46 lines
1.2 KiB
JavaScript
46 lines
1.2 KiB
JavaScript
|
|
/**
|
||
|
|
* 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);
|
||
|
|
};
|
||
|
|
};
|