diff --git a/app/javascript/mastodon/components/poll.js b/app/javascript/mastodon/components/poll.js
index 690f9ae5a0..373f710d3c 100644
--- a/app/javascript/mastodon/components/poll.js
+++ b/app/javascript/mastodon/components/poll.js
@@ -32,8 +32,38 @@ class Poll extends ImmutablePureComponent {
state = {
selected: {},
+ expired: null,
};
+ static getDerivedStateFromProps (props, state) {
+ const { poll, intl } = props;
+ const expired = poll.get('expired') || (new Date(poll.get('expires_at'))).getTime() < intl.now();
+ return (expired === state.expired) ? null : { expired };
+ }
+
+ componentDidMount () {
+ this._setupTimer();
+ }
+
+ componentDidUpdate () {
+ this._setupTimer();
+ }
+
+ componentWillUnmount () {
+ clearTimeout(this._timer);
+ }
+
+ _setupTimer () {
+ const { poll, intl } = this.props;
+ clearTimeout(this._timer);
+ if (!this.state.expired) {
+ const delay = (new Date(poll.get('expires_at'))).getTime() - intl.now();
+ this._timer = setTimeout(() => {
+ this.setState({ expired: true });
+ }, delay);
+ }
+ }
+
handleOptionChange = e => {
const { target: { value } } = e;
@@ -68,12 +98,11 @@ class Poll extends ImmutablePureComponent {
this.props.dispatch(fetchPoll(this.props.poll.get('id')));
};
- renderOption (option, optionIndex) {
+ renderOption (option, optionIndex, showResults) {
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');
let titleEmojified = option.get('title_emojified');
if (!titleEmojified) {
@@ -112,19 +141,20 @@ class Poll extends ImmutablePureComponent {
render () {
const { poll, intl } = this.props;
+ const { expired } = this.state;
if (!poll) {
return null;
}
- const timeRemaining = poll.get('expired') ? intl.formatMessage(messages.closed) :