-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathSidebar.tsx
51 lines (41 loc) · 1.25 KB
/
Sidebar.tsx
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
import React from 'react';
import { Link, NavLink } from 'react-router-dom';
import { useConfig } from './configContext';
import { Demo } from './Demo';
import { DemosGroup } from './DemoGroup';
type SidebarProps = {
groups: DemosGroup[];
setSearch: (search: string) => void;
};
export const Sidebar: React.FC<SidebarProps> = ({ groups, setSearch }) => {
const { title } = useConfig();
return (
<aside className="demos__sidebar">
<h1 className="demos__sidebar__branding">
<Link to="/">{title}</Link>
</h1>
<input
className="demos__sidebar__search"
placeholder="Search..."
onChange={(e) => setSearch(e.target.value)}
/>
<Tree path={[]} items={groups} />
</aside>
);
};
type TreeProps = {
path: string[];
items: Array<DemosGroup | Demo>;
};
const Tree: React.FC<TreeProps> = ({ items, path }) => (
<>
{items.map((item) => (
<div key={item.label} className={`demos__tree__item depth-${path.length + 1}`}>
<NavLink to={['', ...path, item.label].join('/')} className="demos__tree__item-label">
{item.label}
</NavLink>
{DemosGroup.isDemoGroup(item) && <Tree path={[...path, item.label]} items={item.children} />}
</div>
))}
</>
);