import { IconBolt, IconHelp, IconMapRoute, IconPlus, IconSettings, IconWifiOff, } from '@tabler/icons-react' import { Head, usePage } from '@inertiajs/react' import AppLayout from '~/layouts/AppLayout' import { getServiceLink } from '~/lib/navigation' import { ServiceSlim } from '../../types/services' import DynamicIcon, { DynamicIconName } from '~/components/DynamicIcon' import { useUpdateAvailable } from '~/hooks/useUpdateAvailable' import { useSystemSetting } from '~/hooks/useSystemSetting' import Alert from '~/components/Alert' import { SERVICE_NAMES } from '../../constants/service_names' // Maps is a Core Capability (display_order: 4) const MAPS_ITEM = { label: 'Maps', to: '/maps', target: '', description: 'View offline maps', icon: , installed: true, displayOrder: 4, poweredBy: null, } // System items shown after all apps const SYSTEM_ITEMS = [ { label: 'Easy Setup', to: '/easy-setup', target: '', description: 'Not sure where to start? Use the setup wizard to quickly configure your N.O.M.A.D.!', icon: , installed: true, displayOrder: 50, poweredBy: null, }, { label: 'Install Apps', to: '/settings/apps', target: '', description: 'Not seeing your favorite app? Install it here!', icon: , installed: true, displayOrder: 51, poweredBy: null, }, { label: 'Docs', to: '/docs/home', target: '', description: 'Read Project N.O.M.A.D. manuals and guides', icon: , installed: true, displayOrder: 52, poweredBy: null, }, { label: 'Settings', to: '/settings/system', target: '', description: 'Configure your N.O.M.A.D. settings', icon: , installed: true, displayOrder: 53, poweredBy: null, }, ] interface DashboardItem { label: string to: string target: string description: string icon: React.ReactNode installed: boolean displayOrder: number poweredBy: string | null } export default function Home(props: { system: { services: ServiceSlim[] } }) { const items: DashboardItem[] = [] const updateInfo = useUpdateAvailable(); const { aiAssistantName } = usePage<{ aiAssistantName: string }>().props // Check if user has visited Easy Setup const { data: easySetupVisited } = useSystemSetting({ key: 'ui.hasVisitedEasySetup' }) const shouldHighlightEasySetup = easySetupVisited?.value ? String(easySetupVisited.value) !== 'true' : false // Add installed services (non-dependency services only) props.system.services .filter((service) => service.installed && service.ui_location) .forEach((service) => { items.push({ // Inject custom AI Assistant name if this is the chat service label: service.service_name === SERVICE_NAMES.OLLAMA && aiAssistantName ? aiAssistantName : (service.friendly_name || service.service_name), to: service.ui_location ? getServiceLink(service.ui_location) : '#', target: '_blank', description: service.description || `Access the ${service.friendly_name || service.service_name} application`, icon: service.icon ? ( ) : ( ), installed: service.installed, displayOrder: service.display_order ?? 100, poweredBy: service.powered_by ?? null, }) }) // Add Maps as a Core Capability items.push(MAPS_ITEM) // Add system items items.push(...SYSTEM_ITEMS) // Sort all items by display order items.sort((a, b) => a.displayOrder - b.displayOrder) return ( { updateInfo?.updateAvailable && (
{ window.location.href = '/settings/update' }, }} />
) }
{items.map((item) => { const isEasySetup = item.label === 'Easy Setup' const shouldHighlight = isEasySetup && shouldHighlightEasySetup return (
{shouldHighlight && ( Start here! )}
{item.icon}

{item.label}

{item.poweredBy &&

Powered by {item.poweredBy}

}

{item.description}

) })}
) }