From a5fdd41b03ee31c99c7227605a3bd304030a5218 Mon Sep 17 00:00:00 2001 From: Tim Vahlbrock Date: Fri, 1 Nov 2024 00:33:14 +0100 Subject: [PATCH] Add dialog to display detailed votes --- .../views/dialogs/PollResultsDialog.tsx | 60 +++++++++++++++++++ src/components/views/messages/MPollBody.tsx | 13 +++- 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 src/components/views/dialogs/PollResultsDialog.tsx diff --git a/src/components/views/dialogs/PollResultsDialog.tsx b/src/components/views/dialogs/PollResultsDialog.tsx new file mode 100644 index 0000000000..d16c1ba584 --- /dev/null +++ b/src/components/views/dialogs/PollResultsDialog.tsx @@ -0,0 +1,60 @@ +/* +Copyright 2024 New Vector Ltd. +Copyright 2021, 2022 The Matrix.org Foundation C.I.C. + +SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only +Please see LICENSE files in the repository root for full details. +*/ + +import { PollStartEvent } from "matrix-js-sdk/src/extensible_events_v1/PollStartEvent"; +import { RoomMember } from "matrix-js-sdk/src/matrix"; +import React from "react"; + +import Modal from "../../../Modal"; +import MemberAvatar from "../avatars/MemberAvatar"; +import { UserVote } from "../messages/MPollBody"; +import BaseDialog from "./BaseDialog"; + +interface IProps { + pollEvent: PollStartEvent; + votes: Map; + members: RoomMember[]; +} + +export default function PollResultsDialog (props: IProps): JSX.Element { + return ( + Modal.closeCurrentModal()} + > + { + props.pollEvent.answers.map((answer, answerIndex) => { + const votes = props.votes.get(answer.id) || []; + + if(votes.length === 0) return; + + return ( +
+
+ {answer.text} + {votes.length} votes +
+ {votes.length === 0 &&
No one voted for this.
} + {votes.map((vote) => { + const member = props.members.find(m => m.userId === vote.sender); + if (!member) return null; + return
+
+
+ {member.name} +
; + })} + {answerIndex < props.pollEvent.answers.length - 1 &&
} +
+ ); + }) + } +
+ ); +} diff --git a/src/components/views/messages/MPollBody.tsx b/src/components/views/messages/MPollBody.tsx index fb919bd1d9..7bf921f5dd 100644 --- a/src/components/views/messages/MPollBody.tsx +++ b/src/components/views/messages/MPollBody.tsx @@ -29,6 +29,7 @@ import { MatrixClientPeg } from "../../../MatrixClientPeg"; import Modal from "../../../Modal"; import { formatList } from "../../../utils/FormattingUtils"; import ErrorDialog from "../dialogs/ErrorDialog"; +import PollResultsDialog from "../dialogs/PollResultsDialog"; import PollCreateDialog from "../elements/PollCreateDialog"; import Spinner from "../elements/Spinner"; import { PollOption } from "../polls/PollOption"; @@ -324,6 +325,16 @@ export default class MPollBody extends React.Component { ({_t("common|edited")}) ) : null; + const showDetailedVotes = (): void => { + if(!showResults) return; + + Modal.createDialog(PollResultsDialog, { + pollEvent, + votes, + members: this.context.getRoom(this.props.mxEvent.getRoomId())?.getJoinedMembers() ?? [], + }); + }; + return (

@@ -357,7 +368,7 @@ export default class MPollBody extends React.Component { })}

- {totalText} + showDetailedVotes()}>{totalText} {isFetchingResponses && }