import { createFileRoute } from "@tanstack/react-router" import { useCallback, useState } from "react" import { useTranslation } from "react-i18next" import { Bookmark, Search as SearchIcon, Film, Users } from "lucide-react" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { MovieCard } from "@/components/movie-card" import { PersonRow } from "@/components/person-row" import { EmptyState } from "@/components/empty-state" import { InfiniteScroll } from "@/components/infinite-scroll" import { Skeleton } from "@/components/ui/skeleton" import { useInfiniteSearch } from "@/features/search" import { useDebounce } from "@/hooks/use-debounce" import { useDocumentTitle } from "@/hooks/use-document-title" import { useAddToWatchlist } from "@/features/watchlist" import { toast } from "sonner" export const Route = createFileRoute("/_app/search")({ component: SearchPage, }) function SearchPage() { const { t } = useTranslation() useDocumentTitle(t("search.placeholder")) const addToWatchlist = useAddToWatchlist() const [query, setQuery] = useState("") const debouncedQuery = useDebounce(query, 300) const { data, isPending, hasNextPage, isFetchingNextPage, fetchNextPage, } = useInfiniteSearch({ q: debouncedQuery || undefined }) const hasQuery = debouncedQuery.length > 0 const movies = data?.pages.flatMap((p) => p.movies.items) ?? [] const people = data?.pages[0]?.people.items ?? [] const loadMore = useCallback(() => fetchNextPage(), [fetchNextPage]) return (
setQuery(e.target.value)} placeholder={t("search.placeholder")} className="pl-9" autoFocus />
{!hasQuery && } {hasQuery && isPending && } {hasQuery && data && (
{people.length > 0 && (

{t("search.people")}

{people.map((person) => ( ))}
)} {movies.length > 0 && (

{t("search.movies")}

{movies.map((hit) => ( { addToWatchlist.mutate( { movie_id: hit.movie_id }, { onSuccess: () => toast.success(t("feed.addedToWatchlist")) }, ) }} > } /> ))}
)} {movies.length === 0 && people.length === 0 && ( )}
)}
) } function SearchSkeleton() { return (
{[1, 2, 3, 4].map((i) => (
))}
) }