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 Carousel from "@/components/carousel"; 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 miiImageUrl = `/mii/${mii.id}/image?type=mii`; const qrCodeUrl = `/mii/${mii.id}/image?type=qr-code`; const username = `@${mii.user.username}`; return { metadataBase: new URL(process.env.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`, ...mii.tags], creator: username, category: "Gaming", openGraph: { locale: "en_US", type: "article", images: [miiImageUrl, qrCodeUrl], siteName: "TomodachiShare", 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: [miiImageUrl, qrCodeUrl], 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 = [ `/mii/${mii.id}/image?type=mii`, `/mii/${mii.id}/image?type=qr-code`, ...Array.from({ length: mii.imageCount }, (_, index) => `/mii/${mii.id}/image?type=image${index}`), ]; return (
{/* Carousel */}
{/* Information */}

{mii.name}

{mii.tags.map((tag) => ( {tag} ))}
By: @{mii.user.username}

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

0} isLoggedIn={session?.user != null} big />
{/* Extra information */}
Mii Info
  • Name:{" "} {mii.firstName} {mii.lastName}
  • From: {mii.islandName} Island
  • Allowed Copying:
{session && (Number(session.user.id) === mii.userId || Number(session.user.id) === Number(process.env.NEXT_PUBLIC_ADMIN_USER_ID)) && ( <> )}
{/* Images */}
{images.map((src, index) => ( ))}
); }