Files
breadcrumb-the-shire/web/js/core/app-ui-channels.js

46 lines
1.2 KiB
JavaScript
Raw Normal View History

/**
* Shared UI event channels for cross-component communication.
*/
const SIDEBAR_EVENT = 'app:sidebar';
const ASIDE_PANELS_EVENT = 'app:aside-panels';
const dispatch = (eventName, detail = {}) => {
document.dispatchEvent(new CustomEvent(eventName, { detail }));
};
export const requestSidebarAction = (action, options = {}) => {
const normalizedAction = String(action || '').trim();
if (normalizedAction === '') {
return;
}
dispatch(SIDEBAR_EVENT, {
action: normalizedAction,
persist: Boolean(options.persist),
});
};
export const requestAsidePanelOpen = (panel, options = {}) => {
const normalizedPanel = String(panel || '').trim();
if (normalizedPanel === '') {
return;
}
dispatch(ASIDE_PANELS_EVENT, {
action: 'open',
panel: normalizedPanel,
fromUser: options.fromUser !== false,
});
};
export const bindAsidePanelChannel = (handler) => {
if (typeof handler !== 'function') {
return () => {};
}
const listener = (event) => {
handler(event instanceof CustomEvent ? event.detail || {} : {});
};
document.addEventListener(ASIDE_PANELS_EVENT, listener);
return () => {
document.removeEventListener(ASIDE_PANELS_EVENT, listener);
};
};