"use client" import { useState } from "react" import { Star } from "lucide-react" interface StarRatingProps { rating: number ratingCount: number interactive?: boolean novelId?: string onRate?: (value: number) => void } export function StarRating({ rating: initialRating, ratingCount: initialCount, interactive = false, novelId, onRate }: StarRatingProps) { const [hover, setHover] = useState(0) const [selected, setSelected] = useState(0) const [currentRating, setCurrentRating] = useState(initialRating) const [currentCount, setCurrentCount] = useState(initialCount) const [isSubmitting, setIsSubmitting] = useState(false) const displayRating = hover || selected || currentRating const handleRate = async (star: number) => { if (!interactive || isSubmitting) return setSelected(star) if (onRate) { onRate(star) return } if (novelId) { setIsSubmitting(true) try { const res = await fetch(`/api/truyen/${novelId}/rate`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ score: star }) }) if (res.ok) { const data = await res.json() setCurrentRating(data.rating) setCurrentCount(data.ratingCount) } } catch (error) { console.error("Failed to rate", error) } finally { setIsSubmitting(false) } } } return (
{[1, 2, 3, 4, 5].map((star) => ( ))}
{currentRating.toFixed(1)} ({currentCount} đánh giá)
) }