Skip to content

Commit e7dbd0b

Browse files
authored
Merge pull request #175 from Savy011/navbar-fix
Navbar Body-Scroll Fix
2 parents 60b1fee + 2e2a846 commit e7dbd0b

File tree

2 files changed

+53
-13
lines changed

2 files changed

+53
-13
lines changed

components/common/Header/Header.tsx

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,38 @@
11
import Link from "next/link";
2-
import { useEffect, useState } from "react";
2+
import { useCallback, useEffect, useState, useSyncExternalStore } from "react";
33
import styles from "../../../styles/components/Header.module.scss";
44
import Hamburger from "./Hamburger";
55
import { useRouter } from "next/router";
66
import Image from "next/image";
77
import { useSession } from "next-auth/react";
88
import getCookieData from "../../../lib/getCookieData";
99

10-
function Header() {
10+
export default function Header() {
1111
const [menuOpen, setMenuOpen] = useState(false);
1212
const [active, setActive] = useState("/");
13+
14+
const isMobile = useMediaQuery("only screen and (max-width : 900px)");
15+
const router = useRouter();
16+
1317
const { data: session } = useSession();
1418
const { data: cookieData } = getCookieData(session);
1519

16-
function toggleMenu() {
17-
setMenuOpen(!menuOpen);
18-
menuOpen
19-
? document.body.classList.remove("body-scroll-lock")
20-
: document.body.classList.add("body-scroll-lock")
20+
const toggleMenu = () => {
21+
setMenuOpen(prev => !prev);
22+
document.body.classList.toggle("body-scroll-lock", isMobile && !menuOpen)
2123
}
2224

23-
const router = useRouter();
2425

2526
useEffect(() => {
2627
setActive(router.pathname);
27-
}, [router.pathname]);
28+
29+
const removeScrollLock = () =>
30+
document.body.classList.toggle("body-scroll-lock", isMobile && menuOpen)
31+
32+
window.addEventListener('resize', removeScrollLock)
33+
34+
return () => window.removeEventListener("resize", removeScrollLock)
35+
}, [router.pathname, menuOpen, isMobile]);
2836

2937
return (
3038
<nav className={styles.navbar}>
@@ -92,8 +100,6 @@ function Header() {
92100
);
93101
}
94102

95-
export default Header;
96-
97103
const headerItems = [
98104
{
99105
href: "/about",
@@ -112,3 +118,27 @@ const headerItems = [
112118
name: "Events",
113119
},
114120
];
121+
122+
function useMediaQuery(query: string) {
123+
const subscribe = useCallback(
124+
(callback: () => void) => {
125+
const matchMedia = window.matchMedia(query);
126+
127+
matchMedia.addEventListener("change", callback);
128+
return () => {
129+
matchMedia.removeEventListener("change", callback);
130+
};
131+
},
132+
[query]
133+
);
134+
135+
const getSnapshot = () => {
136+
return window.matchMedia(query).matches;
137+
};
138+
139+
const getServerSnapshot = () => {
140+
throw Error("useMediaQuery is a client-only hook");
141+
};
142+
143+
return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
144+
}

styles/components/Header.module.scss

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@
1919
.logo_wrapper {
2020
padding: 10px 20px;
2121
z-index: 12;
22+
2223
a {
2324
display: flex;
2425
align-items: center;
2526
}
27+
2628
img {
2729
height: 60px;
2830
object-fit: cover;
@@ -56,9 +58,11 @@
5658
&.active {
5759
transform: rotate(45deg);
5860
z-index: 12;
61+
5962
.top {
6063
stroke-dashoffset: -68px;
6164
}
65+
6266
.bottom {
6367
stroke-dashoffset: -68px;
6468
}
@@ -103,17 +107,20 @@
103107
cursor: pointer;
104108
outline: none;
105109
transition: 0.5s;
110+
106111
&:hover {
107112
color: black;
108113
transition: all 0.5s;
109114
}
110115
}
111116
}
112117
}
118+
113119
@media screen and (max-width: $navbar-breakpoint) {
114120
.ham {
115121
display: flex;
116122
}
123+
117124
.menu_modal {
118125
background: rgba(255, 255, 255, 0.95);
119126
height: 100vh;
@@ -154,8 +161,7 @@
154161

155162
&.active {
156163
transform: translate(-50%, calc(-50% + 70px));
157-
transition: transform 0.35s
158-
cubic-bezier(0.05, 1.04, 0.72, 0.98);
164+
transition: transform 0.35s cubic-bezier(0.05, 1.04, 0.72, 0.98);
159165
}
160166
}
161167
}
@@ -166,4 +172,8 @@
166172
.navbar {
167173
padding: 10px 20px;
168174
}
175+
176+
.nav_link {
177+
font-size: 2rem;
178+
}
169179
}

0 commit comments

Comments
 (0)