-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.tsx
More file actions
98 lines (90 loc) · 3.57 KB
/
Copy pathindex.tsx
File metadata and controls
98 lines (90 loc) · 3.57 KB
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import {
ReactNode,
useState,
} from 'react';
import {
IoChevronDownOutline,
IoChevronUpOutline,
} from 'react-icons/io5';
import { NavLink } from 'react-router';
import { Button } from '@ifrc-go/ui';
import { _cs } from '@togglecorp/fujs';
import styles from './styles.module.css';
export interface NavigationItem {
title: string;
to?: string;
icon?: ReactNode;
variant: 'root' | 'group' | 'leaf';
children?: NavigationItem[];
}
function Navigation({ navigationItem }: { navigationItem: NavigationItem[] }) {
const [openIndexes, setOpenIndexes] = useState(
navigationItem.map((_, i) => i),
);
const toggleAccordion = (index: number) => {
setOpenIndexes((prev) => (prev.includes(index)
? prev.filter((i) => i !== index)
: [...prev, index]));
};
return (
<nav className={styles.nav}>
{navigationItem.map((item, index) => {
const isOpen = openIndexes.includes(index);
return (
<div
key={item.title}
className={_cs(
styles[item.variant ?? 'leaf'],
)}
>
<Button
name={item.title}
type="button"
className={styles.navHeaderContainer}
childrenContainerClassName={styles.navHeader}
onClick={() => toggleAccordion(index)}
variant="tertiary"
icons={item.icon}
>
{item.title}
{isOpen ? <IoChevronUpOutline /> : <IoChevronDownOutline />}
</Button>
{isOpen && (
<div
className={_cs(
styles.navContent,
styles[item.variant ?? 'leaf'],
)}
>
{item.children && item.children.map((child) => {
if (!child.to && child.children) {
return (
<Navigation
key={child.title}
navigationItem={[child]}
/>
);
}
return (
<NavLink
key={child.to}
to={child.to ?? ''}
className={({ isActive }) => _cs(
styles.routeLink,
isActive && styles.activeRoute,
styles[child.variant ?? 'leaf'],
)}
>
{child.title}
</NavLink>
);
})}
</div>
)}
</div>
);
})}
</nav>
);
}
export default Navigation;