'use client'; 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 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 ? '编辑指向分组' : '新增指向分组'} 一期使用主节点作为生效节点;备用节点仅保存,不会自动切换。 分组名称 setName(event.target.value)} /> 主节点 备用节点 新成员默认开启橙云 启用同步 ); }