/* eslint-disable react-hooks/exhaustive-deps */ import { useCallback, useMemo } from 'react' import { Model } from '@janhq/core' import { Badge, Button, Tooltip, TooltipArrow, TooltipContent, TooltipPortal, TooltipTrigger, } from '@janhq/uikit' import { atom, useAtomValue } from 'jotai' import { ChevronDownIcon } from 'lucide-react' import { twMerge } from 'tailwind-merge' import ModalCancelDownload from '@/containers/ModalCancelDownload' import { MainViewState } from '@/constants/screens' import { useCreateNewThread } from '@/hooks/useCreateNewThread' import useDownloadModel from '@/hooks/useDownloadModel' import { useDownloadState } from '@/hooks/useDownloadState' import { useMainViewState } from '@/hooks/useMainViewState' import { toGibibytes } from '@/utils/converter' import { assistantsAtom } from '@/helpers/atoms/Assistant.atom' import { serverEnabledAtom } from '@/helpers/atoms/LocalServer.atom' import { downloadedModelsAtom } from '@/helpers/atoms/Model.atom' import { totalRamAtom } from '@/helpers/atoms/SystemBar.atom' type Props = { model: Model onClick: () => void open: string } const ExploreModelItemHeader: React.FC = ({ model, onClick, open }) => { const { downloadModel } = useDownloadModel() const downloadedModels = useAtomValue(downloadedModelsAtom) const { modelDownloadStateAtom } = useDownloadState() const { requestCreateNewThread } = useCreateNewThread() const totalRam = useAtomValue(totalRamAtom) const serverEnabled = useAtomValue(serverEnabledAtom) const assistants = useAtomValue(assistantsAtom) const downloadAtom = useMemo( () => atom((get) => get(modelDownloadStateAtom)[model.id]), [model.id] ) const downloadState = useAtomValue(downloadAtom) const { setMainViewState } = useMainViewState() const onDownloadClick = useCallback(() => { downloadModel(model) }, [model]) const isDownloaded = downloadedModels.find((md) => md.id === model.id) != null let downloadButton = ( ) const onUseModelClick = useCallback(async () => { if (assistants.length === 0) { alert('No assistant available') return } await requestCreateNewThread(assistants[0], model) setMainViewState(MainViewState.Thread) }, []) if (isDownloaded) { downloadButton = ( {serverEnabled && ( Threads are disabled while the server is running )} ) } else if (downloadState != null) { downloadButton = } const getLabel = (size: number) => { if (size * 1.25 >= totalRam) { return ( Not enough RAM ) } else { return ( Recommended ) } } return (
{model.metadata.cover && (
{`Cover
)}
{model.name}
{toGibibytes(model.metadata.size)} {getLabel(model.metadata.size)} {downloadButton}
) } export default ExploreModelItemHeader