NeahFront2/components/sidebar.tsx
2025-04-08 20:36:59 +02:00

229 lines
5.8 KiB
TypeScript

"use client";
import type React from "react";
import { useState } from "react";
import { cn } from "@/lib/utils";
import {
BookOpen,
Share2,
Palette,
GitFork,
Building2,
Calendar,
Target,
Mail,
HardDrive,
GraduationCap,
MessageSquare,
FileText,
Calculator,
Users,
Kanban,
ChevronLeft,
ChevronRight,
} 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";
interface SidebarProps {
isOpen: boolean;
onClose: () => void;
}
export function Sidebar({ isOpen, onClose }: SidebarProps) {
const { data: session } = useSession();
const router = useRouter();
const pathname = usePathname();
// Function to check if user has a specific role
const hasRole = (requiredRole: 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 role:', requiredRole);
return userRoles.some(role => {
// Remove ROLE_ prefix if it exists
const cleanRole = role.replace('ROLE_', '');
return cleanRole === requiredRole || cleanRole === 'Admin';
});
};
// Base menu items (available for everyone)
const baseMenuItems = [
{
title: "Diary",
icon: BookOpen,
href: "/diary",
iframe: process.env.NEXT_PUBLIC_IFRAME_DIARY_URL,
},
{
title: "Calendar",
icon: Calendar,
href: "/calendar",
external: false,
},
{
title: "Mail",
icon: Mail,
href: "/mail",
iframe: process.env.NEXT_PUBLIC_IFRAME_MAIL_URL,
},
{
title: "Drive",
icon: HardDrive,
href: "/drive",
iframe: process.env.NEXT_PUBLIC_IFRAME_DRIVE_URL,
},
{
title: "Contacts",
icon: Users,
href: "/contacts",
iframe: process.env.NEXT_PUBLIC_IFRAME_CONTACTS_URL,
},
{
title: "Learn",
icon: GraduationCap,
href: "/learn",
iframe: process.env.NEXT_PUBLIC_IFRAME_LEARN_URL,
},
{
title: "Parole",
icon: MessageSquare,
href: "/parole",
iframe: process.env.NEXT_PUBLIC_IFRAME_PAROLE_URL,
},
{
title: "MissionsBoard",
icon: Kanban,
href: "/missions-board",
iframe: process.env.NEXT_PUBLIC_IFRAME_MISSIONSBOARD_URL,
},
{
title: "Chapter",
icon: FileText,
href: "/missions",
iframe: process.env.NEXT_PUBLIC_IFRAME_CHAPTER_URL,
},
{
title: "Agility",
icon: Share2,
href: "/flow",
iframe: process.env.NEXT_PUBLIC_IFRAME_AGILITY_URL,
},
];
// Role-specific menu items
const roleSpecificItems = [
{
title: "Artlab",
icon: Palette,
href: "/design",
iframe: process.env.NEXT_PUBLIC_IFRAME_ARTLAB_URL,
requiredRole: "Expression",
},
{
title: "Gite",
icon: GitFork,
href: "/gitlab",
iframe: process.env.NEXT_PUBLIC_IFRAME_GITE_URL,
requiredRole: "Coding",
},
{
title: "Calculation",
icon: Calculator,
href: "/calculation",
iframe: process.env.NEXT_PUBLIC_IFRAME_CALCULATION_URL,
requiredRole: "DataIntelligence",
},
{
title: "Mediations",
icon: Building2,
href: "/crm",
iframe: process.env.NEXT_PUBLIC_IFRAME_MEDIATIONS_URL,
requiredRole: "Mediation",
},
];
// Combine base items with role-specific items based on user roles
const visibleMenuItems = [
...baseMenuItems,
...roleSpecificItems.filter(item => hasRole(item.requiredRole))
];
const handleNavigation = (href: string, external?: boolean) => {
if (external) {
window.open(href, "_blank");
} else {
router.push(href);
}
onClose();
};
return (
<>
{/* Backdrop */}
{isOpen && (
<div
className="fixed inset-0 z-40 bg-background/80 backdrop-blur-sm"
onClick={onClose}
/>
)}
{/* Sidebar */}
<div
className={cn(
"fixed top-0 left-0 z-50 h-full w-64 transform bg-panel transition-all duration-200 ease-in-out",
isOpen ? "translate-x-0" : "-translate-x-full"
)}
>
<ScrollArea className="h-full w-full relative">
{/* Hide Button */}
<button
onClick={onClose}
className="absolute -right-3 top-1/2 transform -translate-y-1/2 w-6 h-12 bg-black text-white rounded-r-md flex items-center justify-center hover:bg-gray-800 transition-colors z-[60]"
>
<ChevronLeft className="h-4 w-4" />
</button>
{/* Logo */}
<div className="flex justify-center p-6 border-b">
<Image
src="/Neahv3 logo.png"
alt="Neah Logo"
width={100}
height={33}
className="text-black"
/>
</div>
{/* Menu Items */}
<div className="space-y-1 p-4">
{visibleMenuItems.map((item) => (
<Button
key={item.title}
variant="ghost"
className={cn(
"w-full justify-start gap-2 text-black hover:bg-gray-100",
pathname === item.href && !item.external && "bg-gray-100"
)}
onClick={() => handleNavigation(item.href, item.external)}
>
<item.icon className="h-5 w-5" />
<span>{item.title}</span>
</Button>
))}
</div>
</ScrollArea>
</div>
</>
);
}