// @flow import React, { useCallback } from 'react'; import { View, Text, FlatList, TouchableOpacity } from 'react-native'; import { useSelector } from 'react-redux'; import { getLocalParticipant } from '../../../base/participants'; import AbstractPollResults from '../AbstractPollResults'; import type { AbstractProps, AnswerInfo } from '../AbstractPollResults'; import { chatStyles, dialogStyles, resultsStyles } from './styles'; /** * Component that renders the poll results. * * @param {Props} props - The passed props. * @returns {React.Node} */ const PollResults = (props: AbstractProps) => { const { answers, changeVote, haveVoted, question, showDetails, t, toggleIsDetailed } = props; /** * Render a header summing up answer information. * * @param {string} answer - The name of the answer. * @param {number} percentage - The percentage of voters. * @param {number} nbVotes - The number of collected votes. * @returns {React.Node} */ const renderHeader = (answer: string, percentage: number, nbVotes: number) => ( { answer } ({nbVotes}) {percentage}% ); /** * Render voters of and answer. * * @param {AnswerInfo} answer - The answer info. * @returns {React.Node} */ const renderRow = useCallback((answer: AnswerInfo) => { const { name, percentage, voters, voterCount } = answer; if (showDetails) { return ( { renderHeader(name, percentage, voterCount) } { voters && voterCount > 0 && {voters.map(({ id, name: voterName }) => ( { voterName } ) )} } ); } // else, we display a simple list // We add a progress bar by creating an empty view of width equal to percentage. return ( { renderHeader(answer.name, percentage, voterCount) } ); }, [ showDetails ]); const localParticipant = useSelector(getLocalParticipant); /* eslint-disable react/jsx-no-bind */ return ( { question } { t('polls.by', { name: localParticipant.name }) } index.toString() } renderItem = { answer => renderRow(answer.item) } /> { showDetails ? t('polls.results.hideDetailedResults') : t('polls.results.showDetailedResults') } { haveVoted ? t('polls.results.changeVote') : t('polls.results.vote') } ); }; /* * We apply AbstractPollResults to fill in the AbstractProps common * to both the web and native implementations. */ // eslint-disable-next-line new-cap export default AbstractPollResults(PollResults);