import Image from 'next/image'; import Link from 'next/link'; import { notFound, redirect } from 'next/navigation'; import { format } from 'date-fns'; import { auth } from '@/lib/auth'; import { db } from '@/lib/db'; import { DeleteFeedbackButton } from '@/components/admin/delete-feedback-button'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; export default async function AdminFeedbackDetailPage({ params, }: { params: Promise<{ feedbackId: string }>; }) { const session = await auth(); if (!session?.user?.isAdmin) { redirect('/'); } const { feedbackId } = await params; const userFeedbackDelegate = (db as unknown as { userFeedback?: { findUnique: (args?: unknown) => Promise<{ id: string; type: string; category: string | null; status: string; rating: number | null; title: string; message: string; screenshotUrl: string | null; createdAt: Date; user: { name: string | null; email: string | null }; screenshots: Array<{ id: string; url: string }>; } | null>; }; }).userFeedback; let entry = null as Awaited['findUnique']>> | null; if (userFeedbackDelegate) { try { entry = await userFeedbackDelegate.findUnique({ where: { id: feedbackId }, include: { user: { select: { id: true, name: true, email: true, }, }, screenshots: { select: { id: true, url: true, }, orderBy: { createdAt: 'asc' }, }, }, }); } catch (error) { const message = error instanceof Error ? error.message : ''; if (message.includes('Unknown field `screenshots`')) { entry = await userFeedbackDelegate.findUnique({ where: { id: feedbackId }, include: { user: { select: { id: true, name: true, email: true, }, }, }, }) as typeof entry; if (entry && !Array.isArray(entry.screenshots)) { entry = { ...entry, screenshots: [], }; } } else { throw error; } } } if (!entry) { notFound(); } const screenshotItems = entry.screenshots.length > 0 ? entry.screenshots : (entry.screenshotUrl ? [{ id: `${entry.id}-legacy`, url: entry.screenshotUrl }] : []); const submittedAtText = format(new Date(entry.createdAt), 'MMM dd, yyyy HH:mm'); const submitterName = entry.user.name || 'there'; const feedbackTypeLabel = entry.type.toLowerCase(); const quotedMessage = entry.message .split('\n') .map((line) => `> ${line}`) .join('\n'); const mailtoHref = entry.user.email ? `mailto:${entry.user.email}?subject=${encodeURIComponent( `[OpenFrame ${entry.type}] Re: ${entry.title}` )}&body=${encodeURIComponent( `Hi ${submitterName},\n\nThanks for your ${feedbackTypeLabel}.\n\n` + `I reviewed your submission:\n` + `Title: ${entry.title}\n` + `Submitted: ${submittedAtText}\n\n` + `Your message:\n${quotedMessage}\n\n` )}` : null; return (

Feedback Detail

{entry.type} {entry.category && {entry.category}} {entry.status} {entry.rating && Rating: {entry.rating}/5}
{entry.title}
Submitted by {entry.user.name || 'Anonymous'} ( {entry.user.email && mailtoHref ? ( {entry.user.email} ) : ( 'No email' )} ) on {submittedAtText}

Message

{entry.message}

Screenshots ({screenshotItems.length})

{screenshotItems.length === 0 ? (
No screenshots attached.
) : (
{screenshotItems.map((screenshot, index) => ( {`Screenshot

Open full size

))}
)}
); }