| import React, { useState } from 'react'; | |
| import { TFile } from 'librechat-data-provider/dist/types'; | |
| import { CheckMark, TrashIcon, Button } from '@librechat/client'; | |
| import VectorStoreButton from '../VectorStore/VectorStoreButton'; | |
| import { CircleIcon, Clock3Icon, InfoIcon } from 'lucide-react'; | |
| import DeleteIconButton from '../DeleteIconButton'; | |
| import { TThread, TVectorStore } from '~/common'; | |
| import { useParams } from 'react-router-dom'; | |
| const tempFile: TFile = { | |
| filename: 'File1.jpg', | |
| object: 'file', | |
| bytes: 10000, | |
| createdAt: '2022-01-01T10:00:00', | |
| _id: '1', | |
| type: 'image', | |
| usage: 12, | |
| user: 'abc', | |
| file_id: 'file_id', | |
| embedded: true, | |
| filepath: 'filepath', | |
| }; | |
| const tempThreads: TThread[] = [ | |
| { id: 'thead_id', createdAt: '2022-01-01T10:00:00' }, | |
| { id: 'thead_id', createdAt: '2022-01-01T10:00:00' }, | |
| { id: 'thead_id', createdAt: '2022-01-01T10:00:00' }, | |
| { id: 'thead_id', createdAt: '2022-01-01T10:00:00' }, | |
| { id: 'thead_id', createdAt: '2022-01-01T10:00:00' }, | |
| { id: 'thead_id', createdAt: '2022-01-01T10:00:00' }, | |
| { id: 'thead_id', createdAt: '2022-01-01T10:00:00' }, | |
| ]; | |
| const tempVectorStoresAttached: TVectorStore[] = [ | |
| { name: 'vector 1', created_at: '2022-01-01T10:00:00', _id: 'id', object: 'vector_store' }, | |
| { name: 'vector 1', created_at: '2022-01-01T10:00:00', _id: 'id', object: 'vector_store' }, | |
| { name: 'vector 1', created_at: '2022-01-01T10:00:00', _id: 'id', object: 'vector_store' }, | |
| ]; | |
| export default function FilePreview() { | |
| const [file, setFile] = useState(tempFile); | |
| const [threads, setThreads] = useState(tempThreads); | |
| const [vectorStoresAttached, setVectorStoresAttached] = useState(tempVectorStoresAttached); | |
| const params = useParams(); | |
| return ( | |
| <div className="m-3 bg-white p-2 sm:p-4 md:p-6 lg:p-10"> | |
| <div className="flex flex-col justify-between md:flex-row"> | |
| <div className="flex flex-col"> | |
| <b className="hidden text-sm md:text-base lg:block lg:text-lg">FILE</b> | |
| <b className="text-center text-xl md:text-2xl lg:text-left lg:text-3xl"> | |
| {file.filename} | |
| </b> | |
| </div> | |
| <div className="mt-3 flex flex-row gap-x-3 md:mt-0"> | |
| <div> | |
| <DeleteIconButton | |
| onClick={() => { | |
| console.log('click'); | |
| }} | |
| /> | |
| </div> | |
| <div className="w-40"> | |
| <VectorStoreButton | |
| onClick={() => { | |
| console.log('click'); | |
| }} | |
| /> | |
| </div> | |
| </div> | |
| </div> | |
| <div className="mt-3 flex flex-col"> | |
| <div className="flex flex-row"> | |
| <span className="flex w-1/2 flex-row items-center sm:w-1/4 md:w-2/5"> | |
| <InfoIcon className="size-4 text-gray-500" /> | |
| File ID | |
| </span> | |
| <span className="w-1/2 text-gray-500 sm:w-3/4 md:w-3/5">{file._id}</span> | |
| </div> | |
| <div className="mt-3 flex flex-row"> | |
| <span className="flex w-1/2 flex-row items-center sm:w-1/4 md:w-2/5"> | |
| <CircleIcon className="m-0 size-4 p-0 text-gray-500" /> | |
| Status | |
| </span> | |
| <div className="w-1/2 sm:w-3/4 md:w-3/5"> | |
| <span className="flex w-20 flex-row items-center justify-evenly rounded-full bg-[#f2f8ec] p-1 text-[#91c561]"> | |
| <CheckMark className="m-0 p-0" /> | |
| <div>{file.object}</div> | |
| </span> | |
| </div> | |
| </div> | |
| <div className="mt-3 flex flex-row"> | |
| <span className="flex w-1/2 flex-row items-center sm:w-1/4 md:w-2/5"> | |
| <Clock3Icon className="m-0 size-4 p-0 text-gray-500" /> | |
| Purpose | |
| </span> | |
| <span className="w-1/2 text-gray-500 sm:w-3/4 md:w-3/5">{file.message}</span> | |
| </div> | |
| <div className="mt-3 flex flex-row"> | |
| <span className="flex w-1/2 flex-row items-center sm:w-1/4 md:w-2/5"> | |
| <Clock3Icon className="m-0 size-4 p-0 text-gray-500" /> | |
| Size | |
| </span> | |
| <span className="w-1/2 text-gray-500 sm:w-3/4 md:w-3/5">{file.bytes}</span> | |
| </div> | |
| <div className="mt-3 flex flex-row"> | |
| <span className="flex w-1/2 flex-row items-center sm:w-1/4 md:w-2/5"> | |
| <Clock3Icon className="m-0 size-4 p-0 text-gray-500" /> | |
| Created At | |
| </span> | |
| <span className="w-1/2 text-gray-500 sm:w-3/4 md:w-3/5"> | |
| {file.createdAt?.toString()} | |
| </span> | |
| </div> | |
| </div> | |
| <div className="mt-10 flex flex-col"> | |
| <div> | |
| <b className="text-sm md:text-base lg:text-lg">Attached To</b> | |
| </div> | |
| <div className="flex flex-col divide-y"> | |
| <div className="mt-2 flex flex-row"> | |
| <div className="w-2/5 text-sm md:w-1/2 md:text-base lg:text-lg xl:w-2/3"> | |
| Vector Stores | |
| </div> | |
| <div className="w-3/5 text-sm md:w-1/2 md:text-base lg:text-lg xl:w-1/3">Uploaded</div> | |
| </div> | |
| <div> | |
| {vectorStoresAttached.map((vectors, index) => ( | |
| <div key={index} className="mt-2 flex flex-row"> | |
| <div className="ml-4 w-2/5 content-center md:w-1/2 xl:w-2/3">{vectors.name}</div> | |
| <div className="flex w-3/5 flex-row md:w-1/2 xl:w-1/3"> | |
| <div className="content-center text-nowrap">{vectors.created_at.toString()}</div> | |
| <Button | |
| className="m-0 ml-3 h-full bg-transparent p-0 text-[#666666] hover:bg-slate-200" | |
| onClick={() => { | |
| console.log('Remove from vector store'); | |
| }} | |
| variant={'ghost'} | |
| > | |
| <TrashIcon className="m-0 p-0" /> | |
| </Button> | |
| </div> | |
| </div> | |
| ))} | |
| </div> | |
| </div> | |
| </div> | |
| <div className="mt-10 flex flex-col"> | |
| <div className="flex flex-col divide-y"> | |
| <div className="flex flex-row"> | |
| <div className="w-2/5 text-sm md:w-1/2 md:text-base lg:text-lg xl:w-2/3">Threads</div> | |
| <div className="w-3/5 text-sm md:w-1/2 md:text-base lg:text-lg xl:w-1/3">Uploaded</div> | |
| </div> | |
| <div> | |
| {threads.map((thread, index) => ( | |
| <div key={index} className="mt-2 flex flex-row"> | |
| <div className="ml-4 w-2/5 content-center md:w-1/2 xl:w-2/3">ID: {thread.id}</div> | |
| <div className="flex w-3/5 flex-row md:w-1/2 xl:w-1/3"> | |
| <div className="content-center text-nowrap">{thread.createdAt}</div> | |
| <Button | |
| className="m-0 ml-3 h-full bg-transparent p-0 text-[#666666] hover:bg-slate-200" | |
| onClick={() => { | |
| console.log('Remove from thread'); | |
| }} | |
| > | |
| <TrashIcon className="m-0 p-0" /> | |
| </Button> | |
| </div> | |
| </div> | |
| ))} | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| ); | |
| } | |