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) => (
-
- ))}
+ {filteredPages.map((page) => (
+
+ ))}
)}
{/* 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}