"use client";
import { useManager } from "@/lib/manager-context";
import { useEffect, useState } from "react";
import type { ReviewEntity } from "./Manager.types";
interface FetchState {
reviews: ReviewEntity[];
loading: boolean;
error: string | null;
}
function StarRating({ rating }: { rating: number }) {
return (
{[1, 2, 3, 4, 5].map((star) => (
))}
);
}
export default function ReviewsTab() {
const { eateryId } = useManager();
const [{ reviews, loading, error }, setState] = useState({
reviews: [],
loading: true,
error: null,
});
useEffect(() => {
if (!eateryId) return;
const controller = new AbortController();
fetch(`/api/eatery/review/${eateryId}`, { signal: controller.signal })
.then((res) => {
if (!res.ok) throw new Error(`Failed to load reviews: ${res.status}`);
return res.json() as Promise;
})
.then((data) => setState({ reviews: data, loading: false, error: null }))
.catch((err: unknown) => {
if (err instanceof Error && err.name === "AbortError") return;
setState({
reviews: [],
loading: false,
error: err instanceof Error ? err.message : "Failed to load reviews.",
});
});
return () => controller.abort();
}, [eateryId]);
if (loading) {
return (
Loading reviews...
);
}
if (error) {
return (
{error}
);
}
if (reviews.length === 0) {
return (
No reviews yet
Reviews from customers will appear here.
);
}
const avgRating =
reviews.reduce((sum, r) => sum + r.rating, 0) / reviews.length;
return (
{/* Summary header */}
{avgRating.toFixed(1)}
/ 5
{reviews.length} review{reviews.length !== 1 ? "s" : ""}
{/* Review list */}
{reviews.map((review, idx) => (
{review.createdAt && (
{new Date(review.createdAt).toLocaleDateString("vi-VN")}
)}
{review.comment ? (
{review.comment}
) : (
No comment provided.
)}
))}
);
}