"use client"; import { useEffect, useMemo, useState } from "react"; import Link from "next/link"; import { useRouter } from "next/navigation"; type Language = { id: string; name: string }; type Paged = { items: T[]; page: number; pageSize: number; total: number }; export default function LanguagesSearch({ 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/languages?${params.toString()}`); } return (

Languages

setQ(e.target.value)} />
{data && data.items.length === 0 &&
No languages found.
} {data && data.items.length > 0 && (
{data.items.map((l) => ( ))}
Code Name
{l.id} {l.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/languages?${(() => { 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
); }