"use client"; import { useRouter, useSearchParams } from "next/navigation"; import { useTransition } from "react"; import Link from "next/link"; import { cn } from "@/lib/utils"; import type { FilterCriteria, FilterTabKey } from "@/lib/filters"; import { writeFilterCriteria, anyActive, EMPTY_STATUS } from "@/lib/filters"; import { MultiFilterPopover, type FilterOption } from "./MultiFilterPopover"; import { MergedFilterPopover } from "./MergedFilterPopover"; import { MarkActionPopover } from "./MarkActionPopover"; import { ActiveCriteriaStrip } from "./ActiveCriteriaStrip"; import { GridSearchInput } from "./GridSearchInput"; import { SortMenu } from "./SortMenu"; import { ViewToggle, type LibraryView } from "./ViewToggle"; import { InfiniteScrollToggle } from "./InfiniteScrollToggle"; import type { SortKey } from "@/lib/sort"; export function FilterBarClient({ criteria, options, isHome, showSort, sort, view, }: { criteria: FilterCriteria; options: Record; isHome: boolean; showSort: boolean; sort?: SortKey; view?: LibraryView; }) { const router = useRouter(); const params = useSearchParams(); const [, start] = useTransition(); function pushCriteria(next: FilterCriteria) { const sp = new URLSearchParams(params.toString()); writeFilterCriteria(sp, next); const y = typeof window !== "undefined" ? window.scrollY : 0; start(() => { router.push(`?${sp.toString()}`, { scroll: false }); // Defensive: restore scroll on the next two frames in case Next still resets. requestAnimationFrame(() => window.scrollTo({ top: y, left: 0, behavior: "instant" as ScrollBehavior })); requestAnimationFrame(() => window.scrollTo({ top: y, left: 0, behavior: "instant" as ScrollBehavior })); }); } const active = anyActive(criteria); return ( <>
{isHome ? ( ) : ( ALL )}
{showSort && sort && } {isHome && } {view && }
); }