"use client" import { Loader2Icon, StarIcon } from "lucide-react" import { useEffect, useState } from "react" import { Button } from "@/components/ui/button" import { Textarea } from "@/components/ui/textarea" import { useI18n } from "@/i18n/provider" import { submitConversationSatisfaction, type ConversationSatisfactionResponse, } from "@/lib/api/im" import { cn } from "@/lib/utils" export type CSATCardProps = { conversationId: number customerToken?: string initialSatisfaction?: ConversationSatisfactionResponse | null onSubmitted?: (satisfaction: ConversationSatisfactionResponse) => void className?: string } function getScoreLabel(score: number, t: (key: string) => string): string { switch (score) { case 1: return t("csat.score1") case 2: return t("csat.score2") case 3: return t("csat.score3") case 4: return t("csat.score4") case 5: return t("csat.score5") default: return "" } } export function CSATCard({ conversationId, customerToken, initialSatisfaction, onSubmitted, className, }: CSATCardProps) { const t = useI18n() const [satisfaction, setSatisfaction] = useState( initialSatisfaction ?? null ) const [selectedScore, setSelectedScore] = useState( initialSatisfaction?.score ?? null ) const [hoveredScore, setHoveredScore] = useState(null) const [feedback, setFeedback] = useState("") const [isSubmitting, setIsSubmitting] = useState(false) const [error, setError] = useState(null) useEffect(() => { setSatisfaction(initialSatisfaction ?? null) setSelectedScore(initialSatisfaction?.score ?? null) setHoveredScore(null) setFeedback("") setError(null) }, [conversationId, initialSatisfaction]) if (satisfaction) { return (
{[1, 2, 3, 4, 5].map((star) => ( ))}

{t("csat.thankYou")}

{t("csat.alreadyRated", { score: String(satisfaction.score) })}

{satisfaction.feedback ? (

“{satisfaction.feedback}”

) : null}
) } const activeScore = hoveredScore ?? selectedScore const activeScoreLabel = activeScore ? getScoreLabel(activeScore, t) : "" const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() if (!selectedScore || isSubmitting) { return } setIsSubmitting(true) setError(null) try { const result = await submitConversationSatisfaction( { conversationId, score: selectedScore, feedback: feedback.trim() || undefined, }, customerToken ) setSatisfaction(result) onSubmitted?.(result) } catch (err) { setError(err instanceof Error ? err.message : t("api.requestFailed")) } finally { setIsSubmitting(false) } } return (

{t("csat.title")}

setHoveredScore(null)} > {[1, 2, 3, 4, 5].map((star) => { const isFilled = activeScore !== null && star <= activeScore const isSelected = selectedScore === star const starLabel = getScoreLabel(star, t) return ( ) })}
{activeScoreLabel}