import { useMemo, useCallback } from 'react' import { Button, Progress } from '@janhq/joi' import { useAtomValue, useSetAtom } from 'jotai' import { CloudDownload } from 'lucide-react' import { toaster } from '@/containers/Toast' import useAbortDownload from '@/hooks/useAbortDownload' import useAssistantQuery from '@/hooks/useAssistantQuery' import useCortex from '@/hooks/useCortex' import { addDownloadModelStateAtom, downloadStateListAtom, } from '@/hooks/useDownloadState' import useThreads from '@/hooks/useThreads' import { formatDownloadPercentage } from '@/utils/converter' import { downloadProgress } from '@/utils/download' import { HfModelEntry } from '@/utils/huggingface' import { addThousandSeparator } from '@/utils/number' import ModelTitle from './ModelTitle' import { MainViewState, mainViewStateAtom } from '@/helpers/atoms/App.atom' import { localModelModalStageAtom } from '@/helpers/atoms/DownloadLocalModel.atom' import { downloadedModelsAtom } from '@/helpers/atoms/Model.atom' const BuiltInModelCard: React.FC = ({ name, downloads, model, }) => { const setLocalModelModalStage = useSetAtom(localModelModalStageAtom) const onItemClick = useCallback(() => { setLocalModelModalStage('MODEL_LIST', name) }, [setLocalModelModalStage, name]) const owner = model?.metadata?.owned_by ?? '' const logoUrl = model?.metadata?.logo ?? '' return (
{name.replaceAll('cortexso/', '')}
{addThousandSeparator(downloads)}
) } type DownloadContainerProps = { modelHandle: string } const DownloadContainer: React.FC = ({ modelHandle, }) => { const { downloadModel } = useCortex() const { abortDownload } = useAbortDownload() const addDownloadState = useSetAtom(addDownloadModelStateAtom) const setMainViewState = useSetAtom(mainViewStateAtom) const { createThread } = useThreads() const setDownloadLocalModelModalStage = useSetAtom(localModelModalStageAtom) const downloadedModels = useAtomValue(downloadedModelsAtom) const allDownloadState = useAtomValue(downloadStateListAtom) const { data: assistants } = useAssistantQuery() const modelId = useMemo(() => `${modelHandle.split('/')[1]}`, [modelHandle]) const downloadState = allDownloadState.find( (downloadState) => downloadState.id == modelId ) const downloadedModel = useMemo( () => downloadedModels.find((m) => m.model.split(':')[0] === modelId), [downloadedModels, modelId] ) const onDownloadClick = useCallback(async () => { addDownloadState(modelId) await downloadModel(modelId) }, [downloadModel, addDownloadState, modelId]) const onUseModelClick = useCallback(async () => { if (!assistants || assistants.length === 0) { toaster({ title: 'No assistant available.', description: 'Please create an assistant to create a new thread', type: 'error', }) return } await createThread(modelId, { ...assistants[0], model: modelId, }) setDownloadLocalModelModalStage('NONE', undefined) setMainViewState(MainViewState.Thread) }, [ setDownloadLocalModelModalStage, setMainViewState, createThread, modelId, assistants, ]) return (
{downloadedModel ? ( ) : downloadState != null ? ( ) : ( )}
) } export default BuiltInModelCard