import { desc } from "drizzle-orm"; import type { Metadata } from "next"; import { getTranslations } from "next-intl/server"; import Link from "@/components/link"; import { PublicLoadError } from "@/components/public/load-error"; import { ContentCard, EmptyState } from "@/components/public/ui"; import { db, Guilds } from "@/lib/db"; import { excerpt } from "@/lib/format"; import { publicReadFailure } from "@/lib/services/public-read"; export async function generateMetadata(): Promise { const t = await getTranslations("pages.guilds"); return { title: t("title"), description: t("subtitle"), openGraph: { title: t("title"), description: t("subtitle"), type: "website", }, }; } type GuildCard = { id: number; name: string; description: string; badge: string; }; async function getGuilds(): Promise { try { return await db .select({ id: Guilds.id, name: Guilds.name, description: Guilds.description, badge: Guilds.badge, }) .from(Guilds) .orderBy(desc(Guilds.id)) .limit(40); } catch (error) { return publicReadFailure("guilds")(error); } } export default async function GuildsPage() { const t = await getTranslations("pages.guilds"); const guilds = await getGuilds(); return (
{guilds === null ? ( ) : guilds.length === 0 ? ( {t("empty")} ) : (
{guilds.map((g) => ( {g.badge ? ( // eslint-disable-next-line @next/next/no-img-element {`${g.name} ) : null}

{g.name || t("unnamedGuild")}

{g.description ? excerpt(g.description, 120) : t("noDescription")}

))}
)}
); }