'use client'; import { useState, useRef, useEffect } from 'react'; import { useTranslations } from 'next-intl'; import { useTheme } from '../providers/ThemeProvider'; import { SunIcon, MoonIcon, ComputerDesktopIcon, ChevronDownIcon } from '@heroicons/react/24/outline'; type ThemeMode = 'light' | 'dark' | 'system'; interface ThemeOption { mode: ThemeMode; label: string; icon: React.ReactNode; } export function ThemeToggle() { const { themeMode, setThemeMode } = useTheme(); const t = useTranslations('ui'); const [isOpen, setIsOpen] = useState(false); const dropdownRef = useRef(null); const themeOptions: ThemeOption[] = [ { mode: 'light', label: t('themes.light'), icon: }, { mode: 'dark', label: t('themes.dark'), icon: }, { mode: 'system', label: t('themes.system'), icon: } ]; // Get current theme option const currentTheme = themeOptions.find(option => option.mode === themeMode) || themeOptions[2]; // Handle clicking outside to close dropdown useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { setIsOpen(false); } }; if (isOpen) { document.addEventListener('mousedown', handleClickOutside); } return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, [isOpen]); // Handle escape key to close dropdown useEffect(() => { const handleEscape = (event: KeyboardEvent) => { if (event.key === 'Escape') { setIsOpen(false); } }; if (isOpen) { document.addEventListener('keydown', handleEscape); } return () => { document.removeEventListener('keydown', handleEscape); }; }, [isOpen]); const handleThemeSelect = (mode: ThemeMode) => { setThemeMode(mode); setIsOpen(false); }; const toggleDropdown = () => { setIsOpen(!isOpen); }; return (
{/* Main toggle button */} {/* Dropdown menu */} {isOpen && (
{themeOptions.map((option) => ( ))}
)}
); }