import { Cable, LogOut, ShieldCheck } from "lucide-react"; import { useEffect, useMemo, useState } from "react"; import { formatDate } from "../lib/format"; import { useI18n } from "../i18n"; import type { AuthorizationRow } from "../types"; import { ActionButton } from "./ActionButton"; import { EmptyRow } from "./ui"; export function AuthorizationTable({ rows, userID, onDone }: { rows: AuthorizationRow[]; userID: number; onDone: () => void }) { const { t } = useI18n(); const [removedHashes, setRemovedHashes] = useState>(() => new Set()); useEffect(() => { setRemovedHashes(new Set()); }, [userID]); const visibleRows = useMemo( () => rows.filter((row) => !removedHashes.has(row.Hash)), [rows, removedHashes] ); function afterRevoke(mutator: (previous: Set) => Set) { setRemovedHashes((previous) => mutator(previous)); onDone(); } return (
{visibleRows.map((row) => ( ))} {visibleRows.length === 0 && }
{t("auth.device")} {t("auth.platform")} {t("auth.ip")} {t("auth.lastActive")} {t("common.actions")}
{row.DeviceModel} {row.SystemVersion} {row.Platform} {row.AppVersion} {row.IP} {formatDate(row.ActiveAt)}
} compact path="/api/actions/revoke-sessions" payload={() => ({ user_id: userID, hash: row.Hash })} onDone={() => afterRevoke((previous) => new Set([...previous, row.Hash]))} /> } compact path="/api/actions/revoke-sessions" payload={() => ({ user_id: userID, keep_hash: row.Hash })} onDone={() => afterRevoke(() => new Set(rows.filter((item) => item.Hash !== row.Hash).map((item) => item.Hash)))} />
} path="/api/actions/revoke-sessions" payload={() => ({ user_id: userID, revoke_all: true })} onDone={() => afterRevoke(() => new Set(rows.map((item) => item.Hash)))} />
); }