import Link from "next/link"; import { notFound } from "next/navigation"; import type { Metadata } from "next"; import { requireUser } from "@/lib/auth"; import { getSettings } from "@/lib/settings"; import { prisma } from "@/lib/db"; import { getUniverse, suggestCollections } from "@/lib/universes"; import { formatMinutes } from "@/lib/labels"; import { AppShell } from "@/components/AppShell"; import { ProgressBar } from "@/components/ProgressBar"; import { OrderedList } from "@/components/universes/OrderedList"; import { AddTitles, DeleteUniverse, OrderTabs, SharePanel, } from "@/components/universes/UniverseTools"; type Params = Promise<{ id: string }>; type Search = Promise<{ reihenfolge?: string }>; export async function generateMetadata({ params }: { params: Params }): Promise { const { id } = await params; const universe = await prisma.universe.findUnique({ where: { id }, select: { name: true } }); return { title: universe?.name ?? "Universum" }; } export default async function UniversePage({ params, searchParams, }: { params: Params; searchParams: Search; }) { const user = await requireUser(); const settings = await getSettings(); const { id } = await params; const { reihenfolge } = await searchParams; const universe = await getUniverse(user.id, id, reihenfolge); if (!universe) notFound(); const activeOrder = universe.orders.find((order) => order.id === universe.activeOrderId); const inUniverse = new Set(universe.entries.map((entry) => entry.titleId)); // Vorschläge zum Aufnehmen: alles aus der eigenen Bibliothek, was noch fehlt. const [libraryTitles, collections] = universe.canWrite ? await Promise.all([ prisma.libraryEntry.findMany({ where: { userId: user.id, deletedAt: null }, orderBy: { title: { title: "asc" } }, select: { title: { select: { id: true, title: true, type: true, releaseDate: true } }, }, }), suggestCollections(user.id), ]) : [[], []]; const candidates = libraryTitles .map((entry) => entry.title) .filter((title) => !inUniverse.has(title.id)) .map((title) => ({ id: title.id, title: title.title, type: title.type, year: title.releaseDate?.getFullYear() ?? null, })); return (

Universum {!universe.isOwner && ` · geteilt von ${universe.ownerName}`} {!universe.canWrite && " · nur ansehen"}

{universe.name}

{universe.description && (

{universe.description}

)}

{universe.progress.completed}{" "} von {universe.progress.total} abgeschlossen

{formatMinutes(universe.progress.watchedMinutes)} gesehen {universe.progress.remainingMinutes > 0 && ( <> {" · noch "} {formatMinutes(universe.progress.remainingMinutes)} {" bis zum Ende des Universums"} )}

{universe.nextUp && (

Als Nächstes dran

{universe.nextUp.title}
)}
{activeOrder?.kind === "RELEASE" ? (

Diese Reihenfolge ergibt sich aus den Erscheinungsdaten und bleibt damit immer aktuell.

) : universe.canWrite ? (

Ziehen oder die Pfeile benutzen, um umzusortieren — gespeichert wird sofort.

) : null}

← Alle Universen

); }