import { useState } from "react"; import { Button, Field, Input, MessageBar, MessageBarBody, Select, Text, } from "@fluentui/react-components"; import { LockClosedRegular, LockOpenRegular } from "@fluentui/react-icons"; import { useCommonSectionStyles } from "../../components/commonStyles"; import { useJailsPageStyles } from "./jailsPageStyles"; import { ApiError } from "../../api/client"; interface BanUnbanFormProps { jailNames: string[]; onBan: (jail: string, ip: string) => Promise; onUnban: (ip: string, jail?: string) => Promise; } export function BanUnbanForm({ jailNames, onBan, onUnban }: BanUnbanFormProps): React.JSX.Element { const styles = useJailsPageStyles(); const sectionStyles = useCommonSectionStyles(); const [banIpVal, setBanIpVal] = useState(""); const [banJail, setBanJail] = useState(""); const [unbanIpVal, setUnbanIpVal] = useState(""); const [unbanJail, setUnbanJail] = useState(""); const [formError, setFormError] = useState(null); const [formSuccess, setFormSuccess] = useState(null); const [isBanning, setIsBanning] = useState(false); const [isUnbanning, setIsUnbanning] = useState(false); const formatErrorMessage = (err: unknown): string => err instanceof ApiError ? `${String(err.status)}: ${err.body}` : err instanceof Error ? err.message : String(err); const handleBan = async (): Promise => { setFormError(null); setFormSuccess(null); if (!banIpVal.trim() || !banJail) { setFormError("Both IP address and jail are required."); return; } setIsBanning(true); try { const ip = banIpVal.trim(); await onBan(banJail, ip); setFormSuccess(`${ip} banned in ${banJail}.`); setBanIpVal(""); } catch (err: unknown) { setFormError(formatErrorMessage(err)); } finally { setIsBanning(false); } }; const handleUnban = async (fromAllJails: boolean): Promise => { setFormError(null); setFormSuccess(null); if (!unbanIpVal.trim()) { setFormError("IP address is required."); return; } setIsUnbanning(true); try { const ip = unbanIpVal.trim(); const jail = fromAllJails ? undefined : unbanJail || undefined; await onUnban(ip, jail); const scope = jail ?? "all jails"; setFormSuccess(`${ip} unbanned from ${scope}.`); setUnbanIpVal(""); setUnbanJail(""); } catch (err: unknown) { setFormError(formatErrorMessage(err)); } finally { setIsUnbanning(false); } }; return (
Ban / Unban IP
{formError && ( {formError} )} {formSuccess && ( {formSuccess} )} Ban an IP
{ setBanIpVal(d.value); }} />
Unban an IP
{ setUnbanIpVal(d.value); }} />
); }