28 lines
1003 B
JavaScript
28 lines
1003 B
JavaScript
// Tiny event bus for cross-component state (pending count, agent toggle, etc.).
|
|
// No reactive framework — just publish/subscribe with last-value semantics.
|
|
//
|
|
// `state` is a plain mutable object for values that don't need subscriptions.
|
|
// Set by the app router on each navigation; read by components like the rail.
|
|
export const state = {
|
|
spaceId: null, // string | null — ID of the currently active Space
|
|
view: null, // { entityType, entityId } | null — entity focused in main panel
|
|
};
|
|
|
|
const subs = new Map(); // event → Set<fn>
|
|
const last = new Map(); // event → last value
|
|
|
|
export function on(event, fn) {
|
|
if (!subs.has(event)) subs.set(event, new Set());
|
|
subs.get(event).add(fn);
|
|
if (last.has(event)) fn(last.get(event));
|
|
return () => subs.get(event).delete(fn);
|
|
}
|
|
|
|
export function emit(event, value) {
|
|
last.set(event, value);
|
|
const set = subs.get(event);
|
|
if (set) for (const fn of set) fn(value);
|
|
}
|
|
|
|
export function get(event) { return last.get(event); }
|