'use client'; import NavBar from './NavBar'; import NavSearch from './NavSearch'; import Link from 'next/link'; import Image from 'next/image'; import { useEffect, useState } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { FAST } from '@/lib/motion'; import { ChevronLeftIcon, ChevronRightIcon, Bars3Icon, UserIcon, ArrowRightStartOnRectangleIcon, ShieldCheckIcon, MoonIcon, SunIcon, LanguageIcon, PlusIcon, } from '@heroicons/react/24/outline'; import { Button } from '@/components/ui/button'; import NoteModalForm from '@/app/(authenticated)/boards/[id]/notes/components/NoteModalForm'; import UserAvatar from './UserAvatar'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetTrigger, } from '@/components/ui/sheet'; import { signout } from '@/app/(authenticated)/lib/actions'; import { cn } from '@/lib/utils'; import { changeLocale } from '@/lib/locale'; import { locales } from '@/i18n/config'; import { useLocale, useTranslations } from 'next-intl'; import { useTheme } from 'next-themes'; import { User } from '@/prisma/generated/client'; import type { AvailableUpdate } from '@/app/(authenticated)/lib/version'; import type { QuickLinks } from '@/components/NavBar'; // '@/app/(authenticated)/lib/actions'; import UpdateAvailableMenuItem, { UpdateBadge } from './UpdateAvailableMenuItem'; interface NavSidebarProps { user: User; update?: AvailableUpdate | null; quickLinks?: QuickLinks; boards?: { id: number; title: string }[]; } export default function NavSidebar({ user, update, quickLinks, boards = [], }: NavSidebarProps) { const t = useTranslations('Navigation'); const tRole = useTranslations('Roles'); const tLocale = useTranslations('LocaleSwitcher'); const tTheme = useTranslations('Theme'); const tNote = useTranslations('NotesPage'); const { theme, setTheme } = useTheme(); const locale = useLocale(); const [mounted, setMounted] = useState(false); const [isCollapsed, setIsCollapsed] = useState(false); const [isLocaleSubmitting, setIsLocaleSubmitting] = useState(false); useEffect(() => { setMounted(true); }, []); const handleLocaleChange = async (nextLocale: string) => { setIsLocaleSubmitting(true); await changeLocale(nextLocale, locale); }; useEffect(() => { const saved = localStorage.getItem('sidebar-collapsed'); if (saved !== null) { setIsCollapsed(saved === 'true'); } }, []); const toggleSidebar = () => { const newState = !isCollapsed; setIsCollapsed(newState); localStorage.setItem('sidebar-collapsed', String(newState)); }; if (!user) return null; return ( <> {/* Desktop Sidebar */}
daylog
{boards.length > 0 && (
{isCollapsed ? ( {tNote('newNote')} ) : ( {tNote('newNote')} )} } />
)}
{/* Mobile Topbar */}
daylog
daylog
{user?.name} {tRole(user.role)}
{t('profile')} {user?.role === 'admin' && ( {t('administration')} )} {update && ( <> )} {mounted && ( setTheme(theme === 'light' ? 'dark' : 'light')} className="rounded-xl flex items-center py-2.5 cursor-pointer" > {theme === 'light' ? ( ) : ( )} {tTheme('toggle')} )} {tLocale('title')} {locales.map((optionLocale) => ( {tLocale(`options.${optionLocale}`)} ))} signout()} className="rounded-xl flex items-center py-2.5 text-destructive focus:text-destructive cursor-pointer group" > {t('logout')}
); }