'use client'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { Session, sessionService } from '@/lib/services/session.service'; import { Button } from '@/components/ui/button'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; import { toast } from 'sonner'; import { Loader2, Trash2, Monitor } from 'lucide-react'; import { format } from 'date-fns'; import { getApiErrorMessage } from '@/types/api-error'; export default function SessionManagementPage() { const queryClient = useQueryClient(); const { data: sessions, isLoading, error, } = useQuery({ queryKey: ['sessions'], queryFn: sessionService.getActiveSessions, }); const sessionList = Array.isArray(sessions) ? sessions : []; const revokeMutation = useMutation({ mutationFn: sessionService.revokeSession, onSuccess: () => { toast.success('Session revoked successfully'); queryClient.invalidateQueries({ queryKey: ['sessions'] }); }, onError: (mutationError: unknown) => { toast.error('Failed to revoke session', { description: getApiErrorMessage(mutationError, 'Unknown error'), }); }, }); const handleRevoke = (id: number) => { if (confirm('Are you sure you want to revoke this session?')) { revokeMutation.mutate(id); } }; if (isLoading) { return (
); } if (error) { return (
{getApiErrorMessage(error, 'Failed to load sessions. Please try again.')}
); } return (

Active Sessions

Monitor and manage active user sessions across all devices.

User Device Info Last Active Actions {sessionList.map((session) => (
{session.user.username} {session.user.firstName} {session.user.lastName}
{session.deviceName || 'Unknown Device'}
{session.ipAddress || 'Unknown IP'}
{session.lastActive ? format(new Date(session.lastActive), 'PP pp') : '-'}
))} {sessionList.length === 0 && ( No active sessions found. )}
); }