"use client" import Image from "next/image" import Link from "next/link" import { useRouter } from "next/navigation" import { useState } from "react" import { posterUrl, backdropUrl } from "@/lib/tmdb" import type { TMDBMovieDetail } from "@/lib/tmdb" import { StarRating } from "@/components/star-rating" import { createClient } from "@/lib/supabase/client" import { ArrowLeft, Bookmark, BookmarkCheck, PenLine, Clock, Film, Link2, Check, } from "lucide-react" interface FamilyEntry { id: string rating: number | null review: string | null watched_at: string profiles: { display_name: string } } interface MovieDetailProps { movie: TMDBMovieDetail externalRatings: any isInWatchlist: boolean familyEntries: FamilyEntry[] } export function MovieDetail({ movie, externalRatings, isInWatchlist: initialWatchlist, familyEntries, }: MovieDetailProps) { const [inWatchlist, setInWatchlist] = useState(initialWatchlist) const [saving, setSaving] = useState(false) const [copied, setCopied] = useState(false) const router = useRouter() const backdrop = backdropUrl(movie.backdrop_path, "w1280") const poster = posterUrl(movie.poster_path, "w500") async function toggleWatchlist() { setSaving(true) const supabase = createClient() const { data: { user }, } = await supabase.auth.getUser() if (!user) return if (inWatchlist) { await supabase .from("watchlist") .delete() .eq("user_id", user.id) .eq("tmdb_id", movie.id) setInWatchlist(false) } else { await supabase.from("watchlist").insert({ user_id: user.id, tmdb_id: movie.id, title: movie.title, poster_path: movie.poster_path, }) setInWatchlist(true) } setSaving(false) } async function handleCopyLink() { try { await navigator.clipboard.writeText(window.location.href) setCopied(true) setTimeout(() => setCopied(false), 2000) } catch { // Fallback for older browsers const textArea = document.createElement("textarea") textArea.value = window.location.href document.body.appendChild(textArea) textArea.select() document.execCommand("copy") document.body.removeChild(textArea) setCopied(true) setTimeout(() => setCopied(false), 2000) } } return (
{/* Backdrop */}
{backdrop ? ( ) : (
)}
{/* Back button */} {/* Copy link button */}
{/* Movie Info */}
{/* Poster */}
{poster ? ( {movie.title} ) : (
)}

{movie.title}

{movie.release_date?.slice(0, 4)} {movie.runtime ? ` \u00B7 ${movie.runtime} Min.` : ""}

{movie.genres && (
{movie.genres.slice(0, 3).map((g) => ( {g.name} ))}
)}
{/* Tagline */} {movie.tagline && (

"{movie.tagline}"

)} {/* External Ratings */} {externalRatings && (

Externe Bewertungen

{externalRatings.imdb_rating && (
IMDb {externalRatings.imdb_rating} {externalRatings.imdb_vote_count && ( ({externalRatings.imdb_vote_count.toLocaleString()}) )}
)} {externalRatings.rotten_tomatoes_rating && (
RT {externalRatings.rotten_tomatoes_rating}%
)} {movie.vote_average > 0 && (
TMDB {movie.vote_average.toFixed(1)}
)}
)} {/* Actions */}
Loggen
{/* Overview */} {movie.overview && (

Handlung

{movie.overview}

)} {/* Family Reviews */} {familyEntries.length > 0 && (

Familien-Bewertungen

{familyEntries.map((entry) => (
{entry.profiles?.display_name?.charAt(0).toUpperCase()}
{entry.profiles?.display_name} {new Date(entry.watched_at).toLocaleDateString("de-DE", { day: "numeric", month: "short", })}
{entry.rating && (
)} {entry.review && (

{entry.review}

)}
))}
)}
) }