import { memo, ReactNode, useState } from 'react' import { useForm } from 'react-hook-form' import Image from 'next/image' import { zodResolver } from '@hookform/resolvers/zod' import { InferenceEngine, Model } from '@janhq/core' import { Button, Input, Modal } from '@janhq/joi' import { useAtomValue } from 'jotai' import { PlusIcon } from 'lucide-react' import { z } from 'zod' import { addRemoteEngineModel, useGetEngines, useGetRemoteModels, } from '@/hooks/useEngineManagement' import { getLogoEngine, getTitleByEngine } from '@/utils/modelEngine' import { downloadedModelsAtom } from '@/helpers/atoms/Model.atom' const modelSchema = z.object({ modelName: z.string().min(1, 'Model name is required'), }) const ModelAddModel = ({ engine }: { engine: string }) => { const [open, setOpen] = useState(false) const { mutate: mutateListEngines } = useGetRemoteModels(engine) const { engines } = useGetEngines() const models = useAtomValue(downloadedModelsAtom) const { register, handleSubmit, formState: { errors }, setError, } = useForm({ resolver: zodResolver(modelSchema), defaultValues: { modelName: '', }, }) const onSubmit = async (data: z.infer) => { if (models.some((e: Model) => e.id === data.modelName)) { setError('modelName', { type: 'manual', message: 'Model already exists', }) return } await addRemoteEngineModel(data.modelName, engine) mutateListEngines() setOpen(false) } // Helper to render labels with asterisks for required fields const renderLabel = ( prefix: ReactNode, label: string, isRequired: boolean, desc?: string ) => ( <> {prefix} {label}

{desc} {isRequired && *}

) return (

Add Model

} fullPage open={open} onOpenChange={() => setOpen(!open)} trigger={ } className="w-[500px]" content={
{errors.modelName && (

{errors.modelName.message}

)}
} /> ) } export default memo(ModelAddModel)