"use client"; import { Check, ChevronsUpDown, Hash, Headphones, LogOut, Mic, Plus, Settings, User, Users, Volume2, } from "lucide-react"; import * as React from "react"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, } from "@/components/ui/breadcrumb"; import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Separator } from "@/components/ui/separator"; import { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInset, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarProvider, SidebarTrigger, } from "@/components/ui/sidebar"; import { cn } from "@/lib/utils"; // Nav group with optional collapsible state type NavGroup = { title: string; items: Array<{ label: string; icon: React.ComponentType>; href: string; isActive?: boolean; children?: Array<{ label: string; icon: React.ComponentType>; href: string; isActive?: boolean; }>; }>; defaultOpen?: boolean; }; // User data for footer (Sidebar6+) type UserData = { name: string; email: string; avatar: string; }; // Workspace data for switcher (Sidebar7+) type Workspace = { id: string; name: string; logo: string; plan: string; }; // Complete sidebar data structure type SidebarData = { // Logo/branding (all sidebars) logo: { src: string; alt: string; title: string; description: string; }; // Main navigation groups (all sidebars) navGroups: NavGroup[]; // Footer navigation group (all sidebars) footerGroup: NavGroup; // User data for user footer (Sidebar6+) user?: UserData; // Workspaces for switcher (Sidebar7+) workspaces?: Workspace[]; // Currently active workspace (Sidebar7+) activeWorkspace?: string; }; // Shared sidebar data - works with all sidebar variations const sidebarData: SidebarData = { logo: { src: "/block-media/shadcnblocks/block/logos/ShadcnBlocks-logo.svg", alt: "هم‌آهنگ", title: "هم‌آهنگ", description: "همکاری تیم فروش", }, navGroups: [], footerGroup: { title: "پشتیبانی", items: [], }, user: { name: "علی رضایی", email: "ali@example.com", avatar: "/block-media/shadcnblocks/block/avatar-8.webp", }, workspaces: [ { id: "1", name: "ShadcnBlocks", logo: "/block-media/shadcnblocks/block/logos/ShadcnBlocks-logo.svg", plan: "سازمانی", }, { id: "2", name: "قالب‌های تیم", logo: "/block-media/shadcnblocks/block/logos/ShadcnBlocks-logo.svg", plan: "تیم SMB", }, { id: "3", name: "فضاهای فروش", logo: "/block-media/shadcnblocks/block/logos/ShadcnBlocks-logo.svg", plan: "آزمایشی", }, ], activeWorkspace: "1", }; // Helper to get active workspace const getActiveWorkspace = (data: SidebarData): Workspace | undefined => { return data.workspaces?.find((w) => w.id === data.activeWorkspace); }; // Channel-style navigation data const channels = [ { id: "1", name: "عمومی", type: "text", unread: 3 }, { id: "2", name: "اعلان‌ها", type: "text", unread: 0 }, { id: "3", name: "گفت‌وگوی آزاد", type: "text", unread: 12 }, { id: "4", name: "راهنما", type: "text", unread: 0 }, { id: "5", name: "بازخورد مشتری", type: "text", unread: 1 }, ]; const voiceChannels = [ { id: "v1", name: "تماس تیم", type: "voice", users: 3 }, { id: "v2", name: "اتاق دمو", type: "voice", users: 0 }, { id: "v3", name: "تمرکز", type: "voice", users: 1 }, ]; const directMessages = [ { id: "dm1", name: "سارا احمدی", avatar: "/block-media/shadcnblocks/block/avatar-3.webp", status: "online", unread: 2, }, { id: "dm2", name: "میکاییل رضایی", avatar: "/block-media/shadcnblocks/block/avatar-3.webp", status: "idle", unread: 0, }, { id: "dm3", name: "نیلوفر حسینی", avatar: "/block-media/shadcnblocks/block/avatar-7.webp", status: "offline", unread: 0, }, { id: "dm4", name: "آرش کیانی", avatar: "/block-media/shadcnblocks/block/avatar-5.webp", status: "online", unread: 5, }, ]; const WorkspaceSwitcher = ({ workspaces, activeWorkspace, }: { workspaces: Workspace[]; activeWorkspace: Workspace; }) => { const [selected, setSelected] = React.useState(activeWorkspace); return (
{selected.name}
{selected.name} {selected.plan}
فضاهای کاری {workspaces.map((workspace) => ( setSelected(workspace)} className="gap-2 p-2" >
{workspace.name}
{workspace.name} {workspace.id === selected.id && ( )}
))}
); }; const NavUser = ({ user }: { user: UserData }) => { return (
{user.name .split(" ") .map((n) => n[0]) .join("")}

{user.name}

آنلاین

حساب کاربری تنظیمات خروج
); }; const AppSidebar = ({ ...props }: React.ComponentProps) => { const activeWorkspace = getActiveWorkspace(sidebarData); return ( {/* Top Section - Workspace */} {sidebarData.workspaces && activeWorkspace && ( )} {/* Middle Section - Scrollable channels */} {/* Text Channels */} کانال‌های تیم {channels.map((channel) => ( {channel.name} {channel.unread > 0 && ( {channel.unread} )} ))} {/* Voice Channels */} تماس‌های صوتی {voiceChannels.map((channel) => ( {channel.name} {channel.users > 0 && ( {channel.users} )} ))} {/* Direct Messages */} پیام مستقیم {directMessages.map((dm) => (
{dm.name .split(" ") .map((n) => n[0]) .join("")}
{dm.name} {dm.unread > 0 && ( {dm.unread} )}
))}
{/* Bottom Section - User controls (always visible) */} {sidebarData.user && }
); }; interface Sidebar18Props { className?: string; } const Sidebar18 = ({ className }: Sidebar18Props) => { return (
نمای کلی داشبورد
); }; export { Sidebar18 };