import { asc, count } from "drizzle-orm"; import Link from "next/link"; import { getTranslations } from "next-intl/server"; import { ContentCard, EmptyState } from "@/components/public/ui"; import { db, WebsiteRareValueCategories, WebsiteRareValues } from "@/lib/db"; import { siteSettings } from "@/lib/services/site-settings"; export const metadata = { title: "Rare values" }; type CategoryRow = { id: bigint; name: string; badge: string; priority: number; }; export default async function RareValuesPage() { const t = await getTranslations("pages.rares"); // Categories, per-category rare counts and site settings are all // independent — run them concurrently instead of sequentially. const [categoryRows, grouped, badgesBase] = await Promise.all([ db .select({ id: WebsiteRareValueCategories.id, name: WebsiteRareValueCategories.name, badge: WebsiteRareValueCategories.badge, priority: WebsiteRareValueCategories.priority, }) .from(WebsiteRareValueCategories) .orderBy( asc(WebsiteRareValueCategories.priority), asc(WebsiteRareValueCategories.name), ) .catch((): CategoryRow[] => []), db .select({ categoryId: WebsiteRareValues.categoryId, value: count(), }) .from(WebsiteRareValues) .groupBy(WebsiteRareValues.categoryId) .catch(() => []), siteSettings.get("badges_path", ""), ]); const categories = categoryRows; // Per-category rare counts (grouped so we avoid N queries). const counts = new Map(); for (const g of grouped) { counts.set(String(g.categoryId), Number(g.value)); } return (
{categories.length === 0 ? ( {t("empty")} ) : (
{categories.map((c) => { const id = String(c.id); const rareCount = counts.get(id) ?? 0; const badgeSrc = badgesBase && c.badge ? `${badgesBase}/${c.badge}.gif` : ""; return (
{badgeSrc ? ( // eslint-disable-next-line @next/next/no-img-element {`${c.name} ) : ( 💎 )}

{c.name}

{t("rareCount", { count: rareCount })}

{t("viewRares")}
); })}
)}
); }