header responsive and drawer
This commit is contained in:
parent
f5110f2aef
commit
7e0c6b23ed
File diff suppressed because it is too large
Load Diff
|
@ -15,6 +15,7 @@
|
||||||
"graphql": "^15.5.1",
|
"graphql": "^15.5.1",
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
"react": "^17.0.2",
|
"react": "^17.0.2",
|
||||||
|
"react-apple-signin-auth": "^1.0.9",
|
||||||
"react-dom": "^17.0.2",
|
"react-dom": "^17.0.2",
|
||||||
"react-facebook-login": "^4.1.1",
|
"react-facebook-login": "^4.1.1",
|
||||||
"react-geocode": "^0.2.3",
|
"react-geocode": "^0.2.3",
|
||||||
|
|
|
@ -1,16 +1,46 @@
|
||||||
/* eslint-disable react-hooks/exhaustive-deps */
|
// /* eslint-disable react-hooks/exhaustive-deps */
|
||||||
import { AppBar, Box, Button, Divider, Grid, IconButton, Toolbar, Typography } from "@material-ui/core";
|
|
||||||
|
import React, { useCallback, useContext, useState } from "react";
|
||||||
|
import {
|
||||||
|
AppBar,
|
||||||
|
Box,
|
||||||
|
Button,
|
||||||
|
Divider,
|
||||||
|
Drawer,
|
||||||
|
Grid,
|
||||||
|
Hidden,
|
||||||
|
IconButton,
|
||||||
|
List,
|
||||||
|
ListItem,
|
||||||
|
ListItemText,
|
||||||
|
Toolbar,
|
||||||
|
Typography,
|
||||||
|
withStyles,
|
||||||
|
} from "@material-ui/core";
|
||||||
import ShoppingCartOutlinedIcon from "@material-ui/icons/ShoppingCartOutlined";
|
import ShoppingCartOutlinedIcon from "@material-ui/icons/ShoppingCartOutlined";
|
||||||
|
import MenuIcon from "@material-ui/icons/Menu";
|
||||||
import clsx from "clsx";
|
import clsx from "clsx";
|
||||||
import React, { useCallback, useContext } from "react";
|
|
||||||
import { Link as RouterLink, useHistory, useLocation } from "react-router-dom";
|
import { Link as RouterLink, useHistory, useLocation } from "react-router-dom";
|
||||||
import LogoHorizontal from "../../../assets/icons/LogoHorizontal";
|
import LogoHorizontal from "../../../assets/icons/LogoHorizontal";
|
||||||
import { UserContext } from "../../../context/User";
|
import { UserContext } from "../../../context/User";
|
||||||
import { HEADER_NAV } from "../../../utils/constant";
|
import { HEADER_NAV } from "../../../utils/constant";
|
||||||
import useStyle from "./styles";
|
import useStyle from "./styles";
|
||||||
|
|
||||||
function MainHeader() {
|
const useStyles = (theme) => ({
|
||||||
const classes = useStyle();
|
drawerPaper: {
|
||||||
|
width: 300,
|
||||||
|
},
|
||||||
|
selectedListItem: {
|
||||||
|
backgroundColor: "#febb2c",
|
||||||
|
"&:hover": {
|
||||||
|
backgroundColor: "#B1821E",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
function MainHeader({ classes }) {
|
||||||
|
const headerClasses = useStyle();
|
||||||
|
const mobileClasses = useStyles(); // Mobile-specific styles
|
||||||
const navigation = useHistory();
|
const navigation = useHistory();
|
||||||
const location = useLocation();
|
const location = useLocation();
|
||||||
const urlPath = location.pathname;
|
const urlPath = location.pathname;
|
||||||
|
@ -24,6 +54,12 @@ function MainHeader() {
|
||||||
}
|
}
|
||||||
}, [isLoggedIn]);
|
}, [isLoggedIn]);
|
||||||
|
|
||||||
|
const [sidebarOpen, setSidebarOpen] = useState(false);
|
||||||
|
|
||||||
|
const toggleSidebar = () => {
|
||||||
|
setSidebarOpen(!sidebarOpen);
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Grid container item xs={12}>
|
<Grid container item xs={12}>
|
||||||
<Grid item xs={1} md={1} />
|
<Grid item xs={1} md={1} />
|
||||||
|
@ -31,9 +67,9 @@ function MainHeader() {
|
||||||
<AppBar position="static" color="transparent" elevation={0}>
|
<AppBar position="static" color="transparent" elevation={0}>
|
||||||
<Toolbar disableGutters>
|
<Toolbar disableGutters>
|
||||||
<Box display="flex" alignItems="center" flexGrow={1}>
|
<Box display="flex" alignItems="center" flexGrow={1}>
|
||||||
<IconButton disableRipple edge="start" className={classes.menuButton} color="inherit" aria-label="menu">
|
<LogoHorizontal width="130px" height="100%" />
|
||||||
<LogoHorizontal width="100px" />
|
</Box>
|
||||||
</IconButton>
|
<Hidden smDown>
|
||||||
{HEADER_NAV.map((element) => {
|
{HEADER_NAV.map((element) => {
|
||||||
const isSelected = urlPath === element.navigate;
|
const isSelected = urlPath === element.navigate;
|
||||||
return (
|
return (
|
||||||
|
@ -44,23 +80,35 @@ function MainHeader() {
|
||||||
key={element.id}
|
key={element.id}
|
||||||
color="inherit"
|
color="inherit"
|
||||||
classes={{
|
classes={{
|
||||||
text: classes.MR2,
|
text: headerClasses.MR2,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Typography
|
<Typography
|
||||||
variant="subtitle2"
|
variant="subtitle2"
|
||||||
color={"textPrimary"}
|
color={"textPrimary"}
|
||||||
className={clsx({ [classes.unSelectedMenu]: !isSelected, [classes.selectedMenu]: isSelected })}
|
className={clsx({
|
||||||
|
[headerClasses.unSelectedMenu]: !isSelected,
|
||||||
|
[headerClasses.selectedMenu]: isSelected,
|
||||||
|
})}
|
||||||
>
|
>
|
||||||
{element.name}
|
{element.name}
|
||||||
</Typography>
|
</Typography>
|
||||||
</Button>
|
</Button>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
</Box>
|
</Hidden>
|
||||||
<Box display="flex" flexDirection="row" className={classes.loginView} mr={3}>
|
<Box
|
||||||
|
display="flex"
|
||||||
|
flexDirection="row"
|
||||||
|
className={headerClasses.loginView}
|
||||||
|
mr={3}
|
||||||
|
>
|
||||||
<Button color="inherit">
|
<Button color="inherit">
|
||||||
<Typography variant="body2" color={"textPrimary"} className={classes.upperCase}>
|
<Typography
|
||||||
|
variant="body2"
|
||||||
|
color={"textPrimary"}
|
||||||
|
className={headerClasses.upperCase}
|
||||||
|
>
|
||||||
EN
|
EN
|
||||||
</Typography>
|
</Typography>
|
||||||
</Button>
|
</Button>
|
||||||
|
@ -72,7 +120,11 @@ function MainHeader() {
|
||||||
authorization();
|
authorization();
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Typography variant="body2" color={"textPrimary"} className={classes.upperCase}>
|
<Typography
|
||||||
|
variant="body2"
|
||||||
|
color={"textPrimary"}
|
||||||
|
className={headerClasses.upperCase}
|
||||||
|
>
|
||||||
{isLoggedIn ? "Logout" : "Login"}
|
{isLoggedIn ? "Logout" : "Login"}
|
||||||
</Typography>
|
</Typography>
|
||||||
</Button>
|
</Button>
|
||||||
|
@ -82,28 +134,76 @@ function MainHeader() {
|
||||||
color="primary"
|
color="primary"
|
||||||
size="medium"
|
size="medium"
|
||||||
classes={{
|
classes={{
|
||||||
containedPrimary: classes.cartBtn,
|
containedPrimary: headerClasses.cartBtn,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<ShoppingCartOutlinedIcon />
|
<ShoppingCartOutlinedIcon />
|
||||||
<Box bgcolor="info.main" borderRadius={20} className={classes.tagView}>
|
<Box
|
||||||
|
bgcolor="info.main"
|
||||||
|
borderRadius={20}
|
||||||
|
className={headerClasses.tagView}
|
||||||
|
>
|
||||||
<Typography
|
<Typography
|
||||||
component="p"
|
component="p"
|
||||||
color="textPrimary"
|
color="textPrimary"
|
||||||
variant="subtitle2"
|
variant="subtitle2"
|
||||||
classes={{
|
classes={{
|
||||||
subtitle2: classes.tagIcon,
|
subtitle2: headerClasses.tagIcon,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
2
|
2
|
||||||
</Typography>
|
</Typography>
|
||||||
</Box>
|
</Box>
|
||||||
</Button>
|
</Button>
|
||||||
|
<Hidden mdUp>
|
||||||
|
<IconButton
|
||||||
|
edge="end"
|
||||||
|
className={clsx(
|
||||||
|
headerClasses.menuButton,
|
||||||
|
mobileClasses.menuButtonMobile
|
||||||
|
)}
|
||||||
|
color="inherit"
|
||||||
|
aria-label="menu"
|
||||||
|
onClick={toggleSidebar}
|
||||||
|
>
|
||||||
|
<MenuIcon style={{ color: "white" }} />
|
||||||
|
</IconButton>
|
||||||
|
</Hidden>
|
||||||
</Toolbar>
|
</Toolbar>
|
||||||
</AppBar>
|
</AppBar>
|
||||||
|
<Hidden mdUp>
|
||||||
|
{/* Customize the Drawer */}
|
||||||
|
<Drawer
|
||||||
|
anchor="right"
|
||||||
|
open={sidebarOpen}
|
||||||
|
onClose={toggleSidebar}
|
||||||
|
classes={{
|
||||||
|
paper: classes.drawerPaper, // Apply custom styles to the Drawer
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<List>
|
||||||
|
{HEADER_NAV.map((element) => (
|
||||||
|
<ListItem
|
||||||
|
button
|
||||||
|
component={RouterLink}
|
||||||
|
to={element.navigate}
|
||||||
|
key={element.id}
|
||||||
|
onClick={toggleSidebar}
|
||||||
|
className={
|
||||||
|
urlPath === element.navigate
|
||||||
|
? classes.selectedListItem
|
||||||
|
: null
|
||||||
|
} // Apply selected style
|
||||||
|
>
|
||||||
|
<ListItemText primary={element.name} />
|
||||||
|
</ListItem>
|
||||||
|
))}
|
||||||
|
</List>
|
||||||
|
</Drawer>
|
||||||
|
</Hidden>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Grid>
|
</Grid>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export default React.memo(MainHeader);
|
export default withStyles(useStyles)(React.memo(MainHeader)); // Apply custom styles using withStyles
|
||||||
|
|
|
@ -8,7 +8,7 @@ import useStyle from "./styles";
|
||||||
|
|
||||||
function SearchContainer(props) {
|
function SearchContainer(props) {
|
||||||
const classes = useStyle();
|
const classes = useStyle();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Grid container className={classes.mainContainer}>
|
<Grid container className={classes.mainContainer}>
|
||||||
<Grid container item xs={12} className={classes.headingContainer}>
|
<Grid container item xs={12} className={classes.headingContainer}>
|
||||||
|
@ -18,10 +18,26 @@ function SearchContainer(props) {
|
||||||
<Grid container item xs={10} sm={10} md={9} lg={8}>
|
<Grid container item xs={10} sm={10} md={9} lg={8}>
|
||||||
<Grid item xs={12} sm={9}>
|
<Grid item xs={12} sm={9}>
|
||||||
{props.showSearch ? (
|
{props.showSearch ? (
|
||||||
<Paper component="form" className={clsx(classes.searchContainer, classes.bottomHeight)}>
|
<Paper
|
||||||
|
component="form"
|
||||||
|
className={clsx(
|
||||||
|
classes.searchContainer,
|
||||||
|
classes.bottomHeight
|
||||||
|
)}
|
||||||
|
>
|
||||||
<SearchIcon color="action" />
|
<SearchIcon color="action" />
|
||||||
<InputBase fullWidth color="primary" placeholder="Search" className={classes.input} />
|
<InputBase
|
||||||
<Button onClick={props.toggleModal} size="large" color="primary" className={classes.rightBtn}>
|
fullWidth
|
||||||
|
color="primary"
|
||||||
|
placeholder="Search"
|
||||||
|
className={classes.input}
|
||||||
|
/>
|
||||||
|
<Button
|
||||||
|
onClick={props.toggleModal}
|
||||||
|
size="large"
|
||||||
|
color="primary"
|
||||||
|
className={classes.rightBtn}
|
||||||
|
>
|
||||||
<TuneIcon color="primary" />
|
<TuneIcon color="primary" />
|
||||||
<Typography variant="body1" color="primary">
|
<Typography variant="body1" color="primary">
|
||||||
Filters
|
Filters
|
||||||
|
@ -29,7 +45,11 @@ function SearchContainer(props) {
|
||||||
</Button>
|
</Button>
|
||||||
</Paper>
|
</Paper>
|
||||||
) : (
|
) : (
|
||||||
<Typography variant="h3" color="textPrimary" className={classes.bottomHeight}>
|
<Typography
|
||||||
|
variant="h3"
|
||||||
|
color="textPrimary"
|
||||||
|
className={classes.bottomHeight}
|
||||||
|
>
|
||||||
{props.heading ?? ""}
|
{props.heading ?? ""}
|
||||||
</Typography>
|
</Typography>
|
||||||
)}
|
)}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
const SERVER_URL = "http://192.168.43.245:8000/";
|
const SERVER_URL = "http://10.97.28.31:8000/";
|
||||||
const WS_SERVER_URL = "ws://192.168.43.245:8000/";
|
const WS_SERVER_URL = "ws://10.97.28.31:8000/";
|
||||||
const GOOGLE_CLIENT_ID = "94983896797-s9qpbnjj4fg5b9fa35m25bm80h1mouaf.apps.googleusercontent.com";
|
const GOOGLE_CLIENT_ID =
|
||||||
|
"967541328677-ge2hpr0n095d0nro56kot0t4q388dsll.apps.googleusercontent.com";
|
||||||
|
|
||||||
export { SERVER_URL, WS_SERVER_URL, GOOGLE_CLIENT_ID };
|
export { SERVER_URL, WS_SERVER_URL, GOOGLE_CLIENT_ID };
|
||||||
|
|
|
@ -3,7 +3,13 @@ import { Grid, LinearProgress, Typography } from "@material-ui/core";
|
||||||
import React, { useEffect } from "react";
|
import React, { useEffect } from "react";
|
||||||
import { gql, useQuery } from "@apollo/client";
|
import { gql, useQuery } from "@apollo/client";
|
||||||
import { categories } from "../../apollo/graphQL";
|
import { categories } from "../../apollo/graphQL";
|
||||||
import { RestaurantRow, SearchContainer, Footer, PaymentModal, FilterModal } from "../../components";
|
import {
|
||||||
|
RestaurantRow,
|
||||||
|
SearchContainer,
|
||||||
|
Footer,
|
||||||
|
PaymentModal,
|
||||||
|
FilterModal,
|
||||||
|
} from "../../components";
|
||||||
import useFilterModal from "../../hooks/useFilterModal";
|
import useFilterModal from "../../hooks/useFilterModal";
|
||||||
|
|
||||||
const CATEGORIES = gql`
|
const CATEGORIES = gql`
|
||||||
|
@ -11,8 +17,8 @@ const CATEGORIES = gql`
|
||||||
`;
|
`;
|
||||||
|
|
||||||
function Home() {
|
function Home() {
|
||||||
const { data, loading} = useQuery(CATEGORIES);
|
const { data, loading } = useQuery(CATEGORIES);
|
||||||
const {isOpen, toggleModal} = useFilterModal()
|
const { isOpen, toggleModal } = useFilterModal();
|
||||||
|
|
||||||
const sections = [
|
const sections = [
|
||||||
{
|
{
|
||||||
|
@ -27,14 +33,14 @@ function Home() {
|
||||||
|
|
||||||
const restaurantSections = sections.map((sec) => ({
|
const restaurantSections = sections.map((sec) => ({
|
||||||
...sec,
|
...sec,
|
||||||
...data
|
...data,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Grid container>
|
<Grid container>
|
||||||
{<FilterModal isOpen={isOpen} toggleModal={toggleModal}/>}
|
{<FilterModal isOpen={isOpen} toggleModal={toggleModal} />}
|
||||||
<Grid container item>
|
<Grid container item>
|
||||||
<SearchContainer showSearch toggleModal={toggleModal}/>
|
<SearchContainer showSearch toggleModal={toggleModal} />
|
||||||
</Grid>
|
</Grid>
|
||||||
<Grid container item>
|
<Grid container item>
|
||||||
{loading ? (
|
{loading ? (
|
||||||
|
|
|
@ -11,6 +11,7 @@ import { GetStartedWrapper } from "../../../components";
|
||||||
import { useRegistration } from "../../../hooks";
|
import { useRegistration } from "../../../hooks";
|
||||||
import useStyles from "./styles";
|
import useStyles from "./styles";
|
||||||
import FacebookLogin from "react-facebook-login/dist/facebook-login-render-props";
|
import FacebookLogin from "react-facebook-login/dist/facebook-login-render-props";
|
||||||
|
import AppleSignIn from "react-apple-signin-auth";
|
||||||
|
|
||||||
function Login() {
|
function Login() {
|
||||||
const classes = useStyles();
|
const classes = useStyles();
|
||||||
|
@ -23,42 +24,24 @@ function Login() {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<GetStartedWrapper>
|
<GetStartedWrapper>
|
||||||
<Grid container item xs={12} direction="row" justifyContent="space-between" className={classes.height100}>
|
<Grid
|
||||||
|
container
|
||||||
|
item
|
||||||
|
xs={12}
|
||||||
|
direction="row"
|
||||||
|
justifyContent="space-between"
|
||||||
|
className={classes.height100}
|
||||||
|
>
|
||||||
<Grid item xs={12} className={clsx(classes.width100, classes.logoView)}>
|
<Grid item xs={12} className={clsx(classes.width100, classes.logoView)}>
|
||||||
<img className={classes.imgContainer} src={Logo} alt="Logo" />
|
<img className={classes.imgContainer} src={Logo} alt="Logo" />
|
||||||
</Grid>
|
</Grid>
|
||||||
<Grid container item xs={12} direction="column" className={clsx(classes.width100, classes.bottomView)}>
|
<Grid
|
||||||
<FacebookLogin
|
container
|
||||||
appId="487943819244563"
|
item
|
||||||
fields="name,email,picture"
|
xs={12}
|
||||||
callback={responseFacebook}
|
direction="column"
|
||||||
render={(renderProps) => (
|
className={clsx(classes.width100, classes.bottomView)}
|
||||||
<Button
|
>
|
||||||
variant="contained"
|
|
||||||
size="large"
|
|
||||||
disableElevation
|
|
||||||
fullWidth
|
|
||||||
disabled={loading || renderProps.disabled}
|
|
||||||
className={classes.loginBtn}
|
|
||||||
startIcon={<FacebookIcon />}
|
|
||||||
onClick={() => renderProps.onClick()}
|
|
||||||
>
|
|
||||||
{loading && loginButton === "FACEBOOK" ? (
|
|
||||||
<CircularProgress color="secondary" size={24} thickness={5} />
|
|
||||||
) : (
|
|
||||||
<Typography
|
|
||||||
variant="button"
|
|
||||||
color="textSecondary"
|
|
||||||
align="left"
|
|
||||||
al
|
|
||||||
className={clsx(classes.font700, classes.btnText)}
|
|
||||||
>
|
|
||||||
Continue with Facebook
|
|
||||||
</Typography>
|
|
||||||
)}
|
|
||||||
</Button>
|
|
||||||
)}
|
|
||||||
/>
|
|
||||||
<Button
|
<Button
|
||||||
variant="contained"
|
variant="contained"
|
||||||
size="large"
|
size="large"
|
||||||
|
@ -85,24 +68,7 @@ function Login() {
|
||||||
</Typography>
|
</Typography>
|
||||||
)}
|
)}
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
|
||||||
variant="contained"
|
|
||||||
size="large"
|
|
||||||
disableElevation
|
|
||||||
fullWidth
|
|
||||||
disabled={loading}
|
|
||||||
className={classes.loginBtn}
|
|
||||||
startIcon={<AppleIcon />}
|
|
||||||
>
|
|
||||||
<Typography
|
|
||||||
variant="button"
|
|
||||||
color="textSecondary"
|
|
||||||
align="left"
|
|
||||||
className={clsx(classes.font700, classes.btnText)}
|
|
||||||
>
|
|
||||||
Continue With Apple
|
|
||||||
</Typography>
|
|
||||||
</Button>
|
|
||||||
<Button
|
<Button
|
||||||
component={RouterLink}
|
component={RouterLink}
|
||||||
to="/Signup"
|
to="/Signup"
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue