import { useCallback, useState } from 'react' import { useDropzone } from 'react-dropzone' import { Button, Input, ScrollArea } from '@janhq/uikit' import { useAtomValue, useSetAtom } from 'jotai' import { Plus, SearchIcon, UploadCloudIcon } from 'lucide-react' import { twMerge } from 'tailwind-merge' import useDropModelBinaries from '@/hooks/useDropModelBinaries' import { setImportModelStageAtom } from '@/hooks/useImportModel' import RowModel from './Row' import { downloadedModelsAtom } from '@/helpers/atoms/Model.atom' const Column = ['Name', 'Model ID', 'Size', 'Version', 'Status', ''] const Models: React.FC = () => { const downloadedModels = useAtomValue(downloadedModelsAtom) const setImportModelStage = useSetAtom(setImportModelStageAtom) const [searchValue, setsearchValue] = useState('') const { onDropModels } = useDropModelBinaries() const filteredDownloadedModels = downloadedModels .filter((x) => x.name?.toLowerCase().includes(searchValue.toLowerCase())) .sort((a, b) => a.name.localeCompare(b.name)) const { getRootProps, isDragActive } = useDropzone({ noClick: true, multiple: true, onDrop: onDropModels, }) const onImportModelClick = useCallback(() => { setImportModelStage('SELECTING_MODEL') }, [setImportModelStage]) return ( {isDragActive && (
Drop file here

File (GGUF) or folder

)}
{ setsearchValue(e.target.value) }} />
{Column.map((col) => ( ))} {filteredDownloadedModels ? filteredDownloadedModels.map((x) => ( )) : null}
{col}
) } export default Models