diff --git a/app/soapbox/actions/importer/normalizer.js b/app/soapbox/actions/importer/normalizer.js
index 6d566fd92..922e57986 100644
--- a/app/soapbox/actions/importer/normalizer.js
+++ b/app/soapbox/actions/importer/normalizer.js
@@ -74,8 +74,9 @@ export function normalizePoll(poll) {
const emojiMap = makeEmojiMap(normalPoll);
- normalPoll.options = poll.options.map(option => ({
+ normalPoll.options = poll.options.map((option, index) => ({
...option,
+ voted: poll.own_votes && poll.own_votes.includes(index),
title_emojified: emojify(escapeTextContentForBrowser(option.title), emojiMap),
}));
diff --git a/app/soapbox/components/poll.js b/app/soapbox/components/poll.js
index ae66ba18f..866182ca4 100644
--- a/app/soapbox/components/poll.js
+++ b/app/soapbox/components/poll.js
@@ -10,9 +10,12 @@ import spring from 'react-motion/lib/spring';
import escapeTextContentForBrowser from 'escape-html';
import emojify from 'soapbox/features/emoji/emoji';
import RelativeTimestamp from './relative_timestamp';
+import Icon from 'soapbox/components/icon';
const messages = defineMessages({
closed: { id: 'poll.closed', defaultMessage: 'Closed' },
+ voted: { id: 'poll.voted', defaultMessage: 'You voted for this answer' },
+ votes: { id: 'poll.votes', defaultMessage: '{votes, plural, one {# vote} other {# votes}}' },
});
const makeEmojiMap = record => record.get('emojis').reduce((obj, emoji) => {
@@ -34,9 +37,7 @@ class Poll extends ImmutablePureComponent {
selected: {},
};
- handleOptionChange = e => {
- const { target: { value } } = e;
-
+ _toggleOption = value => {
if (this.props.poll.get('multiple')) {
const tmp = { ...this.state.selected };
if (tmp[value]) {
@@ -50,8 +51,20 @@ class Poll extends ImmutablePureComponent {
tmp[value] = true;
this.setState({ selected: tmp });
}
+ }
+
+ handleOptionChange = ({ target: { value } }) => {
+ this._toggleOption(value);
};
+ handleOptionKeyPress = (e) => {
+ if (e.key === 'Enter' || e.key === ' ') {
+ this._toggleOption(e.target.getAttribute('data-index'));
+ e.stopPropagation();
+ e.preventDefault();
+ }
+ }
+
handleVote = () => {
if (this.props.disabled) {
return;
@@ -68,12 +81,13 @@ class Poll extends ImmutablePureComponent {
this.props.dispatch(fetchPoll(this.props.poll.get('id')));
};
- renderOption(option, optionIndex) {
- const { poll, disabled } = this.props;
- 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 showResults = poll.get('voted') || poll.get('expired');
+ renderOption(option, optionIndex, showResults) {
+ const { poll, disabled, intl } = this.props;
+
+ 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));
let titleEmojified = option.get('title_emojified');
if (!titleEmojified) {
@@ -101,8 +115,21 @@ class Poll extends ImmutablePureComponent {
disabled={disabled}
/>
- {!showResults && }
- {showResults && {Math.round(percent)}%}
+ {!showResults && (
+
+ )}
+ {showResults &&
+ {!!voted &&