'use client'; import { zodResolver } from '@hookform/resolvers/zod'; import { useEffect } from 'react'; import { useForm } from 'react-hook-form'; import { z } from 'zod'; import { AppModal } from '@/components/ui/app-modal'; import type { TunnelItem, TunnelMutationPayload } from '@/features/tunnels/types'; import { PrimaryButton, ResourceField, ResourceInput, SecondaryButton, } from '@/features/shared/components/resource-primitives'; const tunnelEditorSchema = z.object({ name: z .string() .trim() .min(1, '请输入隧道名称') .max(128, '隧道名称不能超过 128 个字符'), remark: z.string().trim().max(255, '备注不能超过 255 个字符').optional().default(''), }); type TunnelEditorValues = z.infer; const defaultValues: TunnelEditorValues = { name: '', remark: '', }; function buildFormValues(tunnel?: Partial | null): TunnelEditorValues { if (!tunnel) { return defaultValues; } return { name: tunnel.name ?? '', remark: tunnel.remark ?? '', }; } export function TunnelEditorModal({ isOpen, tunnel, isSubmitting, title, description, submitLabel, onClose, onSubmit, }: { isOpen: boolean; tunnel?: Partial | null; isSubmitting: boolean; title: string; description: string; submitLabel: string; onClose: () => void; onSubmit: (payload: TunnelMutationPayload) => void; }) { const form = useForm({ resolver: zodResolver(tunnelEditorSchema), defaultValues, }); useEffect(() => { if (!isOpen) { return; } form.reset(buildFormValues(tunnel)); }, [form, isOpen, tunnel]); const handleSubmit = form.handleSubmit((values) => { onSubmit({ name: values.name.trim(), remark: values.remark.trim(), }); }); return ( 取消 {isSubmitting ? '保存中...' : submitLabel} } >
); }