import { memo, useCallback, useMemo, useState } from 'react' import { LocalEngines, Model } from '@janhq/core' import { Badge, Button, useClickOutside } from '@janhq/joi' import { useAtomValue } from 'jotai' import { MoreVerticalIcon, PlayIcon, StopCircleIcon, Trash2Icon, } from 'lucide-react' import { twMerge } from 'tailwind-merge' import useModelStart from '@/hooks/useModelStart' import useModels from '@/hooks/useModels' import { activeModelsAtom } from '@/helpers/atoms/Model.atom' type Props = { model: Model } const ModelItem: React.FC = ({ model }) => { const activeModels = useAtomValue(activeModelsAtom) const startModel = useModelStart() const [more, setMore] = useState(false) const { stopModel, deleteModel } = useModels() const [menu, setMenu] = useState(null) const [toggle, setToggle] = useState(null) useClickOutside(() => setMore(false), null, [menu, toggle]) const isActive = useMemo( () => activeModels.map((m) => m.model).includes(model.model), [activeModels, model.model] ) const onModelActionClick = useCallback( (modelId: string) => { if (isActive) { stopModel(modelId) } else { startModel.mutate(modelId) } }, [isActive, startModel, stopModel] ) const onDeleteModelClicked = useCallback( async (modelId: string) => { await stopModel(modelId) await deleteModel(modelId) }, [stopModel, deleteModel] ) const isLocalModel = LocalEngines.find( (e) => model.engine != null && e === model.engine ) return (
{model.model}
{model.engine === 'cortex.llamacpp' && (

{model.model}

)}
{isLocalModel && (
{model.version != null ? `v${model.version}` : '-'}
{isActive ? ( Active ) : ( Inactive )}
{ setMore(!more) }} > {more && (
{ onModelActionClick(model.model) setMore(false) }} > {isActive ? ( ) : ( )} {isActive ? 'Stop' : 'Start'}  Model
onDeleteModelClicked(model.model)} > Delete Model
)}
)}
) } export default memo(ModelItem)