import { motion } from "framer-motion"; import { LayoutDashboard, MessageSquare, Radio } from "lucide-react"; import type { MessageRecord } from "../entities/message/types.js"; import type { DashboardTab } from "../entities/ui/types.js"; import { useMascotChat } from "../shared/hooks/useMascotChat"; import { cn } from "../shared/lib/utils"; import { MascotChatbot } from "./mascot/MascotChatbot"; import { MascotImage } from "./mascot/MascotImage"; const navItems: Array<{ id: DashboardTab; label: string; icon: typeof Radio }> = [ { id: "messages", label: "Messages & Moderation", icon: MessageSquare }, { id: "live", label: "Voice & Media", icon: Radio }, { id: "dashboard", label: "Dashboard", icon: LayoutDashboard }, ]; interface SidebarProps { activeTab: DashboardTab; onTabChange: (tab: DashboardTab) => void; collapsed?: boolean; recentMessages?: MessageRecord[]; guildId?: string; channelId?: string; } export function Sidebar({ activeTab, onTabChange, collapsed = true, recentMessages = [], guildId, channelId, }: SidebarProps) { const mascotChat = useMascotChat({ messageCount: recentMessages.length, activeParticipants: new Set( recentMessages.map((message) => message.user_id), ).size, lastActivity: recentMessages.length > 0 ? "Active" : "Idle", topicsDiscussed: ["Messages", "Moderation"], guildId, channelId, }); return ( <> {/* App icon only — no branding text */} {/* Mascot image — only when expanded */} {!collapsed && ( )} {/* Navigation items — centered vertically */} {navItems.map((item) => { const Icon = item.icon; const isActive = activeTab === item.id; return ( onTabChange(item.id)} title={collapsed ? item.label : undefined} className={cn( "group relative flex items-center rounded-xl p-2.5 text-sm font-medium transition-all duration-200 ease-out", collapsed ? "justify-center" : "gap-3", isActive ? "bg-primary/10 text-primary ring-1 ring-primary/20" : "text-muted-foreground hover:bg-primary/5 hover:text-primary/70", )} > {!collapsed && {item.label}} ); })} {/* Mascot button */} mascotChat.setIsOpen(!mascotChat.isOpen)} className="relative z-50 rounded-xl p-1 transition-transform hover:scale-105 focus:outline-none focus:ring-2 focus:ring-primary/40" title="Chat dengan mascot" > mascotChat.setIsOpen(false)} onSendMessage={mascotChat.handleSendMessage} mascotName="IMPHNEN Mascot" className="fixed bottom-[170px] left-[80px] z-[9999]" /> > ); }