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 = (
{/* Logo */}
{!collapsed && (
Sauci
Admin Portal
)}
{collapsed && (

)}
{/* Collapse button */}
{/* Navigation */}
{/* User info */}
{user?.email?.charAt(0).toUpperCase() || 'A'}
{!collapsed && (
{user?.email}
{permissions?.role?.replace('_', ' ')}
)}
);
// Mobile sidebar (overlay)
const mobileSidebar = (
<>
{/* Backdrop */}
{/* Slide-in sidebar */}
{/* Mobile header with close button */}
{/* Navigation */}
{/* User info */}
{user?.email?.charAt(0).toUpperCase() || 'A'}
{user?.email}
{permissions?.role?.replace('_', ' ')}
>
);
return (
<>
{sidebarContent}
{mobileSidebar}
>
);
}