|
1 | | -import React, { useState } from 'react' |
| 1 | +import { useEffect, useState } from 'react' |
2 | 2 | import { |
3 | 3 | Nav, |
4 | 4 | NavList, |
5 | | - NavItem, |
6 | 5 | PageSidebar, |
7 | 6 | PageSidebarBody, |
8 | 7 | } from '@patternfly/react-core' |
9 | 8 | import { useStore } from '@nanostores/react' |
10 | 9 | import { isNavOpen } from '../stores/navStore' |
11 | | - |
12 | | -interface NavOnSelectProps { |
13 | | - groupId: number | string |
14 | | - itemId: number | string |
15 | | - to: string |
16 | | -} |
17 | | - |
18 | | -interface NavEntry { |
19 | | - id: string |
20 | | - data: { |
21 | | - title: string |
22 | | - } |
23 | | - collection: string |
24 | | -} |
| 10 | +import { NavSection } from './NavSection' |
| 11 | +import { type TextContentEntry } from './NavEntry' |
25 | 12 |
|
26 | 13 | interface NavigationProps { |
27 | | - navEntries: NavEntry[] |
| 14 | + navEntries: TextContentEntry[] |
28 | 15 | } |
29 | 16 |
|
30 | 17 | export const Navigation: React.FunctionComponent<NavigationProps> = ({ |
31 | 18 | navEntries, |
32 | 19 | }: NavigationProps) => { |
| 20 | + const $isNavOpen = useStore(isNavOpen) |
33 | 21 | const [activeItem, setActiveItem] = useState('') |
34 | 22 |
|
| 23 | + useEffect(() => { |
| 24 | + setActiveItem(window.location.pathname.split('/').reverse()[0]) |
| 25 | + }, []) |
| 26 | + |
35 | 27 | const onNavSelect = ( |
36 | 28 | _event: React.FormEvent<HTMLInputElement>, |
37 | | - selectedItem: NavOnSelectProps, |
| 29 | + selectedItem: { itemId: string | number }, |
38 | 30 | ) => { |
39 | | - // eslint-disable-next-line @typescript-eslint/no-unused-expressions |
40 | | - typeof selectedItem.itemId === 'string' && |
41 | | - setActiveItem(selectedItem.itemId) |
| 31 | + setActiveItem(selectedItem.itemId.toString()) |
42 | 32 | } |
43 | 33 |
|
44 | | - const $isNavOpen = useStore(isNavOpen) |
| 34 | + const sections = new Set(navEntries.map((entry) => entry.data.section)) |
45 | 35 |
|
46 | | - const sortedNavEntries = navEntries.sort((a, b) => |
47 | | - a.data.title.localeCompare(b.data.title), |
48 | | - ) |
| 36 | + const navSections = Array.from(sections).map((section) => { |
| 37 | + const entries = navEntries.filter((entry) => entry.data.section === section) |
49 | 38 |
|
50 | | - const navItems = sortedNavEntries.map((entry) => ( |
51 | | - <NavItem |
52 | | - key={entry.id} |
53 | | - itemId={entry.id} |
54 | | - isActive={activeItem === entry.id} |
55 | | - to={`/${entry.collection}/${entry.id}`} |
56 | | - > |
57 | | - {entry.data.title} |
58 | | - </NavItem> |
59 | | - )) |
| 39 | + return ( |
| 40 | + <NavSection |
| 41 | + key={section} |
| 42 | + entries={entries} |
| 43 | + sectionId={section} |
| 44 | + activeItem={activeItem} |
| 45 | + /> |
| 46 | + ) |
| 47 | + }) |
60 | 48 |
|
61 | 49 | return ( |
62 | 50 | <PageSidebar isSidebarOpen={$isNavOpen}> |
63 | 51 | <PageSidebarBody> |
64 | 52 | <Nav onSelect={onNavSelect}> |
65 | | - <NavList>{navItems}</NavList> |
| 53 | + <NavList>{navSections}</NavList> |
66 | 54 | </Nav> |
67 | 55 | </PageSidebarBody> |
68 | 56 | </PageSidebar> |
|
0 commit comments