From fcadd2d8b5e3383f2cf36c708a1555937694d7ef Mon Sep 17 00:00:00 2001 From: vidane Date: Sat, 2 May 2026 18:03:47 -0400 Subject: [PATCH] Add src/components/Header.tsx --- src/components/Header.tsx | 111 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 src/components/Header.tsx diff --git a/src/components/Header.tsx b/src/components/Header.tsx new file mode 100644 index 0000000..261cfeb --- /dev/null +++ b/src/components/Header.tsx @@ -0,0 +1,111 @@ +'use client'; + +import { useApp } from './AppProvider'; +import { useState, useEffect, useRef } from 'react'; + +export default function Header() { + const { + view, selectedProject, projects, searchQuery, setSearchQuery, + showNewTaskModal, setShowNewTaskModal, + filterStatus, setFilterStatus, filterPriority, setFilterPriority, + filterDueBefore, setFilterDueBefore, filterDueAfter, setFilterDueAfter, + filterCompleted, setFilterCompleted, + refreshTasks, + } = useApp(); + + const [showFilters, setShowFilters] = useState(false); + const searchRef = useRef(null); + + useEffect(() => { + const handler = (e: KeyboardEvent) => { + if ((e.metaKey || e.ctrlKey) && e.key === 'k') { + e.preventDefault(); + searchRef.current?.focus(); + } + if (e.key === 'n' && (e.metaKey || e.ctrlKey)) { + e.preventDefault(); + setShowNewTaskModal(true); + } + }; + window.addEventListener('keydown', handler); + return () => window.removeEventListener('keydown', handler); + }, [setShowNewTaskModal]); + + const selectedProjectName = projects.find(p => p.id === selectedProject)?.name || 'All Projects'; + + const handleSearch = (e: React.FormEvent) => { + e.preventDefault(); + refreshTasks(); + }; + + const handleClearFilters = () => { + setFilterStatus(''); + setFilterPriority(''); + setFilterDueBefore(''); + setFilterDueAfter(''); + setFilterCompleted(''); + setSearchQuery(''); + refreshTasks(); + }; + + const hasActiveFilters = filterStatus || filterPriority || filterDueBefore || filterDueAfter || filterCompleted || searchQuery; + + return ( +
+ {/* Search */} +
+
+ 🔍 + setSearchQuery(e.target.value)} + placeholder="Search tasks... (⌘K)" + className="w-full bg-content border border-border rounded-lg pl-9 pr-4 py-2 text-sm focus:outline-none focus:border-accent focus:ring-1 focus:ring-accent/20 transition-colors" + /> +
+
+ + {/* Project name */} +
+ 📋 + {selectedProjectName} +
+ + {/* Filter toggle */} + + + {/* Clear filters */} + {hasActiveFilters && ( + + )} + + {/* New task button (mobile) */} + +
+ ); +}