2021-06-24 01:05:22 +05:00
|
|
|
import React, { useCallback } from 'react';
|
2019-08-31 04:07:25 +05:00
|
|
|
import PropTypes from 'prop-types';
|
2021-06-24 01:05:22 +05:00
|
|
|
import classNames from 'classnames';
|
2019-08-31 04:07:25 +05:00
|
|
|
import { Link } from 'react-router-dom';
|
|
|
|
import { Icon, Menu } from 'semantic-ui-react';
|
|
|
|
|
|
|
|
import Paths from '../../constants/Paths';
|
|
|
|
import NotificationsPopup from './NotificationsPopup';
|
2019-10-18 08:06:34 +05:00
|
|
|
import UserPopup from '../UserPopup';
|
2019-08-31 04:07:25 +05:00
|
|
|
|
2020-05-29 19:31:19 +05:00
|
|
|
import styles from './Header.module.scss';
|
2019-08-31 04:07:25 +05:00
|
|
|
|
|
|
|
const Header = React.memo(
|
|
|
|
({
|
2021-06-24 01:05:22 +05:00
|
|
|
project,
|
2019-08-31 04:07:25 +05:00
|
|
|
user,
|
|
|
|
notifications,
|
2021-06-24 01:05:22 +05:00
|
|
|
canEditProject,
|
|
|
|
canEditUsers,
|
|
|
|
onProjectSettingsClick,
|
|
|
|
onUsersClick,
|
2019-10-18 08:06:34 +05:00
|
|
|
onNotificationDelete,
|
2021-06-24 01:05:22 +05:00
|
|
|
onUserSettingsClick,
|
2019-08-31 04:07:25 +05:00
|
|
|
onLogout,
|
2021-06-24 01:05:22 +05:00
|
|
|
}) => {
|
|
|
|
const handleProjectSettingsClick = useCallback(() => {
|
|
|
|
if (canEditProject) {
|
|
|
|
onProjectSettingsClick();
|
|
|
|
}
|
|
|
|
}, [canEditProject, onProjectSettingsClick]);
|
|
|
|
|
|
|
|
return (
|
|
|
|
<div className={styles.wrapper}>
|
|
|
|
{!project && (
|
|
|
|
<Link to={Paths.ROOT} className={classNames(styles.logo, styles.title)}>
|
|
|
|
Planka
|
|
|
|
</Link>
|
|
|
|
)}
|
|
|
|
<Menu inverted size="large" className={styles.menu}>
|
|
|
|
{project && (
|
|
|
|
<Menu.Menu position="left">
|
|
|
|
<Menu.Item
|
|
|
|
as={Link}
|
|
|
|
to={Paths.ROOT}
|
|
|
|
className={classNames(styles.item, styles.itemHoverable)}
|
|
|
|
>
|
|
|
|
<Icon fitted name="arrow left" />
|
|
|
|
</Menu.Item>
|
|
|
|
<Menu.Item
|
|
|
|
className={classNames(
|
|
|
|
styles.item,
|
|
|
|
canEditProject && styles.itemHoverable,
|
|
|
|
styles.title,
|
|
|
|
)}
|
|
|
|
onClick={handleProjectSettingsClick}
|
|
|
|
>
|
|
|
|
{project.name}
|
|
|
|
</Menu.Item>
|
|
|
|
</Menu.Menu>
|
2019-08-31 04:07:25 +05:00
|
|
|
)}
|
2021-06-24 01:05:22 +05:00
|
|
|
<Menu.Menu position="right">
|
|
|
|
{canEditUsers && (
|
|
|
|
<Menu.Item
|
|
|
|
className={classNames(styles.item, styles.itemHoverable)}
|
|
|
|
onClick={onUsersClick}
|
|
|
|
>
|
|
|
|
<Icon fitted name="users" />
|
|
|
|
</Menu.Item>
|
|
|
|
)}
|
|
|
|
<NotificationsPopup items={notifications} onDelete={onNotificationDelete}>
|
|
|
|
<Menu.Item className={classNames(styles.item, styles.itemHoverable)}>
|
|
|
|
<Icon fitted name="bell" />
|
|
|
|
{notifications.length > 0 && (
|
|
|
|
<span className={styles.notification}>{notifications.length}</span>
|
|
|
|
)}
|
|
|
|
</Menu.Item>
|
|
|
|
</NotificationsPopup>
|
|
|
|
<UserPopup onSettingsClick={onUserSettingsClick} onLogout={onLogout}>
|
|
|
|
<Menu.Item className={classNames(styles.item, styles.itemHoverable)}>
|
|
|
|
{user.name}
|
|
|
|
</Menu.Item>
|
|
|
|
</UserPopup>
|
|
|
|
</Menu.Menu>
|
|
|
|
</Menu>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
},
|
2019-08-31 04:07:25 +05:00
|
|
|
);
|
|
|
|
|
|
|
|
Header.propTypes = {
|
|
|
|
/* eslint-disable react/forbid-prop-types */
|
2021-06-24 01:05:22 +05:00
|
|
|
project: PropTypes.object,
|
2019-08-31 04:07:25 +05:00
|
|
|
user: PropTypes.object.isRequired,
|
|
|
|
notifications: PropTypes.array.isRequired,
|
|
|
|
/* eslint-enable react/forbid-prop-types */
|
2021-06-24 01:05:22 +05:00
|
|
|
canEditProject: PropTypes.bool.isRequired,
|
|
|
|
canEditUsers: PropTypes.bool.isRequired,
|
|
|
|
onProjectSettingsClick: PropTypes.func.isRequired,
|
|
|
|
onUsersClick: PropTypes.func.isRequired,
|
2019-10-18 08:06:34 +05:00
|
|
|
onNotificationDelete: PropTypes.func.isRequired,
|
2021-06-24 01:05:22 +05:00
|
|
|
onUserSettingsClick: PropTypes.func.isRequired,
|
2019-08-31 04:07:25 +05:00
|
|
|
onLogout: PropTypes.func.isRequired,
|
|
|
|
};
|
|
|
|
|
2021-06-24 01:05:22 +05:00
|
|
|
Header.defaultProps = {
|
|
|
|
project: undefined,
|
|
|
|
};
|
|
|
|
|
2019-08-31 04:07:25 +05:00
|
|
|
export default Header;
|