@@ -8,13 +8,16 @@ import {
88 ListItemButton ,
99 ListItemText ,
1010 Modal ,
11+ useMediaQuery ,
12+ useTheme ,
1113} from '@mui/material' ;
1214import { observable } from 'mobx' ;
1315import { observer } from 'mobx-react' ;
1416import Link from 'next/link' ;
1517import { JWTProps } from 'next-ssr-middleware' ;
16- import { Component , HTMLAttributes , JSX } from 'react' ;
18+ import { Component , FC , HTMLAttributes , JSX } from 'react' ;
1719
20+ import { SymbolIcon } from '../Icon' ;
1821import { SessionForm } from './SessionForm' ;
1922
2023export type MenuItem = Pick < JSX . IntrinsicElements [ 'a' ] , 'href' | 'title' > ;
@@ -24,24 +27,61 @@ export interface SessionBoxProps extends HTMLAttributes<HTMLDivElement>, JWTProp
2427 menu ?: MenuItem [ ] ;
2528}
2629
30+ interface ResponsiveDrawerProps {
31+ open : boolean ;
32+ onClose : ( ) => void ;
33+ children : JSX . Element ;
34+ }
35+
36+ const ResponsiveDrawer : FC < ResponsiveDrawerProps > = ( { open, onClose, children } ) => {
37+ const theme = useTheme ( ) ;
38+ const isMobile = useMediaQuery ( theme . breakpoints . down ( 'md' ) ) ;
39+
40+ return (
41+ < Drawer
42+ anchor = "left"
43+ open = { isMobile ? open : true }
44+ variant = { isMobile ? 'temporary' : 'permanent' }
45+ onClose = { onClose }
46+ sx = { {
47+ display : { xs : isMobile ? 'block' : 'none' , md : isMobile ? 'none' : 'block' } ,
48+ '& .MuiDrawer-paper' : {
49+ width : 250 ,
50+ ...( isMobile
51+ ? { }
52+ : {
53+ position : 'sticky' ,
54+ top : '5rem' ,
55+ height : 'calc(100vh - 5rem)' ,
56+ border : 'none' ,
57+ boxShadow : 'none' ,
58+ } ) ,
59+ } ,
60+ } }
61+ >
62+ { children }
63+ </ Drawer >
64+ ) ;
65+ } ;
66+
2767@observer
2868export class SessionBox extends Component < SessionBoxProps > {
2969 @observable
3070 accessor modalShown = false ;
3171
3272 @observable
33- accessor mobileMenuOpen = false ;
73+ accessor drawerOpen = false ;
3474
3575 componentDidMount ( ) {
3676 this . modalShown = ! this . props . jwtPayload ;
3777 }
3878
39- toggleMobileMenu = ( ) => {
40- this . mobileMenuOpen = ! this . mobileMenuOpen ;
79+ toggleDrawer = ( ) => {
80+ this . drawerOpen = ! this . drawerOpen ;
4181 } ;
4282
43- closeMobileMenu = ( ) => {
44- this . mobileMenuOpen = false ;
83+ closeDrawer = ( ) => {
84+ this . drawerOpen = false ;
4585 } ;
4686
4787 renderMenuItems ( ) {
@@ -56,7 +96,7 @@ export class SessionBox extends Component<SessionBoxProps> {
5696 href = { href || '#' }
5797 selected = { path ?. split ( '?' ) [ 0 ] . startsWith ( href || '' ) }
5898 sx = { { borderRadius : 1 } }
59- onClick = { this . closeMobileMenu }
99+ onClick = { this . closeDrawer }
60100 >
61101 < ListItemText primary = { title } />
62102 </ ListItemButton >
@@ -95,42 +135,16 @@ export class SessionBox extends Component<SessionBoxProps> {
95135 edge = "start"
96136 color = "inherit"
97137 aria-label = "menu"
98- onClick = { this . toggleMobileMenu }
138+ onClick = { this . toggleDrawer }
99139 >
100- < span className = "material-symbols-outlined" > menu</ span >
140+ < SymbolIcon name = " menu" / >
101141 </ IconButton >
102142 </ Box >
103143
104- { /* Mobile Drawer - temporary, closes on click */ }
105- < Drawer
106- anchor = "left"
107- open = { this . mobileMenuOpen }
108- variant = "temporary"
109- sx = { { display : { xs : 'block' , md : 'none' } } }
110- onClose = { this . closeMobileMenu }
111- >
144+ { /* Unified Responsive Drawer */ }
145+ < ResponsiveDrawer open = { this . drawerOpen } onClose = { this . closeDrawer } >
112146 < Box sx = { { width : 250 } } > { this . renderMenuItems ( ) } </ Box >
113- </ Drawer >
114-
115- { /* Desktop Drawer - persistent, always open */ }
116- < Drawer
117- anchor = "left"
118- open = { true }
119- variant = "permanent"
120- sx = { {
121- display : { xs : 'none' , md : 'block' } ,
122- '& .MuiDrawer-paper' : {
123- width : 250 ,
124- position : 'sticky' ,
125- top : '5rem' ,
126- height : 'calc(100vh - 5rem)' ,
127- border : 'none' ,
128- boxShadow : 'none' ,
129- } ,
130- } }
131- >
132- { this . renderMenuItems ( ) }
133- </ Drawer >
147+ </ ResponsiveDrawer >
134148
135149 { /* Main Content */ }
136150 < Box
0 commit comments