"use client"; import { useMemo, useState } from "react"; import { FILTERS } from "@/lib/ui-config"; import type { AppState, Dispatch } from "@/lib/app-state"; import { Header, IconBtn, OfflineBanner, EmptyState } from "@/components/ui-primitives"; import { PlaceCard } from "@/components/place-card"; import { Icons } from "@/components/icons"; export function PlacesListScreen({ state, dispatch, }: { state: AppState; dispatch: Dispatch; }) { const { filter, search, places, offline } = state; const [searchOpen, setSearchOpen] = useState(false); const filtered = useMemo(() => { let out = places; if (filter !== "all") { if (filter === "visited") out = out.filter((p) => p.visited); else if (filter === "unvisited") out = out.filter((p) => !p.visited); else out = out.filter((p) => p.category === filter); } if (search.trim()) { const s = search.toLowerCase(); out = out.filter( (p) => p.name.toLowerCase().includes(s) || p.address.toLowerCase().includes(s) || p.tags.some((t) => t.toLowerCase().includes(s)), ); } return out; }, [filter, search, places]); return (
p.visited).length} đã đến`} right={ setSearchOpen((v) => !v)} variant="muted" /> } /> {offline && } {searchOpen && (
dispatch({ type: "SET_SEARCH", value: e.target.value }) } /> {search && ( )}
)}
{FILTERS.map((f) => ( ))}
{filtered.length === 0 ? ( ) : (
{filtered.map((p, i) => (
dispatch({ type: "NAV", screen: "place", placeId: p.id }) } />
))}
)}
); }