"use client" import { useState, useEffect } from "react" import { useParams, useRouter } from "next/navigation" import { motion } from "framer-motion" import Link from "next/link" import { Restaurant, Visit } from "@/app/types" function priceLabel(range: number) { return "€".repeat(range) } function formatDate(iso: string) { return new Date(iso).toLocaleDateString("en-GB", { weekday: "long", day: "numeric", month: "long", year: "numeric", }) } function RatingBar({ rating }: { rating: number }) { return (
{rating}
) } function VisitCard({ visit, index }: { visit: Visit; index: number }) { return ( {/* Timeline line */}
{/* Timeline dot */}

{formatDate(visit.date)}

{visit.price_paid && ( €{visit.price_paid} )}

Dishes

    {visit.dishes.map((dish, i) => (
  • · {dish}
  • ))}
{visit.notes && (

“{visit.notes}”

)}
) } export default function RestaurantPage() { const params = useParams() const router = useRouter() const id = params.id as string const [restaurant, setRestaurant] = useState(null) const [loading, setLoading] = useState(true) const [notFound, setNotFound] = useState(false) useEffect(() => { fetch(`/api/restaurants/${id}`) .then((r) => { if (!r.ok) { setNotFound(true) setLoading(false) return null } return r.json() }) .then((data) => { if (data) { setRestaurant(data) setLoading(false) } }) .catch(() => { setNotFound(true) setLoading(false) }) }, [id]) if (loading) { return (
) } if (notFound || !restaurant) { return (

Restaurant not found

Back home
) } const avgRating = restaurant.visits.length > 0 ? restaurant.visits.reduce((s, v) => s + v.rating, 0) / restaurant.visits.length : 0 const sortedVisits = [...restaurant.visits].sort( (a, b) => new Date(b.date).getTime() - new Date(a.date).getTime() ) return (
{/* Back */} {/* Header */}

{restaurant.name}

{avgRating.toFixed(1)}
avg

{restaurant.address} · {restaurant.city}, {restaurant.country}

{restaurant.cuisine.map((tag) => ( {tag} ))} {priceLabel(restaurant.price_range)} {restaurant.visits.length} {restaurant.visits.length === 1 ? "visit" : "visits"}
{/* Divider */}
{/* Visits timeline */}

Visits

{sortedVisits.map((visit, i) => ( ))}
) }