import SDKAdapter from '../../core/adapter.js' import { SDKModel } from '../../core/model.js' import { Datasource } from '../datasources.js' import { SDKCollection } from '../../core/collection.js' import { ExternalComponentModel } from './external-components.js' export interface Form { id: string name: string } export interface IGetFormsResponse { Items: { Entity: { Id: string Name: string } PreviewImageUrl: string }[] } export interface FormParams extends Form { datasources: Datasource[] } export interface FormModel extends FormParams {} export class Forms extends SDKAdapter
{ async fetch() { return this.search() } /** Searches for tenants through inventory api request */ async search(): Promise { let siteName try { siteName = new URL(window.location.href).searchParams.get('sc_site') } catch { console.error('FEAAS: could not find current location') } const response = (await this.sdk.fetchJSON( `${this.sdk.formsBackend.replace('{region}', this.sdk.auth.tenant.getRegionCode())}/api/entities/filter`, { method: 'POST', headers: { Authorization: `Bearer ${this.sdk.accessToken}` }, cache: 'no-cache', body: JSON.stringify({ Page: 1, PageSize: 1000, WhereEntityStatus: 1, SiteNames: siteName ? [siteName] : undefined }) } )) as IGetFormsResponse return response?.Items.map((item) => ({ id: item.Entity.Id, name: item.Entity.Name, thumbnail: item.PreviewImageUrl })) } } export class FormModel extends SDKModel implements FormParams { constructor(data?: any) { super(data) this.updateFormsOnSitecoreSiteChange() } get adapter() { return this.sdk.Forms } /** * Add a listener to fetch forms based on site name every time the site changes */ updateFormsOnSitecoreSiteChange() { //@ts-ignore if (typeof window !== 'undefined' && !window.hasSitecoreSiteChangeObserver) { let oldSite = new URL(window.location.href).searchParams.get('sc_site') let observer = new MutationObserver(() => { let newSite = new URL(window.location.href).searchParams.get('sc_site') if (oldSite !== newSite) { oldSite = newSite this.fetch().then((forms: unknown) => { FormModel.onCollectionChange(forms as SDKCollection) }) } }) observer.observe(document, { subtree: true, childList: true }) // @ts-ignore window.hasSitecoreSiteChangeObserver = true } } static onCollectionChange(forms: SDKCollection) { ExternalComponentModel.setForms(forms) ExternalComponentModel.updateComponents( forms.construct().sdk.renderingHost.registeredComponents, forms.construct().sdk.renderingHost.expandedComponents ) return forms } }