import { useCallback } from 'react' import { useDropzone } from 'react-dropzone' import { SelectFileOption, systemInformation } from '@janhq/core' import { Modal, ModalContent, ModalHeader, ModalTitle } from '@janhq/uikit' import { useAtomValue, useSetAtom } from 'jotai' import { UploadCloudIcon } from 'lucide-react' import useDropModelBinaries from '@/hooks/useDropModelBinaries' import useImportModel, { getImportModelStageAtom, setImportModelStageAtom, } from '@/hooks/useImportModel' const SelectingModelModal: React.FC = () => { const setImportModelStage = useSetAtom(setImportModelStageAtom) const importModelStage = useAtomValue(getImportModelStageAtom) const { onDropModels } = useDropModelBinaries() const { sanitizeFilePaths } = useImportModel() const onSelectFileClick = useCallback(async () => { const platform = (await systemInformation()).osInfo?.platform if (platform === 'win32') { setImportModelStage('CHOOSE_WHAT_TO_IMPORT') return } const options: SelectFileOption = { title: 'Select model folders', buttonLabel: 'Select', allowMultiple: true, selectDirectory: true, } const filePaths = await window.core?.api?.selectFiles(options) if (!filePaths || filePaths.length === 0) return sanitizeFilePaths(filePaths) }, [sanitizeFilePaths, setImportModelStage]) const { isDragActive, getRootProps } = useDropzone({ noClick: true, multiple: true, onDrop: onDropModels, }) const borderColor = isDragActive ? 'border-primary' : 'border-border' const textColor = isDragActive ? 'text-primary' : 'text-muted-foreground' const dragAndDropBgColor = isDragActive ? 'bg-[#EFF6FF] dark:bg-blue-50/10' : 'bg-background' return ( { setImportModelStage('NONE') }} > Import Model

Import any model file (GGUF) or folder. Your imported model will be private to you.

Click to upload {' '} or drag and drop
(GGUF)
) } export default SelectingModelModal