"use client"; import { Bell, Check, ChevronsUpDown, Hash, Headphones, Lock, Mic, MoreHorizontal, PencilLine, Pin, Plus, Settings, Trash2, Volume2, } from "lucide-react"; import * as React from "react"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { Badge } from "@/components/ui/badge"; import { Breadcrumb, BreadcrumbItem, BreadcrumbList, BreadcrumbPage, } from "@/components/ui/breadcrumb"; import { Button } from "@/components/ui/button"; import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from "@/components/ui/collapsible"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { ScrollArea } from "@/components/ui/scroll-area"; import { Separator } from "@/components/ui/separator"; import { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuButton, SidebarMenuItem, SidebarProvider, SidebarTrigger, } from "@/components/ui/sidebar"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "@/components/ui/tooltip"; import { cn } from "@/lib/utils"; // Types type TextChannel = { id: string; name: string; type: "text"; locked: boolean; unread: number; isActive?: boolean; }; type VoiceChannel = { id: string; name: string; type: "voice"; users: string[]; }; type Channel = TextChannel | VoiceChannel; type ChannelCategory = { id: string; name: string; isOpen: boolean; channels: Channel[]; }; type Member = { id: string; name: string; avatar: string; role: string; status: "online" | "idle" | "dnd" | "offline"; }; type Workspace = { id: string; name: string; logo: string; plan: string; }; type UserData = { name: string; email: string; avatar: string; }; // Data const workspaces: Workspace[] = [ { 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: "تیم کوچک", }, { id: "3", name: "میز‌های خدمت", logo: "/block-media/shadcnblocks/block/logos/ShadcnBlocks-logo.svg", plan: "آزمایشی", }, ]; const currentUser: UserData = { name: "علی رضایی", email: "ali@example.com", avatar: "/block-media/shadcnblocks/block/avatar-2.webp", }; const channelCategories: ChannelCategory[] = [ { id: "cat1", name: "اطلاعیه‌ها", isOpen: true, channels: [ { id: "1", name: "اعلان‌ها", type: "text", locked: true, unread: 0 }, { id: "2", name: "SLA و قوانین", type: "text", locked: true, unread: 0 }, { id: "3", name: "خوش‌آمدگویی", type: "text", locked: false, unread: 0 }, ], }, { id: "cat2", name: "عمومی", isOpen: true, channels: [ { id: "4", name: "عمومی", type: "text", locked: false, unread: 12, isActive: true, }, { id: "5", name: "گفت‌وگوی آزاد", type: "text", locked: false, unread: 3 }, { id: "6", name: "معرفی اعضا", type: "text", locked: false, unread: 0, }, ], }, { id: "cat3", name: "محصول", isOpen: true, channels: [ { id: "7", name: "ورود مشتری", type: "text", locked: false, unread: 5 }, { id: "8", name: "صورتحساب", type: "text", locked: false, unread: 0 }, { id: "9", name: "زیرساخت", type: "text", locked: false, unread: 1 }, { id: "10", name: "بازبینی کیفیت", type: "text", locked: false, unread: 0 }, ], }, { id: "cat4", name: "تماس‌های پشتیبانی", isOpen: true, channels: [ { id: "v1", name: "خط عمومی", type: "voice", users: ["سارا", "میکاییل", "آرش"], }, { id: "v2", name: "اتاق هماهنگی", type: "voice", users: [] }, { id: "v3", name: "همکاری دونفره", type: "voice", users: ["نیلوفر"] }, ], }, ]; const members: Member[] = [ { id: "1", name: "سارا احمدی", avatar: "/block-media/shadcnblocks/block/avatar-1.webp", role: "مدیر", status: "online", }, { id: "2", name: "میکاییل رضایی", avatar: "/block-media/shadcnblocks/block/avatar-3.webp", role: "ناظر", status: "online", }, { id: "3", name: "نیلوفر حسینی", avatar: "/block-media/shadcnblocks/block/avatar-3.webp", role: "عضو", status: "idle", }, { id: "4", name: "آرش کیانی", avatar: "/block-media/shadcnblocks/block/avatar-5.webp", role: "عضو", status: "dnd", }, { id: "5", name: "کاوه ویلسون", avatar: "/block-media/shadcnblocks/block/avatar-4.webp", role: "عضو", status: "offline", }, { id: "6", name: "جواد لطفی", avatar: "/block-media/shadcnblocks/block/avatar-2.webp", role: "عضو", status: "offline", }, ]; // Helper const getInitials = (name: string) => name .split(" ") .map((n) => n[0]) .join(""); const statusColors: Record = { online: "bg-green-500", idle: "bg-yellow-500", dnd: "bg-red-500", offline: "bg-gray-400", }; // Components const WorkspaceSwitcher = () => { const [selected, setSelected] = React.useState(workspaces[0]); 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 ChannelItem = ({ channel }: { channel: Channel }) => { const isText = channel.type === "text"; const isVoice = channel.type === "voice"; return ( {isVoice ? ( ) : channel.locked ? ( ) : ( )} 0 && "font-semibold text-foreground", )} > {channel.name} {isText && channel.unread > 0 && ( {channel.unread} )} {isVoice && channel.users.length > 0 && ( {channel.users.length} )} بی‌صدا کردن کانال سنجاق کانال ویرایش کانال حذف کانال {isVoice && channel.users.length > 0 && (
{channel.users.map((userName) => (
{userName}
))}
)} ); }; const ChannelCategoryGroup = ({ category }: { category: ChannelCategory }) => { const [isOpen, setIsOpen] = React.useState(category.isOpen); return ( {category.name} {category.channels.map((channel) => ( ))} ); }; const MemberItem = ({ member, showStatus = true, }: { member: Member; showStatus?: boolean; }) => ( ); const MembersList = () => { const online = members.filter((m) => m.status !== "offline"); const offline = members.filter((m) => m.status === "offline"); return (

آنلاین {online.length}

{online.map((member) => ( ))}

آفلاین {offline.length}

{offline.map((member) => ( ))}
); }; const NavUser = ({ user }: { user: UserData }) => (
{getInitials(user.name)}

{user.name}

آنلاین

{[ { icon: Mic, label: "بی‌صدا" }, { icon: Headphones, label: "قطع صدا" }, { icon: Settings, label: "تنظیمات" }, ].map(({ icon: Icon, label }) => ( {label} ))}
); const SidebarLeft = (props: React.ComponentProps) => ( {channelCategories.map((category) => ( ))} ); const SidebarRight = (props: React.ComponentProps) => (
اعضا
); interface Sidebar19Props { className?: string; } const Sidebar19 = ({ className }: Sidebar19Props) => (
عمومی
); export { Sidebar19 };