import { useCallback, useState } from "react"; import { Button, Dialog, DialogActions, DialogBody, DialogContent, DialogSurface, DialogTitle, MessageBar, MessageBarBody, Spinner, Text, } from "@fluentui/react-components"; import type { BlocklistSource, PreviewResponse } from "../../types/blocklist"; interface PreviewDialogProps { open: boolean; source: BlocklistSource | null; onClose: () => void; fetchPreview: (id: number) => Promise; } export function PreviewDialog({ open, source, onClose, fetchPreview }: PreviewDialogProps): React.JSX.Element { const [data, setData] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const handleOpen = useCallback((): void => { if (!source) return; setData(null); setError(null); setLoading(true); fetchPreview(source.id) .then((result) => { setData(result); setLoading(false); }) .catch((err: unknown) => { setError(err instanceof Error ? err.message : "Failed to fetch preview"); setLoading(false); }); }, [source, fetchPreview]); return ( { if (!data.open) onClose(); }}> Preview — {source?.name ?? ""} {loading && (
)} {error && ( {error} )} {data && (
{data.valid_count} valid IPs / {data.skipped_count} skipped of {data.total_lines} total lines. Showing first {data.entries.length}:
{data.entries.map((entry) => (
{entry}
))}
)}
); }