25 lines
1.3 KiB
JavaScript
25 lines
1.3 KiB
JavaScript
// Shared dashboard state — the one piece of cross-domain state in the
|
|
// dashboard SPA: the live agent roster.
|
|
//
|
|
// The roster is read by nearly every tab (the container tree, the
|
|
// capabilities + tool-group matrices, the schedule target-chips, the
|
|
// container-load poll, the selection bar, and the operator inbox), so
|
|
// it lives here as a single source of truth that each domain module
|
|
// imports rather than threading through call signatures. Everything
|
|
// else in the dashboard is domain-local and lives with its own module.
|
|
//
|
|
// `containersState` is keyed by `ContainerView.name` so a lifecycle
|
|
// form's POST → 200 → matching SSE event can flip a single row without
|
|
// a full snapshot refetch. Mutated in place (`set` / `delete` / `clear`)
|
|
// by the container apply-handlers; consumers read it by reference, so
|
|
// the imported binding always reflects the latest roster.
|
|
|
|
export const containersState = new Map();
|
|
|
|
// Replace the whole roster from a fresh `/api/state` snapshot. Called by
|
|
// the entry's `refreshState` on cold load and after async-form submits;
|
|
// live single-row updates go through the container apply-handlers.
|
|
export function syncContainersFromSnapshot(s) {
|
|
containersState.clear();
|
|
for (const c of s.containers || []) containersState.set(c.name, c);
|
|
}
|