'use client'; import { useState, useEffect } from 'react'; import { Settings as SettingsIcon, Plus, Trash2, Save, RefreshCw, Wifi, Clock } from 'lucide-react'; const Settings = () => { const [config, setConfig] = useState(null); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [currentIPs, setCurrentIPs] = useState({ ipv4: '', ipv6: '' }); const [checkingIP, setCheckingIP] = useState(false); const fetchConfig = async () => { try { const response = await fetch('/api/config'); const data = await response.json(); if (data.success) { setConfig(data.config); } } catch (error) { console.error('Error fetching config:', error); } setLoading(false); }; const fetchCurrentIPs = async () => { try { const response = await fetch('/api/ip/current'); const data = await response.json(); if (data.success && data.ips) { setCurrentIPs(data.ips); } } catch (error) { console.error('Error fetching current IPs:', error); } }; const checkIPs = async () => { setCheckingIP(true); try { const response = await fetch('/api/ip/current', { method: 'POST' }); const data = await response.json(); if (data.success) { setCurrentIPs(data.newIPs); } } catch (error) { console.error('Error checking IPs:', error); } setCheckingIP(false); }; useEffect(() => { // Initial data loading // eslint-disable-next-line react-hooks/set-state-in-effect fetchConfig(); fetchCurrentIPs(); }, []); const saveConfig = async () => { setSaving(true); try { const response = await fetch('/api/config', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(config) }); if (response.ok) { alert('Configuration saved successfully'); } } catch (error) { console.error('Error saving config:', error); alert('Error saving configuration'); } setSaving(false); }; const addAccount = () => { const newAccount = { id: `account${Date.now()}`, name: 'New Account', appKey: '', appSecret: '', consumerKey: '', endpoint: 'ovh-eu', domains: [] }; setConfig({ ...config, ovhAccounts: [...config.ovhAccounts, newAccount] }); }; const removeAccount = (accountId) => { if (!confirm('Are you sure you want to delete this account?')) return; setConfig({ ...config, ovhAccounts: config.ovhAccounts.filter(acc => acc.id !== accountId) }); }; const updateAccount = (accountId, field, value) => { setConfig({ ...config, ovhAccounts: config.ovhAccounts.map(acc => acc.id === accountId ? { ...acc, [field]: value } : acc ) }); }; const addDomain = (accountId) => { const domain = prompt('Enter the domain name:'); if (!domain) return; setConfig({ ...config, ovhAccounts: config.ovhAccounts.map(acc => acc.id === accountId ? { ...acc, domains: [...(acc.domains || []), domain] } : acc ) }); }; const removeDomainFromAccount = (accountId, domain) => { setConfig({ ...config, ovhAccounts: config.ovhAccounts.map(acc => acc.id === accountId ? { ...acc, domains: acc.domains.filter(d => d !== domain) } : acc ) }); }; const updateIPProvider = (providerId, field, value) => { setConfig({ ...config, ipProviders: config.ipProviders.map(provider => provider.id === providerId ? { ...provider, [field]: value } : provider ) }); }; const updateAutoUpdate = (field, value) => { setConfig({ ...config, autoUpdate: { ...config.autoUpdate, [field]: value } }); }; if (loading || !config) { return (

Cargando configuración...

); } return (
{/* Header */}

Settings

Manage your OVH accounts and IP providers

{/* Current IPs Section */}

IPs Actuales

IPv4

{currentIPs.ipv4 || 'No disponible'}

IPv6

{currentIPs.ipv6 || 'No disponible'}

{/* OVH Accounts Section */}

Cuentas OVH

{config.ovhAccounts.map((account) => (
updateAccount(account.id, 'name', e.target.value)} className="text-lg font-semibold text-gray-900 bg-transparent border-none focus:outline-none focus:ring-2 focus:ring-blue-500 rounded px-2" />
updateAccount(account.id, 'appKey', e.target.value)} className="block w-full border-gray-300 rounded-lg shadow-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500 py-2 px-3" placeholder="Your OVH App Key" />
updateAccount(account.id, 'appSecret', e.target.value)} className="block w-full border-gray-300 rounded-lg shadow-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500 py-2 px-3" placeholder="Your OVH App Secret" />
updateAccount(account.id, 'consumerKey', e.target.value)} className="block w-full border-gray-300 rounded-lg shadow-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500 py-2 px-3" placeholder="Your OVH Consumer Key" />
{account.domains?.map((domain) => ( {domain} ))} {(!account.domains || account.domains.length === 0) && ( No hay dominios configurados )}
))}
{/* IP Providers Section */}

IP Providers

{config.ipProviders.map((provider) => (

{provider.name}

updateIPProvider(provider.id, 'ipv4Url', e.target.value)} className="block w-full border-gray-300 rounded-lg shadow-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500 py-2 px-3" />
updateIPProvider(provider.id, 'ipv6Url', e.target.value)} className="block w-full border-gray-300 rounded-lg shadow-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500 py-2 px-3" />
))}
{/* Auto Update Section */}

Actualización Automática

updateAutoUpdate('checkInterval', parseInt(e.target.value))} className="block w-full border-gray-300 rounded-lg shadow-sm focus:ring-2 focus:ring-purple-500 focus:border-purple-500 py-2 px-3" min="60" />
updateAutoUpdate('targetDomains', e.target.value.split(',').map(d => d.trim()).filter(Boolean))} className="block w-full border-gray-300 rounded-lg shadow-sm focus:ring-2 focus:ring-purple-500 focus:border-purple-500 py-2 px-3" placeholder="domain1.com, domain2.com" />

Automatic updates will periodically check public IPs and update DNS records for the specified domains.

); }; export default Settings;