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.3KB

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