Header.jsx 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. import * as React from 'react';
  2. import AppBar from '@mui/material/AppBar';
  3. import Box from '@mui/material/Box';
  4. import Toolbar from '@mui/material/Toolbar';
  5. import IconButton from '@mui/material/IconButton';
  6. import Typography from '@mui/material/Typography';
  7. import Menu from '@mui/material/Menu';
  8. import MenuIcon from '@mui/icons-material/Menu';
  9. import Container from '@mui/material/Container';
  10. import Avatar from '@mui/material/Avatar';
  11. import Button from '@mui/material/Button';
  12. import Tooltip from '@mui/material/Tooltip';
  13. import MenuItem from '@mui/material/MenuItem';
  14. import SearchIcon from '@mui/icons-material/Search';
  15. import FavoriteBorderIcon from '@mui/icons-material/FavoriteBorder';
  16. import ShoppingCartIcon from '@mui/icons-material/ShoppingCart';
  17. import ManageSearchIcon from '@mui/icons-material/ManageSearch';
  18. import Link from "react-router-dom/es/Link";
  19. import '../scss/Header.scss';
  20. import {useState} from "react";
  21. const pages = ['catalog', 'about us', 'our team', 'faq', 'contact'];
  22. const settings = ['Profile', 'Account', 'Dashboard', 'Logout'];
  23. const Header = () => {
  24. const [anchorElNav, setAnchorElNav] = useState(null);
  25. const [anchorElUser, setAnchorElUser] = useState(null);
  26. const handleOpenNavMenu = (event) => {
  27. setAnchorElNav(event.currentTarget);
  28. };
  29. const handleOpenUserMenu = (event) => {
  30. setAnchorElUser(event.currentTarget);
  31. };
  32. const handleCloseNavMenu = () => {
  33. setAnchorElNav(null);
  34. };
  35. const handleCloseUserMenu = () => {
  36. setAnchorElUser(null);
  37. };
  38. const LogoItem = () => {
  39. return (
  40. <Link to='/' className="Header__Logo"> ABRAXAS </Link>
  41. )
  42. }
  43. const LinkItem = ({page, color='white'}) => {
  44. return (
  45. <Button
  46. key={page}
  47. onClick={handleCloseNavMenu}
  48. sx={{ my: 2, color: color, display: 'block'}}
  49. >
  50. <Link
  51. to={`/${Array.from(page.toLowerCase()).map(i => i === ' ' ? '-' : i).join('')}`}
  52. className="Header__Link"> {page}
  53. </Link>
  54. </Button>
  55. )
  56. }
  57. const IconItems = ({size="large", color='default'}) => {
  58. return (
  59. <>
  60. <Link to='/search'>
  61. <IconButton size={size} aria-label="search" color={color}>
  62. <SearchIcon />
  63. </IconButton>
  64. </Link>
  65. <Link to='/my-orders'>
  66. <IconButton size={size} aria-label="my-orders" color={color}>
  67. <ManageSearchIcon />
  68. </IconButton>
  69. </Link>
  70. <Link to='/wish-list'>
  71. <IconButton size={size} aria-label="wish-list" color={color}>
  72. <FavoriteBorderIcon />
  73. </IconButton>
  74. </Link>
  75. <Link to='/basket'>
  76. <IconButton size={size} aria-label="basket" color={color}>
  77. <ShoppingCartIcon />
  78. </IconButton>
  79. </Link>
  80. </>
  81. )
  82. }
  83. return (
  84. <AppBar className='Header' position="fixed">
  85. <Container maxWidth="xl">
  86. <Toolbar disableGutters>
  87. {/*Основной логотип*/}
  88. <Typography
  89. variant="h6"
  90. noWrap
  91. component="div"
  92. sx={{ mr: 2, display: { xs: 'none', md: 'flex' } }}
  93. >
  94. <LogoItem/>
  95. </Typography>
  96. {/*Меню бургер*/}
  97. <Box sx={{ flexGrow: 1, display: { xs: 'flex', md: 'none' } }}>
  98. <IconButton
  99. size="large"
  100. aria-label="account of current user"
  101. aria-controls="menu-appbar"
  102. aria-haspopup="true"
  103. onClick={handleOpenNavMenu}
  104. color="inherit"
  105. >
  106. <MenuIcon />
  107. </IconButton>
  108. <Menu className='Header__Burger'
  109. id="menu-appbar"
  110. anchorEl={anchorElNav}
  111. anchorOrigin={{
  112. vertical: 'bottom',
  113. horizontal: 'left',
  114. }}
  115. keepMounted
  116. transformOrigin={{
  117. vertical: 'top',
  118. horizontal: 'left',
  119. }}
  120. open={Boolean(anchorElNav)}
  121. onClose={handleCloseNavMenu}
  122. sx={{
  123. display: { xs: 'block', md: 'none' },
  124. }}
  125. >
  126. {pages.map((page) => (
  127. <MenuItem key={page} onClick={handleCloseNavMenu}>
  128. <LinkItem page={page} color={'#fff'}/>
  129. </MenuItem>
  130. ))}
  131. <MenuItem onClick={handleCloseNavMenu}>
  132. <IconItems size={'large'} color={'inherit'}/>
  133. </MenuItem>
  134. </Menu>
  135. </Box>
  136. {/*Логитип для смартфонов*/}
  137. <Typography
  138. variant="h6"
  139. noWrap
  140. component="div"
  141. sx={{ flexGrow: 1, display: { xs: 'flex', md: 'none' } }}
  142. >
  143. <LogoItem />
  144. </Typography>
  145. {/*Основные ссылки для декстопа*/}
  146. <Box className='Header__Links' sx={{ flexGrow: 1, display: { xs: 'none', md: 'flex' } }}>
  147. {pages.map((page) => (
  148. <LinkItem page={page} color={'#fff'}/>
  149. ))}
  150. </Box>
  151. {/*Иконки для декстопа*/}
  152. <Box className='Header__Icons' sx={{ flexGrow: 0, display: { xs: 'none', md: 'flex' } }}>
  153. <IconItems size={'large'}/>
  154. </Box>
  155. {/*Пользователь*/}
  156. <Box sx={{ flexGrow: 0 }}>
  157. <Tooltip title="Open settings">
  158. <IconButton onClick={handleOpenUserMenu} sx={{ p: 0 }}>
  159. <Avatar alt="User" src="/static/images/avatar/2.jpg" />
  160. </IconButton>
  161. </Tooltip>
  162. <Menu
  163. sx={{ mt: '45px' }}
  164. id="menu-appbar"
  165. anchorEl={anchorElUser}
  166. anchorOrigin={{
  167. vertical: 'top',
  168. horizontal: 'right',
  169. }}
  170. keepMounted
  171. transformOrigin={{
  172. vertical: 'top',
  173. horizontal: 'right',
  174. }}
  175. open={Boolean(anchorElUser)}
  176. onClose={handleCloseUserMenu}
  177. >
  178. {settings.map((setting) => (
  179. <MenuItem key={setting} onClick={handleCloseNavMenu}>
  180. <Typography textAlign="center">{setting}</Typography>
  181. </MenuItem>
  182. ))}
  183. </Menu>
  184. </Box>
  185. </Toolbar>
  186. </Container>
  187. </AppBar>
  188. );
  189. };
  190. export default Header;