import { Button } from "@/components/ui/button"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; import { useToast } from "@/components/ui/use-toast"; import { SSLProvider as SSLProviderType, SSLProviderSetting, Setting, } from "@/domain/settings"; import { getErrMessage } from "@/lib/error"; import { cn } from "@/lib/utils"; import { getSetting, update } from "@/repository/settings"; import { zodResolver } from "@hookform/resolvers/zod"; import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { z } from "zod"; const SSLProvider = () => { const { t } = useTranslation(); const formSchema = z.object({ provider: z.enum(["letsencrypt", "zerossl"], { message: t("setting.ca.not.empty"), }), eabKid: z.string().optional(), eabHmacKey: z.string().optional(), }); const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: { provider: "letsencrypt", }, }); const [provider, setProvider] = useState("letsencrypt"); const [config, setConfig] = useState(); const { toast } = useToast(); useEffect(() => { const fetchData = async () => { const setting = await getSetting("ssl-provider"); if (setting) { setConfig(setting); const content = setting.content as SSLProviderSetting; form.setValue("provider", content.provider); form.setValue("eabKid", content.config[content.provider].eabKid); form.setValue( "eabHmacKey", content.config[content.provider].eabHmacKey ); setProvider(content.provider); } else { form.setValue("provider", "letsencrypt"); setProvider("letsencrypt"); } }; fetchData(); }, []); const getOptionCls = (val: string) => { if (provider === val) { return "border-primary"; } return ""; }; const onSubmit = async (values: z.infer) => { if (values.provider === "zerossl") { if (!values.eabKid) { form.setError("eabKid", { message: t("setting.ca.eab_kid_hmac_key.not.empty"), }); } if (!values.eabHmacKey) { form.setError("eabHmacKey", { message: t("setting.ca.eab_kid_hmac_key.not.empty"), }); } if (!values.eabKid || !values.eabHmacKey) { return; } } const setting: Setting = { id: config?.id, name: "ssl-provider", content: { provider: values.provider, config: { letsencrypt: {}, zerossl: { eabKid: values.eabKid ?? "", eabHmacKey: values.eabHmacKey ?? "", }, }, }, }; try { await update(setting); toast({ title: t("update.succeed"), description: t("update.succeed"), }); } catch (e) { const message = getErrMessage(e); toast({ title: t("update.failed"), description: message, variant: "destructive", }); } }; return ( <>
( {t("ca")} { setProvider(val); form.setValue("provider", val as SSLProviderType); }} value={provider} >
( )} /> ( )} />
)} />
); }; export default SSLProvider;