diff --git a/src/ThemeProvider.tsx b/src/ThemeProvider.tsx new file mode 100644 index 0000000..5aaa7c1 --- /dev/null +++ b/src/ThemeProvider.tsx @@ -0,0 +1,48 @@ +import { normalTheme, Theme } from "./themes"; +import { + createContext, + ReactNode, + useContext, + useEffect, + useState, +} from "react"; + +interface ThemeContextProps { + children: ReactNode; +} + +interface ThemeContextValue { + theme: Theme; + setTheme: (theme: Theme) => void; +} + +const themeContext = createContext({ + theme: normalTheme, + setTheme: () => {}, +}); + +const ThemeProvider = ({ children }: ThemeContextProps) => { + const [theme, setTheme] = useState(normalTheme); + useEffect(() => { + if (theme.backgroundColor) { + document.body.style.backgroundColor = theme.backgroundColor; + document.body.style.backgroundImage = "unset"; + } else if (theme.backgroundImage) { + document.body.style.backgroundColor = "unset"; + document.body.style.backgroundImage = theme.backgroundImage; + } + document.body.style.color = theme.textColor; + }, [theme]); + + return ( + + {children} + + ); +}; + +function useTheme() { + return useContext(themeContext); +} + +export { ThemeProvider, useTheme }; diff --git a/src/themes.ts b/src/themes.ts new file mode 100644 index 0000000..6d18ca4 --- /dev/null +++ b/src/themes.ts @@ -0,0 +1,24 @@ +export interface Theme { + backgroundColor?: string; + backgroundImage?: string; + textColor: string; +} + +export const normalTheme: Theme = { + backgroundColor: "aliceblue", + textColor: "black", +}; +export const darkTheme: Theme = { + backgroundColor: "#444", + textColor: "white", +}; +export const colourTheme: Theme = { + backgroundImage: + "linear-gradient(45deg, magenta, rebeccapurple, dodgerblue, green)", + textColor: "white", +}; +export const rainbowTheme: Theme = { + backgroundImage: + "linear-gradient(135deg, #FF0000, #FFA500, #888800, #008000, #0000FF, #4B0082, #800080 ", + textColor: "white", +};