import { AppCard } from '@/frontend/components/AppCard' import { DashboardLayout } from '@/frontend/components/DashboardLayout' import { StatsCard } from '@/frontend/components/StatsCard' import { useSession } from '@/frontend/hooks/useAuth' import { Badge, Button, Container, Group, Loader, Paper, SimpleGrid, Stack, Table, Text, Title, } from '@mantine/core' import { useQuery } from '@tanstack/react-query' import { createFileRoute, Link, redirect } from '@tanstack/react-router' import { TbApps, TbChevronRight, TbMessageReport, TbUsers } from 'react-icons/tb' export const Route = createFileRoute('/dashboard')({ beforeLoad: async ({ context }) => { try { const data = await context.queryClient.ensureQueryData({ queryKey: ['auth', 'session'], queryFn: () => fetch('/api/auth/session', { credentials: 'include' }).then((r) => r.json()), }) if (!data?.user) throw redirect({ to: '/login' }) } catch (e) { if (e instanceof Error) throw redirect({ to: '/login' }) throw e } }, component: DashboardPage, }) function DashboardPage() { const { data: sessionData } = useSession() const user = sessionData?.user const { data: stats, isLoading: statsLoading } = useQuery({ queryKey: ['dashboard', 'stats'], queryFn: () => fetch('/api/dashboard/stats').then((r) => r.json()), }) const { data: apps, isLoading: appsLoading } = useQuery({ queryKey: ['apps'], queryFn: () => fetch('/api/apps').then((r) => r.json()), }) const { data: recentErrors = [], isLoading: recentErrorsLoading } = useQuery({ queryKey: ['dashboard', 'recent-errors'], queryFn: () => fetch('/api/dashboard/recent-errors').then((r) => r.json()), }) const formatTimeAgo = (dateStr: string) => { const diff = new Date().getTime() - new Date(dateStr).getTime() const minutes = Math.floor(diff / 60000) if (minutes < 60) return `${minutes || 1} mins ago` const hours = Math.floor(minutes / 60) if (hours < 24) return `${hours} hours ago` return `${Math.floor(hours / 24)} days ago` } return ( Overview Dashboard Welcome back, {user?.name}. Here is what's happening today. {/* */} {statsLoading ? ( ) : ( )} Registered Applications {appsLoading ? ( ) : ( {apps?.map((app: any) => ( ))} )} Recent Error Reports Application Error Message Version Time Severity {recentErrorsLoading ? ( ) : recentErrors.length === 0 ? ( No recent errors found. ) : recentErrors.map((error: any) => ( {error.app} {error.message} v{error.version} {formatTimeAgo(error.time)} {error.severity.toUpperCase()} ))}
) }