'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 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 [name, setName] = 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 ?? ''); setPrimaryNodeID(group ? String(group.primary_node.id) : ''); setBackupNodeID(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('primary')} {t('backup')} {t('defaultProxied')} {t('enableSync')} ); }