1- ' use client' ;
1+ " use client" ;
22
3- import { useState , useEffect } from 'react'
4- import { useTheme } from 'next-themes'
5- import { BsMoonStarsFill } from "react-icons/bs" ;
6- import { BsSunFill } from "react-icons/bs" ;
7- import { Button } from "@/components/ui/button"
3+ import { useTheme } from "next-themes" ;
4+ import { useEffect , useState } from "react" ;
5+ import { BsMoonStarsFill , BsSunFill } from "react-icons/bs" ;
6+ import { Button } from "@/components/ui/button" ;
87import {
9- Tooltip ,
10- TooltipContent ,
11- TooltipTrigger ,
12- } from "@/components/ui/tooltip"
13-
8+ Tooltip ,
9+ TooltipContent ,
10+ TooltipTrigger ,
11+ } from "@/components/ui/tooltip" ;
1412
1513const ThemeSwitch = ( ) => {
16- const [ mounted , setMounted ] = useState ( false )
17- const { theme, setTheme, resolvedTheme } = useTheme ( )
18-
19- const toggleTheme = ( ) => {
20- if ( theme === 'dark' ) {
21- setTheme ( 'light' )
22- } else {
23- setTheme ( 'dark' )
24- }
25- }
26- // useEffect only runs on the client, so now we can safely show the UI
27- useEffect ( ( ) => {
28- setTimeout ( ( ) => {
29- setMounted ( true ) ;
30- } , 0 ) ;
31- } , [ ] ) ;
14+ const [ mounted , setMounted ] = useState ( false ) ;
15+ const { resolvedTheme, setTheme } = useTheme ( ) ;
16+
17+ // useEffect only runs on the client, so now we can safely show the UI
18+ useEffect ( ( ) => {
19+ setTimeout ( ( ) => {
20+ setMounted ( true ) ;
21+ } , 0 ) ;
22+ } , [ ] ) ;
3223
33- const current = mounted ? ( theme ?? resolvedTheme ) : undefined
24+ if ( ! mounted ) return null ;
3425
35- return (
36- < Tooltip delayDuration = { 500 } >
37- < TooltipTrigger asChild >
38- < Button
39- variant = "ghost"
40- size = "icon"
41- className = "cursor-pointer"
42- onClick = { toggleTheme }
43- >
44- { ! mounted ? < BsSunFill className = "size-6" /> : current === 'dark' ? < BsMoonStarsFill className = "size-6" /> : < BsSunFill className = "size-6" /> }
45- </ Button >
46- </ TooltipTrigger >
47- < TooltipContent side = "bottom" align = "start" >
48- { current === 'dark' ?
49- < span > Switch to Light Mode</ span > :
50- < span > Switch to Dark Mode</ span >
51- }
52- </ TooltipContent >
53- </ Tooltip >
54- )
55- }
26+ return (
27+ < Tooltip delayDuration = { 500 } >
28+ < TooltipTrigger asChild >
29+ < Button
30+ variant = "ghost"
31+ size = "icon"
32+ className = "cursor-pointer"
33+ onClick = { ( ) =>
34+ setTheme ( resolvedTheme === "light" ? "dark" : "light" )
35+ }
36+ >
37+ { resolvedTheme === "light" ? (
38+ < BsMoonStarsFill className = "size-6" />
39+ ) : (
40+ < BsSunFill className = "size-6" />
41+ ) }
42+ </ Button >
43+ </ TooltipTrigger >
44+ < TooltipContent side = "bottom" align = "start" >
45+ { resolvedTheme === "dark" ? (
46+ < span > Switch to Light Mode</ span >
47+ ) : (
48+ < span > Switch to Dark Mode</ span >
49+ ) }
50+ </ TooltipContent >
51+ </ Tooltip >
52+ ) ;
53+ } ;
5654
57- export default ThemeSwitch
55+ export default ThemeSwitch ;
0 commit comments