[Glitch] Update poll remaining time just like with status timestamps
Port daab45d4ae000a208f251ce96334df47d894dba3 to glitch-soc
This commit is contained in:
		
							parent
							
								
									1682ac5717
								
							
						
					
					
						commit
						be6885eb93
					
				@ -9,41 +9,12 @@ import Motion from 'mastodon/features/ui/util/optional_motion';
 | 
			
		||||
import spring from 'react-motion/lib/spring';
 | 
			
		||||
import escapeTextContentForBrowser from 'escape-html';
 | 
			
		||||
import emojify from 'mastodon/features/emoji/emoji';
 | 
			
		||||
import RelativeTimestamp from './relative_timestamp';
 | 
			
		||||
 | 
			
		||||
const messages = defineMessages({
 | 
			
		||||
  moments: { id: 'time_remaining.moments', defaultMessage: 'Moments remaining' },
 | 
			
		||||
  seconds: { id: 'time_remaining.seconds', defaultMessage: '{number, plural, one {# second} other {# seconds}} left' },
 | 
			
		||||
  minutes: { id: 'time_remaining.minutes', defaultMessage: '{number, plural, one {# minute} other {# minutes}} left' },
 | 
			
		||||
  hours: { id: 'time_remaining.hours', defaultMessage: '{number, plural, one {# hour} other {# hours}} left' },
 | 
			
		||||
  days: { id: 'time_remaining.days', defaultMessage: '{number, plural, one {# day} other {# days}} left' },
 | 
			
		||||
  closed: { id: 'poll.closed', defaultMessage: 'Closed' },
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const SECOND = 1000;
 | 
			
		||||
const MINUTE = 1000 * 60;
 | 
			
		||||
const HOUR   = 1000 * 60 * 60;
 | 
			
		||||
const DAY    = 1000 * 60 * 60 * 24;
 | 
			
		||||
 | 
			
		||||
const timeRemainingString = (intl, date, now) => {
 | 
			
		||||
  const delta = date.getTime() - now;
 | 
			
		||||
 | 
			
		||||
  let relativeTime;
 | 
			
		||||
 | 
			
		||||
  if (delta < 10 * SECOND) {
 | 
			
		||||
    relativeTime = intl.formatMessage(messages.moments);
 | 
			
		||||
  } else if (delta < MINUTE) {
 | 
			
		||||
    relativeTime = intl.formatMessage(messages.seconds, { number: Math.floor(delta / SECOND) });
 | 
			
		||||
  } else if (delta < HOUR) {
 | 
			
		||||
    relativeTime = intl.formatMessage(messages.minutes, { number: Math.floor(delta / MINUTE) });
 | 
			
		||||
  } else if (delta < DAY) {
 | 
			
		||||
    relativeTime = intl.formatMessage(messages.hours, { number: Math.floor(delta / HOUR) });
 | 
			
		||||
  } else {
 | 
			
		||||
    relativeTime = intl.formatMessage(messages.days, { number: Math.floor(delta / DAY) });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return relativeTime;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const makeEmojiMap = record => record.get('emojis').reduce((obj, emoji) => {
 | 
			
		||||
  obj[`:${emoji.get('shortcode')}:`] = emoji.toJS();
 | 
			
		||||
  return obj;
 | 
			
		||||
@ -146,7 +117,7 @@ class Poll extends ImmutablePureComponent {
 | 
			
		||||
      return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const timeRemaining = poll.get('expired') ? intl.formatMessage(messages.closed) : timeRemainingString(intl, new Date(poll.get('expires_at')), intl.now());
 | 
			
		||||
    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 disabled      = this.props.disabled || Object.entries(this.state.selected).every(item => !item);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -8,6 +8,11 @@ const messages = defineMessages({
 | 
			
		||||
  minutes: { id: 'relative_time.minutes', defaultMessage: '{number}m' },
 | 
			
		||||
  hours: { id: 'relative_time.hours', defaultMessage: '{number}h' },
 | 
			
		||||
  days: { id: 'relative_time.days', defaultMessage: '{number}d' },
 | 
			
		||||
  moments_remaining: { id: 'time_remaining.moments', defaultMessage: 'Moments remaining' },
 | 
			
		||||
  seconds_remaining: { id: 'time_remaining.seconds', defaultMessage: '{number, plural, one {# second} other {# seconds}} left' },
 | 
			
		||||
  minutes_remaining: { id: 'time_remaining.minutes', defaultMessage: '{number, plural, one {# minute} other {# minutes}} left' },
 | 
			
		||||
  hours_remaining: { id: 'time_remaining.hours', defaultMessage: '{number, plural, one {# hour} other {# hours}} left' },
 | 
			
		||||
  days_remaining: { id: 'time_remaining.days', defaultMessage: '{number, plural, one {# day} other {# days}} left' },
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const dateFormatOptions = {
 | 
			
		||||
@ -86,13 +91,34 @@ export const timeAgoString = (intl, date, now, year) => {
 | 
			
		||||
  return relativeTime;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@injectIntl
 | 
			
		||||
export default class RelativeTimestamp extends React.Component {
 | 
			
		||||
const timeRemainingString = (intl, date, now) => {
 | 
			
		||||
  const delta = date.getTime() - now;
 | 
			
		||||
 | 
			
		||||
  let relativeTime;
 | 
			
		||||
 | 
			
		||||
  if (delta < 10 * SECOND) {
 | 
			
		||||
    relativeTime = intl.formatMessage(messages.moments_remaining);
 | 
			
		||||
  } else if (delta < MINUTE) {
 | 
			
		||||
    relativeTime = intl.formatMessage(messages.seconds_remaining, { number: Math.floor(delta / SECOND) });
 | 
			
		||||
  } else if (delta < HOUR) {
 | 
			
		||||
    relativeTime = intl.formatMessage(messages.minutes_remaining, { number: Math.floor(delta / MINUTE) });
 | 
			
		||||
  } else if (delta < DAY) {
 | 
			
		||||
    relativeTime = intl.formatMessage(messages.hours_remaining, { number: Math.floor(delta / HOUR) });
 | 
			
		||||
  } else {
 | 
			
		||||
    relativeTime = intl.formatMessage(messages.days_remaining, { number: Math.floor(delta / DAY) });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return relativeTime;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export default @injectIntl
 | 
			
		||||
class RelativeTimestamp extends React.Component {
 | 
			
		||||
 | 
			
		||||
  static propTypes = {
 | 
			
		||||
    intl: PropTypes.object.isRequired,
 | 
			
		||||
    timestamp: PropTypes.string.isRequired,
 | 
			
		||||
    year: PropTypes.number.isRequired,
 | 
			
		||||
    futureDate: PropTypes.bool,
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  state = {
 | 
			
		||||
@ -145,10 +171,10 @@ export default class RelativeTimestamp extends React.Component {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  render () {
 | 
			
		||||
    const { timestamp, intl, year } = this.props;
 | 
			
		||||
    const { timestamp, intl, year, futureDate } = this.props;
 | 
			
		||||
 | 
			
		||||
    const date         = new Date(timestamp);
 | 
			
		||||
    const relativeTime = timeAgoString(intl, date, this.state.now, year);
 | 
			
		||||
    const relativeTime = futureDate ? timeRemainingString(intl, date, this.state.now) : timeAgoString(intl, date, this.state.now, year);
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
      <time dateTime={timestamp} title={intl.formatDate(date, dateFormatOptions)}>
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user