import React, { useState } from 'react'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Textarea } from '@/components/ui/textarea'; import { Checkbox } from '@/components/ui/checkbox'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { ExternalLink, AlertTriangle, Plus, Trash2, Edit2, ChevronDown, ChevronUp } from 'lucide-react'; interface GatewayField { id: string; type: string; title: string; description: string; default: string | boolean; value?: string | boolean; // Current saved value from backend placeholder?: string; required: boolean; options?: Record; custom_attributes?: Record; } interface GatewaySettings { basic: Record; api: Record; advanced: Record; } interface GenericGatewayFormProps { gateway: { id: string; title: string; settings: { basic: Record; api: Record; advanced: Record; }; wc_settings_url: string; }; onSave: (settings: Record) => Promise; onCancel: () => void; hideFooter?: boolean; } // Supported field types (outside component to avoid re-renders) // Note: WooCommerce BACS uses 'account_details' type for bank account repeater const SUPPORTED_FIELD_TYPES = ['text', 'password', 'checkbox', 'select', 'textarea', 'number', 'email', 'url', 'account', 'account_details', 'title', 'multiselect']; // Bank account interface interface BankAccount { account_name: string; account_number: string; bank_name: string; sort_code?: string; iban?: string; bic?: string; } export function GenericGatewayForm({ gateway, onSave, onCancel, hideFooter = false }: GenericGatewayFormProps) { const [formData, setFormData] = useState>({}); const [isSaving, setIsSaving] = useState(false); const [unsupportedFields, setUnsupportedFields] = useState([]); // Initialize form data with current gateway values React.useEffect(() => { const initialData: Record = {}; const categories: Record[] = [ gateway.settings.basic, gateway.settings.api, gateway.settings.advanced, ]; categories.forEach((category) => { Object.values(category).forEach((field) => { // Use current value from field (backend sends this now!) initialData[field.id] = field.value ?? field.default; }); }); setFormData(initialData); }, [gateway]); // Check for unsupported fields React.useEffect(() => { const unsupported: string[] = []; const categories: Record[] = [ gateway.settings.basic, gateway.settings.api, gateway.settings.advanced, ]; categories.forEach((category) => { Object.values(category).forEach((field) => { if (!SUPPORTED_FIELD_TYPES.includes(field.type)) { unsupported.push(field.title || field.id); } }); }); setUnsupportedFields(unsupported); }, [gateway]); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setIsSaving(true); try { await onSave(formData); } finally { setIsSaving(false); } }; const handleFieldChange = (fieldId: string, value: unknown) => { setFormData((prev) => ({ ...prev, [fieldId]: value, })); }; const renderField = (field: GatewayField) => { const value = formData[field.id] ?? field.default; // Unsupported field type if (!SUPPORTED_FIELD_TYPES.includes(field.type)) { return null; } switch (field.type) { case 'title': // Title field is just a heading/separator return (

{field.title}

{field.description && (

)}

); case 'checkbox': // Skip "enabled" field - already controlled by toggle in main UI if (field.id === 'enabled') { return null; } // WooCommerce uses "yes"/"no" strings, convert to boolean const isChecked = value === 'yes' || value === true; return (
handleFieldChange(field.id, checked ? 'yes' : 'no')} />
{field.description && (

)}

); case 'select': // Ensure select has a value - use current value, saved value, or default const selectValue = (value || field.value || field.default) as string; return (
{field.description && (

)}

); case 'textarea': return (
{field.description && (

)}