From ee2bd693b8d1277ff0e1ba6aa599baddd89c37d2 Mon Sep 17 00:00:00 2001 From: ItsLame <37344470+ItsLame@users.noreply.github.com> Date: Mon, 30 Jun 2025 02:11:34 +1000 Subject: [PATCH 01/13] feat: dark mode toggle hook --- src/app/(frontend)/layout.tsx | 14 ++--- src/components/DarkModeToggle.tsx | 14 +++-- src/components/Navbar.tsx | 4 +- src/hooks/Providers.tsx | 14 +++++ src/hooks/useTheme.tsx | 97 +++++++++++++++++++++++++++++++ 5 files changed, 131 insertions(+), 12 deletions(-) create mode 100644 src/hooks/Providers.tsx create mode 100644 src/hooks/useTheme.tsx diff --git a/src/app/(frontend)/layout.tsx b/src/app/(frontend)/layout.tsx index f6708ae..0e306a7 100644 --- a/src/app/(frontend)/layout.tsx +++ b/src/app/(frontend)/layout.tsx @@ -2,6 +2,7 @@ import type { Metadata } from "next"; import "@/styles/globals.css"; import { Analytics } from "@vercel/analytics/next"; import { SpeedInsights } from "@vercel/speed-insights/next"; +import Providers from "@/hooks/Providers"; export const metadata: Metadata = { title: "Silvia Tan - Software Engineer", @@ -9,18 +10,17 @@ export const metadata: Metadata = { keywords: "Silvia, Silvia Silvia, Silvia Tan, Portfolio, Software Engineer, Full Stack, Startup, Web, Frontend", }; -const RootLayout = ({ - children, -}: Readonly<{ - children: React.ReactNode; -}>) => { +const RootLayout = ({ children }: Readonly<{ children: React.ReactNode }>) => { return ( - + {`${metadata.title}`} + - {children} + + {children} + diff --git a/src/components/DarkModeToggle.tsx b/src/components/DarkModeToggle.tsx index c1cf0e9..2ecae60 100644 --- a/src/components/DarkModeToggle.tsx +++ b/src/components/DarkModeToggle.tsx @@ -1,14 +1,20 @@ +import { IconDeviceDesktop, IconMoon, IconSun } from "@tabler/icons-react"; +import { useTheme } from "@/hooks/useTheme"; + const DarkModeToggle = () => { + const { handler: themeHandler, status: themeStatus } = useTheme(); + const toggleTheme = () => { - document.documentElement.classList.toggle("dark",); + // document.documentElement.classList.toggle("dark",); + themeHandler.toggle(); }; return ( ); diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index d4611c5..0149eb7 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -4,6 +4,7 @@ import Link from "next/link"; import { usePathname } from "next/navigation"; import { ReactNode, useState } from "react"; import { IconExternalLink } from "@tabler/icons-react"; +import DarkModeToggle from "@/components/DarkModeToggle"; const NavbarLink = ({ children, className = "", link = "", newTab } : {children?: ReactNode, className?: string, link?: string, newTab?: true}) => { const pathname = usePathname(); @@ -24,7 +25,8 @@ const Navbar = () => { return (