"use client"; import { useState, useEffect } from "react"; import { Loader2, Monitor, Smartphone, Trash2, Globe } from "lucide-react"; import { toast } from "sonner"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; interface Session { id: string; ip_address: string; user_agent: string; created_at: string; expires_at: string; } interface ActiveSessionsProps { userId: string; } function parseUserAgent(ua: string): { device: string; browser: string } { const isMobile = /mobile|android|iphone|ipad/i.test(ua); const device = isMobile ? "Mobile" : "Desktop"; let browser = "Unknown"; if (ua.includes("Chrome")) browser = "Chrome"; else if (ua.includes("Firefox")) browser = "Firefox"; else if (ua.includes("Safari")) browser = "Safari"; else if (ua.includes("Edge")) browser = "Edge"; return { device, browser }; } export function ActiveSessions({ userId }: ActiveSessionsProps) { const [sessions, setSessions] = useState([]); const [isLoading, setIsLoading] = useState(true); const [revokingId, setRevokingId] = useState(null); async function fetchSessions() { try { const response = await fetch(`/api/admin/users/${userId}`); if (!response.ok) throw new Error("Failed to fetch sessions"); const data = await response.json(); setSessions(data.sessions || []); } catch (error) { console.error("Error fetching sessions:", error); } finally { setIsLoading(false); } } useEffect(() => { fetchSessions(); }, [userId]); async function handleRevoke(sessionId: string) { setRevokingId(sessionId); try { const response = await fetch(`/api/admin/users/${userId}/sessions/${sessionId}`, { method: "DELETE", }); if (!response.ok) throw new Error("Failed to revoke session"); toast.success("Session revoked"); fetchSessions(); } catch (error) { toast.error("Failed to revoke session"); } finally { setRevokingId(null); } } if (isLoading) { return (
); } if (sessions.length === 0) { return (

No active sessions

); } return (
{sessions.map((session) => { const { device, browser } = parseUserAgent(session.user_agent || ""); const isExpired = new Date(session.expires_at) < new Date(); return (
{device === "Mobile" ? ( ) : ( )}
{browser} on {device} {isExpired && Expired}
{session.ip_address || "Unknown IP"} {new Date(session.created_at).toLocaleDateString()}
); })}
); }