"use client"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import apiClient from "@/lib/api/client"; import { DataTable } from "@/components/common/data-table"; import { ColumnDef } from "@tanstack/react-table"; import { Button } from "@/components/ui/button"; import { LogOut, Monitor, Smartphone, RefreshCw } from "lucide-react"; import { format } from "date-fns"; import { toast } from "sonner"; import { Badge } from "@/components/ui/badge"; interface Session { id: string; userId: number; user: { username: string; firstName: string; lastName: string; }; deviceName: string; // e.g., "Chrome on Windows" ipAddress: string; lastActive: string; isCurrent: boolean; } const sessionService = { getAll: async () => (await apiClient.get("/auth/sessions")).data, revoke: async (sessionId: string) => (await apiClient.delete(`/auth/sessions/${sessionId}`)).data, }; export default function SessionsPage() { const queryClient = useQueryClient(); const { data: sessions = [], isLoading } = useQuery({ queryKey: ["sessions"], queryFn: sessionService.getAll, }); const revokeMutation = useMutation({ mutationFn: sessionService.revoke, onSuccess: () => { toast.success("Session revoked successfully"); queryClient.invalidateQueries({ queryKey: ["sessions"] }); }, onError: () => toast.error("Failed to revoke session"), }); const columns: ColumnDef[] = [ { accessorKey: "user", header: "User", cell: ({ row }) => { const user = row.original.user; return (
{user.username} {user.firstName} {user.lastName}
); }, }, { accessorKey: "deviceName", header: "Device / IP", cell: ({ row }) => (
{row.original.deviceName.toLowerCase().includes("mobile") ? ( ) : ( )}
{row.original.deviceName} {row.original.ipAddress}
), }, { accessorKey: "lastActive", header: "Last Active", cell: ({ row }) => format(new Date(row.original.lastActive), "dd MMM yyyy, HH:mm"), }, { id: "status", header: "Status", cell: ({ row }) => row.original.isCurrent ? Current : Active, }, { id: "actions", cell: ({ row }) => ( ), }, ]; if (isLoading) { return (
); } return (

Active Sessions

Manage user sessions and force logout if needed

); }