"use client"; import { signOut } from "@/app/login/actions"; import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { cn } from "@/lib/utils"; import { AnimatePresence, motion } from "framer-motion"; import { BookOpenText, CheckSquare2, ChevronRight, LogOut, Menu, MessageCircleHeart, PanelLeftClose, Settings2, Sparkles, } from "lucide-react"; import Image from "next/image"; import Link from "next/link"; import { usePathname } from "next/navigation"; import { useMemo, useState } from "react"; type DashboardShellProps = { children: React.ReactNode; user: { email: string; displayName: string; shortName: string; avatarUrl: string | null; }; }; type RouteMeta = { eyebrow: string; title: string; description: string; }; const routes = [ { label: "Dashboard", href: "/", icon: Sparkles, description: "Günün ritmi ve genel görünüm", }, { label: "Günlük", href: "/journal", icon: BookOpenText, description: "Düşünceler, duygu ve enerji kayıtları", }, { label: "Görevler", href: "/tasks", icon: CheckSquare2, description: "Planlar, öncelikler ve aksiyonlar", }, { label: "Sohbet", href: "/chat", icon: MessageCircleHeart, description: "AI ile bağlamsal yansıma alanı", }, { label: "Ayarlar", href: "/settings", icon: Settings2, description: "Profil, güvenlik ve AI tercihleri", }, ] as const; const routeMeta: Record = { "/": { eyebrow: "MindSpace Workspace", title: "Günün Nabzı", description: "Verilerini, odağını ve kişisel akışını tek panelden yönet.", }, "/journal": { eyebrow: "Journal", title: "Düşünce Akışı", description: "Bugünün zihinsel yükünü yaz, duygu ve enerji izlerini kaydet.", }, "/tasks": { eyebrow: "Tasks", title: "Aksiyon Katmanı", description: "Önceliklerini sadeleştir, küçük ama net adımlar belirle.", }, "/chat": { eyebrow: "Reflective AI", title: "Yansıtıcı Sohbet", description: "Geçmiş kayıtlarınla bağ kuran özel AI eşlikçin burada.", }, "/settings": { eyebrow: "Preferences", title: "Hesap ve Kontroller", description: "Profilini, güvenliği ve AI ayarlarını tek yerden yönet.", }, }; export function DashboardShell({ children, user }: DashboardShellProps) { const pathname = usePathname(); const [isMobileSidebarOpen, setIsMobileSidebarOpen] = useState(false); const closeMobileSidebar = () => setIsMobileSidebarOpen(false); const currentMeta = useMemo(() => { if (pathname === "/") return routeMeta["/"]; if (pathname?.startsWith("/journal")) return routeMeta["/journal"]; if (pathname?.startsWith("/tasks")) return routeMeta["/tasks"]; if (pathname?.startsWith("/chat")) return routeMeta["/chat"]; if (pathname?.startsWith("/settings")) return routeMeta["/settings"]; return routeMeta["/"]; }, [pathname]); const todayLabel = useMemo( () => new Intl.DateTimeFormat("tr-TR", { weekday: "long", day: "numeric", month: "long", }).format(new Date()), [], ); return (
{isMobileSidebarOpen ? (
); } function SidebarPanel({ pathname, user, desktop = false, onNavigate, }: { pathname: string; user: DashboardShellProps["user"]; desktop?: boolean; onNavigate?: () => void; }) { return ( ); } function TopBar({ user, currentMeta, todayLabel, onOpenSidebar, }: { user: DashboardShellProps["user"]; currentMeta: RouteMeta; todayLabel: string; onOpenSidebar: () => void; }) { return (
{currentMeta.eyebrow}

{currentMeta.title}

{todayLabel}

{currentMeta.description}

Protected session
); } function UserMenu({ user, compact = false, }: { user: DashboardShellProps["user"]; compact?: boolean; }) { return (
{user.displayName}
{user.email}
Ayarlar Günlük Alanı
Bu menü profil ve hızlı erişim içindir. Ana çıkış aksiyonu soldaki panelin altındadır.
); } function Avatar({ user, size = "md", }: { user: DashboardShellProps["user"]; size?: "sm" | "md"; }) { const dimensions = size === "sm" ? "h-11 w-11 text-sm" : "h-12 w-12 text-sm"; if (user.avatarUrl) { return (
{/* Avatar URL dış kaynaklı olduğu için bu önizlemede native img kullanıyoruz. */} {/* eslint-disable-next-line @next/next/no-img-element */} {user.displayName}
); } return (
{user.shortName}
); } function AmbientBackdrop() { return ( <>
); }