Files
Void-Homelab/public/state.js
2026-06-01 19:34:27 +10:00

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); }