"use client"; import { ArchiveX, BadgeCheck, Bell, Calendar, ChevronDown, ChevronsUpDown, CreditCard, File, FileSpreadsheet, Inbox, LogOut, Mail, MoreHorizontal, Send, Settings, Sparkles, StickyNote, Trash2, Users, } from "lucide-react"; import * as React from "react"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Drawer, DrawerContent, DrawerHeader, DrawerTitle, } from "@/components/ui/drawer"; import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Label } from "@/components/ui/label"; import { ScrollArea } from "@/components/ui/scroll-area"; import { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupContent, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarProvider, useSidebar, } from "@/components/ui/sidebar"; import { Switch } from "@/components/ui/switch"; import { cn } from "@/lib/utils"; type FolderId = "inbox" | "sent" | "drafts" | "junk" | "trash"; type Folder = { id: FolderId; label: string; icon: React.ComponentType>; count?: number; }; const folders: Folder[] = [ { id: "inbox", label: "صندوق ورودی", icon: Inbox }, { id: "drafts", label: "پیش‌نویس‌ها", icon: File }, { id: "sent", label: "ارسال‌شده", icon: Send }, { id: "junk", label: "هرزنامه", icon: ArchiveX }, { id: "trash", label: "سطل زباله", icon: Trash2 }, ]; const navTitleToFolderId: Record = { "صندوق ورودی": "inbox", "پیش‌نویس‌ها": "drafts", "ارسال‌شده": "sent", "هرزنامه": "junk", "سطل زباله": "trash", }; type SidebarModule = { id: string; label: string; icon: React.ComponentType>; }; const sidebarModules: SidebarModule[] = [ { id: "emails", label: "ایمیل‌ها", icon: Mail }, { id: "calendar", label: "تقویم", icon: Calendar }, { id: "contacts", label: "مخاطبین", icon: Users }, { id: "tasks", label: "وظایف", icon: FileSpreadsheet }, { id: "notes", label: "یادداشت‌ها", icon: StickyNote }, ]; const userData = { name: "علی رضایی", email: "ali@example.com", avatar: "/block-media/shadcnblocks/block/avatar/avatar1.webp", }; function getInitials(name: string) { return ( name .split(" ") .filter(Boolean) .slice(0, 2) .map((part) => part[0]?.toUpperCase()) .join("") || "U" ); } const data = { user: { name: "shadcn", email: "m@example.com", avatar: "/avatars/shadcn.jpg", }, navMain: [ { title: "صندوق ورودی", url: "#", icon: Inbox, isActive: true, }, { title: "پیش‌نویس‌ها", url: "#", icon: File, isActive: false, }, { title: "ارسال‌شده", url: "#", icon: Send, isActive: false, }, { title: "هرزنامه", url: "#", icon: ArchiveX, isActive: false, }, { title: "سطل زباله", url: "#", icon: Trash2, isActive: false, }, ], mails: [ { id: "1", name: "مریم Mitchell", email: "sarah.mitchell@acme.io", avatar: "/block-media/shadcnblocks/block/avatar/avatar2.webp", verified: true, subject: "بررسی نقشه راه محصول Q4", date: "۰۹:۳۰", teaser: "سلام تیم، پیش‌نویس نقشه راه Q4 را آماده کردم و قبل از نهایی‌سازی هفته آینده نظر شما را می‌خواهم...", read: false, starred: true, }, { id: "2", name: "GitHub", email: "noreply@github.com", avatar: "/block-media/shadcnblocks/block/avatar/avatar2.webp", verified: true, subject: "[acme/dashboard] ادغام PR #847", date: "دیروز", teaser: "درخواست ادغام شما در main ادغام شد. خط لوله CI/CD شروع شده و استقرار روی staging در جریان است...", read: true, starred: false, }, { id: "3", name: "امیر احمدی", email: "alex.t@designstudio.co", avatar: "/block-media/shadcnblocks/block/avatar/avatar3.webp", verified: true, subject: "دارایی‌های برند جدید آماده بازبینی", date: "دیروز", teaser: "سلام! راهنمای برند و کتابخانه دارایی به‌روزرسانی شد. پالت رنگ جدید هم اضافه شده است...", read: true, starred: false, }, { id: "4", name: "Stripe", email: "notifications@stripe.com", avatar: "/block-media/shadcnblocks/block/avatar/avatar4.webp", verified: true, subject: "واریز آذر ماه آغاز شد", date: "۲ روز پیش", teaser: "مبلغ ۱۲٬۴۵۰ دلار آمریکا به حساب بانکی با پایان •••• 4521 در حال واریز است...", read: true, starred: true, }, { id: "5", name: "مهدی جعفری", email: "marcus@venturecap.fund", avatar: "/block-media/shadcnblocks/block/avatar/avatar5.webp", verified: false, subject: "پیگیری: گفتگوی Series A", date: "۳ روز پیش", teaser: "از ملاقات در TechCrunch Disrupt هفته گذشته خوشحال شدم. دوست دارم درباره رشد شما ادامه دهیم...", read: true, starred: false, }, { id: "6", name: "Linear", email: "notifications@linear.app", avatar: "/block-media/shadcnblocks/block/avatar/avatar6.webp", verified: true, subject: "خلاصه هفتگی پروژه", date: "۳ روز پیش", teaser: "خلاصه این هفته: ۲۳ مورد انجام‌شده، ۸ در جریان، ۵ مورد جدید ایجاد شده...", read: true, starred: false, }, { id: "7", name: "Emma حسینی", email: "emma.w@clientcorp.com", avatar: "/block-media/shadcnblocks/block/avatar/avatar8.webp", verified: true, subject: "تمدید قرارداد اقدام لازم", date: "۴ روز پیش", teaser: "قرارداد سالانه ماه آینده برای تمدید است. می‌خواستم درباره سطح‌های قیمت جدید صحبت کنیم...", read: false, starred: false, }, { id: "8", name: "Vercel", email: "notifications@vercel.com", avatar: "/block-media/shadcnblocks/block/avatar/avatar8.webp", verified: true, subject: "خطای build: acme-dashboard", date: "۴ روز پیش", teaser: "آخرین استقرار acme-dashboard ناموفق بود. خطا: Module not found: Can't resolve 'componen...", read: true, starred: false, }, ], }; type NavItem = (typeof data.navMain)[number]; type MailItem = (typeof data.mails)[number]; function VerifiedIcon({ className }: { className?: string }) { return ( ); } export function NavUser({ user, }: { user: { name: string; email: string; avatar: string; }; }) { const { isMobile } = useSidebar(); return ( {getInitials(user.name)}
{user.name} {user.email}
{getInitials(user.name)}
{user.name} {user.email}
ارتقا به حرفه‌ای حساب کاربری صورتحساب اعلان‌ها خروج
); } interface FolderTabsProps { className?: string; folders: Folder[]; activeFolder: FolderId; onFolderChange: (folderId: FolderId) => void; activeEmailCount: number; } function FolderTabs({ className, folders, activeFolder, onFolderChange, activeEmailCount, }: FolderTabsProps) { const mainFolders = folders.slice(0, 5); const additionalFolders = folders.slice(5); return (
{/* Desktop: All folders visible at 2xl */}
{folders.map((folder) => { const Icon = folder.icon; const isActive = activeFolder === folder.id; return ( ); })}
{/* Large: Main folders + dropdown for additional */}
{mainFolders.map((folder) => { const Icon = folder.icon; const isActive = activeFolder === folder.id; return ( ); })} {additionalFolders.map((folder) => { const Icon = folder.icon; return ( onFolderChange(folder.id)} > {folder.label} ); })}
{/* Medium: First 3 folders + dropdown */}
{mainFolders.slice(0, 3).map((folder) => { const Icon = folder.icon; const isActive = activeFolder === folder.id; return ( ); })} {[...mainFolders.slice(3), ...additionalFolders].map((folder) => { const Icon = folder.icon; return ( onFolderChange(folder.id)} > {folder.label} ); })}
{/* Small: First 2 folders + dropdown */}
{mainFolders.slice(0, 2).map((folder) => { const Icon = folder.icon; const isActive = activeFolder === folder.id; return ( ); })} {[...mainFolders.slice(2), ...additionalFolders].map((folder) => { const Icon = folder.icon; return ( onFolderChange(folder.id)} > {folder.label} ); })}
{/* Mobile: Single dropdown */}
{folders.map((folder) => { const Icon = folder.icon; const isActive = activeFolder === folder.id; return ( onFolderChange(folder.id)} > {folder.label} {isActive && ( {activeEmailCount.toLocaleString("fa-IR")} )} ); })}
); } interface AppSidebarProps extends React.ComponentProps { activeModule: string; onModuleChange: (moduleId: string) => void; } export function AppSidebar({ activeModule, onModuleChange, ...props }: AppSidebarProps) { return (
شاد‌سی‌ان بلاکس
ری یو آی سازمانی
{sidebarModules.map((moduleItem) => ( onModuleChange(moduleItem.id)} isActive={activeModule === moduleItem.id} className="px-2.5 md:px-2" > {moduleItem.label} ))} تنظیمات
); } interface MailSidebarProps { activeItem: NavItem; mails: MailItem[]; selectedEmailId: string | null; onEmailSelect: (emailId: string) => void; } function MailSidebar({ activeItem, mails, selectedEmailId, onEmailSelect, }: MailSidebarProps) { return (
{activeItem?.title}
{mails.map((mail) => { const isSelected = selectedEmailId === mail.id; return ( ); })}
); } export function ApplicationShell8() { const [activeModule, setActiveModule] = React.useState("emails"); const [activeFolder, setActiveFolder] = React.useState("inbox"); const [mails, setMails] = React.useState(data.mails); const [selectedEmailId, setSelectedEmailId] = React.useState( data.mails[0]?.id ?? null, ); const [isMobileDetailOpen, setIsMobileDetailOpen] = React.useState(false); const filteredEmails = mails; const selectedEmail = mails.find((m) => m.id === selectedEmailId) ?? null; const handleModuleChange = (moduleId: string) => { setActiveModule(moduleId); }; const handleFolderChange = (folderId: FolderId) => { setActiveFolder(folderId); const mail = [...data.mails].sort(() => Math.random() - 0.5); setMails(mail.slice(0, Math.max(5, Math.floor(Math.random() * 10) + 1))); }; const handleEmailSelect = (emailId: string) => { setSelectedEmailId(emailId); setMails((prev) => prev.map((m) => (m.id === emailId ? { ...m, read: true } : m)), ); if (window.innerWidth < 768) { setIsMobileDetailOpen(true); } }; const activeItem = data.navMain.find( (item) => navTitleToFolderId[item.title] === activeFolder, ) || data.navMain[0]; return (
شاد‌سی‌ان بلاکس
{activeModule === "emails" ? ( ) : (
{(() => { const moduleData = sidebarModules.find( (m) => m.id === activeModule, ); if (!moduleData) return null; const Icon = moduleData.icon; return ( <> {moduleData.label} ); })()}
)}

{userData.name}

{userData.email}

ارتقا به حرفه‌ای حساب کاربری صورتحساب اعلان‌ها خروج
{activeModule === "emails" && ( )}
{activeModule === "emails" ? ( Array.from({ length: 24 }).map((_, index) => (
)) ) : (
{(() => { const moduleData = sidebarModules.find( (m) => m.id === activeModule, ); if (!moduleData) return null; const Icon = moduleData.icon; return ( <>

محتوای {moduleData.label} به‌زودی

); })()}
)}
جزئیات ایمیل
{selectedEmail ? (
{getInitials(selectedEmail.name)}
{selectedEmail.name} {selectedEmail.verified && ( )}

{selectedEmail.email}

{selectedEmail.date}

{selectedEmail.subject}

{selectedEmail.teaser}

) : (
)}
); }