'use client'; import { Loader2, Trash2 } from 'lucide-react'; import { useMemo, useState } from 'react'; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from '@/components/ui/alert-dialog'; import { Button } from '@/components/ui/button'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { EmptyStateWithBorder } from '@/components/layout/empty'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; import type { WAFIPGroup } from '@/lib/services/openflare'; import { formatDateTime } from '@/lib/utils'; import { getIPGroupViewEntries, ipGroupTypeLabels, type IPGroupViewEntry, } from './helpers'; interface IPGroupViewDialogProps { open: boolean; group: WAFIPGroup | null; loading: boolean; removingIp: string | null; onOpenChange: (open: boolean) => void; onRemoveIp: (ip: string) => Promise; } export function IPGroupViewDialog({ open, group, loading, removingIp, onOpenChange, onRemoveIp, }: IPGroupViewDialogProps) { const [deleteTarget, setDeleteTarget] = useState( null, ); const entries = useMemo( () => (group ? getIPGroupViewEntries(group) : []), [group], ); const showAutomaticMeta = group?.type === 'automatic'; return ( <> { onOpenChange(nextOpen); if (!nextOpen) { setDeleteTarget(null); } }} > {group ? `查看 ${group.name}` : '查看 IP 组'} {group ? `${ipGroupTypeLabels[group.type]} · 共 ${entries.length} 条 IP` : '查看当前 IP 组中的 IP 列表,并可移除不需要的条目。'} {loading ? (
加载 IP 列表...
) : !group ? (

未选择 IP 组。

) : entries.length === 0 ? ( ) : (
{group.type === 'subscription' ? (

订阅类型在下次同步时可能重新拉取已删除的 IP。

) : null}
IP 地址 {showAutomaticMeta ? ( <> 抓取时间 封禁剩余 ) : null} 操作 {entries.map((entry) => ( {entry.ip} {showAutomaticMeta ? ( <> {entry.capturedAt ? formatDateTime(entry.capturedAt) : '—'} {entry.banRemaining ?? '—'} ) : null} ))}
)}
!nextOpen && setDeleteTarget(null)} > 确认删除 IP 确认从 IP 组「{group?.name}」中移除 {deleteTarget?.ip} 吗? 取消 { if (!deleteTarget) return; await onRemoveIp(deleteTarget.ip); setDeleteTarget(null); }} > {removingIp ? '删除中...' : '确认删除'} ); }