More poll normalization fixes
This commit is contained in:
parent
84a364a7d2
commit
4bd1531056
4 changed files with 45 additions and 16 deletions
|
@ -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 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 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 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');
|
let titleEmojified = option.get('title_emojified');
|
||||||
if (!titleEmojified) {
|
if (!titleEmojified) {
|
||||||
|
@ -156,7 +156,7 @@ class Poll extends ImmutablePureComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { me, poll, intl } = this.props;
|
const { poll, intl } = this.props;
|
||||||
|
|
||||||
if (!poll) {
|
if (!poll) {
|
||||||
return null;
|
return null;
|
||||||
|
@ -165,7 +165,7 @@ class Poll extends ImmutablePureComponent {
|
||||||
const timeRemaining = poll.get('expired') ? intl.formatMessage(messages.closed) : <RelativeTimestamp timestamp={poll.get('expires_at')} futureDate />;
|
const timeRemaining = poll.get('expired') ? intl.formatMessage(messages.closed) : <RelativeTimestamp timestamp={poll.get('expires_at')} futureDate />;
|
||||||
const showResults = poll.get('voted') || poll.get('expired');
|
const showResults = poll.get('voted') || poll.get('expired');
|
||||||
const disabled = this.props.disabled || Object.entries(this.state.selected).every(item => !item);
|
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 (
|
return (
|
||||||
<div className={classNames('poll', { voted })}>
|
<div className={classNames('poll', { voted })}>
|
||||||
|
|
|
@ -147,7 +147,7 @@ describe('normalizeStatus', () => {
|
||||||
multiple: false,
|
multiple: false,
|
||||||
voters_count: 0,
|
voters_count: 0,
|
||||||
votes_count: 0,
|
votes_count: 0,
|
||||||
own_votes: [],
|
own_votes: null,
|
||||||
voted: false,
|
voted: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -163,6 +163,6 @@ describe('normalizeStatus', () => {
|
||||||
|
|
||||||
// Adds logged-in fields
|
// Adds logged-in fields
|
||||||
expect(result.poll.voted).toBe(false);
|
expect(result.poll.voted).toBe(false);
|
||||||
expect(result.poll.own_votes).toEqual(fromJS([]));
|
expect(result.poll.own_votes).toBe(null);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -57,11 +57,12 @@ const PollRecord = ImmutableRecord({
|
||||||
emojis: ImmutableList(),
|
emojis: ImmutableList(),
|
||||||
expired: false,
|
expired: false,
|
||||||
expires_at: new Date(),
|
expires_at: new Date(),
|
||||||
|
id: '',
|
||||||
multiple: false,
|
multiple: false,
|
||||||
options: ImmutableList(),
|
options: ImmutableList(),
|
||||||
voters_count: 0,
|
voters_count: 0,
|
||||||
votes_count: 0,
|
votes_count: 0,
|
||||||
own_votes: ImmutableList(),
|
own_votes: null,
|
||||||
voted: false,
|
voted: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -106,14 +107,42 @@ const normalizeMentions = (status: ImmutableMap<string, any>) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
// Normalize poll
|
// Normalize poll options
|
||||||
const normalizePoll = (status: ImmutableMap<string, any>) => {
|
const normalizePollOptions = (poll: ImmutableMap<string, any>) => {
|
||||||
|
return poll.update('options', (options: ImmutableList<ImmutableMap<string, any>>) => {
|
||||||
|
return options.map(PollOptionRecord);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
// Normalize own_votes to `null` if empty (like Mastodon)
|
||||||
|
const normalizePollOwnVotes = (poll: ImmutableMap<string, any>) => {
|
||||||
|
return poll.update('own_votes', ownVotes => {
|
||||||
|
return ownVotes?.size > 0 ? ownVotes : null;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
// Whether the user voted in the poll
|
||||||
|
const normalizePollVoted = (poll: ImmutableMap<string, any>) => {
|
||||||
|
return poll.update('voted', voted => {
|
||||||
|
return typeof voted === 'boolean' ? voted : poll.get('own_votes')?.size > 0;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
// Normalize the actual poll
|
||||||
|
const normalizePoll = (poll: ImmutableMap<string, any>) => {
|
||||||
|
return PollRecord(
|
||||||
|
poll.withMutations((poll: ImmutableMap<string, any>) => {
|
||||||
|
normalizePollOptions(poll);
|
||||||
|
normalizePollOwnVotes(poll);
|
||||||
|
normalizePollVoted(poll);
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Normalize the poll in the status, if applicable
|
||||||
|
const normalizeStatusPoll = (status: ImmutableMap<string, any>) => {
|
||||||
if (status.hasIn(['poll', 'options'])) {
|
if (status.hasIn(['poll', 'options'])) {
|
||||||
return status.update('poll', ImmutableMap(), poll => {
|
return status.update('poll', ImmutableMap(), normalizePoll);
|
||||||
return PollRecord(poll).update('options', (options: ImmutableList<ImmutableMap<string, any>>) => {
|
|
||||||
return options.map(PollOptionRecord);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
} else {
|
} else {
|
||||||
return status.set('poll', null);
|
return status.set('poll', null);
|
||||||
}
|
}
|
||||||
|
@ -161,12 +190,12 @@ const fixQuote = (status: ImmutableMap<string, any>) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
export const normalizeStatus = (status: ImmutableMap<any, string>): IStatus => {
|
export const normalizeStatus = (status: ImmutableMap<string, any>): IStatus => {
|
||||||
return StatusRecord(
|
return StatusRecord(
|
||||||
status.withMutations(status => {
|
status.withMutations(status => {
|
||||||
normalizeAttachments(status);
|
normalizeAttachments(status);
|
||||||
normalizeMentions(status);
|
normalizeMentions(status);
|
||||||
normalizePoll(status);
|
normalizeStatusPoll(status);
|
||||||
fixMentionsOrder(status);
|
fixMentionsOrder(status);
|
||||||
addSelfMention(status);
|
addSelfMention(status);
|
||||||
fixQuote(status);
|
fixQuote(status);
|
||||||
|
|
|
@ -24,7 +24,7 @@ describe('polls reducer', () => {
|
||||||
multiple: false,
|
multiple: false,
|
||||||
voters_count: 0,
|
voters_count: 0,
|
||||||
votes_count: 0,
|
votes_count: 0,
|
||||||
own_votes: [],
|
own_votes: null,
|
||||||
voted: false,
|
voted: false,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue