import { getTranslations } from "next-intl/server"; import { notFound, redirect } from "next/navigation"; import { AdminBreadcrumb } from "@/components/admin/admin-breadcrumb"; import { Badge } from "@/components/ui/badge"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { canAccess, getAdminContext, PERMS } from "@/lib/permissions"; import { prisma } from "@/lib/prisma"; import { PollForm } from "../poll-form"; import { PollQuestionsManager } from "./poll-questions"; import { PollResultsView } from "./poll-results"; export default async function PollDetailPage({ params, }: { params: Promise<{ locale: string; id: string }>; }) { const { id } = await params; const { session, permissions } = await getAdminContext(); if (!canAccess(permissions, PERMS.POLLS_EDIT, session.user.rank)) { redirect("/admin/polls"); } const pollId = parseInt(id, 10); if (Number.isNaN(pollId)) notFound(); const t = await getTranslations("pages.admin.polls"); const tHubs = await getTranslations("pages.admin.hubs"); const poll = await prisma.websitePoll.findUnique({ where: { id: pollId }, include: { questions: { orderBy: { sortOrder: "asc" }, include: { votes: true, }, }, }, }); if (!poll) notFound(); const totalVoters = new Set( poll.questions.flatMap((q) => q.votes.map((v) => v.userId)), ).size; const statusLabel: Record = { active: t("statusActive"), draft: t("statusDraft"), closed: t("statusClosed"), }; return (

{poll.title}

{statusLabel[poll.status] ?? poll.status}
{poll.description && (

{poll.description}

)}
{/* Stats */}
{t("statVoters")}
{totalVoters}
{t("statQuestions")}
{poll.questions.length}
{t("statVotes")}
{poll.questions.reduce((sum, q) => sum + q.votes.length, 0)}
{/* Edit form */} {/* Questions */} ({ id: q.id, question: q.question, type: q.type, sortOrder: q.sortOrder, options: q.options, }))} /> {/* Results */} {poll.questions.length > 0 && ( ({ id: q.id, question: q.question, options: q.options, votes: q.votes.map((v) => v.answer), }))} /> )}
); }