components/file-search-setup.tsx (96 lines of code) (raw):
"use client";
import React, { useState } from "react";
import useToolsStore from "@/stores/useToolsStore";
import FileUpload from "@/components/file-upload";
import { Input } from "./ui/input";
import { CircleX } from "lucide-react";
import { TooltipContent, TooltipTrigger } from "./ui/tooltip";
import { Tooltip } from "./ui/tooltip";
import { TooltipProvider } from "./ui/tooltip";
export default function FileSearchSetup() {
const { vectorStore, setVectorStore } = useToolsStore();
const [newStoreId, setNewStoreId] = useState<string>("");
const unlinkStore = async () => {
setVectorStore({
id: "",
name: "",
});
};
const handleAddStore = async (storeId: string) => {
if (storeId.trim()) {
const newStore = await fetch(
`/api/vector_stores/retrieve_store?vector_store_id=${storeId}`
).then((res) => res.json());
if (newStore.id) {
console.log("Retrieved store:", newStore);
setVectorStore(newStore);
} else {
alert("Vector store not found");
}
}
};
return (
<div>
<div className="text-sm text-zinc-500">
Upload a file to create a new vector store, or use an existing one.
</div>
<div className="flex items-center gap-2 mt-2 h-10">
<div className="flex items-center gap-2 w-full">
<div className="text-sm font-medium w-24 text-nowrap">
Vector store
</div>
{vectorStore?.id ? (
<div className="flex items-center justify-between flex-1 min-w-0">
<div className="flex items-center gap-2 min-w-0">
<div className="text-zinc-400 text-xs font-mono flex-1 text-ellipsis truncate">
{vectorStore.id}
</div>
<TooltipProvider>
<Tooltip>
<TooltipTrigger asChild>
<CircleX
onClick={() => unlinkStore()}
size={16}
className="cursor-pointer text-zinc-400 mb-0.5 shrink-0 mt-0.5 hover:text-zinc-700 transition-all"
/>
</TooltipTrigger>
<TooltipContent className="mr-2">
<p>Unlink vector store</p>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</div>
</div>
) : (
<div className="flex items-center gap-2">
<Input
type="text"
placeholder="ID (vs_XXXX...)"
value={newStoreId}
onChange={(e) => setNewStoreId(e.target.value)}
className="border border-zinc-300 rounded text-sm bg-white"
onKeyDown={(e) => {
if (e.key === "Enter") {
handleAddStore(newStoreId);
}
}}
/>
<div
className="text-zinc-400 text-sm px-1 transition-colors hover:text-zinc-600 cursor-pointer"
onClick={() => handleAddStore(newStoreId)}
>
Add
</div>
</div>
)}
</div>
</div>
<div className="flex mt-4">
<FileUpload
vectorStoreId={vectorStore?.id ?? ""}
vectorStoreName={vectorStore?.name ?? ""}
onAddStore={(id) => handleAddStore(id)}
onUnlinkStore={() => unlinkStore()}
/>
</div>
</div>
);
}