import { memo, useState } from 'react' import { Model } from '@janhq/core' import { Badge, Button, Tooltip, useClickOutside } from '@janhq/joi' import { useAtom } from 'jotai' import { MoreVerticalIcon, PlayIcon, StopCircleIcon, Trash2Icon, } from 'lucide-react' import { twMerge } from 'tailwind-merge' import { useActiveModel } from '@/hooks/useActiveModel' import useDeleteModel from '@/hooks/useDeleteModel' import { toGibibytes } from '@/utils/converter' import { isLocalEngine } from '@/utils/modelEngine' import { serverEnabledAtom } from '@/helpers/atoms/LocalServer.atom' type Props = { model: Model groupTitle?: string } const MyModelList = ({ model }: Props) => { const { activeModel, startModel, stopModel, stateModel } = useActiveModel() const isActiveModel = stateModel.model?.id === model.id const { deleteModel } = useDeleteModel() const [more, setMore] = useState(false) const [serverEnabled, setServerEnabled] = useAtom(serverEnabledAtom) const [menu, setMenu] = useState(null) const [toggle, setToggle] = useState(null) useClickOutside(() => setMore(false), null, [menu, toggle]) const onModelActionClick = (modelId: string) => { if (activeModel && activeModel.id === modelId) { stopModel() window.core?.api?.stopServer() setServerEnabled(false) } else if (!serverEnabled) { startModel(modelId) } } return (
{model.name}
{isLocalEngine(model.engine) && (

{model.id}

)}
{isLocalEngine(model.engine) && (
{model.metadata?.size ? toGibibytes(model.metadata?.size) : '-'}
{stateModel.loading && stateModel.model?.id === model.id ? ( {stateModel.state === 'start' ? 'Starting...' : 'Stopping...'} ) : activeModel && activeModel.id === model.id ? ( Active ) : ( Inactive )}
{ setMore(!more) }} > {more && (
{ onModelActionClick(model.id) setMore(false) }} > {activeModel && activeModel.id === model.id ? ( ) : ( )} {isActiveModel ? stateModel.state : 'Start'}  Model
} disabled={!serverEnabled} content={ {activeModel && activeModel.id === model.id ? 'The API server is running, change model will stop the server' : 'Threads are disabled while the server is running'} } />
{ setTimeout(async () => { if (!serverEnabled) { await stopModel() deleteModel(model) } }, 500) setMore(false) }} > Delete Model
)}
)}
) } export default memo(MyModelList)