From fcab6518dfc2ca45110b3192923c6d4cbbf2d08c Mon Sep 17 00:00:00 2001 From: zouhelen Date: Tue, 4 Mar 2025 01:08:42 -0500 Subject: [PATCH] dark mode button with icons --- src/client/components/DarkButton.tsx | 40 +++++++++++++++++++++ src/client/components/DarkModeProvider.tsx | 29 +++++++++++++++ src/client/components/navigation/Header.tsx | 15 +++++--- src/client/routes/__root.tsx | 14 ++++---- src/client/routes/sports.tsx | 6 ++-- 5 files changed, 91 insertions(+), 13 deletions(-) create mode 100644 src/client/components/DarkButton.tsx create mode 100644 src/client/components/DarkModeProvider.tsx diff --git a/src/client/components/DarkButton.tsx b/src/client/components/DarkButton.tsx new file mode 100644 index 0000000..e577d09 --- /dev/null +++ b/src/client/components/DarkButton.tsx @@ -0,0 +1,40 @@ +import React from "react"; + +interface DarkButtonProps { + darkMode: boolean; + toggleDarkMode: () => void; +} + +const DarkButton: React.FC = ({ darkMode, toggleDarkMode }) => { + return ( + + ); +}; + +export default DarkButton; diff --git a/src/client/components/DarkModeProvider.tsx b/src/client/components/DarkModeProvider.tsx new file mode 100644 index 0000000..635a96c --- /dev/null +++ b/src/client/components/DarkModeProvider.tsx @@ -0,0 +1,29 @@ +import React, { createContext, useEffect, useState } from "react"; + +interface DarkModeContextProps { + darkMode: boolean; + toggleDarkMode: () => void; +} + +export const DarkModeContext = createContext({ + darkMode: false, + toggleDarkMode: () => {}, +}); + +export const DarkModeProvider = ({ children }: { children: React.ReactNode }) => { + const [darkMode, setDarkMode] = useState(() => { + if (typeof window !== "undefined") { + return localStorage.getItem("darkMode") === "true"; + } + return false; + }); + + useEffect(() => { + localStorage.setItem("darkMode", darkMode.toString()); + document.documentElement.classList.toggle("dark", darkMode); + }, [darkMode]); + + const toggleDarkMode = () => setDarkMode((prev) => !prev); + + return {children}; +}; diff --git a/src/client/components/navigation/Header.tsx b/src/client/components/navigation/Header.tsx index 5307f11..f0df8a3 100644 --- a/src/client/components/navigation/Header.tsx +++ b/src/client/components/navigation/Header.tsx @@ -7,7 +7,9 @@ import { SearchBar } from "@navigation/SearchBar"; import { UserButton } from "@navigation/UserButton"; import { useLocation } from "@tanstack/react-router"; import { Squash as Hamburger } from "hamburger-react"; -import React, { useEffect, useRef, useState } from "react"; +import React, { useContext, useEffect, useRef, useState } from "react"; +import DarkButton from "../DarkButton"; +import { DarkModeContext } from "../DarkModeProvider"; const SCREEN_BREAKPOINT = 1024; @@ -52,6 +54,7 @@ const Header: React.FC = () => { const { isAuthenticated, isLoading, logout } = useAuth(); const menuRef = useRef(null); const hamburgerRef = useRef(null); + const { darkMode, toggleDarkMode } = useContext(DarkModeContext); useEffect(() => { const handleOutsideClick = (event: MouseEvent) => { @@ -85,13 +88,16 @@ const Header: React.FC = () => {