import { createRoute, Outlet, redirect, useMatchRoute, useNavigate, Link } from "@tanstack/react-router" import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query" import { Calendar, CalendarDays, CircleDot, CloudSun, Loader2, TrainFront, LogOut, MapPin, Rss, Server, TriangleAlert, } from "lucide-react" import { fetchConfigs, fetchSources } from "@/lib/api" import { getSession, signOut } from "@/lib/auth" import { Alert, AlertDescription } from "@/components/ui/alert" import { Button } from "@/components/ui/button" import { Separator } from "@/components/ui/separator" import { Sidebar, SidebarContent, SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInset, SidebarMenu, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarProvider, SidebarTrigger, } from "@/components/ui/sidebar" import { Route as rootRoute } from "./__root" const SOURCE_ICONS: Record> = { "aelis.location": MapPin, "aelis.weather": CloudSun, "aelis.caldav": CalendarDays, "aelis.google-calendar": Calendar, "aelis.tfl": TrainFront, } export const Route = createRoute({ getParentRoute: () => rootRoute, id: "dashboard", beforeLoad: async ({ context }) => { let session: Awaited> | null = null try { session = await context.queryClient.ensureQueryData({ queryKey: ["session"], queryFn: getSession, }) } catch { throw redirect({ to: "/login" }) } if (!session?.user) { throw redirect({ to: "/login" }) } return { user: session.user } }, component: DashboardLayout, pendingComponent: () => (
), }) function DashboardLayout() { const { user } = Route.useRouteContext() const navigate = useNavigate() const queryClient = useQueryClient() const matchRoute = useMatchRoute() const { data: sources = [] } = useQuery({ queryKey: ["sources"], queryFn: fetchSources, }) const { data: configs = [], error: configsError, refetch: refetchConfigs, } = useQuery({ queryKey: ["configs"], queryFn: fetchConfigs, }) const logoutMutation = useMutation({ mutationFn: signOut, onSuccess() { queryClient.setQueryData(["session"], null) queryClient.clear() navigate({ to: "/login" }) }, }) const error = configsError?.message ?? null const configMap = new Map(configs.map((c) => [c.sourceId, c])) return (

{user.name}

{user.email}

General Server Feed Sources {sources.map((source) => { const Icon = SOURCE_ICONS[source.id] ?? CircleDot const cfg = configMap.get(source.id) const isEnabled = source.alwaysEnabled || cfg?.enabled return ( {source.name} {isEnabled && ( )} ) })}
{error && ( {error} )}
) }