Skip to content

Commit 247680b

Browse files
committed
Implement theme switching with local storage and update Navbar for theme toggle
1 parent b0eab54 commit 247680b

File tree

4 files changed

+326
-72
lines changed

4 files changed

+326
-72
lines changed

src/App.jsx

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,19 +41,30 @@ import JokesQuotes from './pages/JokesQuotes.jsx';
4141
import Pets from './pages/Pets.jsx';
4242
import Covid from './pages/Covid.jsx';
4343
import Navbar from './components/Navbar.jsx';
44-
import ThemeSwitcher from './components/ThemeSwitcher.jsx';
4544

4645
// TODO: Extract theme state into context (see todo 5).
47-
import { useState } from 'react';
46+
import { useState, useEffect } from 'react';
4847

4948
export default function App() {
50-
const [theme, setTheme] = useState('light');
51-
const toggleTheme = () => setTheme(t => (t === 'light' ? 'dark' : 'light'));
49+
const [theme, setTheme] = useState(() => {
50+
return localStorage.getItem('theme') || 'light';
51+
});
52+
53+
const toggleTheme = () => {
54+
setTheme(t => {
55+
const newTheme = t === 'light' ? 'dark' : 'light';
56+
localStorage.setItem('theme', newTheme);
57+
return newTheme;
58+
});
59+
};
60+
61+
useEffect(() => {
62+
localStorage.setItem('theme', theme);
63+
}, [theme]);
5264

5365
return (
5466
<div className={`app theme-${theme}`}>
55-
<Navbar />
56-
<ThemeSwitcher theme={theme} toggleTheme={toggleTheme} />
67+
<Navbar theme={theme} toggleTheme={toggleTheme} />
5768
<main className="container">
5869
<Routes>
5970
{/* Different Routes */}

src/components/Navbar.jsx

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
import { NavLink } from 'react-router-dom';
22

3-
export default function Navbar() {
3+
export default function Navbar({ theme, toggleTheme }) {
44
return (
55
<nav className="navbar">
6-
<h1 className="logo">React Verse</h1>
7-
<button className="nav-toggle" aria-label="Toggle navigation" onClick={() => {
8-
document.body.classList.toggle('nav-open');
9-
}}></button>
6+
<h1 className="logo">🌐 ReactVerse</h1>
7+
108
<ul>
119
<li><NavLink to="/">Home</NavLink></li>
1210
<li><NavLink to="/weather">Weather</NavLink></li>
@@ -18,7 +16,25 @@ export default function Navbar() {
1816
<li><NavLink to="/jokes-quotes">Jokes & Quotes</NavLink></li>
1917
<li><NavLink to="/pets">Pets</NavLink></li>
2018
<li><NavLink to="/covid">COVID-19</NavLink></li>
19+
<li className="theme-item">
20+
<button
21+
className="theme-toggle"
22+
onClick={toggleTheme}
23+
aria-label={`Switch to ${theme === 'light' ? 'dark' : 'light'} mode`}
24+
>
25+
<span className="theme-text">Theme Switcher</span>
26+
<span className="theme-icon">{theme === 'light' ? '🌙' : '☀️'}</span>
27+
</button>
28+
</li>
2129
</ul>
30+
31+
<button
32+
className="nav-toggle"
33+
aria-label="Toggle navigation"
34+
onClick={() => document.body.classList.toggle('nav-open')}
35+
>
36+
37+
</button>
2238
</nav>
2339
);
2440
}

src/components/ThemeSwitcher.jsx

Lines changed: 0 additions & 7 deletions
This file was deleted.

0 commit comments

Comments
 (0)