import { IdpState } from '../idp.state.js'; import * as plugins from '../plugins.js'; import * as elements from '../elements/index.js'; import { customElement, DeesElement, property, html, cssManager, unsafeCSS, css, type TemplateResult, } from '@design.estate/dees-element'; @customElement('idp-viewcontainer') export class IdpViewcontainer extends DeesElement { constructor() { super(); } public static styles = [ cssManager.defaultStyles, css` :host { display: block; color: #fff; font-family: 'Geist Sans'; } :host([hidden]) { display: none; } .viewContainer { min-width: 100vh; min-height: 100vh; } `, ]; public render(): TemplateResult { return html`
`; } public currentElement: plugins.deesElement.DeesElement; public async loadElement(viewElement: typeof plugins.deesElement.DeesElement) { const idpState = await IdpState.getSingletonInstance(); // Wait until the viewContainer itself is rendered await this.updateComplete; // Select the viewContainer const viewContainer = this.shadowRoot.querySelector('.viewContainer'); // Check if viewContainer is present if (!viewContainer) { throw new Error('View container not found in the rendered DOM.'); } // Remove the current element if it exists if (this.currentElement) { viewContainer.removeChild(this.currentElement); } // Create a new instance of the viewElement const newElement = new viewElement(); (newElement as any).viewContainer = this; viewContainer.appendChild(newElement); // Wait until the new element is fully rendered await newElement.updateComplete; // Set the new element as the current element this.currentElement = newElement; } public async firstUpdated() { const idpState = await IdpState.getSingletonInstance(); idpState.mainStatePart .select((stateArg) => stateArg.view) .subscribe(async (viewArg) => { switch (viewArg) { case 'welcome': await this.loadElement(elements.IdpWelcome); break; case 'login': console.log('now on /login'); await this.loadElement(elements.IdpLogincontainer); break; case 'register': await this.loadElement(elements.IdpRegistrationPrompt); break; } }); } }