import { Description, Dialog, DialogPanel, DialogTitle, } from '@headlessui/react'; import { Loader2, Plus } from 'lucide-react'; import { useMemo, useState } from 'react'; import { AnimatePresence, motion } from 'framer-motion'; import { ConfigModelProvider, ModelProviderUISection, StringUIConfigField, UIConfigField, } from '@/lib/config/types'; import Select from '@/components/ui/Select'; import { toast } from 'sonner'; const AddProvider = ({ modelProviders, setProviders, }: { modelProviders: ModelProviderUISection[]; setProviders: React.Dispatch>; }) => { const [open, setOpen] = useState(false); const [selectedProvider, setSelectedProvider] = useState( modelProviders[0]?.key || null, ); const [config, setConfig] = useState>({}); const [name, setName] = useState(''); const [loading, setLoading] = useState(false); const providerConfigMap = useMemo(() => { const map: Record = {}; modelProviders.forEach((p) => { map[p.key] = { name: p.name, fields: p.fields, }; }); return map; }, [modelProviders]); const selectedProviderFields = useMemo(() => { if (!selectedProvider) return []; const providerFields = providerConfigMap[selectedProvider]?.fields || []; const config: Record = {}; providerFields.forEach((field) => { config[field.key] = field.default || ''; }); setConfig(config); return providerFields; }, [selectedProvider, providerConfigMap]); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setLoading(true); try { const res = await fetch('/api/providers', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ type: selectedProvider, name: name, config: config, }), }); if (!res.ok) { throw new Error('Failed to add provider'); } const data: ConfigModelProvider = (await res.json()).provider; setProviders((prev) => [...prev, data]); toast.success('Provider added successfully.'); } catch (error) { console.error('Error adding provider:', error); toast.error('Failed to add provider.'); } finally { setLoading(false); setOpen(false); } }; return ( <> {open && ( setOpen(false)} className="relative z-[60]" >

Add new provider

setName(e.target.value)} className="w-full rounded-lg border border-light-200 dark:border-dark-200 bg-light-primary dark:bg-dark-primary px-4 py-3 pr-10 text-sm text-black/80 dark:text-white/80 placeholder:text-black/40 dark:placeholder:text-white/40 focus-visible:outline-none focus-visible:border-light-300 dark:focus-visible:border-dark-300 transition-colors disabled:cursor-not-allowed disabled:opacity-60" placeholder={'Provider Name'} type="text" required={true} />
{selectedProviderFields.map((field: UIConfigField) => (
setConfig((prev) => ({ ...prev, [field.key]: event.target.value, })) } className="w-full rounded-lg border border-light-200 dark:border-dark-200 bg-light-primary dark:bg-dark-primary px-4 py-3 pr-10 text-sm text-black/80 dark:text-white/80 placeholder:text-black/40 dark:placeholder:text-white/40 focus-visible:outline-none focus-visible:border-light-300 dark:focus-visible:border-dark-300 transition-colors disabled:cursor-not-allowed disabled:opacity-60" placeholder={ (field as StringUIConfigField).placeholder } type="text" required={field.required} />
))}
)}
); }; export default AddProvider;