import { useCallback, useEffect, useState } from "react"; import { ThumbsDown, ThumbsUp, User } from "lucide-react"; import { postVisitorSessionQuestionVote } from "../lib/api"; import { notifyRewardFromApiData } from "../lib/rewardCelebration"; import { getOrCreateAudienceVoteKey, readStoredQuestionVote, writeStoredQuestionVote, } from "../lib/audienceVoteKey"; export type AudienceQuestionItem = { _id?: string; author: string; text: string; up: number; down: number; }; export type AudienceQuestionVoteContext = { eventId: string; sessionId: string; }; export function AudienceQuestionCard({ item, variant = "default", voteContext, }: { item: AudienceQuestionItem; variant?: "default" | "embedded"; /** When set and `item._id` is present, up/down votes call the visitor API and sync to RTDB */ voteContext?: AudienceQuestionVoteContext; }) { const rawId = item._id; const qid = rawId == null || rawId === "" ? "" : typeof rawId === "string" ? rawId.trim() : String(rawId).trim(); const canVote = Boolean(voteContext && qid); const [userVote, setUserVote] = useState<"up" | "down" | null>(() => qid ? readStoredQuestionVote(qid) : null, ); const [voting, setVoting] = useState(false); const [voteError, setVoteError] = useState(null); useEffect(() => { setUserVote(qid ? readStoredQuestionVote(qid) : null); }, [qid]); const shell = variant === "embedded" ? "flex flex-col gap-4 p-4" : "flex flex-col gap-4 rounded-md border border-[#f2f2f7] bg-white p-4 shadow-[0_1px_4px_rgba(12,12,13,0.05)]"; const doVote = useCallback( async (direction: "up" | "down") => { if (!canVote || !voteContext || voting) return; if (userVote === direction) return; setVoting(true); setVoteError(null); try { const voterKey = getOrCreateAudienceVoteKey(); const res = await postVisitorSessionQuestionVote( voteContext.sessionId, voteContext.eventId, qid, { voterKey, direction }, ); setUserVote(res.yourVote); writeStoredQuestionVote(qid, res.yourVote); notifyRewardFromApiData(res); } catch (e) { setVoteError(e instanceof Error ? e.message : "Vote failed"); } finally { setVoting(false); } }, [canVote, voteContext, qid, userVote, voting], ); const upBtn = ( ); const downBtn = ( ); return (
{item.author}

{item.text}

{canVote ? ( upBtn ) : (
{item.up}
)} {canVote ? ( downBtn ) : (
{item.down}
)}
{voteError ?

{voteError}

: null}
); }