UNPKG

@restnfeel/agentc-starter-kit

Version:

한국어 기업용 CMS 모듈 - Task Master AI와 함께 빠르게 웹사이트를 구현할 수 있는 재사용 가능한 컴포넌트 시스템

97 lines (87 loc) 2.53 kB
/** * @fileoverview Document management hook for the RAG chatbot system * @module hooks/useDocuments */ import { useCallback, useMemo } from "react"; import { useChatbot } from "./useChatbot"; import type { Document } from "../core/contexts/ChatbotContext"; /** * Return type for the useDocuments hook */ export interface UseDocumentsReturn { /** List of all documents */ documents: Document[]; /** Whether documents are loading */ isLoading: boolean; /** Upload a document */ uploadDocument: ( file: File, metadata?: Partial<Document["metadata"]> ) => Promise<Document>; /** Delete a document */ deleteDocument: (documentId: string) => Promise<void>; /** Get a specific document by ID */ getDocument: (documentId: string) => Document | undefined; /** Search documents by query */ searchDocuments: (query: string, limit?: number) => Promise<Document[]>; /** Filter documents by status */ filterByStatus: (status: Document["status"]) => Document[]; /** Get documents by tag */ getDocumentsByTag: (tag: string) => Document[]; /** Get document count */ documentCount: number; /** Get total size of all documents */ totalSize: number; } /** * Hook for managing documents in the chatbot system * * @returns {UseDocumentsReturn} Document management utilities */ export function useDocuments(): UseDocumentsReturn { const { documents, isProcessing, uploadDocument, deleteDocument, searchSimilarDocuments, listDocuments, } = useChatbot(); const getDocument = useCallback( (documentId: string): Document | undefined => { return documents.find((doc) => doc.id === documentId); }, [documents] ); const filterByStatus = useCallback( (status: Document["status"]): Document[] => { return documents.filter((doc) => doc.status === status); }, [documents] ); const getDocumentsByTag = useCallback( (tag: string): Document[] => { return documents.filter((doc) => doc.metadata.tags?.includes(tag)); }, [documents] ); const documentCount = useMemo(() => documents.length, [documents]); const totalSize = useMemo(() => { return documents.reduce( (total, doc) => total + (doc.metadata.size || 0), 0 ); }, [documents]); return { documents, isLoading: isProcessing, uploadDocument, deleteDocument, getDocument, searchDocuments: searchSimilarDocuments, filterByStatus, getDocumentsByTag, documentCount, totalSize, }; }