import {vlElement, define, awaitScript} from '/node_modules/vl-ui-core/dist/vl-core.js';
awaitScript('vl-header-client', 'https://prod.widgets.burgerprofiel.vlaanderen.be/api/v1/node_modules/@govflanders/vl-widget-polyfill/dist/index.js').then(() => {
awaitScript('vl-header-polyfill', 'https://prod.widgets.burgerprofiel.vlaanderen.be/api/v1/node_modules/@govflanders/vl-widget-client/dist/index.js').finally(() => {
define('vl-header', VlHeader);
});
}).catch(() => {
define('vl-header', VlHeader);
});
/**
* VlHeader
* @class
* @classdesc De Vlaanderen header.
*
* @extends HTMLElement
* @mixes vlElement
*
* @property {string} data-vl-identifier - De header identifier die gebruikt wordt om bij AIV de header op te halen.
* @property {string} data-vl-development - Attribuut geeft aan dat de AIV ontwikkel servers gebruikt moeten worden.
*
* @see {@link https://www.github.com/milieuinfo/webcomponent-vl-ui-header/releases/latest|Release notes}
* @see {@link https://www.github.com/milieuinfo/webcomponent-vl-ui-header/issues|Issues}
* @see {@link https://webcomponenten.omgeving.vlaanderen.be/demo/vl-header.html|Demo}
*
*/
export class VlHeader extends vlElement(HTMLElement) {
static get EVENTS() {
return {
ready: 'ready',
};
}
static get _observedAttributes() {
return ['identifier'];
}
static get id() {
return 'header';
}
static get header() {
return document.getElementById(VlHeader.id);
}
disconnectedCallback() {
if (this._observer) {
this._observer.disconnect();
}
}
get _widgetURL() {
const prefix = this._isDevelopment ? 'https://tni.widgets.burgerprofiel.dev-vlaanderen.be/api/v1/widget' : 'https://prod.widgets.burgerprofiel.vlaanderen.be/api/v1/widget';
return `${prefix}/${this._widgetUUID}`;
}
get _widgetUUID() {
return this.dataset.vlIdentifier;
}
get _isDevelopment() {
return this.hasAttribute('data-vl-development');
}
getHeaderTemplate() {
return `<div id="${VlHeader.id}"></div>`;
}
_identifierChangedCallback(oldValue, newValue) {
this.__addHeaderElement();
}
async __addHeaderElement() {
if (!VlHeader.header) {
document.body.insertAdjacentHTML('afterbegin', this.getHeaderTemplate());
}
this._observer = this.__observeHeaderElementIsAdded();
vl.widget.client.bootstrap(this._widgetURL).then((widget) => {
widget.setMountElement(VlHeader.header);
widget.mount().catch((e) => console.error(e));
return widget;
}).then((widget) => {
widget.getExtension('citizen_profile.session').then(async (session) => {
session.configure({
active: await this.__isUserAuthenticated(),
endpoints: {
loginUrl: '/aanmelden',
loginRedirectUrl: '/',
logoutUrl: '/afgemeld',
switchCapacityUrl: '/wissel_organisatie',
},
});
});
}).catch((e) => {
console.error(e);
});
}
__observeHeaderElementIsAdded() {
const isHeader = (node) => node.tagName === 'HEADER' || (node.childNodes && [...node.childNodes].some(isHeader));
const observer = new MutationObserver((mutations, observer) => {
const nodes = mutations.flatMap((mutation) => [...mutation.addedNodes]);
if (nodes.some(isHeader)) {
this.dispatchEvent(new CustomEvent(VlHeader.EVENTS.ready));
observer.disconnect();
}
});
observer.observe(VlHeader.header, {childList: true});
}
async __isUserAuthenticated() {
const response = await fetch('/LoggedInUser');
return response.status === 200;
}
}