RAG_Backend / frontend /src /hooks /useDocument.js
Madhesh4124's picture
feat: add auth-gated 3-mode workflow with admin chroma controls
7ac3a44
Raw
History Blame Contribute Delete
2.42 kB
import { useState, useCallback } from "react";
import { uploadDocument, getChunks, MOCK_CHUNKS } from "../services/api";
export function useDocument() {
const [document, setDocument] = useState(null);
const [chunks, setChunks] = useState([]);
const [uploading, setUploading] = useState(false);
const [uploadProgress, setUploadProgress] = useState(0);
const [loadingChunks, setLoadingChunks] = useState(false);
const [error, setError] = useState(null);
const upload = useCallback(async (fileOrFiles) => {
const files = Array.isArray(fileOrFiles) ? fileOrFiles : [fileOrFiles];
const validFiles = files.filter(Boolean);
if (!validFiles.length) return;
setUploading(true);
setError(null);
setUploadProgress(0);
try {
let lastUploaded = null;
for (let index = 0; index < validFiles.length; index += 1) {
const file = validFiles[index];
const fd = new FormData();
fd.append("file", file);
const { data } = await uploadDocument(fd, (progress) => {
const current = Math.max(0, Math.min(100, Number(progress) || 0));
const overall = ((index + current / 100) / validFiles.length) * 100;
setUploadProgress(Math.round(overall));
});
lastUploaded = data;
}
if (lastUploaded) {
setDocument(lastUploaded);
}
} catch (err) {
setError(err.response?.data?.detail || err.message || "Upload failed");
console.error("Upload error:", err);
} finally {
setUploading(false);
}
}, []);
const fetchChunks = useCallback(async (docId, configId) => {
setLoadingChunks(true);
setError(null);
try {
const { data } = await getChunks(docId, configId);
const chunkData = data?.chunks || data;
if (Array.isArray(chunkData) && chunkData.length > 0) {
setChunks(chunkData);
} else {
setChunks(MOCK_CHUNKS);
}
} catch (e) {
console.error("[Chunks] Error:", e);
setChunks(MOCK_CHUNKS);
setError(e.message);
} finally {
setLoadingChunks(false);
}
}, []);
const clearDocument = () => { setDocument(null); setChunks([]); };
const selectDocument = useCallback((doc) => {
setDocument(doc || null);
}, []);
return { document, chunks, uploading, uploadProgress, loadingChunks, error, upload, fetchChunks, clearDocument, selectDocument };
}