84 lines
2.2 KiB
TypeScript
84 lines
2.2 KiB
TypeScript
import { create } from 'zustand'
|
|
import { persist, createJSONStorage } from 'zustand/middleware'
|
|
import { ulid } from 'ulidx'
|
|
import { localStorageKey } from '@/constants/localStorage'
|
|
import { useThreads } from '@/hooks/useThreads'
|
|
|
|
type ThreadFolder = {
|
|
id: string
|
|
name: string
|
|
updated_at: number
|
|
}
|
|
|
|
type ThreadManagementState = {
|
|
folders: ThreadFolder[]
|
|
setFolders: (folders: ThreadFolder[]) => void
|
|
addFolder: (name: string) => ThreadFolder
|
|
updateFolder: (id: string, name: string) => void
|
|
deleteFolder: (id: string) => void
|
|
getFolderById: (id: string) => ThreadFolder | undefined
|
|
}
|
|
|
|
export const useThreadManagement = create<ThreadManagementState>()(
|
|
persist(
|
|
(set, get) => ({
|
|
folders: [],
|
|
|
|
setFolders: (folders) => {
|
|
set({ folders })
|
|
},
|
|
|
|
addFolder: (name) => {
|
|
const newFolder: ThreadFolder = {
|
|
id: ulid(),
|
|
name,
|
|
updated_at: Date.now(),
|
|
}
|
|
set((state) => ({
|
|
folders: [...state.folders, newFolder],
|
|
}))
|
|
return newFolder
|
|
},
|
|
|
|
updateFolder: (id, name) => {
|
|
set((state) => ({
|
|
folders: state.folders.map((folder) =>
|
|
folder.id === id
|
|
? { ...folder, name, updated_at: Date.now() }
|
|
: folder
|
|
),
|
|
}))
|
|
},
|
|
|
|
deleteFolder: (id) => {
|
|
// Remove project metadata from all threads that belong to this project
|
|
const threadsState = useThreads.getState()
|
|
const threadsToUpdate = Object.values(threadsState.threads).filter(
|
|
(thread) => thread.metadata?.project?.id === id
|
|
)
|
|
|
|
threadsToUpdate.forEach((thread) => {
|
|
threadsState.updateThread(thread.id, {
|
|
metadata: {
|
|
...thread.metadata,
|
|
project: undefined,
|
|
},
|
|
})
|
|
})
|
|
|
|
set((state) => ({
|
|
folders: state.folders.filter((folder) => folder.id !== id),
|
|
}))
|
|
},
|
|
|
|
getFolderById: (id) => {
|
|
return get().folders.find((folder) => folder.id === id)
|
|
},
|
|
}),
|
|
{
|
|
name: localStorageKey.threadManagement,
|
|
storage: createJSONStorage(() => localStorage),
|
|
}
|
|
)
|
|
)
|