"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 (
)
}
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 && (
)}
)
}
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) => (
))}
{/* Admin link */}
+ add visit
manage
)
}