diff options
author | eug-vs <eug-vs@keemail.me> | 2020-08-11 21:38:47 +0300 |
---|---|---|
committer | eug-vs <eug-vs@keemail.me> | 2020-08-11 21:38:47 +0300 |
commit | 4bcabf751b8292fee696db5e027f38b1838b0be6 (patch) | |
tree | 82f7b42441dd419037e3c59142a3f9c6b1421870 /src | |
parent | c6723fa8a2a303f356b1756b45b2190203c96582 (diff) | |
download | which-ui-4bcabf751b8292fee696db5e027f38b1838b0be6.tar.gz |
feat: add mobile header
Diffstat (limited to 'src')
-rw-r--r-- | src/components/Header/BottomBar.tsx | 39 | ||||
-rw-r--r-- | src/components/Header/Header.tsx | 75 | ||||
-rw-r--r-- | src/components/Header/MobileHeader.tsx | 38 | ||||
-rw-r--r-- | src/containers/Page/Page.tsx | 2 |
4 files changed, 120 insertions, 34 deletions
diff --git a/src/components/Header/BottomBar.tsx b/src/components/Header/BottomBar.tsx new file mode 100644 index 0000000..57efb3e --- /dev/null +++ b/src/components/Header/BottomBar.tsx @@ -0,0 +1,39 @@ +import React from 'react'; +import { AppBar, Toolbar } from '@material-ui/core'; +import { makeStyles } from '@material-ui/core/styles'; + +interface PropTypes { + profile: JSX.Element; + feed: JSX.Element; + notifications: JSX.Element; +} + +const useStyles = makeStyles(theme => ({ + root: { + top: 'auto', + bottom: 0 + }, + toolbar: { + display: 'flex', + justifyContent: 'space-around' + } +})); + + +const BottomBar: React.FC<PropTypes> = React.memo(props => { + const classes = useStyles(); + const { profile, feed, notifications } = props; + + return ( + <AppBar position="fixed" className={classes.root}> + <Toolbar className={classes.toolbar}> + {notifications} + {feed} + {profile} + </Toolbar> + </AppBar> + ); +}); + +export default BottomBar; + diff --git a/src/components/Header/Header.tsx b/src/components/Header/Header.tsx index c3a678c..b314d79 100644 --- a/src/components/Header/Header.tsx +++ b/src/components/Header/Header.tsx @@ -8,20 +8,22 @@ import { Avatar, useMediaQuery } from '@material-ui/core'; +import { + AccountCircle, + Notifications, + Home, + Menu, + Search, +} from '@material-ui/icons'; import { makeStyles, useTheme } from '@material-ui/core/styles'; -import AccountCircle from '@material-ui/icons/AccountCircle'; -import NotificationsIcon from '@material-ui/icons/Notifications'; -import HomeIcon from '@material-ui/icons/Home'; import { useAuth } from '../../hooks/useAuth'; import SearchBar from './SearchBar'; +import MobileHeader from './MobileHeader'; +import BottomBar from './BottomBar'; const useStyles = makeStyles(theme => ({ - mobile: { - top: 'auto', - bottom: 0 - }, toolbar: { display: 'flex', justifyContent: 'space-around' @@ -41,7 +43,6 @@ const useStyles = makeStyles(theme => ({ } })); - const Header: React.FC = React.memo(() => { const classes = useStyles(); const { user } = useAuth(); @@ -66,19 +67,37 @@ const Header: React.FC = React.memo(() => { history.push('/notifications'); }; - const FeedButton = ( + const feed = ( <IconButton onClick={handleFeed}> - <HomeIcon /> + <Home /> + </IconButton> + ); + + const notifications = ( + <IconButton onClick={handleNotifications}> + <Notifications /> + </IconButton> + ); + + const menu = ( + <IconButton> + <Menu /> </IconButton> ); - const NotificationsButton = ( + const search = ( <IconButton onClick={handleNotifications}> - <NotificationsIcon /> + <Search /> </IconButton> ); - const ProfileButton = ( + const logo = ( + <Typography variant="h5" className={classes.logo} onClick={handleHome}> + Which + </Typography> + ); + + const profile= ( <IconButton onClick={handleProfile}> { user?.avatarUrl @@ -91,33 +110,23 @@ const Header: React.FC = React.memo(() => { const BrowserVersion = ( <AppBar position="fixed"> <Toolbar className={`${classes.toolbar} ${classes.browserToolbar}`}> - <Typography variant="h5" className={classes.logo} onClick={handleHome}> - Which - </Typography> + {logo} <SearchBar /> <div> - {FeedButton} - {NotificationsButton} - {ProfileButton} + {feed} + {notifications} + {profile} </div> </Toolbar> </AppBar> ); - const MobileVersion = ( - <AppBar position="fixed" className={classes.mobile}> - <Toolbar className={classes.toolbar}> - <IconButton onClick={handleHome}> - <Typography className={`${classes.logo} ${classes.round}`}>W</Typography> - </IconButton> - {FeedButton} - {NotificationsButton} - {ProfileButton} - </Toolbar> - </AppBar> - ); - - return isMobile ? MobileVersion : BrowserVersion; + return isMobile ? ( + <> + <MobileHeader logo={logo} menu={menu} search={search} /> + <BottomBar feed={feed} profile={profile} notifications={notifications} /> + </> + ) : BrowserVersion; }); export default Header; diff --git a/src/components/Header/MobileHeader.tsx b/src/components/Header/MobileHeader.tsx new file mode 100644 index 0000000..fbbd37a --- /dev/null +++ b/src/components/Header/MobileHeader.tsx @@ -0,0 +1,38 @@ +import React from 'react'; +import { AppBar, Toolbar, useScrollTrigger, Slide } from '@material-ui/core'; +import { makeStyles } from '@material-ui/core/styles'; + +interface PropTypes { + menu: JSX.Element; + logo: JSX.Element; + search: JSX.Element; +} + +const useStyles = makeStyles(theme => ({ + root: { + display: 'flex', + justifyContent: 'space-between', + }, +})); + + +const MobileHeader: React.FC<PropTypes> = React.memo(props => { + const classes = useStyles(); + const trigger = useScrollTrigger(); + const { menu, search, logo } = props; + + return ( + <Slide appear={false} direction="down" in={!trigger}> + <AppBar position="fixed"> + <Toolbar className={classes.root}> + {menu} + {logo} + {search} + </Toolbar> + </AppBar> + </Slide> + ); +}); + +export default MobileHeader; + diff --git a/src/containers/Page/Page.tsx b/src/containers/Page/Page.tsx index 643e6de..f6a0aa5 100644 --- a/src/containers/Page/Page.tsx +++ b/src/containers/Page/Page.tsx @@ -16,7 +16,7 @@ const Notifications = React.lazy(() => import('../Notifications/Notifications')) const useStyles = makeStyles(theme => ({ root: { [theme.breakpoints.down('sm')]: { - margin: theme.spacing(2, 0, 12, 0) + margin: theme.spacing(15, 0, 12, 0) }, [theme.breakpoints.up('md')]: { margin: theme.spacing(15, 5, 8, 5) |