@restnfeel/agentc-starter-kit
Version:
한국어 기업용 CMS 모듈 - Task Master AI와 함께 빠르게 웹사이트를 구현할 수 있는 재사용 가능한 컴포넌트 시스템
97 lines (87 loc) • 2.53 kB
text/typescript
/**
* @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,
};
}