Skip to content

Commit 4e92e7e

Browse files
CopilotTechQuery
andcommitted
Refactor to use SymbolIcon and single unified ResponsiveDrawer
Co-authored-by: TechQuery <[email protected]>
1 parent 85a6d26 commit 4e92e7e

File tree

1 file changed

+52
-38
lines changed

1 file changed

+52
-38
lines changed

components/User/SessionBox.tsx

Lines changed: 52 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,16 @@ import {
88
ListItemButton,
99
ListItemText,
1010
Modal,
11+
useMediaQuery,
12+
useTheme,
1113
} from '@mui/material';
1214
import { observable } from 'mobx';
1315
import { observer } from 'mobx-react';
1416
import Link from 'next/link';
1517
import { 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';
1821
import { SessionForm } from './SessionForm';
1922

2023
export 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
2868
export 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

Comments
 (0)