import { useState } from "react"; import { revokeOtherSession, signOutEverywhere } from "~/fns/account-security"; import { resetAnalytics } from "~/lib/analytics"; import { useAction } from "~/hooks/use-action"; import { Button } from "~/ui/Button"; import { ErrorBanner } from "~/ui/Callout"; import { Panel } from "~/ui/Panel"; import { RelativeTime } from "~/ui/RelativeTime"; type Session = { id: string; ip: string | null; userAgent: string | null; createdAt: number; lastSeenAt: number; current: boolean; }; /** A short, human label for a browser user-agent string. */ function describeAgent(userAgent: string | null): string { if (!userAgent) return "Unknown browser"; const browser = /Firefox\//.test(userAgent) ? "Firefox" : /Edg\//.test(userAgent) ? "Edge" : /OPR\//.test(userAgent) ? "Opera" : /Chrome\//.test(userAgent) ? "Chrome" : /Safari\//.test(userAgent) ? "Safari" : "Browser"; const platform = /iPhone|iPad/.test(userAgent) ? "iOS" : /Android/.test(userAgent) ? "Android" : /Mac OS X/.test(userAgent) ? "macOS" : /Windows/.test(userAgent) ? "Windows" : /Linux/.test(userAgent) ? "Linux" : null; return platform ? `${browser} on ${platform}` : browser; } export function SessionsPanel({ sessions }: { sessions: Session[] }) { const signOut = useAction(signOutEverywhere); const revoke = useAction(revokeOtherSession); const [revokeTokens, setRevokeTokens] = useState(false); return (

Every browser or device currently signed in to your account. Sessions end after 14 days without use and 30 days at most.

    {sessions.map((session) => (
  • {describeAgent(session.userAgent)} {session.current && This device}
    {session.ip ?? "unknown address"} · signed in · last active
    {!session.current && ( )}
  • ))}

Sign out of every other browser and device. This one stays signed in.

); }