Skip to content

Commit a2f2bf1

Browse files
fix: resolve mobile hamburger menu instant outside-click closure bug
1 parent 236e2e1 commit a2f2bf1

1 file changed

Lines changed: 12 additions & 1 deletion

File tree

src/app/dashboard/layout.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ function DashboardShell({ children }: { children: React.ReactNode }) {
3636
const [userMenuOpen, setUserMenuOpen] = useState(false);
3737
const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
3838
const userMenuRef = useRef<HTMLDivElement>(null);
39+
const mobileMenuRef = useRef<HTMLDivElement>(null);
40+
const mobileBtnRef = useRef<HTMLButtonElement>(null);
3941

4042
/* ── Auth guard ── */
4143
useEffect(() => {
@@ -58,7 +60,14 @@ function DashboardShell({ children }: { children: React.ReactNode }) {
5860
if (userMenuRef.current && !userMenuRef.current.contains(e.target as Node)) {
5961
setUserMenuOpen(false);
6062
}
61-
setMobileMenuOpen(false);
63+
if (
64+
mobileMenuRef.current &&
65+
!mobileMenuRef.current.contains(e.target as Node) &&
66+
mobileBtnRef.current &&
67+
!mobileBtnRef.current.contains(e.target as Node)
68+
) {
69+
setMobileMenuOpen(false);
70+
}
6271
};
6372
document.addEventListener("click", handler);
6473
return () => document.removeEventListener("click", handler);
@@ -343,6 +352,7 @@ function DashboardShell({ children }: { children: React.ReactNode }) {
343352

344353
{/* Mobile hamburger */}
345354
<button
355+
ref={mobileBtnRef}
346356
className="dash-nav-mobile-btn"
347357
onClick={e => { e.stopPropagation(); setMobileMenuOpen(v => !v); }}
348358
style={{
@@ -371,6 +381,7 @@ function DashboardShell({ children }: { children: React.ReactNode }) {
371381
{/* Mobile dropdown menu */}
372382
{mobileMenuOpen && (
373383
<div
384+
ref={mobileMenuRef}
374385
className="dash-nav-mobile-menu"
375386
style={{
376387
borderTop: "1px solid var(--border-subtle)",

0 commit comments

Comments
 (0)