import * as plugins from '../plugins.js'; import { customElement, DeesElement, property, html, type TemplateResult, css, cssManager, state, domtools, } from '@design.estate/dees-element'; // third party catalogs import '@uptime.link/webwidget'; import { IdpState } from '../states/idp.state.js'; declare global { interface HTMLElementTagNameMap { 'idp-registrationprompt': IdpRegistrationPrompt; } } @customElement('idp-registrationprompt') export class IdpRegistrationPrompt extends DeesElement { public static demo = () => html``; @property() accessor productOfInterest: string; @property() accessor jwt: string; @property({ reflect: true, type: Object, }) accessor appData: plugins.idpInterfaces.data.IApp; public jwtObserable = new domtools.plugins.smartrx.rxjs.Subject(); constructor() { super(); domtools.elementBasic.setup(); } public static styles = [ cssManager.defaultStyles, css` :host { --foreground: hsl(0 0% 98%); --muted-foreground: hsl(240 5% 64.9%); font-family: 'Geist Sans', -apple-system, BlinkMacSystemFont, sans-serif; display: block; color: var(--foreground); } .form-header { margin-bottom: 32px; text-align: center; } .form-header h2 { font-size: 24px; font-weight: 600; color: var(--foreground); margin: 0 0 8px 0; letter-spacing: -0.02em; } .form-header p { font-size: 14px; color: var(--muted-foreground); margin: 0; } idp-form { display: flex; flex-direction: column; gap: 16px; } .form-footer { margin-top: 24px; text-align: center; font-size: 14px; color: var(--muted-foreground); } .form-footer a { color: var(--foreground); text-decoration: none; font-weight: 500; cursor: pointer; transition: opacity 0.15s ease; } .form-footer a:hover { opacity: 0.8; } `, ]; public render(): TemplateResult { return html`

Create your account

Get started with your permanent identity

) => { this.register({ emailAddress: String(eventArg.detail.data.emailAddress || ''), }); }} > Send Verification Email
`; } public async firstUpdated() { await this.domtoolsPromise; const idpState = await IdpState.getSingletonInstance(); const loggedIn = await idpState.idpClient.determineLoginStatus(); if (loggedIn) { idpState.domtools.router.pushUrl('/dash/overview'); } } private register = async (valueArg: { emailAddress: string }) => { const registrationForm = this.shadowRoot.querySelector('#registrationForm') as plugins.idpCatalog.IdpForm; registrationForm.setStatus('pending', 'registering...'); const idpState = await IdpState.getSingletonInstance(); const firstSignupRequest = idpState.idpClient.typedsocket.createTypedRequest( 'firstRegistrationRequest' ); const response = await firstSignupRequest .fire({ email: valueArg.emailAddress, productSlugOfInterest: this.productOfInterest, }) .catch((err) => { const message = err?.errorText || err?.message || 'Registration request failed. Please try again.'; registrationForm.setStatus('error', message); return null; }); if (response?.status === 'ok') { registrationForm.setStatus('success', 'Please check your email!'); } else if (response) { registrationForm.setStatus('error', 'Registration request failed. Please try again.'); } console.log(response); }; public async dispatchJwt(jwtArg?: string) { if (jwtArg !== undefined) { console.log(`dispatching jwt from loginprompt.`); this.jwt = jwtArg; await domtools.plugins.smartdelay.delayFor(200); this.dispatchEvent( new CustomEvent('leleLoginGotJwt', { detail: { jwt: this.jwt, }, }) ); this.jwtObserable.next(this.jwt); } } public async handleRefreshToken(refreshTokenArg: string, delayDispatchMillisArg = 0) { const idpState = await IdpState.getSingletonInstance(); const jwt = await idpState.idpClient.refreshJwt(refreshTokenArg); if (jwt) { this.domtools.convenience.smartdelay.delayFor(delayDispatchMillisArg).then(() => { this.dispatchJwt(jwt); }); return jwt; } else { return null; } } public async show() { await this.updateComplete; const centerContainer = this.shadowRoot.querySelector('idp-centercontainer'); await centerContainer.show(); } public async hide() { await this.updateComplete; const centerContainer = this.shadowRoot.querySelector('idp-centercontainer'); await centerContainer.hide(); } }