11import { useTheme } from 'next-themes' ;
2- import { useEffect , useState } from 'react' ;
2+ import { useEffect , useRef , useState } from 'react' ;
33import React from 'react' ;
44import Image from 'next/image' ;
55
@@ -35,6 +35,7 @@ export default function DarkModeToggle() {
3535 const [ activeThemeIcon , setActiveThemeIcon ] = useState (
3636 '/icons/theme-switch.svg' ,
3737 ) ;
38+
3839 useEffect ( ( ) => {
3940 switch ( theme ) {
4041 case 'system' :
@@ -46,8 +47,30 @@ export default function DarkModeToggle() {
4647 }
4748 } , [ theme , resolvedTheme ] ) ;
4849
50+ const dropdownRef = useRef < HTMLDivElement > ( null ) ;
51+
52+ useEffect ( ( ) => {
53+ const handleClickOutside = ( event : MouseEvent ) => {
54+ if (
55+ dropdownRef . current &&
56+ ! dropdownRef . current . contains ( event . target as Node )
57+ ) {
58+ setShowSelect ( false ) ;
59+ }
60+ } ;
61+
62+ document . addEventListener ( 'mousedown' , handleClickOutside ) ;
63+
64+ return ( ) => {
65+ document . removeEventListener ( 'mousedown' , handleClickOutside ) ;
66+ } ;
67+ } , [ ] ) ;
68+
4969 return (
50- < div className = 'relative w-10 h-10 dark-mode-toggle-container' >
70+ < div
71+ ref = { dropdownRef }
72+ className = 'relative w-10 h-10 dark-mode-toggle-container'
73+ >
5174 < button
5275 onClick = { ( ) => setShowSelect ( ! showSelect ) }
5376 className = 'dark-mode-toggle rounded-md dark:hover:bg-gray-700 p-1.5 hover:bg-gray-100 transition duration-150 '
@@ -66,11 +89,10 @@ export default function DarkModeToggle() {
6689 />
6790 </ button >
6891 < div
69- className = 'absolute right-0 p-2 bg-white dark:bg-gray-800 rounded-lg border dark:border-gray-700 z-10 w-max'
70- style = { { display : showSelect ? 'block' : 'none' } }
71- onMouseLeave = { ( ) => {
72- setShowSelect ( false ) ;
73- } }
92+ onMouseLeave = { ( ) => setShowSelect ( false ) }
93+ className = { `absolute right-0 p-2 bg-white dark:bg-gray-800 rounded-lg border dark:border-gray-700 z-10 w-max ${
94+ showSelect ? 'block' : 'hidden'
95+ } `}
7496 tabIndex = { 0 }
7597 data-test = 'theme-dropdown'
7698 >
@@ -93,7 +115,7 @@ export default function DarkModeToggle() {
93115 >
94116 < Image
95117 src = { '/icons/sun.svg' }
96- alt = 'System theme'
118+ alt = 'Light theme'
97119 width = { 18 }
98120 height = { 18 }
99121 style = { { filter : isDarkMode ? 'invert(1)' : 'invert(0)' } }
@@ -106,7 +128,7 @@ export default function DarkModeToggle() {
106128 >
107129 < Image
108130 src = { '/icons/moon.svg' }
109- alt = 'System theme'
131+ alt = 'Dark theme'
110132 width = { 18 }
111133 height = { 18 }
112134 style = { { filter : isDarkMode ? 'invert(1)' : 'invert(0)' } }
0 commit comments