import { useState } from "react"; import { AlertCircle, Banknote, FileText, Train, UserCheck, Users, } from "lucide-react"; import { Alert, Badge, Button, Container, Paper, Skeleton, Stack, Tabs, } from "@mantine/core"; import { useQueryClient } from "@tanstack/react-query"; import { OverviewPageHeader } from "@/components/overview/OverviewPageHeader"; import { OverviewQuickLinks } from "@/components/overview/OverviewQuickLinks"; import { OverviewTabContent } from "@/components/overview/OverviewTabContent"; import { QUERY_KEYS } from "@/constants/QUERY_KEYS"; import { useOverview } from "@/hooks/useOverview"; import type { OverviewRange, OverviewTabKey } from "@/types/overview"; const TAB_ITEMS: Array<{ value: OverviewTabKey; label: string; icon: typeof FileText; kpiKey: "bookings" | "billing" | "operations" | "customers" | "staff"; metricKey: string; }> = [ { value: "bookings", label: "Bookings", icon: FileText, kpiKey: "bookings", metricKey: "totalActive", }, { value: "billing", label: "Billing", icon: Banknote, kpiKey: "billing", metricKey: "successfulPaymentsMtd", }, { value: "operations", label: "Operations", icon: Train, kpiKey: "operations", metricKey: "trainsActive", }, { value: "customers", label: "Customers", icon: Users, kpiKey: "customers", metricKey: "totalCustomers", }, { value: "staff", label: "Staff", icon: UserCheck, kpiKey: "staff", metricKey: "activeEmployees", }, ]; function HeaderSkeleton() { return ( ); } const OverviewPage = () => { const [range, setRange] = useState("30d"); const [activeTab, setActiveTab] = useState("bookings"); const queryClient = useQueryClient(); const { data: summary, isLoading, isError, refetch, isFetching } = useOverview(range); const handleRefresh = () => { void refetch(); void queryClient.invalidateQueries({ queryKey: QUERY_KEYS.OVERVIEW.ROOT }); }; const getTabBadge = (tab: (typeof TAB_ITEMS)[number]) => { if (!summary?.kpis) return 0; const group = summary.kpis[tab.kpiKey] as Record; return group[tab.metricKey] ?? 0; }; return ( {isLoading && !summary ? ( ) : ( )} {isError && ( } color="red" title="Unable to load dashboard summary" variant="light" > Check your connection and try again. )} setActiveTab((value as OverviewTabKey) ?? "bookings")} variant="pills" color="green" keepMounted={false} > {TAB_ITEMS.map((tab) => { const Icon = tab.icon; return ( } rightSection={ summary ? ( {getTabBadge(tab)} ) : undefined } style={{ fontWeight: 600 }} > {tab.label} ); })} {TAB_ITEMS.map((tab) => ( ))} ); }; export default OverviewPage;