'use client' import { useState, useEffect } from 'react' import { Input } from '@/components/ui/input' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetTrigger, } from '@/components/ui/sheet' import { Menu, Search, StickyNote, Tag, Moon, Sun, X, Bell, Trash2, Archive } from 'lucide-react' import Link from 'next/link' import { usePathname, useRouter, useSearchParams } from 'next/navigation' import { cn } from '@/lib/utils' import { useLabels } from '@/context/LabelContext' import { LabelManagementDialog } from './label-management-dialog' import { LabelFilter } from './label-filter' interface HeaderProps { selectedLabels?: string[] selectedColor?: string | null onLabelFilterChange?: (labels: string[]) => void onColorFilterChange?: (color: string | null) => void } export function Header({ selectedLabels = [], selectedColor = null, onLabelFilterChange, onColorFilterChange }: HeaderProps = {}) { const [searchQuery, setSearchQuery] = useState('') const [theme, setTheme] = useState<'light' | 'dark'>('light') const [isSidebarOpen, setIsSidebarOpen] = useState(false) const pathname = usePathname() const router = useRouter() const searchParams = useSearchParams() const { labels } = useLabels() const currentLabels = searchParams.get('labels')?.split(',').filter(Boolean) || [] const currentSearch = searchParams.get('search') || '' const currentColor = searchParams.get('color') || '' useEffect(() => { setSearchQuery(currentSearch) }, [currentSearch]) useEffect(() => { const savedTheme = localStorage.getItem('theme') || 'light' applyTheme(savedTheme) }, []) const applyTheme = (newTheme: string) => { setTheme(newTheme as any) localStorage.setItem('theme', newTheme) // Remove all theme classes first document.documentElement.classList.remove('dark') document.documentElement.removeAttribute('data-theme') if (newTheme === 'dark') { document.documentElement.classList.add('dark') } else if (newTheme !== 'light') { document.documentElement.setAttribute('data-theme', newTheme) if (newTheme === 'midnight') { document.documentElement.classList.add('dark') } } } const handleSearch = (query: string) => { setSearchQuery(query) const params = new URLSearchParams(searchParams.toString()) if (query.trim()) { params.set('search', query) } else { params.delete('search') } router.push(`/?${params.toString()}`) } const removeLabelFilter = (labelToRemove: string) => { const newLabels = currentLabels.filter(l => l !== labelToRemove) const params = new URLSearchParams(searchParams.toString()) if (newLabels.length > 0) { params.set('labels', newLabels.join(',')) } else { params.delete('labels') } router.push(`/?${params.toString()}`) } const removeColorFilter = () => { const params = new URLSearchParams(searchParams.toString()) params.delete('color') router.push(`/?${params.toString()}`) } const clearAllFilters = () => { setSearchQuery('') router.push('/') } const handleFilterChange = (newLabels: string[]) => { const params = new URLSearchParams(searchParams.toString()) if (newLabels.length > 0) { params.set('labels', newLabels.join(',')) } else { params.delete('labels') } router.push(`/?${params.toString()}`) } const handleColorChange = (newColor: string | null) => { const params = new URLSearchParams(searchParams.toString()) if (newColor) { params.set('color', newColor) } else { params.delete('color') } router.push(`/?${params.toString()}`) } const NavItem = ({ href, icon: Icon, label, active }: any) => ( setIsSidebarOpen(false)} className={cn( "flex items-center gap-3 px-4 py-3 rounded-r-full text-sm font-medium transition-colors mr-2", active ? "bg-amber-100 text-amber-900 dark:bg-amber-900/30 dark:text-amber-100" : "hover:bg-gray-100 dark:hover:bg-zinc-800 text-gray-700 dark:text-gray-300" )} > {label} ) const hasActiveFilters = currentLabels.length > 0 || !!currentSearch || !!currentColor return ( <>
Memento
Labels
{labels.map(label => ( ))}
Memento
handleSearch(e.target.value)} /> {searchQuery && ( )}
applyTheme('light')}>Light applyTheme('dark')}>Dark applyTheme('midnight')}>Midnight applyTheme('sepia')}>Sepia
{hasActiveFilters && (
{currentSearch && ( Search: {currentSearch} )} {currentColor && (
Color: {currentColor} )} {currentLabels.map(label => ( {label} ))}
)}
) }