mirror of
https://github.com/multica-ai/multica.git
synced 2026-06-17 03:38:32 +02:00
Add Zustand persisted draft stores for the create-project and feedback modals, following the same pattern as the existing issue draft store. Drafts are saved to localStorage on every field change and restored when the modal reopens, preventing accidental data loss on close. Draft is cleared on successful submit.
55 lines
1.5 KiB
TypeScript
55 lines
1.5 KiB
TypeScript
import { create } from "zustand";
|
|
import { createJSONStorage, persist } from "zustand/middleware";
|
|
import type { ProjectStatus, ProjectPriority } from "../types";
|
|
import { createWorkspaceAwareStorage, registerForWorkspaceRehydration } from "../platform/workspace-storage";
|
|
import { defaultStorage } from "../platform/storage";
|
|
|
|
interface ProjectDraft {
|
|
title: string;
|
|
description: string;
|
|
status: ProjectStatus;
|
|
priority: ProjectPriority;
|
|
leadType?: "member" | "agent";
|
|
leadId?: string;
|
|
icon?: string;
|
|
}
|
|
|
|
const EMPTY_DRAFT: ProjectDraft = {
|
|
title: "",
|
|
description: "",
|
|
status: "planned",
|
|
priority: "none",
|
|
leadType: undefined,
|
|
leadId: undefined,
|
|
icon: undefined,
|
|
};
|
|
|
|
interface ProjectDraftStore {
|
|
draft: ProjectDraft;
|
|
setDraft: (patch: Partial<ProjectDraft>) => void;
|
|
clearDraft: () => void;
|
|
hasDraft: () => boolean;
|
|
}
|
|
|
|
export const useProjectDraftStore = create<ProjectDraftStore>()(
|
|
persist(
|
|
(set, get) => ({
|
|
draft: { ...EMPTY_DRAFT },
|
|
setDraft: (patch) =>
|
|
set((s) => ({ draft: { ...s.draft, ...patch } })),
|
|
clearDraft: () =>
|
|
set({ draft: { ...EMPTY_DRAFT } }),
|
|
hasDraft: () => {
|
|
const { draft } = get();
|
|
return !!(draft.title || draft.description);
|
|
},
|
|
}),
|
|
{
|
|
name: "multica_project_draft",
|
|
storage: createJSONStorage(() => createWorkspaceAwareStorage(defaultStorage)),
|
|
},
|
|
),
|
|
);
|
|
|
|
registerForWorkspaceRehydration(() => useProjectDraftStore.persist.rehydrate());
|