"use client"; import type React from "react"; import { useState } from "react"; import { cn } from "@/lib/utils"; import { Share2, Palette, GitFork, Building2, Calendar, Target, Mail, HardDrive, GraduationCap, MessageSquare, FileText, Calculator, Kanban, ChevronLeft, ChevronRight, BookOpen, Book, } from "lucide-react"; import { Button } from "@/components/ui/button"; import { ScrollArea } from "@/components/ui/scroll-area"; import { useRouter, usePathname } from "next/navigation"; import Link from "next/link"; import Image from "next/image"; import { useSession } from "next-auth/react"; import { CalendarNav } from "@/components/sidebar/calendar-nav"; interface SidebarProps { isOpen: boolean; onClose: () => void; } interface MenuItem { title: string; icon: any; href: string; iframe?: string; external?: boolean; requiredRole?: string | string[]; } export function Sidebar({ isOpen, onClose }: SidebarProps) { const { data: session, status } = useSession(); const router = useRouter(); const pathname = usePathname(); // Debug session data console.log('SIDEBAR DEBUG - Session:', session); console.log('SIDEBAR DEBUG - User roles:', session?.user?.role); // Show loading state while session is being checked if (status === 'loading') { return null; } // Show nothing if not authenticated (middleware will handle redirect) if (status === 'unauthenticated') { return null; } // Function to check if user has a specific role const hasRole = (requiredRole: string | string[] | undefined) => { // If no role is required, allow access if (!requiredRole) { return true; } // If no session or user roles, deny access if (!session?.user?.role) { return false; } // Get user roles and normalize them properly const userRoles = Array.isArray(session.user.role) ? session.user.role : [session.user.role]; // Filter out technical/system roles that shouldn't count for permissions const ignoredRoles = ['offline_access', 'uma_authorization', 'default-roles-cercle']; const cleanUserRoles = userRoles .filter(Boolean) // Remove any null/undefined values .filter(role => !ignoredRoles.includes(String(role))) // Filter out system roles .map(role => { if (typeof role !== 'string') return ''; return role .replace(/^\//, '') // Remove leading slash .replace(/^ROLE_/i, '') // Remove ROLE_ prefix, case insensitive .replace(/^default-roles-[^/]*\//i, '') // Remove realm prefix like default-roles-cercle/ .toLowerCase(); }) .filter(role => role !== ''); // Remove empty strings // Check against array of required roles if (Array.isArray(requiredRole)) { const cleanRequiredRoles = requiredRole .filter(Boolean) .map(role => typeof role === 'string' ? role.toLowerCase() : '') .filter(role => role !== ''); return cleanRequiredRoles.some(role => cleanUserRoles.includes(role)); } // Check against single required role if (typeof requiredRole === 'string') { const cleanRequiredRole = requiredRole.toLowerCase(); return cleanUserRoles.includes(cleanRequiredRole); } return false; }; // Base menu items (available for everyone) const baseMenuItems: MenuItem[] = [ { title: "Pages", icon: FileText, href: "/pages", iframe: process.env.NEXT_PUBLIC_IFRAME_CARNET_URL, }, { title: "Courrier", icon: Mail, href: "/courrier", }, { title: "Dossiers", icon: HardDrive, href: "/dossiers", iframe: process.env.NEXT_PUBLIC_IFRAME_DRIVE_URL, }, { title: "Apprendre", icon: GraduationCap, href: "/apprendre", iframe: process.env.NEXT_PUBLIC_IFRAME_LEARN_URL, }, { title: "Parole", icon: MessageSquare, href: "/parole", iframe: process.env.NEXT_PUBLIC_IFRAME_PAROLE_URL, }, { title: "Missions", icon: Kanban, href: "/missions", iframe: process.env.NEXT_PUBLIC_IFRAME_MISSIONSBOARD_URL, }, { title: "Chapitre", icon: BookOpen, href: "/chapitre", iframe: process.env.NEXT_PUBLIC_IFRAME_CHAPTER_URL, }, { title: "Agilité", icon: Share2, href: "/agilite", iframe: process.env.NEXT_PUBLIC_IFRAME_AGILITY_URL, }, ]; // Role-specific menu items const roleSpecificItems: MenuItem[] = [ { title: "Artlab", icon: Palette, href: "/design", iframe: process.env.NEXT_PUBLIC_IFRAME_ARTLAB_URL, requiredRole: ["expression", "admin", "user", "coding", "dataintelligence", "mediation"], }, { title: "Gite", icon: GitFork, href: "/gite", iframe: process.env.NEXT_PUBLIC_IFRAME_GITE_URL, requiredRole: ["coding", "dataintelligence"], }, { title: "Calcul", icon: Calculator, href: "/calcul", iframe: process.env.NEXT_PUBLIC_IFRAME_CALCULATION_URL, requiredRole: "dataintelligence", }, { title: "Médiation", icon: Building2, href: "/mediation", iframe: process.env.NEXT_PUBLIC_IFRAME_MEDIATIONS_URL, requiredRole: "mediation", }, { title: "Livres", icon: Book, href: "/livres", iframe: process.env.NEXT_PUBLIC_IFRAME_LIVRE_URL, }, ]; // Combine base items with role-specific items based on user roles const visibleMenuItems = [ ...baseMenuItems, ...roleSpecificItems.filter(item => { const isVisible = hasRole(item.requiredRole); return isVisible; }) ]; const handleNavigation = (href: string, external?: boolean) => { if (external && href) { window.open(href, "_blank"); } else { router.push(href); } onClose(); }; return ( <> {/* Backdrop */} {isOpen && (
)} {/* Sidebar */}
{/* Hide Button */} {/* Logo */}
Neah Logo
{/* Menu Items */}
{visibleMenuItems.map((item) => ( ))}
); }