import { Link, useLocation } from 'react-router-dom'; import { cn } from '@/lib/utils'; import { useAuth, PERMISSION_KEYS, PermissionKey } from '@/contexts/AuthContext'; import { LayoutGrid, Users, ClipboardList, ChevronLeft, ChevronRight, LogOut, Shield, Ticket, MessageSquareText, Target, Bot, Smartphone, X, Home, Activity, AlertTriangle, PieChart, Tags, Zap, HelpCircle, Heart, Swords, Pencil, } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Separator } from '@/components/ui/separator'; import { Avatar, AvatarFallback } from '@/components/ui/avatar'; import { useState, useEffect } from 'react'; import logoImage from '@/assets/logo.png'; interface NavItem { label: string; href: string; icon: React.ReactNode; requiredPermission?: PermissionKey; } const dashboardNav: NavItem[] = [ { label: 'Dashboard', href: '/', icon: , }, ]; const contentNav: NavItem[] = [ { label: 'Categories', href: '/categories', icon: , requiredPermission: PERMISSION_KEYS.MANAGE_CATEGORIES, }, { label: 'Dare Packs', href: '/dare-packs', icon: , requiredPermission: PERMISSION_KEYS.MANAGE_PACKS, }, { label: 'Question Analytics', href: '/question-analytics', icon: , requiredPermission: PERMISSION_KEYS.MANAGE_QUESTIONS, }, { label: 'Tags', href: '/tags', icon: , requiredPermission: PERMISSION_KEYS.MANAGE_PACKS, }, { label: 'Quiz Questions', href: '/quiz-questions', icon: , requiredPermission: PERMISSION_KEYS.MANAGE_QUESTIONS, }, ]; const usersNav: NavItem[] = [ { label: 'Users', href: '/users', icon: , requiredPermission: PERMISSION_KEYS.VIEW_USERS, }, { label: 'User Activity', href: '/activity', icon: , requiredPermission: PERMISSION_KEYS.VIEW_ACTIVITY, }, { label: 'Sent Dares', href: '/activity/sent-dares', icon: , requiredPermission: PERMISSION_KEYS.VIEW_ACTIVITY, }, { label: 'Live Draw Sessions', href: '/activity/live-draw', icon: , requiredPermission: PERMISSION_KEYS.VIEW_USERS, }, { label: 'Couples', href: '/couples', icon: , requiredPermission: PERMISSION_KEYS.VIEW_USERS, }, { label: 'Usage Insights', href: '/usage-insights', icon: , requiredPermission: PERMISSION_KEYS.VIEW_USERS, }, { label: 'Feedback', href: '/feedback', icon: , requiredPermission: PERMISSION_KEYS.MANAGE_FEEDBACK, }, ]; const systemNav: NavItem[] = [ { label: 'Admins', href: '/admins', icon: , requiredPermission: PERMISSION_KEYS.MANAGE_ADMINS, }, { label: 'Flagged Messages', href: '/flagged-messages', icon: , requiredPermission: PERMISSION_KEYS.VIEW_CHATS, }, { label: 'AI Settings', href: '/ai-settings', icon: , requiredPermission: PERMISSION_KEYS.MANAGE_AI_CONFIG, }, { label: 'App Settings', href: '/app-settings', icon: , requiredPermission: PERMISSION_KEYS.MANAGE_APP_CONFIG, }, { label: 'Redemption Codes', href: '/redemption-codes', icon: , requiredPermission: PERMISSION_KEYS.MANAGE_CODES, }, { label: 'Audit Logs', href: '/audit-logs', icon: , requiredPermission: PERMISSION_KEYS.VIEW_AUDIT_LOGS, }, ]; interface SidebarProps { mobileOpen?: boolean; onMobileClose?: () => void; } export function Sidebar({ mobileOpen, onMobileClose }: SidebarProps) { const location = useLocation(); const { user, permissions, logout, hasPermission } = useAuth(); const [collapsed, setCollapsed] = useState(false); // Close mobile sidebar on route change useEffect(() => { if (mobileOpen && onMobileClose) { onMobileClose(); } }, [location.pathname]); const NavLink = ({ item }: { item: NavItem }) => { if (item.requiredPermission && !hasPermission(item.requiredPermission)) return null; const isActive = item.href === '/' ? location.pathname === '/' : location.pathname.startsWith(item.href); return ( {item.icon} {!collapsed && {item.label}} ); }; const NavSection = ({ title, items }: { title: string; items: NavItem[] }) => { const visibleItems = items.filter(item => !item.requiredPermission || hasPermission(item.requiredPermission)); if (visibleItems.length === 0) return null; return (
{!collapsed && (

{title}

)} {visibleItems.map(item => ( ))}
); }; const sidebarContent = (