diff --git a/.gitignore b/.gitignore index 0289c75..0d8d2ea 100644 --- a/.gitignore +++ b/.gitignore @@ -63,3 +63,4 @@ typings/ # generate output dist +*.mp4 diff --git a/src/components/Loading/Loading.cy.tsx b/src/components/Loading/Loading.cy.tsx index b9e2afa..f173717 100644 --- a/src/components/Loading/Loading.cy.tsx +++ b/src/components/Loading/Loading.cy.tsx @@ -7,7 +7,7 @@ describe('', () => { cy.mount() cy.get('.MuiCircularProgress-root').should('exist') }) - it('Show data only when loading and containing data', () => { + it('Show data when loading and containing data', () => { cy.mount( {children} +} + +const protectedPage = { + name: 'protected-route', + path: '/protected', + protected: true +} +const publicPage = { + name: 'public-route', + path: '/public' +} + +describe('', () => { + describe('Show only non-protected pages', () => { + ;[true, false].forEach((drawer) => { + it(`drawer=${drawer}`, () => { + cy.mount( + + + + ) + cy.get('[data-cy=navbar-menu-button]').click() + + cy.get('[data-cy=navbar-menu-item]').should('have.length', 1) + cy.get('[data-cy=navbar-menu-item]').should('contain.text', 'public-route') + }) + }) + }) + + describe('Show protected pages when logged in', () => { + ;[true, false].forEach((drawer) => { + it(`drawer=${drawer}`, () => { + cy.mount( + + + + ) + cy.get('[data-cy=navbar-menu-button]').click() + + cy.get('[data-cy=navbar-menu-item]').should('have.length', 2) + cy.get('[data-cy=navbar-menu-item]').should('contain.text', 'protected-route') + }) + }) + }) +}) diff --git a/src/components/Navigation.tsx b/src/components/Navigation.tsx index ee85e16..7ef32c7 100644 --- a/src/components/Navigation.tsx +++ b/src/components/Navigation.tsx @@ -11,7 +11,9 @@ import { SxProps, Theme, Toolbar, - Typography + Typography, + useMediaQuery, + useTheme } from '@mui/material' import { useState } from 'react' import { Link } from 'react-router-dom' @@ -70,6 +72,8 @@ function NavigationBar({ title, Icon, pages, avatarOptions, user, isLoggedIn, dr const [anchorElNav, setAnchorElNav] = useState(null) const [anchorElUser, setAnchorElUser] = useState(null) const [showDrawer, setShowDrawer] = useState(false) + const theme = useTheme() + const isLargeScreen = useMediaQuery(theme.breakpoints.up('sm')) const handleOpenNavMenu = (event: React.MouseEvent) => { if (drawer) { @@ -90,8 +94,10 @@ function NavigationBar({ title, Icon, pages, avatarOptions, user, isLoggedIn, dr setAnchorElUser(null) } - const showMenu = !!(pages && pages.length) + const filteredPages = (pages || []).filter((x) => !x.protected || isLoggedIn) + const showMenu = !!filteredPages.length const showAvatarOptions = !!(avatarOptions && avatarOptions.length) + return ( <> @@ -101,29 +107,32 @@ function NavigationBar({ title, Icon, pages, avatarOptions, user, isLoggedIn, dr > {/* show on large screen */} - {Icon && } - - {title} - + {Icon && isLargeScreen && } + {isLargeScreen && ( + + {title} + + )} {/* Navigation menu (burger menu) show on small screen */} - {showMenu && ( - + {showMenu && !isLargeScreen && ( + - {(pages || []) - .filter((x) => isLoggedIn || !x.protected) - .map((page) => ( - - {page.name} - - ))} + {filteredPages.map((page) => ( + + {page.name} + + ))} )} {/* show on small screen */} - {Icon && } - - {/* title - show on small screen */} - - {title} - + {!isLargeScreen && ( + <> + {Icon && } + {/* title - show on small screen */} + + {title} + + + )} {/* pages link - show on large screens */} - {!drawer && ( - - {(pages || []) - .filter((x) => isLoggedIn || !x.protected) - .map((page) => ( - - ))} + {!drawer && isLargeScreen && ( + + {filteredPages.map((page) => ( + + ))} )} - {/* avatar if logged - show on large AND small screens */} + {/* avatar if logged in - show on large AND small screens */} {isLoggedIn && ( setShowDrawer(false)} - items={pages} + items={filteredPages} > {children}