import React, { useState } from 'react'; import { createPortal } from 'react-dom'; import { useNavigate } from 'react-router-dom'; import { useAuth } from '@/providers/authProvider'; import { useTheme } from '@/providers/themeProvider'; import { useUsersQuery } from '@/hooks/use-query/useUsersQuery'; import { STATUS_BADGE, STATUS_DOT } from '@/components/common/ui'; const THEME_OPTIONS = [ { mode: 'light' as const, label: 'Light', icon: 'fa-sun' }, { mode: 'dark' as const, label: 'Dark', icon: 'fa-moon' }, { mode: 'auto' as const, label: 'Auto', icon: 'fa-clock' }, ]; interface SettingsMenuProps { onClose: () => void; onOpenProfileModal: () => void; } export const SettingsMenu: React.FC = ({ onClose, onOpenProfileModal }) => { const navigate = useNavigate(); const menuRef = React.useRef(null); const { logout } = useAuth(); const { themeMode, setThemeMode } = useTheme(); const { data: userData } = useUsersQuery(); const [menuPosition, setMenuPosition] = useState({ top: 0, right: 0 }); React.useEffect(() => { // Calculate position for the menu const settingsButton = document.querySelector('[aria-label="Settings"]') as HTMLElement; if (settingsButton) { const rect = settingsButton.getBoundingClientRect(); setMenuPosition({ top: rect.bottom + 8, right: window.innerWidth - rect.right }); } }, []); React.useEffect(() => { const handleClickOutside = (event: MouseEvent) => { // Check if click was on the settings button const settingsButton = document.querySelector('[aria-label="Settings"]'); if (settingsButton?.contains(event.target as Node)) { return; } if (menuRef.current && !menuRef.current.contains(event.target as Node)) { onClose(); } }; document.addEventListener('mousedown', handleClickOutside); return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, [onClose]); React.useEffect(() => { const handleViewportChange = () => { onClose(); }; window.addEventListener('resize', handleViewportChange); document.addEventListener('scroll', handleViewportChange, true); return () => { window.removeEventListener('resize', handleViewportChange); document.removeEventListener('scroll', handleViewportChange, true); }; }, [onClose]); const handleLogout = () => { logout(); onClose(); }; const handleProfileClick = () => { onClose(); onOpenProfileModal(); }; const handleSettingsClick = () => { onClose(); // Navigate to Settings page navigate('/settings'); }; const menuContent = (
{userData && ( <>

{userData.username}

{userData.is_admin ? 'Administrator' : 'Team user'}
)} {userData?.is_admin && ( )}

Theme

{THEME_OPTIONS.map(({ mode, label, icon }) => ( ))}
); return <>{createPortal(menuContent, document.body)}; };