// Root store: composes 5 slices into the same-named `useSchedulesStore`. // External consumers keep importing `{ useSchedulesStore }` from this file. // // The legacy monolithic file exported both `useSchedulesStore` and // `bindSchedulesApi`; we re-export the binding helper from `./helpers` here // so `routes/platform.tsx` (and any future callers) get the same surface. import { create } from "zustand"; import { bindSchedulesApi } from "./helpers"; import { createCanvasSlice } from "./canvasSlice"; import { createDialogSlice } from "./dialogSlice"; import { createListSlice } from "./listSlice"; import { createLogsSlice } from "./logsSlice"; import { createRunsSlice } from "./runsSlice"; import type { CanvasSliceActions, CanvasSliceState } from "./canvasSlice"; import type { DialogSliceActions, DialogSliceState } from "./dialogSlice"; import type { ListSliceActions, ListSliceState } from "./listSlice"; import type { LogsSliceActions, LogsSliceState } from "./logsSlice"; import type { RunsSliceActions, RunsSliceState } from "./runsSlice"; import type { WorkspaceBoundApi } from "../../../services/api"; // ---- Initial values (used by reset() to mirror the legacy monolithic `initial` const) ---- import { EMPTY_NODE_FORM, EMPTY_SCHEDULE_FORM } from "./types"; // ---- Combined types (re-used by each slice's StateCreator generic) ---- export type SchedulesState = & ListSliceState & CanvasSliceState & DialogSliceState & RunsSliceState & LogsSliceState; export type SchedulesActions = & ListSliceActions & CanvasSliceActions & DialogSliceActions & RunsSliceActions & LogsSliceActions & { bindApi: (api: WorkspaceBoundApi | null) => void; reset: () => void; }; export type SchedulesStore = SchedulesState & SchedulesActions; const INITIAL: Omit = { // List schedules: [], artifacts: [], loading: true, // Canvas selectedNodeId: null, selectedEdgeId: null, linkSourceId: null, scheduleKeyword: "", artifactKeyword: "", scheduleForm: EMPTY_SCHEDULE_FORM, nodeForm: EMPTY_NODE_FORM, contextMenu: null, positionDraftCount: 0, // Dialog createDialogOpen: false, newScheduleName: "", renameTarget: null, renameName: "", cronResult: null, // Runs runs: [], runsLoading: false, expandedRunId: null, runDetails: {}, detailLoadingId: null, detailErrors: {}, artifactBusyKey: null, artifactErrors: {}, // Logs openLogNodeRunIds: new Set(), logStates: {}, }; export const useSchedulesStore = create()( (set, get, store) => ({ ...createListSlice(set, get, store), ...createCanvasSlice(set, get, store), ...createDialogSlice(set, get, store), ...createRunsSlice(set, get, store), ...createLogsSlice(set, get, store), // ---- global actions (cross-slice) ---- bindApi: (api) => { bindSchedulesApi(api); }, reset: () => { // Mirror legacy `set({ ...initial, loading: true })` — wipe every // slice field back to its default. schedule/busy are explicitly set // because their default values differ from the Omit above. set({ ...INITIAL, schedule: null, busy: null, loading: true, }); }, }), ); export { bindSchedulesApi };