diff --git a/app/soapbox/components/poll.js b/app/soapbox/components/poll.js
index d3ed22942..57d693003 100644
--- a/app/soapbox/components/poll.js
+++ b/app/soapbox/components/poll.js
@@ -105,7 +105,7 @@ class Poll extends ImmutablePureComponent {
const percent = poll.get('votes_count') === 0 ? 0 : (option.get('votes_count') / poll.get('votes_count')) * 100;
const leading = poll.get('options').filterNot(other => other.get('title') === option.get('title')).every(other => option.get('votes_count') >= other.get('votes_count'));
const active = !!this.state.selected[`${optionIndex}`];
- const voted = option.get('voted') || (poll.get('own_votes') && poll.get('own_votes').includes(optionIndex));
+ const voted = poll.own_votes?.includes(optionIndex);
let titleEmojified = option.get('title_emojified');
if (!titleEmojified) {
@@ -156,7 +156,7 @@ class Poll extends ImmutablePureComponent {
}
render() {
- const { me, poll, intl } = this.props;
+ const { poll, intl } = this.props;
if (!poll) {
return null;
@@ -165,7 +165,7 @@ class Poll extends ImmutablePureComponent {
const timeRemaining = poll.get('expired') ? intl.formatMessage(messages.closed) : ;
const showResults = poll.get('voted') || poll.get('expired');
const disabled = this.props.disabled || Object.entries(this.state.selected).every(item => !item);
- const voted = me && poll.get('own_votes').size > 0;
+ const voted = poll.voted;
return (
diff --git a/app/soapbox/normalizers/__tests__/status-test.js b/app/soapbox/normalizers/__tests__/status-test.js
index 54117e167..f3c836f23 100644
--- a/app/soapbox/normalizers/__tests__/status-test.js
+++ b/app/soapbox/normalizers/__tests__/status-test.js
@@ -147,7 +147,7 @@ describe('normalizeStatus', () => {
multiple: false,
voters_count: 0,
votes_count: 0,
- own_votes: [],
+ own_votes: null,
voted: false,
};
@@ -163,6 +163,6 @@ describe('normalizeStatus', () => {
// Adds logged-in fields
expect(result.poll.voted).toBe(false);
- expect(result.poll.own_votes).toEqual(fromJS([]));
+ expect(result.poll.own_votes).toBe(null);
});
});
diff --git a/app/soapbox/normalizers/status.ts b/app/soapbox/normalizers/status.ts
index 71210c502..727206265 100644
--- a/app/soapbox/normalizers/status.ts
+++ b/app/soapbox/normalizers/status.ts
@@ -57,11 +57,12 @@ const PollRecord = ImmutableRecord({
emojis: ImmutableList(),
expired: false,
expires_at: new Date(),
+ id: '',
multiple: false,
options: ImmutableList(),
voters_count: 0,
votes_count: 0,
- own_votes: ImmutableList(),
+ own_votes: null,
voted: false,
});
@@ -106,14 +107,42 @@ const normalizeMentions = (status: ImmutableMap
) => {
});
};
-// Normalize poll
-const normalizePoll = (status: ImmutableMap) => {
+// Normalize poll options
+const normalizePollOptions = (poll: ImmutableMap) => {
+ return poll.update('options', (options: ImmutableList>) => {
+ return options.map(PollOptionRecord);
+ });
+};
+
+// Normalize own_votes to `null` if empty (like Mastodon)
+const normalizePollOwnVotes = (poll: ImmutableMap) => {
+ return poll.update('own_votes', ownVotes => {
+ return ownVotes?.size > 0 ? ownVotes : null;
+ });
+};
+
+// Whether the user voted in the poll
+const normalizePollVoted = (poll: ImmutableMap) => {
+ return poll.update('voted', voted => {
+ return typeof voted === 'boolean' ? voted : poll.get('own_votes')?.size > 0;
+ });
+};
+
+// Normalize the actual poll
+const normalizePoll = (poll: ImmutableMap) => {
+ return PollRecord(
+ poll.withMutations((poll: ImmutableMap) => {
+ normalizePollOptions(poll);
+ normalizePollOwnVotes(poll);
+ normalizePollVoted(poll);
+ }),
+ );
+};
+
+// Normalize the poll in the status, if applicable
+const normalizeStatusPoll = (status: ImmutableMap) => {
if (status.hasIn(['poll', 'options'])) {
- return status.update('poll', ImmutableMap(), poll => {
- return PollRecord(poll).update('options', (options: ImmutableList>) => {
- return options.map(PollOptionRecord);
- });
- });
+ return status.update('poll', ImmutableMap(), normalizePoll);
} else {
return status.set('poll', null);
}
@@ -161,12 +190,12 @@ const fixQuote = (status: ImmutableMap) => {
});
};
-export const normalizeStatus = (status: ImmutableMap): IStatus => {
+export const normalizeStatus = (status: ImmutableMap): IStatus => {
return StatusRecord(
status.withMutations(status => {
normalizeAttachments(status);
normalizeMentions(status);
- normalizePoll(status);
+ normalizeStatusPoll(status);
fixMentionsOrder(status);
addSelfMention(status);
fixQuote(status);
diff --git a/app/soapbox/reducers/__tests__/polls-test.js b/app/soapbox/reducers/__tests__/polls-test.js
index c3ecd5152..b19ad858c 100644
--- a/app/soapbox/reducers/__tests__/polls-test.js
+++ b/app/soapbox/reducers/__tests__/polls-test.js
@@ -24,7 +24,7 @@ describe('polls reducer', () => {
multiple: false,
voters_count: 0,
votes_count: 0,
- own_votes: [],
+ own_votes: null,
voted: false,
},
};