import { create } from "zustand"; import { persist } from "zustand/middleware"; import { pick } from "radash"; export interface TaskStore { id: string; question: string; resources: Resource[]; query: string; questions: string; feedback: string; reportPlan: string; suggestion: string; tasks: SearchTask[]; requirement: string; title: string; finalReport: string; sources: Source[]; images: ImageSource[]; knowledgeGraph: string; } interface TaskFunction { update: (tasks: SearchTask[]) => void; setId: (id: string) => void; setTitle: (title: string) => void; setSuggestion: (suggestion: string) => void; setRequirement: (requirement: string) => void; setQuery: (query: string) => void; updateTask: (query: string, task: Partial) => void; removeTask: (query: string) => boolean; setQuestion: (question: string) => void; addResource: (resource: Resource) => void; updateResource: (id: string, resource: Partial) => void; removeResource: (id: string) => boolean; updateQuestions: (questions: string) => void; updateReportPlan: (plan: string) => void; updateFinalReport: (report: string) => void; setSources: (sources: Source[]) => void; setImages: (images: Source[]) => void; setFeedback: (feedback: string) => void; updateKnowledgeGraph: (knowledgeGraph: string) => void; clear: () => void; reset: () => void; backup: () => TaskStore; restore: (taskStore: TaskStore) => void; } const defaultValues: TaskStore = { id: "", question: "", resources: [], query: "", questions: "", feedback: "", reportPlan: "", suggestion: "", tasks: [], requirement: "", title: "", finalReport: "", sources: [], images: [], knowledgeGraph: "", }; export const useTaskStore = create( persist( (set, get) => ({ ...defaultValues, update: (tasks) => set(() => ({ tasks: [...tasks] })), setId: (id) => set(() => ({ id })), setTitle: (title) => set(() => ({ title })), setSuggestion: (suggestion) => set(() => ({ suggestion })), setRequirement: (requirement) => set(() => ({ requirement })), setQuery: (query) => set(() => ({ query })), updateTask: (query, task) => { const newTasks = get().tasks.map((item) => { return item.query === query ? { ...item, ...task } : item; }); set(() => ({ tasks: [...newTasks] })); }, removeTask: (query) => { set((state) => ({ tasks: state.tasks.filter((task) => task.query !== query), })); return true; }, setQuestion: (question) => set(() => ({ question })), addResource: (resource) => set((state) => ({ resources: [resource, ...state.resources] })), updateResource: (id, resource) => { const newResources = get().resources.map((item) => { return item.id === id ? { ...item, ...resource } : item; }); set(() => ({ resources: [...newResources] })); }, removeResource: (id) => { set((state) => ({ resources: state.resources.filter((resource) => resource.id !== id), })); return true; }, updateQuestions: (questions) => set(() => ({ questions })), updateReportPlan: (plan) => set(() => ({ reportPlan: plan })), updateFinalReport: (report) => set(() => ({ finalReport: report })), setSources: (sources) => set(() => ({ sources })), setImages: (images) => set(() => ({ images })), setFeedback: (feedback) => set(() => ({ feedback })), updateKnowledgeGraph: (knowledgeGraph) => set(() => ({ knowledgeGraph })), clear: () => set(() => ({ tasks: [] })), reset: () => set(() => ({ ...defaultValues })), backup: () => { return { ...pick(get(), Object.keys(defaultValues) as (keyof TaskStore)[]), } as TaskStore; }, restore: (taskStore) => set(() => ({ ...taskStore })), }), { name: "research" } ) );