flex-template-web/src/components/TopbarDesktop/TopbarDesktop.js
Vesa Luusua b1eb69f6d3 Refactored className usage for InlineTextButton
They are changed to use rootClassName for consistency
and protection against future bundling order changes.
2019-02-19 15:49:49 +02:00

176 lines
5.1 KiB
JavaScript

import React from 'react';
import PropTypes from 'prop-types';
import { FormattedMessage, intlShape } from 'react-intl';
import classNames from 'classnames';
import { ACCOUNT_SETTINGS_PAGES } from '../../routeConfiguration';
import { propTypes } from '../../util/types';
import {
Avatar,
InlineTextButton,
Logo,
Menu,
MenuLabel,
MenuContent,
MenuItem,
NamedLink,
} from '../../components';
import { TopbarSearchForm } from '../../forms';
import css from './TopbarDesktop.css';
const TopbarDesktop = props => {
const {
className,
currentUser,
currentPage,
rootClassName,
currentUserHasListings,
notificationCount,
intl,
isAuthenticated,
onLogout,
onSearchSubmit,
initialSearchFormValues,
} = props;
const classes = classNames(rootClassName || css.root, className);
const search = (
<TopbarSearchForm
className={css.searchLink}
desktopInputRoot={css.topbarSearchWithLeftPadding}
form="TopbarSearchFormDesktop"
onSubmit={onSearchSubmit}
initialValues={initialSearchFormValues}
/>
);
const notificationDot = notificationCount > 0 ? <div className={css.notificationDot} /> : null;
const inboxLink = isAuthenticated ? (
<NamedLink
className={css.inboxLink}
name="InboxPage"
params={{ tab: currentUserHasListings ? 'sales' : 'orders' }}
>
<span className={css.inbox}>
<FormattedMessage id="TopbarDesktop.inbox" />
{notificationDot}
</span>
</NamedLink>
) : null;
const currentPageClass = page => {
const isAccountSettingsPage =
page === 'AccountSettingsPage' && ACCOUNT_SETTINGS_PAGES.includes(currentPage);
return currentPage === page || isAccountSettingsPage ? css.currentPage : null;
};
const profileMenu = isAuthenticated ? (
<Menu>
<MenuLabel className={css.profileMenuLabel} isOpenClassName={css.profileMenuIsOpen}>
<Avatar className={css.avatar} user={currentUser} disableProfileLink />
</MenuLabel>
<MenuContent className={css.profileMenuContent}>
<MenuItem key="ManageListingsPage">
<NamedLink
className={classNames(css.yourListingsLink, currentPageClass('ManageListingsPage'))}
name="ManageListingsPage"
>
<span className={css.menuItemBorder} />
<FormattedMessage id="TopbarDesktop.yourListingsLink" />
</NamedLink>
</MenuItem>
<MenuItem key="ProfileSettingsPage">
<NamedLink
className={classNames(css.profileSettingsLink, currentPageClass('ProfileSettingsPage'))}
name="ProfileSettingsPage"
>
<span className={css.menuItemBorder} />
<FormattedMessage id="TopbarDesktop.profileSettingsLink" />
</NamedLink>
</MenuItem>
<MenuItem key="AccountSettingsPage">
<NamedLink
className={classNames(css.yourListingsLink, currentPageClass('AccountSettingsPage'))}
name="AccountSettingsPage"
>
<span className={css.menuItemBorder} />
<FormattedMessage id="TopbarDesktop.accountSettingsLink" />
</NamedLink>
</MenuItem>
<MenuItem key="logout">
<InlineTextButton rootClassName={css.logoutButton} onClick={onLogout}>
<span className={css.menuItemBorder} />
<FormattedMessage id="TopbarDesktop.logout" />
</InlineTextButton>
</MenuItem>
</MenuContent>
</Menu>
) : null;
const signupLink = isAuthenticated ? null : (
<NamedLink name="SignupPage" className={css.signupLink}>
<span className={css.signup}>
<FormattedMessage id="TopbarDesktop.signup" />
</span>
</NamedLink>
);
const loginLink = isAuthenticated ? null : (
<NamedLink name="LoginPage" className={css.loginLink}>
<span className={css.login}>
<FormattedMessage id="TopbarDesktop.login" />
</span>
</NamedLink>
);
return (
<nav className={classes}>
<NamedLink className={css.logoLink} name="LandingPage">
<Logo
format="desktop"
className={css.logo}
alt={intl.formatMessage({ id: 'TopbarDesktop.logo' })}
/>
</NamedLink>
{search}
<NamedLink className={css.createListingLink} name="NewListingPage">
<span className={css.createListing}>
<FormattedMessage id="TopbarDesktop.createListing" />
</span>
</NamedLink>
{inboxLink}
{profileMenu}
{signupLink}
{loginLink}
</nav>
);
};
const { bool, func, object, number, string } = PropTypes;
TopbarDesktop.defaultProps = {
rootClassName: null,
className: null,
currentUser: null,
currentPage: null,
notificationCount: 0,
initialSearchFormValues: {},
};
TopbarDesktop.propTypes = {
rootClassName: string,
className: string,
currentUserHasListings: bool.isRequired,
currentUser: propTypes.currentUser,
currentPage: string,
isAuthenticated: bool.isRequired,
onLogout: func.isRequired,
notificationCount: number,
onSearchSubmit: func.isRequired,
initialSearchFormValues: object,
intl: intlShape.isRequired,
};
export default TopbarDesktop;