import { ChangeDetectorRef, Component, OnDestroy, OnInit } from "@angular/core"; import { ScalarWidgetApi } from "../../shared/services/scalar/scalar-widget.api"; import { CapableWidget, WIDGET_API_VERSION_OPENID } from "../capable-widget"; import { ActivatedRoute } from "@angular/router"; import { ScalarServerApiService } from "../../shared/services/scalar/scalar-server-api.service"; import { TranslateService } from "@ngx-translate/core"; @Component({ selector: "my-reauth-example-widget-wrapper", templateUrl: "manager-test.component.html", styleUrls: ["manager-test.component.scss"], }) export class ManagerTestWidgetWrapperComponent extends CapableWidget implements OnInit, OnDestroy { public readonly STATE_NEUTRAL = "neutral"; public readonly STATE_OK = "ok"; public readonly STATE_ERROR = "error"; public isBusy = true; public isSupported = true; public selfState = this.STATE_NEUTRAL; public managerState = this.STATE_NEUTRAL; public homeserverState = this.STATE_NEUTRAL; public message: string; constructor( activatedRoute: ActivatedRoute, private scalarApi: ScalarServerApiService, private changeDetector: ChangeDetectorRef, public translate: TranslateService ) { super(); this.translate = translate; this.translate .get( "Click the button to test your connection. This may cause your client to ask if it is okay to share your identity with the widget - this is required to test your connection to your homeserver." ) .subscribe((res: string) => { this.message = res; }); const params: any = activatedRoute.snapshot.queryParams; ScalarWidgetApi.widgetId = params.widgetId; } protected onSupportedVersionsFound(): void { super.onSupportedVersionsFound(); this.isSupported = this.doesSupportAtLeastVersion( WIDGET_API_VERSION_OPENID ); this.isBusy = false; if (!this.isSupported) { this.selfState = this.STATE_ERROR; } this.changeDetector.detectChanges(); } public async start(): Promise { this.selfState = this.STATE_NEUTRAL; this.managerState = this.STATE_NEUTRAL; this.homeserverState = this.STATE_NEUTRAL; this.translate .get("Please accept the prompt to verify your identity.") .subscribe((res: string) => { this.message = res; }); this.isBusy = true; const response = await this.getOpenIdInfo(); if (response.blocked) { this.isBusy = false; this.selfState = this.STATE_ERROR; this.translate .get("You have blocked this widget from verifying your identity.") .subscribe((res: string) => { this.message = res; }); return; } this.selfState = this.STATE_OK; this.translate .get("Checking connectivity to integration manager...") .subscribe((res: string) => { this.message = res; }); try { await this.scalarApi.ping(); this.managerState = this.STATE_OK; this.translate .get("Checking connectivity to homeserver...") .subscribe((res: string) => { this.message = res; }); } catch (e) { console.error(e); this.isBusy = false; this.managerState = this.STATE_ERROR; this.translate .get( "Error checking if the integration manager is alive. This usually means that the manager which served this widget has gone offline." ) .subscribe((res: string) => { this.message = res; }); return; } try { await this.scalarApi.register(response.openId); this.homeserverState = this.STATE_OK; this.translate .get("You're all set! Click the button below to re-run the test.") .subscribe((res: string) => { this.message = res; }); this.isBusy = false; } catch (e) { this.isBusy = false; this.homeserverState = this.STATE_ERROR; this.translate .get( "Error contacting homeserver. This usually means your federation setup is incorrect, or your homeserver is offline. Consult your homeserver's documentation for how to set up federation." ) .subscribe((res: string) => { this.message = res; }); } } }