import { create } from "zustand"; import { persist, type StorageValue } from "zustand/middleware"; import { researchStore } from "@/utils/storage"; import { clone, pick } from "radash"; export interface KnowledgeStore { knowledges: Knowledge[]; } type KnowledgeFunction = { save: (knowledge: Knowledge) => void; exist: (id: string) => boolean; get: (id: string) => Knowledge | null; update: (id: string, knowledge: Partial) => boolean; remove: (id: string) => boolean; }; export const useKnowledgeStore = create( persist( (set, get) => ({ knowledges: [], save: (knowledge) => { set((state) => ({ knowledges: [knowledge, ...state.knowledges] })); }, exist: (id) => { const { knowledges } = get(); const knowledge = knowledges.find((item) => item.id === id); return !!knowledge; }, get: (id) => { const current = get().knowledges.find((item) => item.id === id); return current ? clone(current) : null; }, update: (id, knowledge) => { const newKnowledges = get().knowledges.map((item) => { if (item.id === id) { return { ...item, ...clone(knowledge), updatedAt: Date.now(), }; } else { return item; } }); set(() => ({ knowledges: [...newKnowledges] })); return true; }, remove: (id) => { set((state) => ({ knowledges: state.knowledges.filter((item) => item.id !== id), })); return true; }, }), { name: "knowledgeStore", version: 1, storage: { getItem: async (key: string) => { return await researchStore.getItem< StorageValue >(key); }, setItem: async ( key: string, store: StorageValue ) => { return await researchStore.setItem(key, { state: pick(store.state, ["knowledges"]), version: store.version, }); }, removeItem: async (key: string) => await researchStore.removeItem(key), }, } ) );