import React, { useState, useRef } from 'react'; import { useNavigate } from 'react-router-dom'; import { Menu, User, LogOut, Settings, Bell, Lock, CheckCircle, Trash2 } from 'lucide-react'; import { useTranslation } from 'react-i18next'; import { useLocalizedDate } from '../../hooks/useLocalizedDate'; import { useLocalizedTimeAgo } from '../../hooks/useLocalizedTimeAgo'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { useAdminAuth } from '../../contexts'; import { useOnClickOutside } from '../../hooks/useOnClickOutside'; import { PasswordChangeModal } from './PasswordChangeModal'; import { LanguageSelector } from '../common'; import { notificationsService } from '../../services/notifications.service'; import { toast } from 'react-toastify'; interface AdminHeaderProps { onMenuClick: () => void; } export const AdminHeader: React.FC = ({ onMenuClick }) => { const navigate = useNavigate(); const { user, logout } = useAdminAuth(); const { t } = useTranslation(); const { format } = useLocalizedDate(); const { formatTimeAgo } = useLocalizedTimeAgo(); const [showUserMenu, setShowUserMenu] = useState(false); const [showNotifications, setShowNotifications] = useState(false); const [showPasswordModal, setShowPasswordModal] = useState(false); const queryClient = useQueryClient(); const userMenuRef = useRef(null); const notificationRef = useRef(null); useOnClickOutside(userMenuRef, () => setShowUserMenu(false)); useOnClickOutside(notificationRef, () => setShowNotifications(false)); const handleLogout = () => { logout(); navigate('/admin/login'); }; // Fetch notifications const { data: notificationsData } = useQuery({ queryKey: ['notifications', showNotifications], queryFn: () => notificationsService.getNotifications(showNotifications, 20), refetchInterval: 60000, // Refetch every minute }); // Mark all as read mutation const markAllAsReadMutation = useMutation({ mutationFn: notificationsService.markAllAsRead, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['notifications'] }); toast.success(t('admin.notificationToasts.markedAllRead')); }, }); // Clear old notifications mutation const clearOldMutation = useMutation({ mutationFn: notificationsService.clearOldNotifications, onSuccess: (data) => { queryClient.invalidateQueries({ queryKey: ['notifications'] }); toast.success(t('admin.notificationToasts.clearedOld', { count: data.deletedCount })); }, }); const notifications = notificationsData?.notifications || []; const unreadCount = notificationsData?.unreadCount || 0; return (
{/* Left side - Menu button and Date */}
{/* Date display - hidden on small screens */}

{format(new Date(), 'PPPP')}

{/* Center - Logo and PicPeak text - hidden on small screens to prevent overlap */}
PicPeak PicPeak
{/* Mobile Logo - shown only on small screens */}
PicPeak PicPeak
{/* Right side actions */}
{/* Language Selector */} {/* Notifications */}
{/* Notifications dropdown */} {showNotifications && (

{t('admin.notifications')}

{unreadCount > 0 && ( )}
{notifications.length === 0 ? (
{t('admin.noNotificationsMessage')}
) : ( notifications.map((notification) => { const style = notificationsService.getNotificationStyle(notification.type); return (

{notificationsService.formatNotificationMessage(notification)}

{formatTimeAgo(notification.createdAt)}

); }) )}
{notifications.length > 0 && (
)}
)}
{/* User menu */}
{/* User dropdown */} {showUserMenu && (

{user?.username}

{user?.email}

)}
{/* Password Change Modal */} setShowPasswordModal(false)} />
); };