import { useCallback, useEffect, useState } from 'react'; import { knowledgeBaseApi } from '@/api'; import type { CreateKnowledgeBaseRequest, KnowledgeBaseView, SearchKnowledgeBaseRequest, UpdateKnowledgeBaseRequest, } from '@/api'; /** * Knowledge base CRUD + search wrapper. * * Loads the caller's knowledge bases from `/knowledge_bases/` on mount * and refetches after every mutation, so the UI stays consistent with * the server-side state. */ export function useKnowledgeBases() { const [knowledgeBases, setKnowledgeBases] = useState([]); const [loading, setLoading] = useState(false); const [creating, setCreating] = useState(false); const [error, setError] = useState(null); const refetch = useCallback(async () => { setLoading(true); setError(null); try { const { knowledge_bases } = await knowledgeBaseApi.list(); setKnowledgeBases(knowledge_bases); } catch (e) { setError(e as Error); } finally { setLoading(false); } }, []); useEffect(() => { refetch(); }, [refetch]); /** Create a new knowledge base and refresh the list. */ const create = useCallback( async (body: CreateKnowledgeBaseRequest): Promise => { setCreating(true); setError(null); try { const { knowledge_base_id } = await knowledgeBaseApi.create(body); await refetch(); return knowledge_base_id; } catch (e) { setError(e as Error); throw e; } finally { setCreating(false); } }, [refetch], ); /** Permanently delete a knowledge base and refresh the list. */ const remove = useCallback( async (knowledgeBaseId: string) => { await knowledgeBaseApi.delete(knowledgeBaseId); await refetch(); }, [refetch], ); /** Update mutable fields on a knowledge base and refresh the list. */ const update = useCallback( async ( knowledgeBaseId: string, body: UpdateKnowledgeBaseRequest, ): Promise => { const view = await knowledgeBaseApi.update(knowledgeBaseId, body); await refetch(); return view; }, [refetch], ); /** Upload a document into a knowledge base. */ const uploadDocument = useCallback( (knowledgeBaseId: string, file: File) => knowledgeBaseApi.uploadDocument(knowledgeBaseId, file), [], ); /** Delete a document from a knowledge base. */ const deleteDocument = useCallback( (knowledgeBaseId: string, documentId: string) => knowledgeBaseApi.deleteDocument(knowledgeBaseId, documentId), [], ); /** Search a knowledge base by natural-language query. */ const search = useCallback( (knowledgeBaseId: string, body: SearchKnowledgeBaseRequest) => knowledgeBaseApi.search(knowledgeBaseId, body), [], ); return { knowledgeBases, loading, creating, error, refetch, create, remove, update, uploadDocument, deleteDocument, search, }; }