import React, { useEffect, useState } from "react"; import { Bar } from "react-chartjs-2"; import { Chart as ChartJS, BarElement, CategoryScale, LinearScale, } from "chart.js"; import { useMutation, useQuery } from "react-query"; import { useParams } from "react-router-dom"; import getPollData from "../services/getPollData"; import ErrorFallback from "../components/Errors/ErrorFallback"; import createVoteService from "../services/createVoteService"; import { FaBookmark } from "react-icons/fa"; import { toast } from "react-toastify"; import { makeChartDataObjFromPollData } from "../utils/util"; import useBookmark from "../hooks/useBookmark"; import { io } from "socket.io-client"; ChartJS.register(BarElement, CategoryScale, LinearScale); function VotingPage() { const { pollId } = useParams(); const [selectedOption, setSelectedOption] = useState(null); const { handleBookmark } = useBookmark(); const [poll, setPoll] = useState(null); const [socket, setSocket] = useState(null); useEffect(() => { const s = io("https://livepoll-anjx.onrender.com"); setSocket(s); s.on("connect", () => { console.log("Connected to the server"); s.emit("joinPoll", pollId); }); return () => { s.disconnect(); }; }, [pollId]); const { data, isLoading, isError, refetch, } = useQuery(["poll", pollId], () => getPollData(pollId), { cacheTime: 10 * 60 * 1000, // 10 minutes staleTime: 20 * 60 * 1000, // 20 minutes onSuccess: (data) => { setPoll(data); }, }); useEffect(() => { if (socket) { socket.on("pollDataUpdated", (data) => { console.log("Received updated poll data:", data); setPoll(data); }); socket.on("error", (error) => { console.error("Socket error:", error.message); }); return () => { socket.off("pollDataUpdated"); socket.off("error"); }; } }, [socket]); const mutation = useMutation(createVoteService, { onSuccess: (data) => { toast.success("Vote submitted successfully"); if (socket) { socket.emit("vote", { pollId, success: data?.success }); } }, onError: (error) => { console.error(error); toast.error( error?.response?.data?.message || "An unexpected error occurred" ); }, }); const handleOptionSelect = (id) => { setSelectedOption(id); mutation.mutate({ pollId, optionId: id }); }; if (isLoading) { return
; } if (isError) { return (
); } const chartData = makeChartDataObjFromPollData(poll); return (
{/* Poll Creator Info */}
{poll?.data?.creatorData?.username}

{poll?.data?.creatorData?.username || "Unknown"}

{/* BookMark Button */}
{/* Poll Title */}

{poll?.data?.pollData?.title || "Loading.."}

{/* Poll Description */}

{poll?.data?.pollData?.description || "Loading.."}

{/* Voting Options */}
{poll?.data?.pollData?.options.map((option) => (
handleOptionSelect(option._id)} key={option._id} className={`md:p-4 p-2 ${ selectedOption == option._id ? "bg-blue-500" : "bg-base-100" } rounded-lg shadow-md flex items-center justify-center cursor-pointer ${ selectedOption == option._id ? "outline" : "hover:bg-base-300" } transition`} > {option.name}
))}
{/* Chart Visualization */}
); } export default VotingPage;