"use client"; import { useCallback, useEffect, useMemo, useState } from "react"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { Row, Col, Card, Form, Button, Alert, Table, Badge } from "react-bootstrap"; import ZxdbBreadcrumbs from "@/app/zxdb/components/ZxdbBreadcrumbs"; import Pagination from "@/components/explorer/Pagination"; import type { PagedResult } from "@/types/zxdb"; type Genre = { id: number; name: string }; export default function GenresSearch({ initial, initialQ }: { initial?: PagedResult; 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()}`); } const buildHref = useCallback((p: number) => { const params = new URLSearchParams(); if (q) params.set("q", q); params.set("page", String(p)); return `/zxdb/genres?${params.toString()}`; }, [q]); return (

Genres

{data?.total.toLocaleString() ?? "0"} results
Search setQ(e.target.value)} />
{data && data.items.length === 0 && No genres found.} {data && data.items.length > 0 && ( {data.items.map((g) => ( ))}
Genres search results
ID Name
#{g.id} {g.name}
)}
router.push(buildHref(p))} />
); }