The Node.js® Website
1import { useTranslations } from 'next-intl';
2import type { ComponentProps, FC } from 'react';
3
4import SidebarGroup from '@/components/Containers/Sidebar/SidebarGroup';
5import WithRouterSelect from '@/components/withRouterSelect';
6import { useClientContext } from '@/hooks/react-server';
7
8import styles from './index.module.css';
9
10type SidebarProps = {
11 groups: Array<ComponentProps<typeof SidebarGroup>>;
12};
13
14const SideBar: FC<SidebarProps> = ({ groups }) => {
15 const t = useTranslations();
16 const { pathname } = useClientContext();
17
18 const selectItems = groups.map(({ items, groupName }) => ({
19 label: groupName,
20 items: items.map(({ label, link }) => ({ value: link, label })),
21 }));
22
23 const currentItem = selectItems
24 .map(item => item.items)
25 .flat()
26 .find(item => pathname === item.value);
27
28 return (
29 <aside className={styles.wrapper}>
30 {selectItems.length > 0 && (
31 <WithRouterSelect
32 label={t('components.common.sidebar.title')}
33 values={selectItems}
34 defaultValue={currentItem?.value}
35 />
36 )}
37
38 {groups.map(({ groupName, items }) => (
39 <SidebarGroup
40 key={groupName.toString()}
41 groupName={groupName}
42 items={items}
43 />
44 ))}
45 </aside>
46 );
47};
48
49export default SideBar;