'use client'; import { Loader2, Trash2 } from 'lucide-react'; import { useTranslations } from 'next-intl'; 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, 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 t = useTranslations('ipGroups'); const tCommon = useTranslations('common'); const [deleteTarget, setDeleteTarget] = useState( null, ); const entries = useMemo( () => group ? getIPGroupViewEntries(group, (key, values) => t(key, values)) : [], [group, t], ); const showAutomaticMeta = group?.type === 'automatic'; return ( <> { onOpenChange(nextOpen); if (!nextOpen) { setDeleteTarget(null); } }} > {group ? t('viewDialog.titleNamed', { name: group.name }) : t('viewDialog.title')} {group ? t('viewDialog.summary', { type: t(`types.${group.type}`), count: entries.length, }) : t('viewDialog.fallbackDesc')} {loading ? (
{t('viewDialog.loading')}
) : !group ? (

{t('viewDialog.noGroup')}

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

{t('viewDialog.subscriptionHint')}

) : null}
{t('viewDialog.ipAddress')} {showAutomaticMeta ? ( <> {t('viewDialog.capturedAt')} {t('viewDialog.banRemaining')} ) : null} {t('viewDialog.actions')} {entries.map((entry) => ( {entry.ip} {showAutomaticMeta ? ( <> {entry.capturedAt ? formatDateTime(entry.capturedAt) : '—'} {entry.banRemaining ?? '—'} ) : null} ))}
)}
!nextOpen && setDeleteTarget(null)} > {t('viewDialog.deleteTitle')} {t('viewDialog.deleteDesc', { name: group?.name ?? '', ip: deleteTarget?.ip ?? '', })} {tCommon('cancel')} { if (!deleteTarget) return; await onRemoveIp(deleteTarget.ip); setDeleteTarget(null); }} > {removingIp ? t('viewDialog.deleting') : t('viewDialog.confirmDelete')} ); }