'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 ? '删除中...' : '确认删除'} ); }