'use client'; import Link from 'next/link'; import { usePathname } from 'next/navigation'; import { useState, useEffect } from 'react'; import { LayoutDashboard, Ticket, Users, Route, DollarSign, Bell, BarChart3, Settings, LogOut, LogIn, ChevronLeft, ChevronRight, Train, MapPin, CreditCard, Shield, UserCheck, Wallet, Gift, MessageSquare, AlertTriangle, FileText, Briefcase, Calendar, Utensils, Package, Moon, Sun, Armchair, Ban, Grid3x3, Banknote, Activity, Smartphone, Layers, } from 'lucide-react'; import { useAuthStore } from '@/lib/auth-store'; import { cn } from '@/lib/utils'; import { useTheme } from '@/lib/theme-store'; import { PERMS } from '@/lib/permissions'; interface NavItem { name: string; href: string; icon: React.ComponentType<{ className?: string }>; permission?: string; } const navigationSections: { title: string; items: NavItem[] }[] = [ { title: 'Overview', items: [ { name: 'Dashboard', href: '/dashboard', icon: LayoutDashboard, permission: PERMS.dashboard }, ] }, { title: 'Operations', items: [ { name: 'Bookings', href: '/bookings', icon: Ticket, permission: PERMS.bookings.view }, { name: 'Passengers', href: '/passengers', icon: Users, permission: PERMS.passengers.view }, { name: 'Tickets', href: '/tickets', icon: FileText, permission: PERMS.tickets.view }, { name: 'Boarding', href: '/boarding', icon: LogIn, permission: PERMS.tickets.manage }, { name: 'Luggage', href: '/excess-baggage', icon: Banknote, permission: PERMS.bookings.view }, { name: 'Discrepancy', href: '/discrepancy', icon: Layers, permission: PERMS.seats.manage }, ] }, { title: 'Tourism', items: [ { name: 'Packages', href: '/packages', icon: Package, permission: PERMS.packages.view }, // { name: 'Bookings', href: '/package-bookings', icon: Ticket, permission: PERMS.packages.view }, { name: 'Inquiries', href: '/package-inquiries', icon: MessageSquare, permission: PERMS.inquiries.view }, ] }, { title: 'Master Data', items: [ { name: 'Stations', href: '/stations', icon: MapPin, permission: PERMS.stations.view }, { name: 'Trains', href: '/trains', icon: Train, permission: PERMS.trains.view }, { name: 'Coaches', href: '/coaches', icon: Grid3x3, permission: PERMS.coaches.view }, { name: 'Seats', href: '/seats', icon: Armchair, permission: PERMS.seats.view }, { name: 'Classes', href: '/classes', icon: Settings, permission: PERMS.classes.view }, { name: 'Routes', href: '/routes', icon: Route, permission: PERMS.routes.view }, { name: 'Schedules', href: '/schedules', icon: Calendar, permission: PERMS.schedules.view }, ] }, { title: 'Financial', items: [ // { name: 'Pricing & Fares', href: '/pricing', icon: DollarSign, permission: PERMS.admin }, { name: 'Tariff Rates', href: '/tariff-rates', icon: Banknote, permission: PERMS.tariffRates.view }, // { name: 'Fare Rules', href: '/fare-management', icon: Settings, permission: PERMS.admin }, { name: 'Payments', href: '/payments', icon: CreditCard, permission: PERMS.payments.view }, { name: 'Currencies', href: '/currencies', icon: Banknote, permission: PERMS.currencies.view }, // { name: 'Promo Codes', href: '/promos', icon: Gift, permission: PERMS.admin }, { name: 'Payment Methods', href: '/payment-methods', icon: CreditCard, permission: PERMS.paymentMethods.view }, // { name: 'Wallet Accounts', href: '/wallet-accounts', icon: Wallet, permission: PERMS.payments.view }, ] }, { title: 'Customer Services', items: [ // { name: 'Loyalty Program', href: '/loyalty', icon: Gift, permission: PERMS.passengers.view }, { name: 'Support Center', href: '/support', icon: MessageSquare, permission: PERMS.bookings.view }, { name: 'Notifications', href: '/notifications', icon: Bell, permission: PERMS.notifications.send }, ] }, { title: 'Security & Compliance', items: [ { name: 'Audit Logs', href: '/audit', icon: AlertTriangle, permission: PERMS.audit.view }, { name: 'Fraud Detection', href: '/fraud', icon: Shield, permission: PERMS.fraud.view }, // { name: 'Verifayda Integration', href: '/verifayda', icon: UserCheck, permission: PERMS.admin }, ] }, { title: 'Analytics & Reports', items: [ { name: 'Overall', href: '/reports/overall', icon: BarChart3, permission: PERMS.reports.view }, { name: 'Finance', href: '/reports/finance', icon: DollarSign, permission: PERMS.reports.view }, { name: 'Seats', href: '/reports/seats', icon: Armchair, permission: PERMS.reports.view }, { name: 'Blocked Seats', href: '/reports/blocked-seats', icon: Ban, permission: PERMS.reports.view }, { name: 'Passengers', href: '/reports/passengers', icon: Users, permission: PERMS.reports.view }, { name: 'Boarding', href: '/reports/boarding', icon: LogIn, permission: PERMS.reports.view }, { name: 'Payments', href: '/reports/payments', icon: CreditCard, permission: PERMS.reports.view }, // { name: 'Payment Discrepancy', href: '/reports/payment-discrepancy', icon: AlertTriangle, permission: PERMS.reports.view }, // { name: 'Operational Reports', href: '/operational-reports', icon: FileText, permission: PERMS.reports.view }, ] }, { title: 'System', items: [ // { name: 'Agents', href: '/agents', icon: Briefcase, permission: PERMS.agents.view }, // { name: 'Users', href: '/settings/users', icon: Users, permission: PERMS.admin }, { name: 'Settings', href: '/settings', icon: Settings, permission: PERMS.admin }, { name: 'Health', href: '/health', icon: Activity, permission: PERMS.admin }, { name: 'App Releases', href: '/app-releases', icon: Smartphone, permission: PERMS.admin }, ] } ]; // Hook to detect mobile devices function useIsMobile() { const [isMobile, setIsMobile] = useState(false); useEffect(() => { const checkIsMobile = () => { setIsMobile(window.innerWidth < 768); // md breakpoint }; // Check on mount checkIsMobile(); // Listen for resize events window.addEventListener('resize', checkIsMobile); return () => window.removeEventListener('resize', checkIsMobile); }, []); return isMobile; } export default function Sidebar() { const pathname = usePathname(); const { user, logout, hasPermission } = useAuthStore(); const { isDark, toggleTheme } = useTheme(); const isMobile = useIsMobile(); // Initialize collapsed state based on mobile detection const [isCollapsed, setIsCollapsed] = useState(false); // Update collapsed state when mobile status changes useEffect(() => { setIsCollapsed(isMobile); }, [isMobile]); return (
Back-office Passenger Portal