import React, { useState, useEffect, useRef, useMemo } from 'react'; import { useNavigate } from 'react-router-dom'; import { SunIcon, MoonIcon, PlusIcon, CheckIcon, FolderIcon, BookOpenIcon, Squares2X2Icon, TagIcon, InboxIcon, } from '@heroicons/react/24/outline'; import TelegramIcon from '../Shared/Icons/TelegramIcon'; import { useTranslation } from 'react-i18next'; import { Note } from '../../entities/Note'; import { Area } from '../../entities/Area'; import { useTelegramStatus } from '../../contexts/TelegramStatusContext'; import { getApiPath } from '../../config/paths'; import { useKeyboardShortcuts } from '../../hooks/useKeyboardShortcuts'; import { KeyboardShortcutsConfig, ShortcutAction, formatShortcutDisplay, getDefaultShortcuts, getShortcutByAction, } from '../../utils/keyboardShortcutsService'; interface SidebarFooterProps { currentUser: { email: string }; isDarkMode: boolean; toggleDarkMode: () => void; isSidebarOpen: boolean; setIsSidebarOpen: React.Dispatch>; isDropdownOpen: boolean; toggleDropdown: () => void; openTaskModal: () => void; openProjectModal: () => void; openNoteModal: (note: Note | null) => void; openAreaModal: (area: Area | null) => void; openTagModal: (tag: any | null) => void; keyboardShortcuts?: KeyboardShortcutsConfig | null; } const SidebarFooter: React.FC = ({ isDarkMode, toggleDarkMode, isSidebarOpen, setIsSidebarOpen, openTaskModal, openProjectModal, openNoteModal, openAreaModal, openTagModal, keyboardShortcuts, }) => { const { t } = useTranslation(); const [isDropdownOpen, setIsDropdownOpen] = useState(false); const { status: telegramStatus } = useTelegramStatus(); const dropdownRef = useRef(null); const [version, setVersion] = useState('v0.86'); const navigate = useNavigate(); // Get shortcuts config, using defaults if not provided const shortcuts = useMemo(() => { return keyboardShortcuts?.shortcuts || getDefaultShortcuts(); }, [keyboardShortcuts]); const shortcutsEnabled = keyboardShortcuts?.enabled ?? true; const toggleDropdown = () => { setIsDropdownOpen(!isDropdownOpen); }; // Handle click outside to close dropdown useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if ( dropdownRef.current && !dropdownRef.current.contains(event.target as Node) ) { setIsDropdownOpen(false); } }; if (isDropdownOpen) { document.addEventListener('mousedown', handleClickOutside); } return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, [isDropdownOpen]); // Fetch version from API useEffect(() => { fetch(getApiPath('version')) .then((response) => response.json()) .then((data) => { if (data.version) { setVersion(data.version); } }) .catch((error) => { console.error('Error fetching version:', error); }); }, []); const handleDropdownSelect = (type: string) => { switch (type) { case 'Inbox': navigate('/inbox'); if (window.innerWidth < 1024) { setIsSidebarOpen(false); } break; case 'Task': openTaskModal(); break; case 'Project': openProjectModal(); break; case 'Note': openNoteModal(null); break; case 'Area': openAreaModal(null); break; case 'Tag': openTagModal(null); break; default: break; } setIsDropdownOpen(false); }; // Use the keyboard shortcuts hook useKeyboardShortcuts( shortcuts, { inbox: () => handleDropdownSelect('Inbox'), task: () => handleDropdownSelect('Task'), project: () => handleDropdownSelect('Project'), note: () => handleDropdownSelect('Note'), area: () => handleDropdownSelect('Area'), tag: () => handleDropdownSelect('Tag'), }, shortcutsEnabled ); // Helper to get the display string for a shortcut action const getShortcutDisplay = (action: ShortcutAction): string => { const shortcut = getShortcutByAction(shortcuts, action); return shortcut ? formatShortcutDisplay(shortcut) : ''; }; const dropdownItems = [ { label: 'Inbox', translationKey: 'dropdown.inbox', icon: , action: 'inbox' as ShortcutAction, }, { label: 'Task', translationKey: 'dropdown.task', icon: , action: 'task' as ShortcutAction, }, { label: 'Project', translationKey: 'dropdown.project', icon: , action: 'project' as ShortcutAction, }, { label: 'Note', translationKey: 'dropdown.note', icon: , action: 'note' as ShortcutAction, }, { label: 'Area', translationKey: 'dropdown.area', icon: , action: 'area' as ShortcutAction, }, { label: 'Tag', translationKey: 'dropdown.tag', icon: , action: 'tag' as ShortcutAction, }, ]; return (
{/* Version Display */} {isSidebarOpen && (
{version}
)}
{isSidebarOpen && (
{/* Plus Icon Button - Left */}
{/* Dropdown Menu */} {isDropdownOpen && (
{dropdownItems.map( ({ label, translationKey, icon, action, }) => ( ) )}
)}
{/* Telegram Status and Dark Mode Toggle - Right */}
{/* Telegram Status Indicator */} {telegramStatus !== 'none' && (
)} {/* Dark Mode Toggle */}
)}
); }; export default SidebarFooter;