"use client" import { zodResolver } from "@hookform/resolvers/zod" import { useState } from "react" import { Controller, useForm } from "react-hook-form" import z from "zod" import { Button } from "@/components/ui/button" import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog" import { Field, FieldError, FieldGroup, FieldLabel, } from "@/components/ui/field" import { Input } from "@/components/ui/input" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { toast } from "sonner" import { createGateway } from "@/actions/gateway" const schema = z.object({ mac: z.string().regex(/^([0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2}$/, { message: "MAC地址格式不正确,请使用如 00:11:22:AA:BB:CC 或 00-11-22-AA-BB-CC 的格式" }), ip: z.string().regex(/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/, { message: "IP地址格式不正确,请使用如 192.168.1.1 的格式" }), host: z.string().regex(/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$/, { message: "域名格式不正确,请使用如 example.com 的格式" }).or(z.literal("")), type: z.string().optional(), status: z.string().optional(), }) export default function CreatePage(props: { onSuccess?: () => void }) { const [open, setOpen] = useState(false) const [isLoading, setIsLoading] = useState(false) const form = useForm({ resolver: zodResolver(schema), defaultValues: { mac: "", ip: "", host: "", type: "1", status: "0", }, }) const onSubmit = async (data: z.infer) => { setIsLoading(true) try { const payload = { mac: data.mac.trim(), ip: data.ip.trim(), host: data?.host.trim(), type: data.type ? Number(data.type) : 0, status: data.status ? Number(data.status) : 0, } const res = await createGateway(payload) if (res.success) { toast.success("添加网关成功") setOpen(false) props.onSuccess?.() form.reset() }else { toast.error(res.message || "添加失败") } } catch (error) { console.error("添加网关失败:", error) const message = error instanceof Error ? error.message : error toast.error(`添加失败: ${message}`) } finally { setIsLoading(false) } } const handleCancel = () => { setOpen(false) form.reset() } const statusOptions = [ { value: "0", label: "离线" }, { value: "1", label: "在线" }, ] const typeOptions = [ { value: "1", label: "自有" }, { value: "2", label: "白银" }, ] return ( { setOpen(newOpen) if (!newOpen) { form.reset() } }} > 添加网关
( MAC地址: {fieldState.invalid && fieldState.error && ( )} )} /> ( IP地址: {fieldState.invalid && fieldState.error && ( )} )} /> ( 域名: {fieldState.invalid && fieldState.error && ( )} )} /> ( 类型 {fieldState.invalid && fieldState.error && ( {fieldState.error?.message} )} )} /> ( 状态 {fieldState.invalid && fieldState.error && ( {fieldState.error?.message} )} )} />
) }