Spaces:
Sleeping
Sleeping
File size: 2,449 Bytes
3786a3f feca495 3786a3f feca495 3786a3f feca495 3786a3f feca495 0527a95 3786a3f feca495 0527a95 3786a3f feca495 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | import { create } from 'zustand';
import { persist } from 'zustand/middleware';
export type DocStatus = 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED';
export interface DocumentItem {
id: string;
name: string;
status: DocStatus;
entities?: number;
relationships?: number;
uploadedAt: string;
error?: string;
source?: string;
processingStep?: string | null;
processingProgress?: number;
}
interface DocumentsState {
documents: DocumentItem[];
activeJobs: number;
selectedDocumentIds: string[];
setDocuments: (docs: DocumentItem[]) => void;
upsertDocument: (doc: DocumentItem) => void;
setActiveJobs: (n: number) => void;
toggleSelectDocument: (id: string) => void;
setSelectedDocumentIds: (ids: string[]) => void;
selectAllDocuments: () => void;
deselectAllDocuments: () => void;
clear: () => void;
}
export const useDocumentsStore = create<DocumentsState>()(
persist(
(set) => ({
documents: [],
activeJobs: 0,
selectedDocumentIds: [],
setDocuments: (documents) => set({ documents }),
upsertDocument: (doc) =>
set((state) => {
const idx = state.documents.findIndex((d) => d.id === doc.id);
if (idx >= 0) {
const next = [...state.documents];
next[idx] = doc;
return { documents: next };
}
return { documents: [doc, ...state.documents] };
}),
setActiveJobs: (activeJobs) => set({ activeJobs }),
toggleSelectDocument: (id) =>
set((state) => {
const isSel = state.selectedDocumentIds.includes(id);
const next = isSel
? state.selectedDocumentIds.filter((x) => x !== id)
: [...state.selectedDocumentIds, id];
return { selectedDocumentIds: next };
}),
setSelectedDocumentIds: (selectedDocumentIds) => set({ selectedDocumentIds }),
selectAllDocuments: () =>
set((state) => {
const completedIds = state.documents
.filter((d) => d.status === 'COMPLETED')
.map((d) => d.id);
return { selectedDocumentIds: completedIds };
}),
deselectAllDocuments: () => set({ selectedDocumentIds: [] }),
clear: () => set({ documents: [], activeJobs: 0, selectedDocumentIds: [] }),
}),
{
name: 'graphrag-selected-documents',
partialize: (state) => ({ selectedDocumentIds: state.selectedDocumentIds }),
}
)
);
|