-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathApp.js
52 lines (45 loc) · 1.63 KB
/
App.js
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import React, { useState, useEffect, useRef } from 'react';
import { CartDataContextProvider } from './context/CartDataContext';
import Accessibility from './components/Accessibility/Accessibility';
import HeaderNavbar from './components/Navbar/HeaderNavbar';
import Router from './components/Router/Router';
import Footer from './components/Footer/Footer';
export default function App() {
const [theme, setTheme] = useState('dark');
const topOfPage = useRef(null);
// Initialize theme from local storage or set theme in local storage
// when App mounts
useEffect(() => {
let savedTheme = localStorage.getItem('theme');
if (!localStorage.getItem('theme')) {
savedTheme = 'dark';
localStorage.setItem('theme', savedTheme);
}
setTheme(savedTheme);
}, []);
useEffect(() => {
document.documentElement.className = theme;
}, [theme]);
const handleThemeToggle = (e) => {
if (e.type === 'click' || e.key === ' ' || e.key === 'Enter') {
e.preventDefault();
const newTheme = theme === 'dark' ? 'light' : 'dark';
setTheme(newTheme);
localStorage.setItem('theme', newTheme);
}
};
return (
<CartDataContextProvider>
<header>
<Accessibility
siteTheme={theme}
toggleEvent={handleThemeToggle}
topRef={topOfPage}
/>
<HeaderNavbar />
</header>
<Router />
<Footer siteTheme={theme} topRef={topOfPage} />
</CartDataContextProvider>
);
}