'use client'; import { zodResolver } from '@hookform/resolvers/zod'; import { useMutation, useQueryClient } from '@tanstack/react-query'; import { useEffect } from 'react'; import { useForm, useWatch } from 'react-hook-form'; import { InlineMessage } from '@/components/feedback/inline-message'; import { AppModal } from '@/components/ui/app-modal'; import { StatusBadge } from '@/components/ui/status-badge'; import { createManagedDomain, updateManagedDomain, } from '@/features/managed-domains/api/managed-domains'; import type { ManagedDomainItem } from '@/features/managed-domains/types'; import type { TlsCertificateItem } from '@/features/tls-certificates/types'; import { defaultManagedDomainValues, managedDomainSchema, type ManagedDomainFormValues, } from '@/features/websites/schemas'; import { buildCertificateLabel, getErrorMessage, getMatchTypeMeta, toManagedDomainFormValues, toManagedDomainPayload, } from '@/features/websites/utils'; import { PrimaryButton, ResourceField, ResourceInput, ResourceSelect, SecondaryButton, ToggleField, } from '@/features/shared/components/resource-primitives'; interface WebsiteEditorModalProps { isOpen: boolean; onClose: () => void; onSaved?: (domain: ManagedDomainItem, mode: 'create' | 'update') => void; onRequestImportCertificate: () => void; certificates: TlsCertificateItem[]; certificatesLoading?: boolean; initialDomain?: ManagedDomainItem | null; preferredCertificateId?: number | null; } export function WebsiteEditorModal({ isOpen, onClose, onSaved, onRequestImportCertificate, certificates, certificatesLoading = false, initialDomain = null, preferredCertificateId = null, }: WebsiteEditorModalProps) { const queryClient = useQueryClient(); const form = useForm({ resolver: zodResolver(managedDomainSchema), defaultValues: defaultManagedDomainValues, }); const watchedDomain = useWatch({ control: form.control, name: 'domain', }); const watchedCertId = useWatch({ control: form.control, name: 'cert_id', }); const watchedEnabled = useWatch({ control: form.control, name: 'enabled', }); const saveMutation = useMutation({ mutationFn: async (values: ManagedDomainFormValues) => { const payload = toManagedDomainPayload(values); return initialDomain ? updateManagedDomain(initialDomain.id, payload) : createManagedDomain(payload); }, onSuccess: async (domain) => { await queryClient.invalidateQueries({ queryKey: ['managed-domains'] }); onSaved?.(domain, initialDomain ? 'update' : 'create'); handleClose(); }, }); const currentCertificate = watchedCertId ? (certificates.find((item) => item.id === Number(watchedCertId)) ?? null) : null; const handleSubmit = form.handleSubmit((values) => { saveMutation.mutate(values); }); const handleClose = () => { saveMutation.reset(); form.reset(defaultManagedDomainValues); onClose(); }; useEffect(() => { if (!isOpen) { return; } form.reset( initialDomain ? toManagedDomainFormValues(initialDomain) : defaultManagedDomainValues, ); }, [form, initialDomain, isOpen]); useEffect(() => { if (!isOpen || !preferredCertificateId) { return; } form.setValue('cert_id', String(preferredCertificateId), { shouldDirty: true, shouldValidate: true, }); }, [form, isOpen, preferredCertificateId]); return ( 取消 {saveMutation.isPending ? '保存中...' : initialDomain ? '保存网站' : '创建网站'} } >
{saveMutation.isError ? ( ) : null}
form.setValue('cert_id', event.target.value, { shouldDirty: true, shouldValidate: true, }) } > {certificates.map((certificate) => ( ))} 添加证书

当前域名

{watchedDomain?.trim() || '未填写域名'}

匹配类型

{watchedDomain?.trim() ? ( ) : ( )}

当前证书

form.setValue('enabled', checked, { shouldDirty: true, shouldValidate: true, }) } />
); }