Last active
September 15, 2024 04:52
-
-
Save reoxb/a5275101f3d9f7de5cf8b2c69c82fdaf to your computer and use it in GitHub Desktop.
React - Context API - Alternate
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import "./App.css"; | |
import React, { useContext } from 'react'; | |
import Switch from "./Switch"; | |
import { ThemeProvider, useTheme } from './ThemeContext'; // Import from ThemeContext.js | |
const Title = ({ children }) => { | |
const { theme } = useTheme(); | |
return ( | |
<h2 | |
style={{ | |
color: theme === "light" ? "black" : "white", | |
}} | |
> | |
{children} | |
</h2> | |
); | |
}; | |
const Paragraph = ({ children }) => { | |
const { theme } = useTheme(); | |
return ( | |
<p | |
style={{ | |
color: theme === "light" ? "black" : "white", | |
}} | |
> | |
{children} | |
</p> | |
); | |
}; | |
const Content = () => { | |
return ( | |
<div> | |
<Paragraph> | |
We are a pizza loving family. And for years, I searched and searched and | |
searched for the perfect pizza dough recipe. I tried dozens, or more. | |
And while some were good, none of them were that recipe that would | |
make me stop trying all of the others. | |
</Paragraph> | |
</div> | |
); | |
}; | |
const Header = () => { | |
return ( | |
<header> | |
<Title>Little Lemon 🍕</Title> | |
<Switch /> | |
</header> | |
); | |
}; | |
const Page = () => { | |
return ( | |
<div className="Page"> | |
<Title>When it comes to dough</Title> | |
<Content /> | |
</div> | |
); | |
}; | |
function App() { | |
const { theme } = useTheme(); | |
return ( | |
<div | |
className="App" | |
style={{ | |
backgroundColor: theme === "light" ? "white" : "black", | |
}} | |
> | |
<Header /> | |
<Page /> | |
</div> | |
); | |
} | |
function Root() { | |
return ( | |
<ThemeProvider> | |
<App /> | |
</ThemeProvider> | |
); | |
} | |
export default Root; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import "./Styles.css"; | |
import { useTheme } from "../ThemeContext"; | |
const Switch = () => { | |
const { theme, toggleTheme } = useTheme(); | |
return ( | |
<label className="switch"> | |
<input | |
type="checkbox" | |
checked={theme === "light"} | |
onChange={toggleTheme} | |
/> | |
<span className="slider round" /> | |
</label> | |
); | |
}; | |
export default Switch; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { createContext, useContext, useState } from "react"; | |
const ThemeContext = createContext(undefined); | |
export const ThemeProvider = ({ children }) => { | |
const [theme, setTheme] = useState("light"); | |
const toggleTheme = () => { | |
setTheme((prevTheme) => (prevTheme === "light" ? "dark" : "light")); | |
}; | |
return ( | |
<ThemeContext.Provider value={{ theme, toggleTheme }}> | |
{children} | |
</ThemeContext.Provider> | |
); | |
}; | |
export const useTheme = () => useContext(ThemeContext); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment