import {useEffect, useState} from 'react';
import Head from 'next/head';
import {serverSideTranslations} from 'next-i18next/serverSideTranslations';
import {useTranslation} from 'next-i18next';
import {Container} from 'reactstrap';
import {faCheck} from '@fortawesome/free-solid-svg-icons';
import BallotDesktop from '@components/ballot/BallotDesktop';
import Button from '@components/Button';
import BallotMobile from '@components/ballot/BallotMobile';
import Blur from '@components/Blur';
import {
getElection,
getBallot,
castBallot,
ElectionPayload,
BallotPayload,
ErrorPayload,
} from '@services/api';
import {
useBallot,
BallotTypes,
BallotProvider,
} from '@services/BallotContext';
import {getUrl, RouteTypes} from '@services/routes';
import {isEnded} from '@services/utils';
import WaitingBallot from '@components/WaitingBallot';
import PatternedBackground from '@components/PatternedBackground';
const shuffle = (array) => array.sort(() => Math.random() - 0.5);
export async function getServerSideProps({query: {pid, tid}, locale}) {
if (!pid) {
return {notFound: true};
}
const electionRef = pid.replaceAll('-', '');
const [election, ballot, translations] = await Promise.all([
getElection(electionRef),
tid ? getBallot(tid) : null,
serverSideTranslations(locale, ['resource']),
]);
if ('message' in election) {
return {notFound: true};
}
if (isEnded(election.date_end)) {
return {
redirect: {
destination: getUrl(RouteTypes.ENDED_VOTE, electionRef),
permanent: false,
},
};
}
if (
!election ||
!election.candidates ||
!Array.isArray(election.candidates)
) {
return {notFound: true};
}
const description = JSON.parse(election.description);
if (description.randomOrder) {
shuffle(election.candidates);
}
return {
props: {
...translations,
election,
token: tid || null,
previousBallot: ballot || null,
},
};
}
const ButtonSubmit = () => {
const {t} = useTranslation();
const [ballot, dispatch] = useBallot();
const disabled = ballot.votes.length !== ballot.election.candidates.length;
return (
);
};
interface VoteInterface {
election: ElectionPayload;
err: string;
token?: string;
previousBallot: BallotPayload
}
const VoteBallot = ({election, token, previousBallot}: VoteInterface) => {
const {t} = useTranslation();
const [ballot, dispatch] = useBallot();
const [voting, setVoting] = useState(false);
const [payload, setPayload] = useState(null);
const [error, setError] = useState(null);
useEffect(() => {
dispatch({
type: BallotTypes.ELECTION,
election: election,
});
}, []);
if (!ballot.election) {
return "Loading..."
;
}
const handleSubmit = async (event) => {
event.preventDefault();
setVoting(true);
try {
const res = await castBallot(ballot.votes, ballot.election, token);
if (res.status !== 200) {
console.error(res);
const msg = await res.json();
setError(msg);
} else {
const msg = await res.json();
setPayload(msg);
}
} catch (err) {
console.error(err);
setError(err.message);
}
};
if (voting) {
return (
);
}
return (
);
};
const Ballot = (props) => {
return (
);
};
export default Ballot;