'use client'; import { zodResolver } from '@hookform/resolvers/zod'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { useEffect } from 'react'; import { useForm } from 'react-hook-form'; import { EmptyState } from '@/components/feedback/empty-state'; import { ErrorState } from '@/components/feedback/error-state'; import { InlineMessage } from '@/components/feedback/inline-message'; import { LoadingState } from '@/components/feedback/loading-state'; import { AppModal } from '@/components/ui/app-modal'; import { getTlsCertificateContent, updateTlsCertificate, } from '@/features/tls-certificates/api/tls-certificates'; import type { TlsCertificateItem } from '@/features/tls-certificates/types'; import { defaultManualImportValues, manualImportSchema, type ManualImportFormValues, } from '@/features/websites/schemas'; import { getErrorMessage, toManualPayload } from '@/features/websites/utils'; import { PrimaryButton, ResourceField, ResourceInput, ResourceTextarea, SecondaryButton, } from '@/features/shared/components/resource-primitives'; interface CertificateEditorModalProps { certificateId: number | null; isOpen: boolean; onClose: () => void; onSaved?: (certificate: TlsCertificateItem) => void; } export function CertificateEditorModal({ certificateId, isOpen, onClose, onSaved, }: CertificateEditorModalProps) { const queryClient = useQueryClient(); const form = useForm({ resolver: zodResolver(manualImportSchema), defaultValues: defaultManualImportValues, }); const certificateQuery = useQuery({ queryKey: ['tls-certificates', 'content', certificateId], queryFn: () => getTlsCertificateContent(certificateId as number), enabled: isOpen && certificateId !== null, }); const updateMutation = useMutation({ mutationFn: async (values: ManualImportFormValues) => updateTlsCertificate(certificateId as number, toManualPayload(values)), onSuccess: async (certificate) => { await Promise.all([ queryClient.invalidateQueries({ queryKey: ['tls-certificates'] }), queryClient.invalidateQueries({ queryKey: ['managed-domains'] }), ]); onSaved?.(certificate); handleClose(); }, }); useEffect(() => { if (!isOpen || !certificateQuery.data) { return; } form.reset({ name: certificateQuery.data.name, cert_pem: certificateQuery.data.cert_pem, key_pem: certificateQuery.data.key_pem, remark: certificateQuery.data.remark || '', }); }, [certificateQuery.data, form, isOpen]); const handleSubmit = form.handleSubmit((values) => { updateMutation.mutate(values); }); const handleClose = () => { updateMutation.reset(); form.reset(defaultManualImportValues); onClose(); }; return ( 取消 {updateMutation.isPending ? '保存中...' : '保存证书'} } > {certificateQuery.isLoading ? ( ) : certificateQuery.isError ? ( ) : !certificateQuery.data ? ( ) : (
{updateMutation.isError ? ( ) : null}
)}
); }