feat: implement client-side state management hooks

- Created useSearch hook for search state and debouncing
- Created useFilters hook for filter state management
- Created useOptimisticUpdate hook for optimistic UI updates
- Created useScrollPosition hook for scroll preservation
- Updated SearchBar, GlobalSearch, and ListDetailView to use new hooks
- Added comprehensive documentation for all hooks

Validates: Requirements 6.4, 7.3, 7.4, 8.3
Task: 9. Implement client-side state management
This commit is contained in:
2025-12-01 20:11:41 +00:00
parent 0143097e69
commit e2e3581d06
10 changed files with 821 additions and 52 deletions

View File

@@ -4,6 +4,7 @@ import { useState, useCallback } from 'react'
import SearchBar from './SearchBar'
import SearchResults from './SearchResults'
import { searchItems } from '@/lib/actions'
import { useSearch } from '@/hooks'
interface ItemWithList {
id: string
@@ -22,13 +23,10 @@ interface ItemWithList {
}
export default function GlobalSearch() {
const [searchQuery, setSearchQuery] = useState('')
const [searchResults, setSearchResults] = useState<ItemWithList[]>([])
const [isSearching, setIsSearching] = useState(false)
const handleSearch = useCallback(async (query: string) => {
setSearchQuery(query)
if (!query.trim()) {
setSearchResults([])
setIsSearching(false)
@@ -47,10 +45,14 @@ export default function GlobalSearch() {
}
}, [])
const { debouncedQuery, clearSearch } = useSearch({
onSearch: handleSearch
})
const handleClose = useCallback(() => {
setSearchQuery('')
clearSearch()
setSearchResults([])
}, [])
}, [clearSearch])
return (
<div className="space-y-4">
@@ -59,10 +61,10 @@ export default function GlobalSearch() {
placeholder="Search all tasks..."
/>
{searchQuery.trim() && (
{debouncedQuery.trim() && (
<SearchResults
results={searchResults}
query={searchQuery}
query={debouncedQuery}
onClose={handleClose}
/>
)}