From 17bbd4eaacc294a7c8aa1c21ce2a5fe1ee6ddc6e Mon Sep 17 00:00:00 2001 From: Kerry Date: Wed, 22 Feb 2023 23:51:44 +1300 Subject: [PATCH] Polls: show warning about undecryptable relations (#10179) * add decryption error message to MPollBody * test poll undecryptable message * tidy + ling * remove unused file --- src/components/views/messages/MPollBody.tsx | 6 +++++- src/i18n/strings/en_EN.json | 1 + test/components/views/messages/MPollBody-test.tsx | 14 ++++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/components/views/messages/MPollBody.tsx b/src/components/views/messages/MPollBody.tsx index 6a92185e61..62c53af518 100644 --- a/src/components/views/messages/MPollBody.tsx +++ b/src/components/views/messages/MPollBody.tsx @@ -182,12 +182,14 @@ export default class MPollBody extends React.Component { private addListeners(): void { this.state.poll?.on(PollEvent.Responses, this.onResponsesChange); this.state.poll?.on(PollEvent.End, this.onRelationsChange); + this.state.poll?.on(PollEvent.UndecryptableRelations, this.render.bind(this)); } private removeListeners(): void { if (this.state.poll) { this.state.poll.off(PollEvent.Responses, this.onResponsesChange); this.state.poll.off(PollEvent.End, this.onRelationsChange); + this.state.poll.off(PollEvent.UndecryptableRelations, this.render.bind(this)); } } @@ -297,7 +299,9 @@ export default class MPollBody extends React.Component { const showResults = poll.isEnded || (disclosed && myVote !== undefined); let totalText: string; - if (poll.isEnded) { + if (showResults && poll.undecryptableRelationsCount) { + totalText = _t("Due to decryption errors, some votes may not be counted"); + } else if (poll.isEnded) { totalText = _t("Final result based on %(count)s votes", { count: totalVotes }); } else if (!disclosed) { totalText = _t("Results will be visible when the poll is ended"); diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 076ccfdfb4..02647da3ff 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2405,6 +2405,7 @@ "Sorry, you can't edit a poll after votes have been cast.": "Sorry, you can't edit a poll after votes have been cast.", "Vote not registered": "Vote not registered", "Sorry, your vote was not registered. Please try again.": "Sorry, your vote was not registered. Please try again.", + "Due to decryption errors, some votes may not be counted": "Due to decryption errors, some votes may not be counted", "Final result based on %(count)s votes|other": "Final result based on %(count)s votes", "Final result based on %(count)s votes|one": "Final result based on %(count)s vote", "Results will be visible when the poll is ended": "Results will be visible when the poll is ended", diff --git a/test/components/views/messages/MPollBody-test.tsx b/test/components/views/messages/MPollBody-test.tsx index 2e411f2b7d..6cb3187603 100644 --- a/test/components/views/messages/MPollBody-test.tsx +++ b/test/components/views/messages/MPollBody-test.tsx @@ -765,6 +765,20 @@ describe("MPollBody", () => { expect(container).toMatchSnapshot(); }); + it("renders a warning message when poll has undecryptable relations", async () => { + const votes = [ + responseEvent("@op:example.com", "pizza", 12), + responseEvent("@op:example.com", [], 13), + responseEvent("@op:example.com", "italian", 14), + responseEvent("@me:example.com", "wings", 15), + responseEvent("@qr:example.com", "italian", 16), + ]; + + jest.spyOn(votes[1], "isDecryptionFailure").mockReturnValue(true); + const { getByText } = await newMPollBody(votes); + expect(getByText("Due to decryption errors, some votes may not be counted")).toBeInTheDocument(); + }); + it("renders a poll with local, non-local and invalid votes", async () => { const votes = [ responseEvent("@a:example.com", "pizza", 12),