aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/components/collapsed-navigation.tsx
blob: 1748317ff309d434b10c9f82b3ff65496a811e28 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import { NavLink } from 'react-router'
import { ActionButton } from '@react-spectrum/s2/ActionButton'
import { Menu, MenuItem, MenuTrigger, SubmenuTrigger, Text } from '@react-spectrum/s2/Menu'
import { Tooltip, TooltipTrigger } from '@react-spectrum/s2/Tooltip'
import { menuItems, type NavigationItem } from '../route-config'
import iconStyles from './menu-icon.module.css'
import styles from './layout-basic.module.css'

function containsPage(item: NavigationItem, pageId?: string): boolean {
  return item.id === pageId || !!item.children?.some((child) => containsPage(child, pageId))
}

function renderMenuItem(item: NavigationItem) {
  const Icon = item.Icon
  const content = <>{Icon && <Icon />}<Text>{item.title}</Text></>

  return item.children ? (
    <SubmenuTrigger key={item.id}>
      <MenuItem id={item.id} textValue={item.title}>{content}</MenuItem>
      <Menu aria-label={item.title}>{item.children.map(renderMenuItem)}</Menu>
    </SubmenuTrigger>
  ) : (
    <MenuItem key={item.id} id={item.id} href={item.path} textValue={item.title}>{content}</MenuItem>
  )
}

function CollapsedNavigation({ activePageId }: { activePageId?: string }) {
  return (
    <div className={styles.iconNavigation}>
      {menuItems.map((item) => {
        const Icon = item.Icon
        const icon = Icon ? <Icon UNSAFE_className={iconStyles.icon} /> : item.title.slice(0, 1)

        return item.children ? (
          <div key={item.id} className={`${styles.iconNavigationGroup}${containsPage(item, activePageId) ? ` ${styles.isActive}` : ''}`}>
            <MenuTrigger direction="right" align="start">
              <TooltipTrigger placement="right">
                <ActionButton aria-label={item.title} isQuiet>{icon}</ActionButton>
                <Tooltip>{item.title}</Tooltip>
              </TooltipTrigger>
              <Menu aria-label={item.title}>{item.children.map(renderMenuItem)}</Menu>
            </MenuTrigger>
          </div>
        ) : (
          <NavLink key={item.id} className={styles.iconNavigationLink} to={item.path} end aria-label={item.title} title={item.title}>
            {icon}
          </NavLink>
        )
      })}
    </div>
  )
}

export default CollapsedNavigation