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 })}
))}
);
};