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, }, };