aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/App.tsx
blob: 716d5ad35044de0abb9787a9e28182270fcf9564 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import { useLayoutEffect, useState } from 'react'
import { Outlet, useHref, useNavigate, type NavigateOptions } from 'react-router'
import { Provider } from '@react-spectrum/s2/Provider'
import BasicLayout from './components/layout-basic'
import { getInitialColorScheme, ThemeContext, themeStorageKey } from './theme'

// Configure the type of the `routerOptions` prop on all React Spectrum components.
declare module '@react-spectrum/s2/Provider' {
  interface RouterConfig {
    routerOptions: NavigateOptions
  }
}

function App() {
  const navigate = useNavigate()
  const [colorScheme, setColorScheme] = useState(getInitialColorScheme)

  useLayoutEffect(() => {
    document.documentElement.dataset.theme = colorScheme
    try {
      localStorage.setItem(themeStorageKey, colorScheme)
    } catch {
      // Keep applying the theme even when browser storage is unavailable.
    }
  }, [colorScheme])

  return (
    <ThemeContext value={{ colorScheme, setColorScheme }}>
      <Provider background="base" colorScheme={colorScheme} router={{ navigate, useHref }}>
        <BasicLayout>
          <Outlet />
        </BasicLayout>
      </Provider>
    </ThemeContext>
  )
}

export default App