import { useCallback, useMemo, useState } from 'react' import { useDropzone } from 'react-dropzone' import { LlmEngines } from '@janhq/core' import { Button, ScrollArea } from '@janhq/joi' import { useAtomValue, useSetAtom } from 'jotai' import { UploadIcon, UploadCloudIcon } from 'lucide-react' import { twMerge } from 'tailwind-merge' import BlankState from '@/containers/BlankState' import ModelSearch from '@/containers/ModelSearch' import useDropModelBinaries from '@/hooks/useDropModelBinaries' import { setImportModelStageAtom } from '@/hooks/useImportModel' import ModelGroup from './ModelGroup' import { MainViewState, mainViewStateAtom } from '@/helpers/atoms/App.atom' import { downloadedModelsAtom } from '@/helpers/atoms/Model.atom' const MyModels = () => { const setMainViewState = useSetAtom(mainViewStateAtom) const downloadedModels = useAtomValue(downloadedModelsAtom) const { onDropModels } = useDropModelBinaries() const [searchText, setSearchText] = useState('') const setImportModelStage = useSetAtom(setImportModelStageAtom) const onImportModelClick = useCallback(() => { setImportModelStage('SELECTING_MODEL') }, [setImportModelStage]) const filteredDownloadedModels = useMemo( () => downloadedModels .filter((m) => m.model.toLowerCase().includes(searchText.toLowerCase().trim()) ) .sort((a, b) => a.model.localeCompare(b.model)), [downloadedModels, searchText] ) const { getRootProps, isDragActive } = useDropzone({ noClick: true, multiple: true, onDrop: onDropModels, }) const onSearchChange = useCallback((input: string) => { setSearchText(input) }, []) return (
File (GGUF) or folder