| 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<SearchTask>) => void; | |
| removeTask: (query: string) => boolean; | |
| setQuestion: (question: string) => void; | |
| addResource: (resource: Resource) => void; | |
| updateResource: (id: string, resource: Partial<Resource>) => 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<TaskStore & TaskFunction>( | |
| (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" } | |
| ) | |
| ); | |