"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; const CustomerName = ({ customerId }: { customerId: string }) => { const [name, setName] = useState(""); const [loading, setLoading] = useState(true); useEffect(() => { // Hàm gọi API const getName = async () => { try { setLoading(true); const response = await fetch(`/api/customer/${customerId}`); if (!response.ok) { throw new Error("Mạng lỗi hoặc không tìm thấy nhân viên"); } const data = await response.json(); setName(data["name"]); } catch (error) { console.error("Lỗi khi lấy tên:", error); setName("Lỗi tải tên"); } finally { setLoading(false); } }; if (customerId) { getName(); } }, [customerId]); // Chạy lại nếu customerId thay đổi if (loading) return ...; return {name || "N/A"}; }; 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.

)}
))}
); }