5
5
import * as React from 'react' ;
6
6
import cn from 'classnames' ;
7
7
import NextLink from 'next/link' ;
8
- import { useRouter } from 'next/router' ;
8
+ import { useRouter } from 'next/router' ;
9
9
10
- import { IconClose } from 'components/Icon/IconClose' ;
11
- import { IconHamburger } from 'components/Icon/IconHamburger' ;
12
- import { Search } from 'components/Search' ;
13
- import { MenuContext } from 'components/useMenu' ;
14
-
15
- import { Logo } from '../../Logo' ;
10
+ import { IconClose } from 'components/Icon/IconClose' ;
11
+ import { IconHamburger } from 'components/Icon/IconHamburger' ;
12
+ import { Search } from 'components/Search' ;
13
+ import { MenuContext } from 'components/useMenu' ;
14
+ import { Logo } from '../../Logo' ;
16
15
import NavLink from './NavLink' ;
16
+ import { ColorMode , ThemeContext } from 'modules/ThemeProvider' ;
17
17
18
18
const feedbackIcon = (
19
19
< svg
@@ -90,18 +90,19 @@ function inferSection(pathname: string): 'learn' | 'reference' | 'home' {
90
90
}
91
91
92
92
export default function Nav ( ) {
93
- const { pathname} = useRouter ( ) ;
94
- const { isOpen, toggleOpen} = React . useContext ( MenuContext ) ;
95
- // TODO: persist
93
+ const { pathname } = useRouter ( ) ;
94
+ const { isOpen, toggleOpen } = React . useContext ( MenuContext ) ;
96
95
// TODO: respect system pref
97
- const [ isDark , setIsDark ] = React . useState ( ( ) => {
98
- if ( typeof document === 'undefined' ) {
99
- return false ;
100
- }
101
- return document . documentElement . classList . contains ( 'dark' ) ;
102
- } ) ;
96
+
97
+ // get the current colorMode
98
+ const { colorMode, setColorMode } = React . useContext ( ThemeContext ) ;
99
+
103
100
const section = inferSection ( pathname ) ;
104
101
102
+ const toggleColorMode = React . useCallback ( ( ) => {
103
+ setColorMode ( colorMode === ColorMode . dark ? ColorMode . light : ColorMode . dark )
104
+ } , [ colorMode ] )
105
+
105
106
function handleFeedback ( ) {
106
107
const nodes : any = document . querySelectorAll (
107
108
'#_hj_feedback_container button'
@@ -115,7 +116,7 @@ export default function Nav() {
115
116
}
116
117
117
118
return (
118
- < nav className = "sticky top-0 items-center w-full flex lg:block justify-between bg-wash dark:bg-wash-dark pt-0 lg:pt-4 pr-5 lg:px-5 z-50" >
119
+ < nav className = "sticky top-0 items-center w-full flex lg:block justify-between bg-transparent pt-0 lg:pt-4 pr-5 lg:px-5 z-50" >
119
120
< div className = "xl:w-full xl:max-w-xs flex items-center" >
120
121
< button
121
122
type = "button"
@@ -139,18 +140,10 @@ export default function Nav() {
139
140
</ div >
140
141
< button
141
142
type = "button"
142
- aria-label = { isDark ? 'Use Light Mode' : 'Use Dark Mode' }
143
- onClick = { ( ) => {
144
- if ( isDark ) {
145
- document . documentElement . classList . remove ( 'dark' ) ;
146
- setIsDark ( false ) ;
147
- } else {
148
- document . documentElement . classList . add ( 'dark' ) ;
149
- setIsDark ( true ) ;
150
- }
151
- } }
143
+ aria-label = { colorMode === ColorMode . dark ? 'Use Light Mode' : 'Use Dark Mode' }
144
+ onClick = { toggleColorMode }
152
145
className = "hidden lg:flex items-center h-full pr-2" >
153
- { isDark ? lightIcon : darkIcon }
146
+ { colorMode === ColorMode . dark ? lightIcon : darkIcon }
154
147
</ button >
155
148
</ div >
156
149
< div className = "px-0 pt-2 w-full 2xl:max-w-xs hidden lg:flex items-center self-center border-b-0 lg:border-b border-border dark:border-border-dark" >
@@ -174,20 +167,12 @@ export default function Nav() {
174
167
</ button >
175
168
< button
176
169
type = "button"
177
- aria-label = { isDark ? 'Use Light Mode' : 'Use Dark Mode' }
178
- onClick = { ( ) => {
179
- if ( isDark ) {
180
- document . documentElement . classList . remove ( 'dark' ) ;
181
- setIsDark ( false ) ;
182
- } else {
183
- document . documentElement . classList . add ( 'dark' ) ;
184
- setIsDark ( true ) ;
185
- }
186
- } }
170
+ aria-label = { colorMode === ColorMode . dark ? 'Use Light Mode' : 'Use Dark Mode' }
171
+ onClick = { toggleColorMode }
187
172
className = "flex lg:hidden items-center p-1 h-full ml-4 lg:ml-6" >
188
- { isDark ? lightIcon : darkIcon }
173
+ { colorMode === ColorMode . dark ? lightIcon : darkIcon }
189
174
</ button >
190
175
</ div >
191
176
</ nav >
192
177
) ;
193
- }
178
+ }
0 commit comments