2026-06-02 12:38:01 +08:00
|
|
|
import { create } from 'zustand';
|
|
|
|
|
import type { WebProjectSummary, WebCanvasWorkflow } from '../types';
|
2026-06-03 01:39:06 +08:00
|
|
|
import { createBlankWorkflow } from '../data/workflows';
|
2026-06-02 12:38:01 +08:00
|
|
|
|
|
|
|
|
interface ProjectState {
|
|
|
|
|
projects: WebProjectSummary[];
|
|
|
|
|
projectsLoaded: boolean;
|
2026-06-03 01:39:06 +08:00
|
|
|
canvasWorkflow: WebCanvasWorkflow;
|
2026-06-02 12:38:01 +08:00
|
|
|
currentCanvasProjectId: string | null;
|
|
|
|
|
pendingDeleteProject: WebProjectSummary | null;
|
|
|
|
|
deleteProjectSubmitting: boolean;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
interface ProjectActions {
|
|
|
|
|
setProjects: (projects: WebProjectSummary[]) => void;
|
|
|
|
|
setProjectsLoaded: (loaded: boolean) => void;
|
2026-06-03 01:39:06 +08:00
|
|
|
setCanvasWorkflow: (workflow: WebCanvasWorkflow) => void;
|
2026-06-02 12:38:01 +08:00
|
|
|
setCurrentCanvasProjectId: (id: string | null) => void;
|
|
|
|
|
openDeleteProject: (project: WebProjectSummary) => void;
|
|
|
|
|
closeDeleteProject: () => void;
|
|
|
|
|
setDeleteProjectSubmitting: (submitting: boolean) => void;
|
|
|
|
|
clearProjectState: () => void;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const initialState: ProjectState = {
|
|
|
|
|
projects: [],
|
|
|
|
|
projectsLoaded: false,
|
2026-06-03 01:39:06 +08:00
|
|
|
canvasWorkflow: createBlankWorkflow(),
|
2026-06-02 12:38:01 +08:00
|
|
|
currentCanvasProjectId: null,
|
|
|
|
|
pendingDeleteProject: null,
|
|
|
|
|
deleteProjectSubmitting: false,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const useProjectStore = create<ProjectState & ProjectActions>((set) => ({
|
|
|
|
|
...initialState,
|
|
|
|
|
|
|
|
|
|
setProjects: (projects) => set({ projects }),
|
|
|
|
|
|
|
|
|
|
setProjectsLoaded: (loaded) => set({ projectsLoaded: loaded }),
|
|
|
|
|
|
|
|
|
|
setCanvasWorkflow: (workflow) => set({ canvasWorkflow: workflow }),
|
|
|
|
|
|
|
|
|
|
setCurrentCanvasProjectId: (id) => set({ currentCanvasProjectId: id }),
|
|
|
|
|
|
|
|
|
|
openDeleteProject: (project) => set({ pendingDeleteProject: project }),
|
|
|
|
|
|
|
|
|
|
closeDeleteProject: () => set({
|
|
|
|
|
pendingDeleteProject: null,
|
|
|
|
|
deleteProjectSubmitting: false,
|
|
|
|
|
}),
|
|
|
|
|
|
|
|
|
|
setDeleteProjectSubmitting: (submitting) => set({ deleteProjectSubmitting: submitting }),
|
|
|
|
|
|
|
|
|
|
clearProjectState: () => set(initialState),
|
|
|
|
|
}));
|