/* Copyright 2024 New Vector Ltd. Copyright 2023 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial Please see LICENSE files in the repository root for full details. */ import React, { type ReactNode } from "react"; import classNames from "classnames"; import { type PollAnswerSubevent } from "matrix-js-sdk/src/extensible_events_v1/PollStartEvent"; import { _t } from "../../../languageHandler"; import { Icon as TrophyIcon } from "../../../../res/img/element-icons/trophy.svg"; import StyledRadioButton from "../elements/StyledRadioButton"; type PollOptionContentProps = { answer: PollAnswerSubevent; voteCount: number; displayVoteCount?: boolean; isWinner?: boolean; }; const PollOptionContent: React.FC = ({ isWinner, answer, voteCount, displayVoteCount }) => { const votesText = displayVoteCount ? _t("timeline|m.poll|count_of_votes", { count: voteCount }) : ""; return (
{answer.text}
{isWinner && } {votesText}
); }; interface PollOptionProps extends PollOptionContentProps { pollId: string; totalVoteCount: number; isEnded?: boolean; isChecked?: boolean; onOptionSelected?: (id: string) => void; children?: ReactNode; } const EndedPollOption: React.FC> = ({ isChecked, children, answer, }) => (
{children}
); const ActivePollOption: React.FC> = ({ pollId, isChecked, children, answer, onOptionSelected, }) => ( onOptionSelected?.(answer.id)} > {children} ); export const PollOption: React.FC = ({ pollId, answer, voteCount, totalVoteCount, displayVoteCount, isEnded, isChecked, onOptionSelected, }) => { const cls = classNames({ mx_PollOption: true, mx_PollOption_checked: isChecked, mx_PollOption_ended: isEnded, }); const isWinner = isEnded && isChecked; const answerPercent = totalVoteCount === 0 ? 0 : Math.round((100.0 * voteCount) / totalVoteCount); const PollOptionWrapper = isEnded ? EndedPollOption : ActivePollOption; return (
onOptionSelected?.(answer.id)}>
); };