"use client"; import { useEffect, useMemo, useState } from "react"; import Link from "next/link"; import { useRouter } from "next/navigation"; type Genre = { id: number; name: string }; type Paged = { items: T[]; page: number; pageSize: number; total: number }; export default function GenresSearch({ initial, initialQ }: { initial?: Paged; initialQ?: string }) { const router = useRouter(); const [q, setQ] = useState(initialQ ?? ""); const [data, setData] = useState | null>(initial ?? null); const totalPages = useMemo(() => (data ? Math.max(1, Math.ceil(data.total / data.pageSize)) : 1), [data]); useEffect(() => { if (initial) setData(initial); }, [initial]); useEffect(() => { setQ(initialQ ?? ""); }, [initialQ]); function submit(e: React.FormEvent) { e.preventDefault(); const params = new URLSearchParams(); if (q) params.set("q", q); params.set("page", "1"); router.push(`/zxdb/genres?${params.toString()}`); } return (

Genres

setQ(e.target.value)} />
{data && data.items.length === 0 &&
No genres found.
} {data && data.items.length > 0 && (
{data.items.map((g) => ( ))}
ID Name
#{g.id} {g.name}
)}
Page {data?.page ?? 1} / {totalPages}
{ const p = new URLSearchParams(); if (q) p.set("q", q); p.set("page", String(Math.max(1, (data?.page ?? 1) - 1))); return p.toString(); })()}`} > Prev = totalPages) ? "disabled" : ""}`} aria-disabled={!data || data.page >= totalPages} href={`/zxdb/genres?${(() => { const p = new URLSearchParams(); if (q) p.set("q", q); p.set("page", String(Math.min(totalPages, (data?.page ?? 1) + 1))); return p.toString(); })()}`} > Next
); }