Files
Magent/frontend/app/ui/HeaderActions.tsx
T
Assclaw ec0a866ef3
Magent CI/CD / verify (push) Canceled after 1m19s
Magent CI/CD / deploy-prod (push) Canceled after 0s
Magent CI/CD / deploy-beta (push) Canceled after 0s
Add user feature permissions and unified account management
2026-09-11 12:31:25 +12:00

83 lines
2.2 KiB
TypeScript

'use client'
import { usePathname } from 'next/navigation'
import { canAccess, featureForPath } from '../lib/features'
import { useFeatureUser } from './FeatureGate'
export default function HeaderActions() {
const pathname = usePathname()
const { user, ready } = useFeatureUser()
const role = user?.role ?? null
const showRequestsNav = canAccess(user, 'new_requests')
if (!ready || !user) return null
const roleItems =
role === null
? []
: role === 'admin'
? [
{
href: '/profile/invites',
label: 'Invites',
match: (path: string) => path.startsWith('/profile/invites'),
},
{
href: '/admin',
label: 'Config',
match: (path: string) => path.startsWith('/admin') || path.startsWith('/users'),
},
]
: [
{
href: '/profile/invites',
label: 'Invites',
match: (path: string) => path.startsWith('/profile/invites'),
},
]
const commonItems = [
{
href: '/insights',
label: 'My Stats',
match: (path: string) => path === '/insights' || path.startsWith('/insights/'),
},
{
href: '/',
label: 'My Requests',
match: (path: string) => path === '/' || path.startsWith('/requests/'),
},
...(showRequestsNav
? [
{
href: '/new-requests',
label: 'New Requests',
match: (path: string) => path === '/new-requests',
},
]
: []),
{
href: '/portal/issues',
label: 'Issues',
match: (path: string) => path === '/portal/issues' || path === '/admin/issues',
},
]
const items = [
...commonItems,
...roleItems,
].filter((item) => canAccess(user, featureForPath(item.href)))
return (
<nav className="header-actions" aria-label="Primary">
{items.map((item) => {
const active = item.match(pathname)
return (
<a key={item.href} href={item.href} className={active ? 'is-active' : undefined}>
{item.label}
</a>
)
})}
</nav>
)
}