Skip to content

Commit 11a7479

Browse files
Fixes #6693: fixes search functionality on iOS devices (#6743)
* change isOpen variable in TopNav component to isMenuOpen to differentiate from isOpen props in Search component change setIsOpen to setIsMenuOpen in TopNav component * move initialization of ShowSearch state to top-level of TopNav component organize hook initializations in TopNav component: useState, useRef, useRouter * remove initialYScroll prop from DocSearchModal component to fix search functionality on ios devices
1 parent a7103d8 commit 11a7479

File tree

2 files changed

+16
-17
lines changed

2 files changed

+16
-17
lines changed

src/components/Layout/TopNav/TopNav.tsx

+16-16
Original file line numberDiff line numberDiff line change
@@ -142,10 +142,11 @@ export default function TopNav({
142142
breadcrumbs: RouteItem[];
143143
section: 'learn' | 'reference' | 'community' | 'blog' | 'home' | 'unknown';
144144
}) {
145-
const [isOpen, setIsOpen] = useState(false);
145+
const [isMenuOpen, setIsMenuOpen] = useState(false);
146+
const [showSearch, setShowSearch] = useState(false);
147+
const [isScrolled, setIsScrolled] = useState(false);
146148
const scrollParentRef = useRef<HTMLDivElement>(null);
147149
const {asPath} = useRouter();
148-
const [isScrolled, setIsScrolled] = useState(false);
149150

150151
// HACK. Fix up the data structures instead.
151152
if ((routeTree as any).routes.length === 1) {
@@ -154,18 +155,18 @@ export default function TopNav({
154155

155156
// While the overlay is open, disable body scroll.
156157
useEffect(() => {
157-
if (isOpen) {
158+
if (isMenuOpen) {
158159
const preferredScrollParent = scrollParentRef.current!;
159160
disableBodyScroll(preferredScrollParent);
160161
return () => enableBodyScroll(preferredScrollParent);
161162
} else {
162163
return undefined;
163164
}
164-
}, [isOpen]);
165+
}, [isMenuOpen]);
165166

166167
// Close the overlay on any navigation.
167168
useEffect(() => {
168-
setIsOpen(false);
169+
setIsMenuOpen(false);
169170
}, [asPath]);
170171

171172
// Also close the overlay if the window gets resized past mobile layout.
@@ -175,7 +176,7 @@ export default function TopNav({
175176

176177
function closeIfNeeded() {
177178
if (!media.matches) {
178-
setIsOpen(false);
179+
setIsMenuOpen(false);
179180
}
180181
}
181182

@@ -204,7 +205,6 @@ export default function TopNav({
204205
return () => observer.disconnect();
205206
}, []);
206207

207-
const [showSearch, setShowSearch] = useState(false);
208208
const onOpenSearch = useCallback(() => {
209209
startTransition(() => {
210210
setShowSearch(true);
@@ -224,28 +224,28 @@ export default function TopNav({
224224
<div ref={scrollDetectorRef} />
225225
<div
226226
className={cn(
227-
isOpen
227+
isMenuOpen
228228
? 'h-screen sticky top-0 lg:bottom-0 lg:h-screen flex flex-col shadow-nav dark:shadow-nav-dark z-20'
229229
: 'z-50 sticky top-0'
230230
)}>
231231
<nav
232232
className={cn(
233233
'duration-300 backdrop-filter backdrop-blur-lg backdrop-saturate-200 transition-shadow bg-opacity-90 items-center w-full flex justify-between bg-wash dark:bg-wash-dark dark:bg-opacity-95 px-1.5 lg:pe-5 lg:ps-4 z-50',
234-
{'dark:shadow-nav-dark shadow-nav': isScrolled || isOpen}
234+
{'dark:shadow-nav-dark shadow-nav': isScrolled || isMenuOpen}
235235
)}>
236236
<div className="flex items-center justify-between w-full h-16 gap-0 sm:gap-3">
237237
<div className="flex flex-row 3xl:flex-1 ">
238238
<button
239239
type="button"
240240
aria-label="Menu"
241-
onClick={() => setIsOpen(!isOpen)}
241+
onClick={() => setIsMenuOpen(!isMenuOpen)}
242242
className={cn(
243243
'active:scale-95 transition-transform flex lg:hidden w-12 h-12 rounded-full items-center justify-center hover:bg-primary/5 hover:dark:bg-primary-dark/5 outline-link',
244244
{
245-
'text-link dark:text-link-dark': isOpen,
245+
'text-link dark:text-link-dark': isMenuOpen,
246246
}
247247
)}>
248-
{isOpen ? <IconClose /> : <IconHamburger />}
248+
{isMenuOpen ? <IconClose /> : <IconHamburger />}
249249
</button>
250250
<div className="flex 3xl:flex-1 align-center">
251251
<NextLink
@@ -343,14 +343,14 @@ export default function TopNav({
343343
</div>
344344
</nav>
345345

346-
{isOpen && (
346+
{isMenuOpen && (
347347
<div
348348
ref={scrollParentRef}
349349
className="overflow-y-scroll isolate no-bg-scrollbar lg:w-[342px] grow bg-wash dark:bg-wash-dark">
350350
<aside
351351
className={cn(
352352
`lg:grow lg:flex flex-col w-full pb-8 lg:pb-0 lg:max-w-custom-xs z-50`,
353-
isOpen ? 'block z-40' : 'hidden lg:block'
353+
isMenuOpen ? 'block z-40' : 'hidden lg:block'
354354
)}>
355355
<nav
356356
role="navigation"
@@ -383,10 +383,10 @@ export default function TopNav({
383383
<SidebarRouteTree
384384
// Don't share state between the desktop and mobile versions.
385385
// This avoids unnecessary animations and visual flicker.
386-
key={isOpen ? 'mobile-overlay' : 'desktop-or-hidden'}
386+
key={isMenuOpen ? 'mobile-overlay' : 'desktop-or-hidden'}
387387
routeTree={routeTree}
388388
breadcrumbs={breadcrumbs}
389-
isForceExpanded={isOpen}
389+
isForceExpanded={isMenuOpen}
390390
/>
391391
</Suspense>
392392
<div className="h-16" />

src/components/Search.tsx

-1
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,6 @@ export function Search({
110110
createPortal(
111111
<DocSearchModal
112112
{...options}
113-
initialScrollY={window.scrollY}
114113
searchParameters={searchParameters}
115114
onClose={onClose}
116115
navigator={{

0 commit comments

Comments
 (0)