import type { Metadata } from "next"; import Link from "next/link"; import { headers as nextHeaders } from "next/headers"; import { redirect } from "next/navigation"; import { getPayload } from "payload"; import config from "@payload-config"; import { ArrowRightIcon, CheckCircle2Icon, Clock3Icon, EyeOffIcon, MicIcon, SparklesIcon, TriangleAlertIcon, } from "lucide-react"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { listScriptsForUser, type VoiceoverScriptView } from "@/lib/voiceover"; import { cn } from "@/lib/utils"; import { redactText } from "@/lib/redaction"; import { isPayloadUser } from "@/utils/access-control/isPayloadUser"; export const metadata: Metadata = { title: "Voiceover: Polaris Task Force", description: "Record voiceover takes for active Polaris Task Force scripts.", }; const submissionStatusClasses: Record = { pending: "border-amber-500/40 text-amber-400", accepted: "border-emerald-500/40 text-emerald-400", rejected: "border-red-500/40 text-red-400", }; function ScriptAvailability({ status }: { readonly status: string }) { const isDraft = status === "draft"; const isOpen = status === "open"; return ( {isDraft ? ( ) : isOpen ? ( ) : ( )} {isDraft ? "Draft" : isOpen ? "Open" : "Closed"} ); } function SubmissionStatuses({ script }: { readonly script: VoiceoverScriptView }) { if (script.mySubmissions.length === 0) { return

No takes submitted yet.

; } return (
{script.mySubmissions.map((submission, index) => ( Take {index + 1}: {submission.status} ))}
); } function SpoilerBadge() { return ( Spoilers ); } function ScriptCard({ script }: { readonly script: VoiceoverScriptView }) { const isDraft = script.status === "draft"; const isOpen = script.status === "open"; const isRecordable = isOpen; return (
{isRecordable || isDraft ? ( {script.title} ) : ( script.title )} {(script.spoiler ? redactText(script.description) : script.description)?.trim() || `Voiceover script #${script.id}`}
{script.spoiler && }
+{script.xpAmount} XP {script.otherSubmissionCount} other submission {script.otherSubmissionCount === 1 ? "" : "s"}
Your submissions
{isDraft ? (

Draft preview: this script is still hidden from other users.

) : isRecordable ? ( ) : (

This script is closed to new takes.

)}
); } export default async function VoiceoverPage() { const headers = await nextHeaders(); const payloadConfig = await config; const payload = await getPayload({ config: payloadConfig }); const { user } = await payload.auth({ headers, canSetHeaders: false }); if (!isPayloadUser(user)) { redirect(`/login?returnTo=${encodeURIComponent("/voiceover")}`); } const scripts = await listScriptsForUser(payload, user); return (

Voiceover submissions

Choose an active script, read it in the teleprompter, and submit your best take.

{scripts.length > 0 ? (
{scripts.map((script) => ( ))}
) : (

No scripts available

New voiceover opportunities will appear here when they are published.

)}
); }