'use client'; import { useTranslations } from 'next-intl'; import { useEffect, useMemo, useState } from 'react'; import { Button } from '@/components/ui/button'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { Field, FieldGroup, FieldLabel } from '@/components/ui/field'; import { Input } from '@/components/ui/input'; import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { Switch } from '@/components/ui/switch'; import { ToggleGroup, ToggleGroupItem } from '@/components/ui/toggle-group'; import type { CloudflareGroup, CloudflareGroupPayload, NodeItem, } from '@/lib/services/openflare'; export function GroupDialog({ open, onOpenChange, group, nodes, pending, onSubmit, }: { open: boolean; onOpenChange: (open: boolean) => void; group?: CloudflareGroup | null; nodes: NodeItem[]; pending: boolean; onSubmit: (payload: CloudflareGroupPayload) => void; }) { const t = useTranslations('cloudflare.groupDialog'); const tCommon = useTranslations('common'); const edgeNodes = useMemo( () => nodes.filter((node) => node.node_type === 'edge_node'), [nodes], ); const recordContentPlaceholders = { CNAME: t('recordContentPlaceholder.CNAME'), A: t('recordContentPlaceholder.A'), AAAA: t('recordContentPlaceholder.AAAA'), }; const [name, setName] = useState(''); const [targetMode, setTargetMode] = useState<'node' | 'custom'>('node'); const [recordType, setRecordType] = useState<'CNAME' | 'A' | 'AAAA'>('A'); const [recordContent, setRecordContent] = useState(''); const [primaryNodeID, setPrimaryNodeID] = useState(''); const [backupNodeID, setBackupNodeID] = useState('none'); const [defaultProxied, setDefaultProxied] = useState(true); const [enabled, setEnabled] = useState(true); useEffect(() => { if (!open) return; setName(group?.name ?? ''); setTargetMode(group?.target_mode === 'custom' ? 'custom' : 'node'); setRecordType(group?.record_type ?? 'A'); setRecordContent(group?.record_content ?? ''); setPrimaryNodeID( group?.target_mode !== 'custom' && group ? String(group.primary_node.id) : '', ); setBackupNodeID( group?.target_mode !== 'custom' && group?.backup_node ? String(group.backup_node.id) : 'none', ); setDefaultProxied(group?.default_proxied ?? true); setEnabled(group?.enabled ?? true); }, [group, open]); return ( {group ? t('editTitle') : t('createTitle')} {t('description')} {t('name')} setName(event.target.value)} /> {t('targetMode')} { if (value === 'node' || value === 'custom') { setTargetMode(value); } }} > {t('bindNode')} {t('customTarget')} {targetMode === 'node' ? ( <> {t('primary')} {t('backup')} ) : ( <> {t('recordType')} {t('recordContent')} setRecordContent(event.target.value)} />

{t('recordContentHint')}

)} {t('defaultProxied')} {t('enableSync')}
); }