/** * state.js — Единое реактивное состояние редактора «Кадр» */ const state = { currentVersionId: null, historyVersions: [], collapsedGroups: new Map(), // groupId (id корня) -> true (свёрнута) reference: { file: null, versionId: null, image: null, region: null, }, isBusy: false, activeJobs: new Map(), suggestRunning: false, }; const listeners = new Set(); export function subscribe(listener) { listeners.add(listener); return () => listeners.delete(listener); } export function notify(changeKey) { for (const listener of listeners) { try { listener(state, changeKey); } catch (err) { console.error("State listener error:", err); } } } export function getState() { return state; } export function setCurrentVersionId(id) { state.currentVersionId = id; notify("currentVersionId"); } export function setHistoryVersions(versions) { state.historyVersions = Array.isArray(versions) ? versions : []; notify("historyVersions"); } export function setBusy(busy) { state.isBusy = Boolean(busy); notify("isBusy"); } export function setSuggestRunning(running) { state.suggestRunning = Boolean(running); notify("suggestRunning"); } export function setReference(refData) { state.reference = { ...state.reference, ...refData }; notify("reference"); } export function clearReferenceState() { state.reference = { file: null, versionId: null, image: null, region: null, }; notify("reference"); }