import moment from 'moment' import React from 'react' export default class RelativeTime extends React.Component { // Local state updates, to trigger a rerender // every second for time updates. componentDidMount() { this.timer = setInterval(() => { this.setState({ now: Date.now() }) }, 1000); } // Stop timer componentWillUnmount() { clearInterval(this.timer); } // Helper: Assert time is an instance of moment getTime() { if (!this.props.value) { return false; } let time = false; if (this.props.value instanceof moment) { time = this.props.value; } else { time = moment.utc(this.props.value); } return time } // Time can be capped, if we are handling a past // or future event: capTime(time) { const now = moment.utc(); if (this.props.pastEvent && time.isAfter(now)) { return now; } if (this.props.futureEvent && time.isBefore(now)) { return now; } return time; } render() { let time = this.getTime(); if (!time) { return null; // Well, nothing to do here } time = this.capTime(time); // A few seconds ago / in a few seconds can be replaced // with 'just now'. // fuzzyNow can be set as a threshold of seconds if (this.props.fuzzyNow) { const now = moment.utc(); if (Math.abs(now - time) / 1000.0 < this.props.fuzzyNow) { return ( just now ); } } return ( {time.fromNow(this.props.suffix)} ); } }