import { useState } from 'react'; import { Card, CardHeader, CardTitle, CardContent } from './ui/card'; import { Button } from './ui/button'; import { Textarea } from './ui/textarea'; import { Alert, AlertDescription } from './ui/alert'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from './ui/dialog'; import { Router, CheckCircle, ExternalLink, Loader2, AlertCircle, Play, RotateCw, Copy, ChevronDown, ChevronUp, Edit } from 'lucide-react'; import { Badge } from './ui/badge'; import { useConfig } from '../hooks'; import { useDnsmasq } from '../hooks/useDnsmasq'; import { apiService } from '../services/api-legacy'; export function LanDnsComponent() { const { config: globalConfig } = useConfig(); const { status: dnsStatus, isLoadingStatus: isDnsStatusLoading, config: dnsConfig, fetchConfig: fetchDnsConfig, generateConfig: generateDnsConfig, isGenerating: isDnsGenerating, generateData: dnsGenerateData, restart: restartDns, isRestarting: isDnsRestarting, restartData: dnsRestartData, generateError: dnsGenerateError, restartError: dnsRestartError, } = useDnsmasq(); const [showDnsAdvanced, setShowDnsAdvanced] = useState(false); const [showDnsEditDialog, setShowDnsEditDialog] = useState(false); const [editedDnsConfig, setEditedDnsConfig] = useState(''); const [copiedDnsIp, setCopiedDnsIp] = useState(false); const isDnsRunning = dnsStatus?.status === 'active'; const dnsIp = dnsStatus?.ip; const handleCopyDnsIp = () => { if (dnsIp) { navigator.clipboard.writeText(dnsIp); setCopiedDnsIp(true); setTimeout(() => setCopiedDnsIp(false), 2000); } }; const handleShowDnsAdvanced = () => { if (!showDnsAdvanced && !dnsConfig) { fetchDnsConfig(); } setShowDnsAdvanced(!showDnsAdvanced); }; const handleEditDnsConfig = () => { if (dnsConfig?.content) { setEditedDnsConfig(dnsConfig.content); } else if (dnsGenerateData?.config || dnsGenerateData?.content) { setEditedDnsConfig(dnsGenerateData.config || dnsGenerateData.content || ''); } else { setEditedDnsConfig(''); } setShowDnsEditDialog(true); }; const handleSaveDnsConfig = async () => { try { await apiService.writeDnsmasqConfig(editedDnsConfig); setShowDnsEditDialog(false); fetchDnsConfig(); } catch (error) { console.error('Failed to save config:', error); } }; const handleSaveAndRestartDns = async () => { try { await apiService.writeDnsmasqConfig(editedDnsConfig); await apiService.restartDnsmasq(); setShowDnsEditDialog(false); fetchDnsConfig(); } catch (error) { console.error('Failed to save config and restart:', error); } }; return (

LAN DNS

Resolves Wild Cloud domains on your local network via dnsmasq

DNS Service {isDnsStatusLoading ? ( ) : isDnsRunning ? ( ) : null} {isDnsStatusLoading ? 'Checking...' : isDnsRunning ? 'Running' : 'Stopped'}
Set this as the primary DNS server in your router
{dnsIp || 'Auto-detecting...'}
{globalConfig?.cloud?.router?.ip && (
Router: {globalConfig.cloud.router.ip}
)}
{!isDnsRunning ? ( ) : ( )}
{(dnsGenerateData || dnsRestartData) && ( {dnsGenerateData?.message || dnsRestartData?.message} )} {(dnsGenerateError || dnsRestartError) && ( {(dnsGenerateError || dnsRestartError)?.toString()} )}
{showDnsAdvanced && (
Advanced DNS Configuration
              {isDnsGenerating && !dnsConfig && !dnsGenerateData && (
                
)} {(dnsConfig?.content || dnsGenerateData?.config || dnsGenerateData?.content) && ( dnsConfig?.content || dnsGenerateData?.config || dnsGenerateData?.content )} {!isDnsGenerating && !dnsGenerateData && !dnsConfig && (

Configuration preview will appear here

)}
)} Edit DNS Configuration Modify the dnsmasq configuration. Changes will take effect after saving and restarting.