Next.js template
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

Navbar.jsx 6.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. import AdbIcon from '@mui/icons-material/Adb';
  2. import MenuIcon from '@mui/icons-material/Menu';
  3. import AppBar from '@mui/material/AppBar';
  4. import Box from '@mui/material/Box';
  5. import Button from '@mui/material/Button';
  6. import Container from '@mui/material/Container';
  7. import IconButton from '@mui/material/IconButton';
  8. import Menu from '@mui/material/Menu';
  9. import MenuItem from '@mui/material/MenuItem';
  10. import Toolbar from '@mui/material/Toolbar';
  11. import Tooltip from '@mui/material/Tooltip';
  12. import Typography from '@mui/material/Typography';
  13. import { signOut, useSession } from 'next-auth/react';
  14. import Image from 'next/image';
  15. import Link from 'next/link';
  16. import { useState } from 'react';
  17. import { LOGIN_PAGE, PROFILE_PAGE } from '../../../constants/pages';
  18. const pages = ['Link 1', 'Link 2', 'Link 3'];
  19. const Navbar = () => {
  20. const { data: session } = useSession();
  21. const [anchorElNav, setAnchorElNav] = useState(null);
  22. const [anchorElUser, setAnchorElUser] = useState(null);
  23. const handleOpenNavMenu = (event) => {
  24. setAnchorElNav(event.currentTarget);
  25. };
  26. const handleOpenUserMenu = (event) => {
  27. setAnchorElUser(event.currentTarget);
  28. };
  29. const handleCloseNavMenu = () => {
  30. setAnchorElNav(null);
  31. };
  32. const handleCloseUserMenu = () => {
  33. setAnchorElUser(null);
  34. };
  35. function logoutHandler() {
  36. signOut();
  37. }
  38. return (
  39. <AppBar
  40. position="static"
  41. sx={{ zIndex: 100, position: 'fixed', top: 0, left: 0 }}
  42. >
  43. <Container maxWidth="xl">
  44. <Toolbar disableGutters>
  45. <AdbIcon sx={{ display: { xs: 'none', md: 'flex' }, mr: 1 }} />
  46. <Typography
  47. variant="h6"
  48. noWrap
  49. sx={{
  50. mr: 2,
  51. display: { xs: 'none', md: 'flex' },
  52. fontFamily: 'monospace',
  53. fontWeight: 700,
  54. letterSpacing: '.3rem',
  55. color: 'inherit',
  56. textDecoration: 'none',
  57. }}
  58. >
  59. LOGO
  60. </Typography>
  61. <Box sx={{ flexGrow: 1, display: { xs: 'flex', md: 'none' } }}>
  62. <IconButton
  63. size="large"
  64. aria-label="account of current user"
  65. aria-controls="menu-appbar"
  66. aria-haspopup="true"
  67. onClick={handleOpenNavMenu}
  68. color="inherit"
  69. >
  70. <MenuIcon />
  71. </IconButton>
  72. <Menu
  73. id="menu-appbar"
  74. anchorEl={anchorElNav}
  75. anchorOrigin={{
  76. vertical: 'bottom',
  77. horizontal: 'left',
  78. }}
  79. keepMounted
  80. transformOrigin={{
  81. vertical: 'top',
  82. horizontal: 'left',
  83. }}
  84. open={Boolean(anchorElNav)}
  85. onClose={handleCloseNavMenu}
  86. sx={{
  87. display: { xs: 'block', md: 'none' },
  88. }}
  89. >
  90. {pages.map((page) => (
  91. <MenuItem key={page} onClick={handleCloseNavMenu}>
  92. <Typography textAlign="center">{page}</Typography>
  93. </MenuItem>
  94. ))}
  95. </Menu>
  96. </Box>
  97. <AdbIcon sx={{ display: { xs: 'flex', md: 'none' }, mr: 1 }} />
  98. <Typography
  99. variant="h5"
  100. noWrap
  101. component="a"
  102. href=""
  103. sx={{
  104. mr: 2,
  105. display: { xs: 'flex', md: 'none' },
  106. flexGrow: 1,
  107. fontFamily: 'monospace',
  108. fontWeight: 700,
  109. letterSpacing: '.3rem',
  110. color: 'inherit',
  111. textDecoration: 'none',
  112. }}
  113. >
  114. LOGO
  115. </Typography>
  116. <Box sx={{ flexGrow: 1, display: { xs: 'none', md: 'flex' } }}>
  117. {pages.map((page) => (
  118. <Button
  119. key={page}
  120. onClick={handleCloseNavMenu}
  121. sx={{ my: 2, color: 'white', display: 'block' }}
  122. >
  123. {page}
  124. </Button>
  125. ))}
  126. </Box>
  127. <Box sx={{ flexGrow: 0 }}>
  128. {session ? (
  129. <>
  130. <Tooltip title="Open settings">
  131. <IconButton onClick={handleOpenUserMenu} sx={{ p: 0 }}>
  132. <Image
  133. src="https://www.business2community.com/wp-content/uploads/2017/08/blank-profile-picture-973460_640.png"
  134. alt="profile picture"
  135. width={40}
  136. height={40}
  137. style={{ borderRadius: '50%' }}
  138. />
  139. </IconButton>
  140. </Tooltip>
  141. <Menu
  142. sx={{ mt: '45px' }}
  143. id="menu-appbar"
  144. anchorEl={anchorElUser}
  145. anchorOrigin={{
  146. vertical: 'top',
  147. horizontal: 'right',
  148. }}
  149. keepMounted
  150. transformOrigin={{
  151. vertical: 'top',
  152. horizontal: 'right',
  153. }}
  154. open={Boolean(anchorElUser)}
  155. onClose={handleCloseUserMenu}
  156. >
  157. <MenuItem onClick={handleCloseUserMenu}>
  158. <Link href={PROFILE_PAGE}>
  159. <a
  160. style={{
  161. textDecoration: 'none',
  162. color: 'inherit',
  163. fontSize: 15,
  164. marginLeft: 6,
  165. }}
  166. >
  167. PROFILE
  168. </a>
  169. </Link>
  170. </MenuItem>
  171. <MenuItem onClick={handleCloseUserMenu}>
  172. <Button color="inherit" onClick={logoutHandler}>
  173. Logout
  174. </Button>
  175. </MenuItem>
  176. </Menu>
  177. </>
  178. ) : (
  179. <Button color="inherit">
  180. <Link href={LOGIN_PAGE}>
  181. <a
  182. style={{
  183. textDecoration: 'none',
  184. color: 'inherit',
  185. fontSize: 17,
  186. }}
  187. >
  188. Login
  189. </a>
  190. </Link>
  191. </Button>
  192. )}
  193. </Box>
  194. </Toolbar>
  195. </Container>
  196. </AppBar>
  197. );
  198. };
  199. export default Navbar;