UNPKG

@nteract/timeago

Version:

A simple Time-Ago component for React

190 lines (147 loc) 6.81 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime-corejs2/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.YEAR = exports.MONTH = exports.WEEK = exports.DAY = exports.HOUR = exports.MINUTE = void 0; var _now = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/date/now")); var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/extends")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/slicedToArray")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/objectWithoutProperties")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn")); var _getPrototypeOf3 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/assertThisInitialized")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _defaultFormatter = _interopRequireDefault(require("./defaultFormatter")); var _dateParser = _interopRequireDefault(require("./dateParser")); var MINUTE = 60; exports.MINUTE = MINUTE; var HOUR = MINUTE * 60; exports.HOUR = HOUR; var DAY = HOUR * 24; exports.DAY = DAY; var WEEK = DAY * 7; exports.WEEK = WEEK; var MONTH = DAY * 30; exports.MONTH = MONTH; var YEAR = DAY * 365; exports.YEAR = YEAR; var TimeAgo = /*#__PURE__*/ function (_React$Component) { (0, _inherits2.default)(TimeAgo, _React$Component); function TimeAgo() { var _getPrototypeOf2; var _this; (0, _classCallCheck2.default)(this, TimeAgo); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = (0, _possibleConstructorReturn2.default)(this, (_getPrototypeOf2 = (0, _getPrototypeOf3.default)(TimeAgo)).call.apply(_getPrototypeOf2, [this].concat(args))); (0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "isStillMounted", false); (0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "tick", function (refresh) { if (!_this.isStillMounted || !_this.props.live) { return; } var then = (0, _dateParser.default)(_this.props.date).valueOf(); if (!then) { console.warn("[@nteract/timeago] Invalid Date provided"); return; } var now = _this.props.now(); var seconds = Math.round(Math.abs(now - then) / 1000); var unboundPeriod = seconds < MINUTE ? 1000 : seconds < HOUR ? 1000 * MINUTE : seconds < DAY ? 1000 * HOUR : 0; var period = Math.min(Math.max(unboundPeriod, _this.props.minPeriod * 1000), _this.props.maxPeriod * 1000); if (period) { _this.timeoutId = setTimeout(_this.tick, period); } if (!refresh) { _this.forceUpdate(); } }); return _this; } (0, _createClass2.default)(TimeAgo, [{ key: "componentDidMount", value: function componentDidMount() { this.isStillMounted = true; if (this.props.live) { this.tick(true); } } }, { key: "componentDidUpdate", value: function componentDidUpdate(lastProps) { if (this.props.live !== lastProps.live || this.props.date !== lastProps.date) { if (!this.props.live && this.timeoutId) { clearTimeout(this.timeoutId); } this.tick(); } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { this.isStillMounted = false; if (this.timeoutId) { clearTimeout(this.timeoutId); this.timeoutId = undefined; } } }, { key: "render", value: function render() { /* eslint-disable no-unused-vars */ var _this$props = this.props, date = _this$props.date, formatter = _this$props.formatter, Komponent = _this$props.component, live = _this$props.live, minPeriod = _this$props.minPeriod, maxPeriod = _this$props.maxPeriod, title = _this$props.title, now = _this$props.now, passDownProps = (0, _objectWithoutProperties2.default)(_this$props, ["date", "formatter", "component", "live", "minPeriod", "maxPeriod", "title", "now"]); /* eslint-enable no-unused-vars */ var then = (0, _dateParser.default)(date).valueOf(); if (!then) { return null; } var timeNow = now(); var seconds = Math.round(Math.abs(timeNow - then) / 1000); var suffix = then <= timeNow ? "ago" : "from now"; var _ref = seconds < MINUTE ? [Math.round(seconds), "second"] : seconds < HOUR ? [Math.round(seconds / MINUTE), "minute"] : seconds < DAY ? [Math.round(seconds / HOUR), "hour"] : seconds < WEEK ? [Math.round(seconds / DAY), "day"] : seconds < MONTH ? [Math.round(seconds / WEEK), "week"] : seconds < YEAR ? [Math.round(seconds / MONTH), "month"] : [Math.round(seconds / YEAR), "year"], _ref2 = (0, _slicedToArray2.default)(_ref, 2), value = _ref2[0], unit = _ref2[1]; var passDownTitle = typeof title === "undefined" ? typeof date === "string" ? date : (0, _dateParser.default)(date).toISOString().substr(0, 16).replace("T", " ") : title; var dateTime = null; if (Komponent === "time") { dateTime = (0, _dateParser.default)(date).toISOString(); } var nextFormatter = _defaultFormatter.default.bind(null, value, unit, suffix); return React.createElement(Komponent, (0, _extends2.default)({}, passDownProps, { dateTime: dateTime, title: passDownTitle }), this.props.formatter(value, unit, suffix, then, nextFormatter)); } }]); return TimeAgo; }(React.Component); exports.default = TimeAgo; (0, _defineProperty2.default)(TimeAgo, "displayName", "TimeAgo"); (0, _defineProperty2.default)(TimeAgo, "defaultProps", { live: true, component: "time", minPeriod: 0, maxPeriod: Infinity, formatter: _defaultFormatter.default, now: function now() { return (0, _now.default)(); } });