import { Metadata } from "next"; import Link from "next/link"; import { redirect } from "next/navigation"; import { Icon } from "@iconify/react"; import { auth } from "@/lib/auth"; import { prisma } from "@/lib/prisma"; import LikeButton from "@/components/like-button"; import ImageViewer from "@/components/image-viewer"; import DeleteMiiButton from "@/components/delete-mii"; import ScanTutorialButton from "@/components/tutorial/scan"; interface Props { params: Promise<{ id: string }>; } export async function generateMetadata({ params }: Props): Promise { const { id } = await params; const mii = await prisma.mii.findUnique({ where: { id: Number(id), }, include: { user: { select: { username: true, }, }, _count: { select: { likedBy: true }, // Get total like count }, }, }); // Bots get redirected anyways if (!mii) return {}; const metadataImageUrl = `/mii/${mii.id}/image?type=metadata`; const username = `@${mii.user.username}`; return { metadataBase: new URL(process.env.NEXT_PUBLIC_BASE_URL!), title: `${mii.name} - TomodachiShare`, description: `Check out '${mii.name}', a Tomodachi Life Mii created by ${username} on TomodachiShare. From ${mii.islandName} Island with ${mii._count.likedBy} likes.`, keywords: ["mii", "tomodachi life", "nintendo", "tomodachishare", "tomodachi-share", "mii creator", "mii collection", ...mii.tags], creator: username, openGraph: { type: "article", title: `${mii.name} - TomodachiShare`, description: `Check out '${mii.name}', a Tomodachi Life Mii created by ${username} on TomodachiShare. From ${mii.islandName} Island with ${mii._count.likedBy} likes.`, images: [metadataImageUrl], publishedTime: mii.createdAt.toISOString(), authors: username, }, twitter: { card: "summary_large_image", title: `${mii.name} - TomodachiShare`, description: `Check out '${mii.name}', a Tomodachi Life Mii created by ${username} on TomodachiShare. From ${mii.islandName} Island with ${mii._count.likedBy} likes.`, images: [metadataImageUrl], creator: username, }, alternates: { canonical: `/mii/${mii.id}`, }, }; } export default async function MiiPage({ params }: Props) { const { id } = await params; const session = await auth(); const mii = await prisma.mii.findUnique({ where: { id: Number(id), }, include: { user: { select: { username: true, }, }, likedBy: session?.user ? { where: { userId: Number(session.user.id), }, select: { userId: true }, } : false, _count: { select: { likedBy: true }, // Get total like count }, }, }); if (!mii) redirect("/404"); const images = [...Array.from({ length: mii.imageCount }, (_, index) => `/mii/${mii.id}/image?type=image${index}`)]; return (
{/* Mii Image */}
{/* QR Code */}

{/* Mii Info */}
  • Name:{" "} {mii.firstName} {mii.lastName}
  • From: {mii.islandName} Island
  • Allowed Copying:
{/* Mii Gender */}
{/* Information */}
{/* Submission name */}

{mii.name}

{/* Like button */} 0} isLoggedIn={session?.user != null} big />
{/* Tags */}
{mii.tags.map((tag) => ( {tag} ))}
{/* Author and Created date */}
By: @{mii.user.username}

Created: {mii.createdAt.toLocaleDateString("en-GB", { month: "long", day: "2-digit", year: "numeric" })} at{" "} {mii.createdAt.toLocaleTimeString("en-GB", { timeZone: "UTC" })} UTC

{/* Description */} {mii.description &&

{mii.description}

}
{/* Buttons */}
{session && (Number(session.user.id) === mii.userId || Number(session.user.id) === Number(process.env.NEXT_PUBLIC_ADMIN_USER_ID)) && ( <> Edit )} Report
{/* Images */}

Gallery

{images.length > 0 ? (
{images.map((src, index) => (
))}
) : (

There is nothing here...

)}
); }