import { useState, useEffect } from 'react' import { useTranslation } from 'react-i18next' import { ChevronDown, ChevronUp, ExternalLink, CheckCircle, XCircle, Settings } from 'lucide-react' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, Button, Input, Label, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Checkbox, Alert, Textarea, } from './ui' import { useDNSProviderTypes, useDNSProviderMutations, type DNSProvider } from '../hooks/useDNSProviders' import type { DNSProviderRequest, DNSProviderTypeInfo } from '../api/dnsProviders' import { defaultProviderSchemas } from '../data/dnsProviderSchemas' import { useEnableMultiCredentials, useCredentials } from '../hooks/useCredentials' import CredentialManager from './CredentialManager' interface DNSProviderFormProps { open: boolean onOpenChange: (open: boolean) => void provider?: DNSProvider | null onSuccess: () => void } export default function DNSProviderForm({ open, onOpenChange, provider = null, onSuccess, }: DNSProviderFormProps) { const { t } = useTranslation() const { data: providerTypes, isLoading: typesLoading } = useDNSProviderTypes() const { createMutation, updateMutation, testCredentialsMutation } = useDNSProviderMutations() const enableMultiCredsMutation = useEnableMultiCredentials() const { data: existingCredentials } = useCredentials(provider?.id || 0) const [name, setName] = useState('') const [providerType, setProviderType] = useState('') const [credentials, setCredentials] = useState>({}) const [propagationTimeout, setPropagationTimeout] = useState(120) const [pollingInterval, setPollingInterval] = useState(5) const [isDefault, setIsDefault] = useState(false) const [useMultiCredentials, setUseMultiCredentials] = useState(false) const [showAdvanced, setShowAdvanced] = useState(false) const [showCredentialManager, setShowCredentialManager] = useState(false) const [testResult, setTestResult] = useState<{ success: boolean; message: string } | null>(null) // Populate form when editing useEffect(() => { if (provider) { setName(provider.name) setProviderType(provider.provider_type) setPropagationTimeout(provider.propagation_timeout) setPollingInterval(provider.polling_interval) setIsDefault(provider.is_default) setUseMultiCredentials((provider as { use_multi_credentials?: boolean }).use_multi_credentials || false) setCredentials({}) // Don't pre-fill credentials (they're encrypted) } else { resetForm() } }, [provider, open]) const resetForm = () => { setName('') setProviderType('') setCredentials({}) setPropagationTimeout(120) setPollingInterval(5) setIsDefault(false) setUseMultiCredentials(false) setShowAdvanced(false) setShowCredentialManager(false) setTestResult(null) } const getSelectedProviderInfo = (): DNSProviderTypeInfo | undefined => { if (!providerType) return undefined return ( providerTypes?.find((pt) => pt.type === providerType) || (defaultProviderSchemas[providerType as keyof typeof defaultProviderSchemas] as DNSProviderTypeInfo) ) } const handleCredentialChange = (fieldName: string, value: string) => { setCredentials((prev) => ({ ...prev, [fieldName]: value })) } const handleTestConnection = async () => { const selectedProvider = getSelectedProviderInfo() if (!selectedProvider) return const data: DNSProviderRequest = { name: name || 'Test', provider_type: providerType as DNSProviderRequest['provider_type'], credentials, propagation_timeout: propagationTimeout, polling_interval: pollingInterval, } try { const result = await testCredentialsMutation.mutateAsync(data) setTestResult({ success: result.success, message: result.message || result.error || t('dnsProviders.testSuccess'), }) } catch (error: unknown) { const err = error as { response?: { data?: { error?: string } }; message?: string } setTestResult({ success: false, message: err.response?.data?.error || err.message || t('dnsProviders.testFailed'), }) } } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() setTestResult(null) const data: DNSProviderRequest = { name, provider_type: providerType as DNSProviderRequest['provider_type'], credentials, propagation_timeout: propagationTimeout, polling_interval: pollingInterval, is_default: isDefault, } try { if (provider) { await updateMutation.mutateAsync({ id: provider.id, data }) } else { await createMutation.mutateAsync(data) } onSuccess() onOpenChange(false) resetForm() } catch (error) { console.error('Failed to save DNS provider:', error) } } const selectedProviderInfo = getSelectedProviderInfo() const isSubmitting = createMutation.isPending || updateMutation.isPending const isTesting = testCredentialsMutation.isPending return ( {provider ? t('dnsProviders.editProvider') : t('dnsProviders.addProvider')}
{/* Provider Type */}
{/* Provider Name */} setName(e.target.value)} placeholder={t('dnsProviders.providerNamePlaceholder')} required aria-label={t('dnsProviders.providerName')} /> {/* Dynamic Credential Fields */} {selectedProviderInfo && ( <>
{selectedProviderInfo.documentation_url && ( {t('dnsProviders.viewDocs')} )}
{selectedProviderInfo.fields?.map((field) => { // Handle select field type if (field.type === 'select' && field.options) { return (
{field.hint && (

{field.hint}

)}
) } // Handle textarea field type if (field.type === 'textarea') { return (