/** * Jail detail page. * * Fetches and displays the full configuration and state of a single jail * identified by the `:name` route parameter. */ import { Button, MessageBar, MessageBarBody, Spinner, Text } from "@fluentui/react-components"; import { ArrowLeftRegular } from "@fluentui/react-icons"; import { Link, useParams } from "react-router-dom"; import { useJailDetail } from "../hooks/useJailDetail"; import { useJailBannedIps } from "../hooks/useJailBannedIps"; import { BannedIpsSection } from "../components/jail/BannedIpsSection"; import { JailInfoSection } from "./jail/JailInfoSection"; import { PatternsSection } from "./jail/PatternsSection"; import { BantimeEscalationSection } from "./jail/BantimeEscalationSection"; import { IgnoreListSection } from "./jail/IgnoreListSection"; import { useJailDetailPageStyles } from "./jail/jailDetailPageStyles"; export function JailDetailPage(): React.JSX.Element { const styles = useJailDetailPageStyles(); const { name = "" } = useParams<{ name: string }>(); const { jail, ignoreList, ignoreSelf, loading, error, refresh, addIp, removeIp, toggleIgnoreSelf, start, stop, reload, setIdle } = useJailDetail(name); const { items, total, page, pageSize, search, loading: bannedLoading, error: bannedError, opError, refresh: refreshBanned, setPage, setPageSize, setSearch, unban, } = useJailBannedIps(name); if (loading && !jail) { return (