|
'use client' |
|
|
|
import { useSelectedLayoutSegment } from 'next/navigation' |
|
import Link from 'next/link' |
|
import classNames from '@/utils/classnames' |
|
|
|
export type NavIcon = React.ComponentType< |
|
React.PropsWithoutRef<React.ComponentProps<'svg'>> & { |
|
title?: string | undefined |
|
titleId?: string | undefined |
|
} |
|
> |
|
|
|
export type NavLinkProps = { |
|
name: string |
|
href: string |
|
iconMap: { |
|
selected: NavIcon |
|
normal: NavIcon |
|
} |
|
mode?: string |
|
} |
|
|
|
export default function NavLink({ |
|
name, |
|
href, |
|
iconMap, |
|
mode = 'expand', |
|
}: NavLinkProps) { |
|
const segment = useSelectedLayoutSegment() |
|
const formattedSegment = (() => { |
|
let res = segment?.toLowerCase() |
|
|
|
if (res === 'annotations') |
|
res = 'logs' |
|
|
|
return res |
|
})() |
|
const isActive = href.toLowerCase().split('/')?.pop() === formattedSegment |
|
const NavIcon = isActive ? iconMap.selected : iconMap.normal |
|
|
|
return ( |
|
<Link |
|
key={name} |
|
href={href} |
|
className={classNames( |
|
isActive ? 'bg-state-accent-active text-text-accent font-semibold' : 'text-components-menu-item-text hover:bg-gray-100 hover:text-components-menu-item-text-hover', |
|
'group flex items-center h-9 rounded-md py-2 text-sm font-normal', |
|
mode === 'expand' ? 'px-3' : 'px-2.5', |
|
)} |
|
title={mode === 'collapse' ? name : ''} |
|
> |
|
<NavIcon |
|
className={classNames( |
|
'h-4 w-4 flex-shrink-0', |
|
mode === 'expand' ? 'mr-2' : 'mr-0', |
|
)} |
|
aria-hidden="true" |
|
/> |
|
{mode === 'expand' && name} |
|
</Link> |
|
) |
|
} |
|
|