/*
Copyright (C) 2023-2026 QuantumNous
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { useMemo } from 'react'
import { useTranslation } from 'react-i18next'
import { useAuthStore } from '@/stores/auth-store'
import { useStatus } from '@/hooks/use-status'
import { parseHeaderNavModulesFromStatus } from '@/lib/nav-modules'
export type TopNavLink = {
title: string
href: string
disabled?: boolean
requiresAuth?: boolean
external?: boolean
}
/**
* Generate top navigation links based on HeaderNavModules configuration from backend /api/status
* Backend format example (stringified JSON):
* {
* home: true,
* console: true,
* pricing: { enabled: true, requireAuth: false },
* rankings: { enabled: true, requireAuth: false },
* docs: true,
* about: true
* }
*/
export function useTopNavLinks(): TopNavLink[] {
const { t } = useTranslation()
const { status } = useStatus()
const { auth } = useAuthStore()
// Parse HeaderNavModules
const modules = useMemo(() => {
return parseHeaderNavModulesFromStatus(
status as Record | null
)
}, [status])
// Documentation link (may be external)
const docsLink: string | undefined = status?.docs_link as string | undefined
const isAuthed = !!auth?.user
const links: TopNavLink[] = []
// Home
if (modules?.home !== false) {
links.push({ title: t('Home'), href: '/' })
}
// Console -> /dashboard (new console path)
if (modules?.console !== false) {
links.push({ title: t('Console'), href: '/dashboard' })
}
// Pricing
const pricing = modules?.pricing
if (pricing && typeof pricing === 'object' && pricing.enabled) {
const requiresAuth = pricing.requireAuth && !isAuthed
links.push({ title: t('Model Square'), href: '/pricing', requiresAuth })
}
// Rankings
const rankings = modules?.rankings
if (rankings && typeof rankings === 'object' && rankings.enabled) {
const requiresAuth = rankings.requireAuth && !isAuthed
links.push({ title: t('Rankings'), href: '/rankings', requiresAuth })
}
// Docs (supports external links)
if (modules?.docs !== false) {
if (docsLink) {
links.push({ title: t('Docs'), href: docsLink, external: true })
} else {
links.push({ title: t('Docs'), href: '/docs' })
}
}
// About
if (modules?.about !== false) {
links.push({ title: t('About'), href: '/about' })
}
return links
}