-
Notifications
You must be signed in to change notification settings - Fork 144
/
Copy pathNavDropdownMenu.jsx
64 lines (57 loc) · 1.33 KB
/
NavDropdownMenu.jsx
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
import React from 'react';
import PropTypes from 'prop-types';
import { useNavigate, useResolvedPath } from 'react-router-dom';
import {
Dropdown,
DropdownButton,
} from '@edx/paragon';
const NavDropdownItem = ({ item }) => {
const navigate = useNavigate();
const resolvedPath = useResolvedPath(item.href);
return (
<Dropdown.Item
href={resolvedPath.pathname}
onClick={(e) => { e.preventDefault(); navigate(resolvedPath.pathname); }}
className="small"
>
{item.title}
</Dropdown.Item>
);
};
NavDropdownItem.propTypes = {
item: PropTypes.shape({
href: PropTypes.string,
title: PropTypes.string,
}).isRequired,
};
const NavDropdownMenu = ({
id,
buttonTitle,
items,
}) => (
<DropdownButton
id={id}
title={buttonTitle}
variant="tertiary"
>
{items.map(item => (/^(?:\w+:)?\/\//.test(item.href)
? (
<Dropdown.Item
href={item.href}
className="small"
>
{item.title}
</Dropdown.Item>
)
: <NavDropdownItem item={item} />))}
</DropdownButton>
);
NavDropdownMenu.propTypes = {
id: PropTypes.string.isRequired,
buttonTitle: PropTypes.string.isRequired,
items: PropTypes.arrayOf(PropTypes.shape({
href: PropTypes.string,
title: PropTypes.string,
})).isRequired,
};
export default NavDropdownMenu;