From 66f8fcade7074800916deef64535e652af51513f Mon Sep 17 00:00:00 2001 From: Paul Bailey Date: Wed, 3 Dec 2025 20:31:39 +0000 Subject: [PATCH] Remove search and filter functionality from list detail view to fix hydration errors --- components/ListDetailView.tsx | 118 +++------------------------------- components/SearchBar.tsx | 21 ++++-- 2 files changed, 23 insertions(+), 116 deletions(-) diff --git a/components/ListDetailView.tsx b/components/ListDetailView.tsx index 1ac7b4c..9ffd74a 100644 --- a/components/ListDetailView.tsx +++ b/components/ListDetailView.tsx @@ -1,16 +1,12 @@ 'use client' -import { useState, useCallback, useMemo, useEffect } from 'react' +import { useState, useMemo } from 'react' import { Share2 } from 'lucide-react' import ItemCard from './ItemCard' -import SearchBar from './SearchBar' -import FilterPanel from './FilterPanel' -import SearchResults from './SearchResults' import EmptyState from './EmptyState' import ShareListModal from './ShareListModal' import PermissionBadge from './PermissionBadge' -import { searchItems, getItemsByFilter } from '@/lib/actions' -import { useSearch, useFilters, useScrollPosition } from '@/hooks' +import { useScrollPosition } from '@/hooks' import { useRealtimeSync } from '@/hooks/useRealtimeSync' interface Item { @@ -66,9 +62,6 @@ export default function ListDetailView({ ownerEmail = '', collaborators = [] }: ListDetailViewProps) { - const [searchResults, setSearchResults] = useState([]) - const [isSearching, setIsSearching] = useState(false) - const [filteredItems, setFilteredItems] = useState(initialItems) const [isShareModalOpen, setIsShareModalOpen] = useState(false) // Use scroll position preservation hook @@ -81,78 +74,9 @@ export default function ListDetailView({ pollInterval: 1000, // Poll every 1 second for faster updates }) - // Extract all unique tags from items - const availableTags = useMemo(() => { - const tagSet = new Set() - initialItems.forEach(item => { - const tags = Array.isArray(item.tags) ? item.tags : [] - tags.forEach(tag => { - if (typeof tag === 'string') { - tagSet.add(tag) - } - }) - }) - return Array.from(tagSet).sort() - }, [initialItems]) - - // Use search hook - const handleSearchCallback = useCallback(async (query: string) => { - if (!query.trim()) { - setSearchResults([]) - setIsSearching(false) - return - } - - setIsSearching(true) - try { - const results = await searchItems(query, listId) - setSearchResults(results as ItemWithList[]) - } catch (error) { - console.error('Search error:', error) - setSearchResults([]) - } finally { - setIsSearching(false) - } - }, [listId]) - - const { debouncedQuery } = useSearch({ - onSearch: handleSearchCallback - }) - - // Use filters hook - const handleFiltersCallback = useCallback(async (newFilters: any) => { - try { - const results = await getItemsByFilter(listId, { - priority: newFilters.priority, - completed: newFilters.completed, - tags: newFilters.tags, - dueDateRange: newFilters.dueDateRange, - sortBy: newFilters.sortBy, - sortOrder: newFilters.sortOrder - }) - // Extract items from pagination result - const items = 'items' in results ? results.items : results - setFilteredItems(items as Item[]) - } catch (error) { - console.error('Filter error:', error) - setFilteredItems(initialItems) - } - }, [listId, initialItems]) - - const { filters, setFilters } = useFilters({ - onFiltersChange: handleFiltersCallback - }) - - // Update filtered items when initialItems changes (after refresh) - // Re-apply filters to the new data - useEffect(() => { - handleFiltersCallback(filters) - }, [initialItems, handleFiltersCallback, filters]) - // Determine which items to display - const displayItems = debouncedQuery.trim() ? searchResults : filteredItems - const completedItems = displayItems.filter(item => item.completed) - const incompleteItems = displayItems.filter(item => !item.completed) + const completedItems = useMemo(() => initialItems.filter(item => item.completed), [initialItems]) + const incompleteItems = useMemo(() => initialItems.filter(item => !item.completed), [initialItems]) return (
@@ -176,27 +100,8 @@ export default function ListDetailView({
)} - {/* Search Bar */} - - - {/* Filter Panel */} - - - {/* Results */} - {debouncedQuery.trim() ? ( - - ) : ( -
+ {/* Items */} +
{/* Incomplete Items */} {incompleteItems.length > 0 && (
@@ -226,19 +131,14 @@ export default function ListDetailView({ )} {/* Empty State */} - {displayItems.length === 0 && ( + {initialItems.length === 0 && ( 0 ? 'filter' : 'inbox'} + icon="inbox" title="No tasks found" - description={ - filters.priority || filters.completed !== null || filters.tags.length > 0 - ? 'Try adjusting your filters to see more tasks' - : 'Add your first task using the button above' - } + description="Add your first task using the button above" /> )}
- )} {/* Share Modal */} { + setMounted(true) + }, []) + return (
- + {mounted && ( + + )} - {query && ( + {mounted && query && ( )} - {isDebouncing && ( + {mounted && isDebouncing && (