import { Input } from "@/components/ui/input"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import z from "zod"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Button } from "@/components/ui/button"; import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { useConfig } from "@/providers/config"; import { useEffect, useState } from "react"; import { Domain, targetTypeKeys, targetTypeMap } from "@/domain/domain"; import { save, get } from "@/repository/domains"; import { ClientResponseError } from "pocketbase"; import { PbErrorData } from "@/domain/base"; import { useToast } from "@/components/ui/use-toast"; import { Toaster } from "@/components/ui/toaster"; import { useLocation, useNavigate } from "react-router-dom"; import { Plus } from "lucide-react"; import { AccessEdit } from "@/components/certimate/AccessEdit"; import { accessTypeMap } from "@/domain/access"; import EmailsEdit from "@/components/certimate/EmailsEdit"; import { Textarea } from "@/components/ui/textarea"; import { cn } from "@/lib/utils"; import { EmailsSetting } from "@/domain/settings"; import { useTranslation } from "react-i18next"; const Edit = () => { const { config: { accesses, emails, accessGroups }, } = useConfig(); const [domain, setDomain] = useState(); const location = useLocation(); const { t } = useTranslation(); const [tab, setTab] = useState<"base" | "advance">("base"); const [targetType, setTargetType] = useState(domain ? domain.targetType : ""); useEffect(() => { // Parsing query parameters const queryParams = new URLSearchParams(location.search); const id = queryParams.get("id"); if (id) { const fetchData = async () => { const data = await get(id); setDomain(data); setTargetType(data.targetType); }; fetchData(); } }, [location.search]); const formSchema = z.object({ id: z.string().optional(), domain: z.string().regex(/^(?:\*\.)?([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}$/, { message: 'domain.not.empty.verify.message', }), email: z.string().email('email.valid.message').optional(), access: z.string().regex(/^[a-zA-Z0-9]+$/, { message: 'domain.management.edit.dns.access.not.empty.message', }), targetAccess: z.string().optional(), targetType: z.string().regex(/^[a-zA-Z0-9-]+$/, { message: 'domain.management.edit.target.type.not.empty.message', }), variables: z.string().optional(), group: z.string().optional(), nameservers: z.string().optional(), }); const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: { id: "", domain: "", email: "", access: "", targetAccess: "", targetType: "", variables: "", group: "", nameservers: "", }, }); useEffect(() => { if (domain) { form.reset({ id: domain.id, domain: domain.domain, email: domain.email, access: domain.access, targetAccess: domain.targetAccess, targetType: domain.targetType, variables: domain.variables, group: domain.group, nameservers: domain.nameservers, }); } }, [domain, form]); const targetAccesses = accesses.filter((item) => { if (item.usage == "apply") { return false; } if (targetType == "") { return true; } const types = targetType.split("-"); return item.configType === types[0]; }); const { toast } = useToast(); const navigate = useNavigate(); const onSubmit = async (data: z.infer) => { const group = data.group == "emptyId" ? "" : data.group; const targetAccess = data.targetAccess === "emptyId" ? "" : data.targetAccess; if (group == "" && targetAccess == "") { form.setError("group", { type: "manual", message: 'domain.management.edit.target.access.verify.msg', }); form.setError("targetAccess", { type: "manual", message: 'domain.management.edit.target.access.verify.msg', }); return; } const req: Domain = { id: data.id as string, crontab: "0 0 * * *", domain: data.domain, email: data.email, access: data.access, group: group, targetAccess: targetAccess, targetType: data.targetType, variables: data.variables, nameservers: data.nameservers, }; try { await save(req); let description = t('domain.management.edit.succeed.tips'); if (req.id == "") { description = t('domain.management.add.succeed.tips'); } toast({ title: t('succeed'), description, }); navigate("/domains"); } catch (e) { const err = e as ClientResponseError; Object.entries(err.response.data as PbErrorData).forEach( ([key, value]) => { form.setError(key as keyof z.infer, { type: "manual", message: value.message, }); } ); return; } }; return ( <>
{domain?.id ? t('domain.edit') : t('domain.add')}
{ setTab("base"); }} > {t('basic.setting')}
{ setTab("advance"); }} > {t('advanced.setting')}
( )} /> (
} /> )} /> (
} op="add" /> )} /> ( )} /> (
} op="add" /> )} /> ( )} /> (