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 '@design.estate/dees-catalog'; import { DeesForm, DeesFormSubmit, DeesInputText } from '@design.estate/dees-catalog'; import { IdpState } from '../idp.state.js'; declare global { interface HTMLElementTagNameMap { 'idp-registrationprompt': IdpRegistrationPrompt; } } @customElement('idp-registrationprompt') export class IdpRegistrationPrompt extends DeesElement { public static demo = () => html``; @property() public productOfInterest: string; @property() jwt: string; @property({ reflect: true, type: Object, }) 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 { font-family: 'Geist Sans'; display: block; color: ${cssManager.bdTheme('#333333', '#ffffff')}; } .boxcontent { margin: 0px 20px; } .registerButton { display: block; transition: all 0.2s ease; will-change: transform; cursor: pointer; } .registerButton:hover { color: #fff; transform: scale(1.02); } .loginButton { margin-top: 16px; } `, ]; public render(): TemplateResult { return html`
Send Verification Email { const idpState = await IdpState.getSingletonInstance(); idpState.domtools.router.pushUrl('/login'); }}>Login instead
`; } public async firstUpdated() { const domtoolsInstance = await this.domtoolsPromise; const loginForm: DeesForm = this.shadowRoot.querySelector('#loginForm'); const loginPasswordInput: DeesInputText = loginForm.querySelector('#loginPasswordInput'); const loginSubmitButton: DeesFormSubmit = loginForm.querySelector('#loginSubmitButton'); const setButtonText = async () => { if (loginPasswordInput.value) { console.log('updating text of registrationprompt.'); loginSubmitButton.text = 'Login'; } else { loginSubmitButton.text = 'Send magic link (or enter password)'; } }; loginForm.changeSubject.subscribe(() => { console.log(`checking button text ${loginPasswordInput.value}`); setButtonText(); }); setButtonText(); } private register = async (valueArg: { emailAddress: string }) => { const registrationForm: DeesForm = this.shadowRoot.querySelector('#registrationForm'); registrationForm.setStatus('pending', 'registering...'); const firstSignupRequest = new domtools.TypedRequest( '/typedrequest', 'firstRegistrationRequest' ); const response = await firstSignupRequest .fire({ email: valueArg.emailAddress, productSlugOfInterest: this.productOfInterest, }) .catch((err) => { registrationForm.setStatus('error', err.message); return null; }); if (response.status === 'ok') { registrationForm.setStatus('success', 'Please check your email!'); } 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) { // a refreshToken binds directly to a session. // the refresh token is used on a continuous basis to get fresh and short-lived jwts const refreshJwt = new domtools.TypedRequest( '/typedrequest', 'refreshJwt' ); const responseJwt = await refreshJwt.fire({ refreshToken: refreshTokenArg, }); if (responseJwt.jwt) { this.domtools.convenience.smartdelay.delayFor(delayDispatchMillisArg).then(() => { this.dispatchJwt(responseJwt.jwt); }); return responseJwt.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(); } }