1
|
|
|
import { |
2
|
|
|
faList as listIcon, |
3
|
|
|
faLink as createIcon, |
4
|
|
|
faTags as tagsIcon, |
5
|
|
|
faPen as editIcon, |
6
|
|
|
} from '@fortawesome/free-solid-svg-icons'; |
7
|
|
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; |
8
|
|
|
import React from 'react'; |
9
|
|
|
import { NavLink } from 'react-router-dom'; |
10
|
|
|
import PropTypes from 'prop-types'; |
11
|
|
|
import classNames from 'classnames'; |
12
|
|
|
import { serverType } from '../servers/prop-types'; |
13
|
|
|
import './AsideMenu.scss'; |
14
|
|
|
|
15
|
1 |
|
const AsideMenuItem = ({ children, to, className, ...rest }) => ( |
16
|
|
|
<NavLink |
17
|
|
|
className={classNames('aside-menu__item', className)} |
18
|
|
|
activeClassName="aside-menu__item--selected" |
19
|
|
|
to={to} |
20
|
|
|
{...rest} |
21
|
|
|
> |
22
|
|
|
{children} |
23
|
|
|
</NavLink> |
24
|
|
|
); |
25
|
|
|
|
26
|
1 |
|
AsideMenuItem.propTypes = { |
27
|
|
|
children: PropTypes.node.isRequired, |
28
|
|
|
to: PropTypes.string.isRequired, |
29
|
|
|
className: PropTypes.string, |
30
|
|
|
}; |
31
|
|
|
|
32
|
1 |
|
const propTypes = { |
33
|
|
|
selectedServer: serverType, |
34
|
|
|
className: PropTypes.string, |
35
|
|
|
showOnMobile: PropTypes.bool, |
36
|
|
|
}; |
37
|
|
|
|
38
|
1 |
|
const AsideMenu = (DeleteServerButton) => { |
39
|
2 |
|
const AsideMenu = ({ selectedServer, className, showOnMobile }) => { |
40
|
2 |
|
const serverId = selectedServer ? selectedServer.id : ''; |
41
|
2 |
|
const asideClass = classNames('aside-menu', className, { |
42
|
|
|
'aside-menu--hidden': !showOnMobile, |
43
|
|
|
}); |
44
|
2 |
|
const shortUrlsIsActive = (match, location) => location.pathname.match('/list-short-urls'); |
45
|
8 |
|
const buildPath = (suffix) => `/server/${serverId}${suffix}`; |
46
|
|
|
|
47
|
2 |
|
return ( |
48
|
|
|
<aside className={asideClass}> |
49
|
|
|
<nav className="nav flex-column aside-menu__nav"> |
50
|
|
|
<AsideMenuItem to={buildPath('/list-short-urls/1')} isActive={shortUrlsIsActive}> |
51
|
|
|
<FontAwesomeIcon icon={listIcon} /> |
52
|
|
|
<span className="aside-menu__item-text">List short URLs</span> |
53
|
|
|
</AsideMenuItem> |
54
|
|
|
<AsideMenuItem to={buildPath('/create-short-url')}> |
55
|
|
|
<FontAwesomeIcon icon={createIcon} flip="horizontal" /> |
56
|
|
|
<span className="aside-menu__item-text">Create short URL</span> |
57
|
|
|
</AsideMenuItem> |
58
|
|
|
<AsideMenuItem to={buildPath('/manage-tags')}> |
59
|
|
|
<FontAwesomeIcon icon={tagsIcon} /> |
60
|
|
|
<span className="aside-menu__item-text">Manage tags</span> |
61
|
|
|
</AsideMenuItem> |
62
|
|
|
<AsideMenuItem to={buildPath('/edit')} className="aside-menu__item--push"> |
63
|
|
|
<FontAwesomeIcon icon={editIcon} /> |
64
|
|
|
<span className="aside-menu__item-text">Edit this server</span> |
65
|
|
|
</AsideMenuItem> |
66
|
|
|
<DeleteServerButton |
67
|
|
|
className="aside-menu__item aside-menu__item--danger" |
68
|
|
|
textClassName="aside-menu__item-text" |
69
|
|
|
server={selectedServer} |
70
|
|
|
/> |
71
|
|
|
</nav> |
72
|
|
|
</aside> |
73
|
|
|
); |
74
|
|
|
}; |
75
|
|
|
|
76
|
2 |
|
AsideMenu.propTypes = propTypes; |
77
|
|
|
|
78
|
2 |
|
return AsideMenu; |
79
|
|
|
}; |
80
|
|
|
|
81
|
|
|
export default AsideMenu; |
82
|
|
|
|