Skip to content

Commit 6f0f200

Browse files
committed
Create header for Admin pages
Fix #118
1 parent 24086dd commit 6f0f200

File tree

4 files changed

+299
-0
lines changed

4 files changed

+299
-0
lines changed
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
import React, { useContext, useState } from 'react';
2+
3+
import Axios from 'axios';
4+
5+
import Alert from '@material-ui/lab/Alert';
6+
import Snackbar from '@material-ui/core/Snackbar';
7+
import IconButton from '@material-ui/core/IconButton';
8+
import MenuIcon from '@material-ui/icons/Menu';
9+
import Menu from '@material-ui/core/Menu';
10+
import MenuItem from '@material-ui/core/MenuItem';
11+
12+
import { useHistory } from 'react-router-dom';
13+
14+
import { userContext } from '../../utils/userProvider';
15+
16+
import useStyles from './style';
17+
18+
function NavMobile() {
19+
const classes = useStyles();
20+
const history = useHistory();
21+
const [, setRole] = useContext(userContext);
22+
const [error, setError] = useState();
23+
const [openSnack, setOpenSnack] = useState(false);
24+
25+
const [anchorEl, setAnchorEl] = useState(null);
26+
const open = Boolean(anchorEl);
27+
28+
const handleClose = (event, reason) => {
29+
if (reason === 'clickaway') {
30+
return;
31+
}
32+
setOpenSnack(false);
33+
};
34+
35+
const handleMenu = (event) => {
36+
setAnchorEl(event.currentTarget);
37+
};
38+
39+
const handleMenuClick = (pageURL) => {
40+
history.push(pageURL);
41+
setAnchorEl(null);
42+
};
43+
const logOutClick = async () => {
44+
try {
45+
await Axios.post('api/v1/logout');
46+
setRole('guest');
47+
setOpenSnack(true);
48+
history.push('/');
49+
} catch (err) {
50+
setError(
51+
err.response ? err.response.data.message : 'Internal Server Error'
52+
);
53+
}
54+
};
55+
56+
return (
57+
<div>
58+
<IconButton
59+
edge="start"
60+
className={classes.menuButton}
61+
color="secondary"
62+
aria-label="menu"
63+
onClick={handleMenu}
64+
>
65+
<MenuIcon />
66+
</IconButton>
67+
<Menu
68+
id="menu-appbar"
69+
classes={{ paper: classes.menuPaper }}
70+
anchorEl={anchorEl}
71+
anchorOrigin={{
72+
vertical: 'top',
73+
horizontal: 'right',
74+
}}
75+
keepMounted
76+
transformOrigin={{
77+
vertical: 'top',
78+
horizontal: 'right',
79+
}}
80+
open={open}
81+
onClose={() => setAnchorEl(null)}
82+
>
83+
<MenuItem onClick={() => handleMenuClick('/')}>Services</MenuItem>
84+
<MenuItem onClick={() => handleMenuClick('/')}>Products</MenuItem>
85+
<MenuItem onClick={() => handleMenuClick('/')}>Blogs</MenuItem>
86+
<MenuItem
87+
classes={{ root: 'logoutMobile' }}
88+
className={classes.logoutMobile}
89+
onClick={() => logOutClick()}
90+
>
91+
Logout
92+
</MenuItem>
93+
</Menu>
94+
<Snackbar open={openSnack} autoHideDuration={8000} onClose={handleClose}>
95+
<Alert onClose={handleClose} severity={error ? 'error' : 'success'}>
96+
{error || 'LogOut Successfully!'}
97+
</Alert>
98+
</Snackbar>
99+
</div>
100+
);
101+
}
102+
103+
export default NavMobile;
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
import React, { useState, useContext } from 'react';
2+
import Axios from 'axios';
3+
4+
import { Link, useHistory } from 'react-router-dom';
5+
import Alert from '@material-ui/lab/Alert';
6+
import Snackbar from '@material-ui/core/Snackbar';
7+
import AppBar from '@material-ui/core/AppBar';
8+
import Toolbar from '@material-ui/core/Toolbar';
9+
import IconButton from '@material-ui/core/IconButton';
10+
import AccountCircle from '@material-ui/icons/AccountCircle';
11+
import useMediaQuery from '@material-ui/core/useMediaQuery';
12+
import { useTheme } from '@material-ui/core/styles';
13+
14+
import ButtonComponent from '../Button';
15+
16+
import { userContext } from '../../utils/userProvider';
17+
18+
import NavMobile from './NavMobile';
19+
import useStyles from './style';
20+
21+
const HeaderForAdmin = () => {
22+
const classes = useStyles();
23+
const theme = useTheme();
24+
const isMobile = useMediaQuery(theme.breakpoints.down('xs'));
25+
const history = useHistory();
26+
const [, setRole] = useContext(userContext);
27+
const [error, setError] = useState();
28+
const [open, setOpen] = useState(false);
29+
30+
const handleMenuClick = (pageURL) => {
31+
history.push(pageURL);
32+
};
33+
const handleClose = (event, reason) => {
34+
if (reason === 'clickaway') {
35+
return;
36+
}
37+
setOpen(false);
38+
};
39+
const logOutClick = async () => {
40+
try {
41+
await Axios.post('api/v1/logout');
42+
setRole('guest');
43+
setOpen(true);
44+
history.push('/');
45+
} catch (err) {
46+
setError(
47+
err.response ? err.response.data.message : 'Internal Server Error'
48+
);
49+
}
50+
};
51+
52+
return (
53+
<div>
54+
<AppBar position="static" color="transparent">
55+
<Toolbar>
56+
<div className={classes.header}>
57+
<div className={classes.headerLeftSide}>
58+
{isMobile ? (
59+
<NavMobile />
60+
) : (
61+
<div>
62+
<Link className={classes.options} to="/">
63+
Services
64+
</Link>
65+
<Link className={classes.options} to="/">
66+
Products
67+
</Link>
68+
<Link className={classes.options} to="/">
69+
Blogs
70+
</Link>
71+
</div>
72+
)}
73+
</div>
74+
<Link className={classes.title} to="/">
75+
Beauty
76+
</Link>
77+
78+
<div className={classes.headerRightSide}>
79+
{!isMobile && (
80+
<>
81+
<IconButton
82+
className={classes.icons}
83+
aria-label="account of current user"
84+
aria-controls="menu-appbar"
85+
aria-haspopup="true"
86+
color="secondary"
87+
onClick={() => handleMenuClick()}
88+
>
89+
<AccountCircle />
90+
</IconButton>
91+
<ButtonComponent
92+
className={classes.logout}
93+
variant="outlined"
94+
onClick={() => logOutClick()}
95+
>
96+
Logout
97+
</ButtonComponent>
98+
</>
99+
)}
100+
{isMobile && (
101+
<IconButton
102+
className={classes.icons}
103+
aria-label="account of current user"
104+
aria-controls="menu-appbar"
105+
aria-haspopup="true"
106+
color="secondary"
107+
onClick={() => handleMenuClick()}
108+
>
109+
<AccountCircle />
110+
</IconButton>
111+
)}
112+
</div>
113+
</div>
114+
<Snackbar open={open} autoHideDuration={8000} onClose={handleClose}>
115+
<Alert onClose={handleClose} severity={error ? 'error' : 'success'}>
116+
{error || 'LogOut Successfully!'}
117+
</Alert>
118+
</Snackbar>
119+
</Toolbar>
120+
</AppBar>
121+
</div>
122+
);
123+
};
124+
125+
export default HeaderForAdmin;
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import { makeStyles } from '@material-ui/core/styles';
2+
3+
const useStyles = makeStyles((theme) => ({
4+
root: {
5+
flexGrow: 1,
6+
[theme.breakpoints.up('sm')]: {
7+
marginTop: '5px',
8+
},
9+
},
10+
header: {
11+
[theme.breakpoints.up('sm')]: {
12+
flexGrow: 1,
13+
},
14+
display: 'flex',
15+
flexDirection: 'row',
16+
justifyContent: 'space-around',
17+
alignItems: 'center',
18+
width: '100%',
19+
},
20+
title: {
21+
display: 'block',
22+
fontSize: '2em',
23+
color: '#fff',
24+
textDecoration: 'none',
25+
fontWeight: 'bold',
26+
'&:hover': {
27+
color: 'f8f8ff',
28+
transform: 'scale(1.1)',
29+
boxShadow: '#888888',
30+
},
31+
'&::first-letter': {
32+
fontSize: '130%',
33+
color: theme.palette.primary.main,
34+
},
35+
},
36+
headerLeftSide: {
37+
justifyContent: 'space-between',
38+
},
39+
40+
options: {
41+
padding: '1em',
42+
color: '#fff',
43+
textDecoration: 'none',
44+
borderRadius: '1.5em',
45+
'&:hover': {
46+
background: '#101010',
47+
},
48+
},
49+
menuPaper: {
50+
backgroundColor: '#0e1717',
51+
},
52+
signup: {
53+
marginLeft: '1em',
54+
color: '#fff',
55+
'&:hover': {
56+
color: 'f8f8ff',
57+
transform: 'scale(1.1)',
58+
boxShadow: '#888888',
59+
},
60+
},
61+
logout: {
62+
marginLeft: '1em',
63+
},
64+
logoutMobile: {
65+
backgroundColor: 'red',
66+
},
67+
}));
68+
69+
export default useStyles;

client/src/component/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import ServiceCardForHomePage from './seviceCardHomePage';
1010
import SelectInput from './Select';
1111
import BlogsCard from './BlogCard';
1212
import BlogsCardForBlogs from './BlogCardForBlogs';
13+
import HeaderForAdmin from './AdminHeader';
1314

1415
export {
1516
InputDate,
@@ -24,4 +25,5 @@ export {
2425
SelectInput,
2526
BlogsCard,
2627
BlogsCardForBlogs,
28+
HeaderForAdmin,
2729
};

0 commit comments

Comments
 (0)