"use client"; import { signOut } from "@/app/login/actions"; import { ColorModeSync } from "@/components/theme/color-mode-sync"; import type { ColorMode } from "@/lib/color-mode"; import { Button, Card, CardContent, Typography, } from "poyraz-ui/atoms"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, toast, } from "poyraz-ui/molecules"; import { SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupLabel, SidebarHeader, SidebarMenu, SidebarMenuItem, SidebarPanel, SidebarProvider, SidebarTrigger, SidebarUserProfile, useSidebar, } from "poyraz-ui/organisms"; import { ChevronUp, LogOut, Settings } from "lucide-react"; import type { LucideIcon } from "lucide-react"; import Image from "next/image"; import Link from "next/link"; import { usePathname, useRouter } from "next/navigation"; import { useTransition } from "react"; export type AppShellNavItem = { title: string; href?: string; icon?: LucideIcon; }; export type AppShellNavGroup = { title: string; items: AppShellNavItem[]; }; export type AppShellBranding = { applicationName: string; organizationName: string | null; lightLogoUrl: string | null; darkLogoUrl: string | null; }; type ShellUser = { email: string; displayName: string; shortName: string; avatarUrl: string | null; }; type AppShellProps = { branding: AppShellBranding; children: React.ReactNode; homeHref: string; navGroups: AppShellNavGroup[]; settingsHref: string; user: ShellUser; progress?: number; colorMode?: ColorMode; }; export function AppShell({ branding, children, homeHref, navGroups, settingsHref, user, progress, colorMode, }: AppShellProps) { const pathname = usePathname(); const sidebarProps = { branding, homeHref, navGroups, pathname, progress, settingsHref, user }; return ( {colorMode ? : null}
Ana içeriğe geç
{children}
); } type SidebarCompositionProps = { branding: AppShellBranding; homeHref: string; navGroups: AppShellNavGroup[]; pathname: string; progress?: number; settingsHref: string; user: ShellUser; }; function DesktopSidebar(props: SidebarCompositionProps) { return ( ); } function MobileSidebar(props: SidebarCompositionProps) { return (
Menü
); } function SidebarComposition({ branding, homeHref, navGroups, pathname, progress, settingsHref, user, }: SidebarCompositionProps) { return ( <> {typeof progress === "number" ? : null} ); } function SidebarNavigation({ homeHref, navGroups, pathname, }: Pick) { const { setMobileOpen, variant } = useSidebar(); return navGroups.map((group) => ( {group.title} {group.items.map((item) => { const active = item.href === homeHref ? pathname === homeHref : item.href ? pathname === item.href || pathname.startsWith(`${item.href}/`) : false; const Icon = item.icon; return ( ); })} )); } function WorkspaceLogo({ branding, compact = false, }: { branding: AppShellBranding; compact?: boolean; }) { const lightLogoUrl = branding.lightLogoUrl ?? branding.darkLogoUrl ?? "/logo/blackLogoLong.png"; const darkLogoUrl = branding.darkLogoUrl ?? branding.lightLogoUrl ?? "/logo/lightLogoLong.png"; const imageClassName = compact ? "max-h-8 w-auto max-w-full object-contain" : "max-h-12 w-auto max-w-full object-contain"; return ( {`${branding.applicationName} {`${branding.applicationName} ); } function ProgressSummary({ progress }: { progress: number }) { const normalizedProgress = Math.max(0, Math.min(100, progress)); return ( Proje ilerlemesi
%{normalizedProgress} tamamlandı
); } function AccountMenu({ user, settingsHref }: { user: ShellUser; settingsHref: string }) { const router = useRouter(); const [isSigningOut, startSignOutTransition] = useTransition(); function handleSignOut() { startSignOutTransition(async () => { try { const result = await signOut(); router.replace(result.redirectTo); router.refresh(); } catch { toast.error("Çıkış yapılamadı. Lütfen tekrar deneyin."); } }); } return ( {user.displayName} {user.email} ); }