Revert "Persist dashboard periods and explore genre filters in URL via nuqs"

This reverts commit 2bb5af042b.
This commit is contained in:
2026-03-08 15:14:03 -04:00
parent 2bb5af042b
commit 5fdc7ebd97
12 changed files with 70 additions and 213 deletions
@@ -1,7 +1,5 @@
"use client";
import Link from "next/link";
import { useQueryStates } from "nuqs";
import { useState, useTransition } from "react";
import { TitleCardSkeleton } from "@/components/skeletons";
import { TitleCard } from "@/components/title-card";
@@ -12,7 +10,6 @@ import {
fetchEpisodeProgress,
fetchUserStatuses,
} from "@/lib/actions/watchlist";
import { exploreSearchParams, serializeExploreParams } from "../search-params";
interface Genre {
id: number;
@@ -35,7 +32,6 @@ interface FilterableTitleRowProps {
icon: React.ReactNode;
mediaType: "movie" | "tv";
defaultItems: TitleRowItem[];
initialGenreItems: TitleRowItem[] | null;
genres: Genre[];
userStatuses?: Record<string, TitleStatus>;
episodeProgress?: Record<string, { watched: number; total: number }>;
@@ -46,28 +42,18 @@ export function FilterableTitleRow({
icon,
mediaType,
defaultItems,
initialGenreItems,
genres,
userStatuses: initialStatuses = {},
episodeProgress: initialProgress = {},
}: FilterableTitleRowProps) {
const paramKey = mediaType === "movie" ? "movieGenre" : ("tvGenre" as const);
const [params, setParams] = useQueryStates(exploreSearchParams, {
history: "push",
});
const selectedGenre = params[paramKey];
const setSelectedGenre = (value: number | null) =>
setParams({ [paramKey]: value });
const [genreResults, setGenreResults] = useState<TitleRowItem[] | null>(
initialGenreItems,
);
const [selectedGenre, setSelectedGenre] = useState<number | null>(null);
const [genreResults, setGenreResults] = useState<TitleRowItem[] | null>(null);
const [genreStatuses, setGenreStatuses] = useState<
Record<string, TitleStatus>
>(initialGenreItems ? initialStatuses : {});
>({});
const [genreProgress, setGenreProgress] = useState<
Record<string, { watched: number; total: number }>
>(initialGenreItems ? initialProgress : {});
>({});
const [isPending, startTransition] = useTransition();
const items = selectedGenre === null ? defaultItems : (genreResults ?? []);
@@ -117,37 +103,26 @@ export function FilterableTitleRow({
{/* Genre chips */}
<ScrollArea scrollFade hideScrollbar>
<div className="flex gap-2">
{genres.map((genre) => {
const isSelected = selectedGenre === genre.id;
const href = serializeExploreParams("/explore", {
...params,
[paramKey]: isSelected ? null : genre.id,
});
return (
<Button
key={genre.id}
render={<Link href={href} prefetch={false} />}
variant={isSelected ? "default" : "outline"}
size="sm"
onClick={(e) => {
e.preventDefault();
toggleGenre(genre.id);
}}
className={`shrink-0 rounded-full ${
isSelected
? "border-primary bg-primary/10 text-primary hover:bg-primary/20"
: "border-border/50 bg-card/50 text-muted-foreground hover:border-primary/20 hover:text-foreground"
}`}
>
{genre.name}
</Button>
);
})}
{genres.map((genre) => (
<Button
key={genre.id}
variant={selectedGenre === genre.id ? "default" : "outline"}
size="sm"
onClick={() => toggleGenre(genre.id)}
className={`shrink-0 rounded-full ${
selectedGenre === genre.id
? "border-primary bg-primary/10 text-primary hover:bg-primary/20"
: "border-border/50 bg-card/50 text-muted-foreground hover:border-primary/20 hover:text-foreground"
}`}
>
{genre.name}
</Button>
))}
</div>
</ScrollArea>
{/* Loading skeleton */}
{(isPending || (selectedGenre !== null && genreResults === null)) && (
{isPending && (
<div className="-mx-4 flex gap-4 overflow-hidden px-4 sm:-mx-0 sm:px-0">
{Array.from({ length: 8 }).map((_, i) => (
<div
@@ -162,14 +137,11 @@ export function FilterableTitleRow({
)}
{/* Empty state */}
{!isPending &&
selectedGenre !== null &&
genreResults !== null &&
items.length === 0 && (
<p className="py-8 text-center text-muted-foreground text-sm">
No titles found for this genre.
</p>
)}
{!isPending && selectedGenre !== null && items.length === 0 && (
<p className="py-8 text-center text-muted-foreground text-sm">
No titles found for this genre.
</p>
)}
{/* Title cards */}
{!isPending && items.length > 0 && (