UNPKG

@webqit/oohtml

Version:

A suite of new DOM features that brings language support for modern UI development paradigms: a component-based architecture, data binding, and reactivity.

55 lines (45 loc) 1.83 kB
/** * @imports */ import DOMContext from '../context-api/DOMContext.js'; import { env } from '../util.js'; export default class DOMNamingContext extends DOMContext { static kind = 'namespace'; /** * @createRequest */ static createRequest( detail = null ) { const request = super.createRequest(); if ( detail?.startsWith( '@' ) ) { const [ targetContext, ...detail ] = detail.slice( 1 ).split( '/' ).map( s => s.trim() ); request.targetContext = targetContext; request.detail = detail.join( '/' ); } else { request.detail = detail; } return request; } /** * @namespaceObj */ get namespaceObj() { return this.host[ this.configs.NAMESPACED_HTML.api.namespace ]; } /** * @handle() */ handle( event ) { const { window: { webqit: { Observer } } } = env; // Any existing event.meta.controller? Abort! event.meta.controller?.abort(); // Parse and translate detail if ( !( event.detail || '' ).trim() ) return event.respondWith( Observer.unproxy( this.namespaceObj ) ); let path = ( event.detail || '' ).split( '/' ).map( x => x.trim() ).filter( x => x ); if ( !path.length ) return event.respondWith(); path = path.join( `/${ this.configs.NAMESPACED_HTML.api.namespace }/` )?.split( '/' ) || []; event.meta.controller = Observer.reduce( this.namespaceObj, path, Observer.get, descriptor => { if ( this.disposed ) return; // If already scheduled but aborted as in provider unmounting event.respondWith( descriptor.value ); }, { live: event.live, signal: event.signal, descripted: true } ); } /** * @unsubscribed() */ unsubscribed( event ) { event.meta.controller?.abort(); } }