Skip to content

Commit 272cb16

Browse files
committed
feat(): Lazy load navbarsidebar
1 parent aab2075 commit 272cb16

File tree

2 files changed

+52
-35
lines changed

2 files changed

+52
-35
lines changed

docusaurus-theme/src/theme/DocStateProvider/index.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ import type { Props } from '@theme/DocStateProvider';
1212

1313
function DocStateProvider(props: Props): JSX.Element {
1414
const [mobileSidebarLoaded, setMobileSidebarLoaded] = useState(false);
15+
const [mobileNavbarSidebarLoaded, setMobileNavbarSidebarLoaded] =
16+
useState(false);
1517
const [mobileSidebarOpen, setMobileSidebarOpen] = useState(false);
18+
const [mobileNavbarSidebarOpen, setMobileNavbarSidebarOpen] = useState(false);
1619

1720
return (
1821
<DocStateContext.Provider
@@ -21,6 +24,10 @@ function DocStateProvider(props: Props): JSX.Element {
2124
setMobileSidebarLoaded,
2225
mobileSidebarOpen,
2326
setMobileSidebarOpen,
27+
mobileNavbarSidebarLoaded,
28+
setMobileNavbarSidebarLoaded,
29+
mobileNavbarSidebarOpen,
30+
setMobileNavbarSidebarOpen,
2431
}}
2532
>
2633
{props.children}

src/theme/Navbar/index.tsx

Lines changed: 45 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -59,17 +59,21 @@ function Navbar(): JSX.Element {
5959
},
6060
} = useDocusaurusContext();
6161
const { path: homePath } = useActiveVersion();
62-
const [navbarSidebarOpen, setNavbarSidebarOpen] = useState(false);
62+
const [] = useState(false);
6363
const {
64+
mobileNavbarSidebarOpen,
65+
setMobileNavbarSidebarOpen,
6466
mobileSidebarOpen,
6567
setMobileSidebarOpen,
6668
setMobileSidebarLoaded,
69+
setMobileNavbarSidebarLoaded,
70+
mobileNavbarSidebarLoaded,
6771
} = useDocStateContext();
6872
const { isDarkTheme, setLightTheme, setDarkTheme } = useThemeContext();
6973
const { navbarRef, isNavbarVisible } = useHideableNavbar(hideOnScroll);
7074

7175
useLockBodyScroll(mobileSidebarOpen);
72-
useLockBodyScroll(navbarSidebarOpen);
76+
useLockBodyScroll(mobileNavbarSidebarOpen);
7377

7478
const showSidebar = useCallback(() => {
7579
setMobileSidebarLoaded(true);
@@ -80,10 +84,11 @@ function Navbar(): JSX.Element {
8084
}, []);
8185

8286
const showNavbarSidebar = useCallback(() => {
83-
setNavbarSidebarOpen(true);
87+
setMobileNavbarSidebarLoaded(true);
88+
setMobileNavbarSidebarOpen(true);
8489
}, []);
8590
const hideNavbarSidebar = useCallback(() => {
86-
setNavbarSidebarOpen(false);
91+
setMobileNavbarSidebarOpen(false);
8792
}, []);
8893

8994
const onToggleChange = useCallback(
@@ -93,6 +98,9 @@ function Navbar(): JSX.Element {
9398

9499
const windowSize = useWindowSize();
95100

101+
const shouldLoadNavbarSidebar =
102+
mobileNavbarSidebarLoaded && windowSize === windowSizes.mobile;
103+
96104
useEffect(() => {
97105
if (windowSize === windowSizes.desktop) {
98106
hideSidebar();
@@ -109,7 +117,7 @@ function Navbar(): JSX.Element {
109117
className={clsx('navbar', 'navbar--fixed-top', {
110118
'navbar--dark': style === 'dark',
111119
'navbar--primary': style === 'primary',
112-
'navbar-sidebar--show': navbarSidebarOpen,
120+
'navbar-sidebar--show': mobileNavbarSidebarOpen,
113121
[styles.navbarHideable]: hideOnScroll,
114122
[styles.navbarHidden]: hideOnScroll && !isNavbarVisible,
115123
})}
@@ -123,7 +131,6 @@ function Navbar(): JSX.Element {
123131
type="button"
124132
tabIndex={0}
125133
onClick={showSidebar}
126-
onKeyDown={showSidebar}
127134
onMouseEnter={() => setMobileSidebarLoaded(true)}
128135
>
129136
<IconMenu />
@@ -161,7 +168,7 @@ function Navbar(): JSX.Element {
161168
{windowSize === windowSizes.mobile && (
162169
<button
163170
aria-label={
164-
navbarSidebarOpen
171+
mobileNavbarSidebarOpen
165172
? translate({
166173
id: 'theme.docs.sidebar.responsiveCloseButtonLabel',
167174
message: 'Close menu',
@@ -181,6 +188,7 @@ function Navbar(): JSX.Element {
181188
styles.navbarSidebarToggle,
182189
)}
183190
onClick={showNavbarSidebar}
191+
onMouseEnter={() => setMobileNavbarSidebarLoaded(true)}
184192
>
185193
186194
</button>
@@ -191,37 +199,39 @@ function Navbar(): JSX.Element {
191199
hideSidebar();
192200
hideNavbarSidebar();
193201
}}
194-
visible={mobileSidebarOpen || navbarSidebarOpen}
202+
visible={mobileSidebarOpen || mobileNavbarSidebarOpen}
195203
/>
196-
<div className={clsx('navbar-sidebar', styles.navbarSidebar)}>
197-
<div className="navbar-sidebar__brand">
198-
<Link to={homePath}>
199-
<Logo
200-
className="navbar__brand"
201-
imageClassName="navbar__logo"
202-
titleClassName="navbar__title"
203-
onClick={hideSidebar}
204-
/>
205-
</Link>
206-
{!disableColorModeSwitch && (
207-
<Toggle checked={isDarkTheme} onChange={onToggleChange} />
208-
)}
209-
</div>
210-
<div className="navbar-sidebar__items">
211-
<div className="menu">
212-
<ul className="menu__list">
213-
{items.map((item, i) => (
214-
<NavbarItem
215-
mobile
216-
{...(item as any)} // TODO fix typing
217-
onClick={hideSidebar}
218-
key={i}
219-
/>
220-
))}
221-
</ul>
204+
{shouldLoadNavbarSidebar && (
205+
<div className={clsx('navbar-sidebar', styles.navbarSidebar)}>
206+
<div className="navbar-sidebar__brand">
207+
<Link to={homePath}>
208+
<Logo
209+
className="navbar__brand"
210+
imageClassName="navbar__logo"
211+
titleClassName="navbar__title"
212+
onClick={hideSidebar}
213+
/>
214+
</Link>
215+
{!disableColorModeSwitch && (
216+
<Toggle checked={isDarkTheme} onChange={onToggleChange} />
217+
)}
218+
</div>
219+
<div className="navbar-sidebar__items">
220+
<div className="menu">
221+
<ul className="menu__list">
222+
{items.map((item, i) => (
223+
<NavbarItem
224+
mobile
225+
{...(item as any)} // TODO fix typing
226+
onClick={hideSidebar}
227+
key={i}
228+
/>
229+
))}
230+
</ul>
231+
</div>
222232
</div>
223233
</div>
224-
</div>
234+
)}
225235
</nav>
226236
);
227237
}

0 commit comments

Comments
 (0)