@eureca/eureca-ui
Version:
UI component library of Eureca's user and admin apps
211 lines (192 loc) • 5.47 kB
JavaScript
import React, { useState, useEffect } from 'react';
import PropTypes from 'prop-types';
import { Hidden, List, ListItem, Divider } from '@material-ui/core';
import { makeStyles, useTheme } from '@material-ui/core/styles';
import { Flex } from '../Flex';
import { CategoryItem } from './CategoryItem';
import { UserItem } from './UserItem';
import { ExpanderControl } from './ExpanderControl';
import { colors } from '../../theme/colors';
import { ReactComponent as Logo } from '../../assets/images/logo.svg';
import { ReactComponent as MiniLogo } from '../../assets/images/logo-small.svg';
const styles = {
menu: {
minHeight: '567px',
height: '100vh',
},
};
const useStyles = makeStyles(() => ({
root: {
width: '100%',
maxWidth: 250,
backgroundColor: colors.gray2,
transition: '0.3s',
position: 'sticky',
top: 0,
left: 0,
minHeight: '567px',
height: '100vh',
paddingTop: 0,
paddingBottom: 0,
zIndex: 999,
},
root_contracted: {
width: '100%',
maxWidth: 72,
backgroundColor: colors.gray2,
transition: '0.3s',
position: 'sticky',
top: 0,
left: 0,
minHeight: '567px',
height: '100vh',
paddingTop: 0,
paddingBottom: 0,
zIndex: 999,
},
divider: {
backgroundColor: 'rgba(46, 202, 175, 0.2)',
},
text_typography: {
fontSize: '0.875rem',
lineHeight: '18px',
},
text_root: {
color: colors.gray3,
},
item: {
paddingLeft: 24,
paddingTop: 14,
paddingBottom: 14,
},
sub_item: {
paddingLeft: 24,
paddingTop: 14,
paddingBottom: 14,
},
}));
function SideDrawer({
list,
enlarged,
current,
onClick = () => {},
user,
onClickUser,
onLogout,
linkComponent,
windowSize,
}) {
const theme = useTheme();
const classes = useStyles();
const { xl, md, lg, xs } = theme.breakpoints.values;
const [active, setActive] = useState(current);
const [shrink, setShrink] = useState(windowSize?.width >= xs && windowSize?.width <= lg);
const showContracted = enlarged
? false
: (windowSize?.width < xl && shrink) || windowSize?.width < md;
const listClasses = showContracted ? classes.root_contracted : classes.root;
function handleMenuClick(id, item) {
onClick(id, item);
return setActive(id);
}
useEffect(() => {
setActive(current);
}, [current]);
return (
<List component="nav" aria-label="side-menu-eureca" className={listClasses}>
<Flex height="100%" style={styles.menu}>
<Hidden only={['xs', 'sm', 'xl']}>
<ExpanderControl toggleExpand={() => setShrink(!shrink)} />
</Hidden>
<ListItem>
<Flex height="72px" justifyContent="center" alignItems="center" width="100%">
{showContracted ? (
<MiniLogo height={40} fill={colors.green1} />
) : (
<Logo height={18} fill={colors.green1} />
)}
</Flex>
</ListItem>
<Divider className={classes.divider} />
<Flex flexGrow={1}>
{list.top.map(item => (
<CategoryItem
key={item.id}
id={item.id}
icon={item.icon}
text={item.text}
subCategories={item.subCategories}
activeItem={active}
onlyIcons={showContracted}
onClick={id => handleMenuClick(id, item)}
href={item.href}
linkComponent={linkComponent}
/>
))}
</Flex>
<Flex>
<Divider className={classes.divider} />
{list.bottom.map(item => (
<CategoryItem
key={item.id}
id={item.id}
icon={item.icon}
text={item.text}
subCategories={item.subCategories}
activeItem={active}
onlyIcons={showContracted}
onClick={id => handleMenuClick(id, item)}
href={item.href}
linkComponent={linkComponent}
/>
))}
<UserItem
onlyIcons={showContracted}
user={user}
onClickUser={onClickUser}
onLogout={onLogout}
/>
</Flex>
</Flex>
</List>
);
}
SideDrawer.propTypes = {
list: PropTypes.shape({
bottom: PropTypes.arrayOf(
PropTypes.shape({
id: PropTypes.string.isRequired,
icon: PropTypes.object.isRequired,
text: PropTypes.string.isRequired,
subCategories: PropTypes.arrayOf(
PropTypes.shape({
text: PropTypes.string.isRequired,
id: PropTypes.string.isRequired,
})
).isRequired,
})
),
top: PropTypes.arrayOf(
PropTypes.shape({
id: PropTypes.string.isRequired,
icon: PropTypes.object.isRequired,
text: PropTypes.string.isRequired,
subCategories: PropTypes.arrayOf(
PropTypes.shape({
text: PropTypes.string.isRequired,
id: PropTypes.string.isRequired,
})
).isRequired,
})
),
}),
user: PropTypes.shape({
id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
name: PropTypes.string.isRequired,
avatar: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),
}),
onClickUser: PropTypes.func,
onLogout: PropTypes.func,
linkComponent: PropTypes.oneOfType([PropTypes.node, PropTypes.element]),
};
export { SideDrawer };