import { useEffect, useMemo } from "react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { useTranslation } from "react-i18next"; import { Button } from "@/components/ui/button"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { useTheme } from "@/components/theme-provider"; import JsonEditor from "@/components/JsonEditor"; import { providerSchema, type ProviderFormData } from "@/lib/schemas/provider"; interface ProviderFormProps { submitLabel: string; onSubmit: (values: ProviderFormData) => void; onCancel: () => void; initialData?: { name?: string; websiteUrl?: string; settingsConfig?: Record; }; } const DEFAULT_CONFIG_PLACEHOLDER = `{ "env": {}, "config": {} }`; export function ProviderForm({ submitLabel, onSubmit, onCancel, initialData, }: ProviderFormProps) { const { t } = useTranslation(); const { theme } = useTheme(); const defaultValues: ProviderFormData = useMemo( () => ({ name: initialData?.name ?? "", websiteUrl: initialData?.websiteUrl ?? "", settingsConfig: initialData?.settingsConfig ? JSON.stringify(initialData.settingsConfig, null, 2) : DEFAULT_CONFIG_PLACEHOLDER, }), [initialData], ); const form = useForm({ resolver: zodResolver(providerSchema), defaultValues, mode: "onSubmit", }); useEffect(() => { form.reset(defaultValues); }, [defaultValues, form]); const isDarkMode = useMemo(() => { if (theme === "dark") return true; if (theme === "light") return false; return typeof window !== "undefined" ? window.document.documentElement.classList.contains("dark") : false; }, [theme]); const handleSubmit = (values: ProviderFormData) => { onSubmit({ ...values, websiteUrl: values.websiteUrl?.trim() ?? "", settingsConfig: values.settingsConfig.trim(), }); }; return (
( {t("provider.name", { defaultValue: "供应商名称" })} )} /> ( {t("provider.websiteUrl", { defaultValue: "官网链接" })} )} /> ( {t("provider.configJson", { defaultValue: "配置 JSON" })}
)} />
); } export type ProviderFormValues = ProviderFormData;