"use client"; import { useState } from "react"; import { Calendar, MessageSquare, BotIcon as Robot, Bell, Users, LogOut, UserCog, Clock, PenLine, Video, Radio as RadioIcon, Megaphone, Heart, Target, Mail, Telescope, Lightbulb, Circle, Menu, } from "lucide-react"; import Image from "next/image"; import Link from "next/link"; import { Sidebar } from "./sidebar"; import { useSession, signIn, signOut } from "next-auth/react"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { format } from "date-fns"; import { fr } from "date-fns/locale"; const requestNotificationPermission = async () => { try { const permission = await Notification.requestPermission(); return permission === "granted"; } catch (error) { console.error("Error requesting notification permission:", error); return false; } }; export function MainNav() { const [isSidebarOpen, setIsSidebarOpen] = useState(false); const { data: session, status } = useSession(); const [userStatus, setUserStatus] = useState<'online' | 'busy' | 'away'>('online'); console.log("Session:", session); console.log("Status:", status); // Updated function to get user initials const getUserInitials = () => { if (session?.user?.name) { // Split the full name and get initials const names = session.user.name.split(' '); if (names.length >= 2) { return `${names[0][0]}${names[names.length - 1][0]}`.toUpperCase(); } // If only one name, use first two letters return names[0].slice(0, 2).toUpperCase(); } return "?"; }; // Function to get display name const getDisplayName = () => { return session?.user?.name || "User"; }; // Function to get user role const getUserRole = () => { if (session?.user?.role) { if (Array.isArray(session.user.role)) { // Filter out technical roles and format remaining ones return session.user.role .filter(role => !['offline_access', 'uma_authorization', 'default-roles-cercle'].includes(role) ) .map(role => { // Transform role names switch(role) { case 'ROLE_Mentors': return 'Mentor'; case 'ROLE_apprentice': return 'Apprentice'; case 'ROLE_Admin': return 'Admin'; default: return role.replace('ROLE_', ''); } }) .join(', '); } return session.user.role; } return ""; }; // Function to check if user has a specific role const hasRole = (requiredRoles: string[]) => { if (!session?.user?.role) return false; const userRoles = Array.isArray(session.user.role) ? session.user.role : [session.user.role]; // Add console.log to debug roles console.log('User roles:', userRoles); console.log('Required roles:', requiredRoles); return userRoles.some(role => { // Remove ROLE_ prefix if it exists const cleanRole = role.replace('ROLE_', ''); return requiredRoles.includes(cleanRole) || cleanRole === 'Admin'; }); }; // Status configurations const statusConfig = { online: { color: 'text-green-500', label: 'Online', notifications: true }, busy: { color: 'text-orange-500', label: 'Busy', notifications: false }, away: { color: 'text-gray-500', label: 'Away', notifications: false }, }; // Handle status change const handleStatusChange = async (newStatus: 'online' | 'busy' | 'away') => { setUserStatus(newStatus); if (newStatus !== 'online') { // If status is busy or away, check and request notification permission if needed const hasPermission = await requestNotificationPermission(); if (hasPermission) { // Disable notifications if ('serviceWorker' in navigator) { const registration = await navigator.serviceWorker.ready; await registration.pushManager.getSubscription()?.then(subscription => { if (subscription) { subscription.unsubscribe(); } }); } } } else { // Re-enable notifications if going back online requestNotificationPermission(); } }; // Base menu items (available for everyone) const baseMenuItems = [ { title: "HealthView", icon: Heart, href: '/health-view', }, { title: "MissionView", icon: Target, href: '/mission-view', }, ]; // Role-specific menu items const roleSpecificItems = [ { title: "ShowCase", icon: Lightbulb, href: '/showcase', requiredRoles: ["Expression"], }, { title: "UsersView", icon: UserCog, href: '/management', requiredRoles: ["Admin", "Entrepreneurship"], }, { title: "TheMessage", icon: Mail, href: '/the-message', requiredRoles: ["Mediation", "Expression"], }, ]; // Get visible menu items based on user roles const visibleMenuItems = [ ...baseMenuItems, ...roleSpecificItems.filter(item => hasRole(item.requiredRoles)) ]; // Format current date and time const now = new Date(); const formattedDate = format(now, "d MMMM yyyy", { locale: fr }); const formattedTime = format(now, "HH:mm"); return ( <>