@nteract/timeago
Version:
A simple Time-Ago component for React
190 lines (147 loc) • 6.81 kB
JavaScript
;
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)();
}
});