import { DashboardLayout } from '@/frontend/components/DashboardLayout' import { APP_CONFIGS } from '@/frontend/config/appMenus' import { Badge, Box, Container, Divider, Group, Skeleton, Stack, Text, Title, } from '@mantine/core' import { useQuery } from '@tanstack/react-query' import { createFileRoute, Outlet, useParams } from '@tanstack/react-router' import { TbAlertTriangle, TbTools } from 'react-icons/tb' export const Route = createFileRoute('/apps/$appId')({ component: AppDetailLayout, }) const STATUS_COLOR: Record = { active: 'teal', warning: 'orange', error: 'red', } const STATUS_LABEL: Record = { active: 'Active', warning: 'Warning', error: 'Error', } function AppDetailLayout() { const { appId } = useParams({ from: '/apps/$appId' }) const { data: appData, isLoading } = useQuery({ queryKey: ['apps', appId], queryFn: () => fetch(`/api/apps/${appId}`).then((r) => r.json()), staleTime: 30_000, }) const configName = APP_CONFIGS[appId]?.name const displayName = appData?.name ?? configName ?? appId const statusKey = appData?.maintenance ? 'maintenance' : (appData?.status ?? 'active') const statusColor = appData?.maintenance ? 'gray' : (STATUS_COLOR[appData?.status] ?? 'gray') const statusLabel = appData?.maintenance ? 'Maintenance' : (STATUS_LABEL[appData?.status] ?? appData?.status) return ( {isLoading ? ( ) : ( {displayName} )} {!isLoading && appData && ( {statusLabel} )} {appId} {isLoading ? ( ) : ( <> {(appData?.errors ?? 0) > 0 && ( } > {appData.errors} open {appData.errors === 1 ? 'error' : 'errors'} )} {appData?.maintenance && ( } > Maintenance mode )} )} ) }