import { useContext, useEffect, useState } from 'react'; import { MyContext } from '../../App'; import { Card, CardContent, CardHeader, Typography, RadioGroup, Radio, FormControlLabel, Button, Box, ButtonBase, Divider, useTheme, } from '@mui/material'; import { getNameInfo } from '../Group/Group'; import PollIcon from '@mui/icons-material/Poll'; import { getFee } from '../../background'; import RefreshIcon from '@mui/icons-material/Refresh'; import { Spacer } from '../../common/Spacer'; import OpenInNewIcon from '@mui/icons-material/OpenInNew'; import { CustomLoader } from '../../common/CustomLoader'; import { useTranslation } from 'react-i18next'; export const PollCard = ({ poll, setInfoSnack, setOpenSnack, refresh, openExternal, external, isLoadingParent, errorMsg, }) => { const [selectedOption, setSelectedOption] = useState(''); const [ownerName, setOwnerName] = useState(''); const [showResults, setShowResults] = useState(false); const [isOpen, setIsOpen] = useState(false); const { show, userInfo } = useContext(MyContext); const [isLoadingSubmit, setIsLoadingSubmit] = useState(false); const theme = useTheme(); const { t } = useTranslation(['auth', 'core', 'group']); const handleVote = async () => { const fee = await getFee('VOTE_ON_POLL'); await show({ message: t('core:question.accept_vote_on_poll', { postProcess: 'capitalizeFirstChar', }), publishFee: fee.fee + ' QORT', }); setIsLoadingSubmit(true); window .sendMessage( 'voteOnPoll', { pollName: poll?.info?.pollName, optionIndex: +selectedOption, }, 60000 ) .then((response) => { setIsLoadingSubmit(false); if (response.error) { setInfoSnack({ type: 'error', message: response?.error || t('core:message.error.unable_vote', { postProcess: 'capitalizeFirstChar', }), }); setOpenSnack(true); return; } else { setInfoSnack({ type: 'success', message: t('core:message.success.voted', { postProcess: 'capitalizeFirstChar', }), }); setOpenSnack(true); } }) .catch((error) => { setIsLoadingSubmit(false); setInfoSnack({ type: 'error', message: error?.message || t('core:message.error.unable_vote', { postProcess: 'capitalizeFirstChar', }), }); setOpenSnack(true); }); }; const getName = async (owner) => { try { const res = await getNameInfo(owner); if (res) { setOwnerName(res); } } catch (error) { console.log(error); } }; useEffect(() => { if (poll?.info?.owner) { getName(poll.info.owner); } }, [poll?.info?.owner]); return ( {t('core:poll_embed', { postProcess: 'capitalizeFirstWord' })} {external && ( )} {t('core:message.error.created_by', { owner: poll?.info?.owner, postProcess: 'capitalizeFirstChar', })} {!isOpen && !errorMsg && ( <> )} {isLoadingParent && isOpen && ( )} {errorMsg && ( {errorMsg} )} {t('core:option_other', { postProcess: 'capitalizeFirstChar' })} setSelectedOption(e.target.value)} > {poll?.info?.pollOptions?.map((option, index) => ( } label={option?.optionName} sx={{ '& .MuiFormControlLabel-label': { fontSize: '14px', }, }} /> ))} {' '} {`${poll?.votes?.totalVotes} ${ poll?.votes?.totalVotes === 1 ? ' vote' : ' votes' }`} item?.voterPublicKey === userInfo?.publicKey ) ? 'visible' : 'hidden', }} > {t('core:message.generic.already_voted', { postProcess: 'capitalizeFirstChar', })} {isLoadingSubmit && ( {t('core:message.generic.processing_transaction', { postProcess: 'capitalizeFirstChar', })} )} { setShowResults((prev) => !prev); }} > {showResults ? t('core:action.hide', { postProcess: 'capitalizeFirstChar' }) : t('core:action.close', { postProcess: 'capitalizeFirstChar' })} {showResults && } ); }; const PollResults = ({ votes }) => { const maxVotes = Math.max( ...votes?.voteCounts?.map((option) => option.voteCount) ); const options = votes?.voteCounts; const { t } = useTranslation(['auth', 'core', 'group']); return ( {options .sort((a, b) => b.voteCount - a.voteCount) // Sort options by votes (highest first) .map((option, index) => ( {`${index + 1}. ${option.optionName}`} {t('core:vote', { count: option.voteCount })} ))} ); };