import { getTranslations } from "next-intl/server"; import type { CSSProperties } from "react"; import { postShout } from "@/actions/radio-shouts"; import { ContentCard, EmptyState } from "@/components/public/ui"; import { auth } from "@/lib/auth"; import { avatarImageUrl } from "@/lib/format"; import { formatDate } from "@/lib/format-date"; import { prisma } from "@/lib/prisma"; import { siteSettings } from "@/lib/services/site-settings"; export const dynamic = "force-dynamic"; type SearchParams = Promise<{ posted?: string; error?: string }>; function feedbackStyle(tone: "success" | "error"): CSSProperties { const accent = tone === "error" ? "var(--color-danger)" : "var(--color-primary)"; return { margin: 0, padding: "0.85rem 1rem", borderRadius: "var(--radius-md)", border: `1px solid ${accent}`, color: "var(--color-text-readable, var(--color-text))", fontSize: "0.9rem", fontWeight: 600, background: "var(--color-surface)", borderLeft: `4px solid ${accent}`, }; } export default async function RadioShoutsPage({ searchParams, }: { searchParams: SearchParams; }) { const t = await getTranslations("pages.radioShouts"); const { posted, error } = await searchParams; const [shouts, imagerBase, session] = await Promise.all([ prisma.radioShouts .findMany({ orderBy: { createdAt: "desc" }, take: 50, }) .catch(() => []), siteSettings.get( "habbo_imaging_url", "https://www.habbo.com/habbo-imaging/avatarimage", ), auth(), ]); const isLoggedIn = Boolean(session?.user?.id); // Resolve author usernames/looks. shout.userId is BigInt; User.id is Int. const authorIds = Array.from(new Set(shouts.map((s) => Number(s.userId)))); const authors = authorIds.length ? await prisma.user .findMany({ where: { id: { in: authorIds } }, select: { id: true, username: true, look: true }, }) .catch(() => []) : []; const authorById = new Map(authors.map((a) => [a.id, a])); const errorMessage = error === "invalid" ? t("errors.invalid") : error === "moderated" ? t("errors.moderated") : error === "ratelimit" ? t("errors.ratelimit") : error ? t("errors.error") : null; return (
{posted === "1" ? (
{t("success.posted")}
) : null} {errorMessage ? (
{errorMessage}
) : null} {isLoggedIn ? ( {/* The author is taken from the session inside the action, never from this form — no user id is submitted. */}