You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
186 lines
7.1 KiB
186 lines
7.1 KiB
"use strict";
|
|
var __extends = (this && this.__extends) || (function () {
|
|
var extendStatics = function (d, b) {
|
|
extendStatics = Object.setPrototypeOf ||
|
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
|
|
return extendStatics(d, b);
|
|
};
|
|
return function (d, b) {
|
|
extendStatics(d, b);
|
|
function __() { this.constructor = d; }
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
};
|
|
})();
|
|
var __assign = (this && this.__assign) || function () {
|
|
__assign = Object.assign || function(t) {
|
|
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
s = arguments[i];
|
|
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
t[p] = s[p];
|
|
}
|
|
return t;
|
|
};
|
|
return __assign.apply(this, arguments);
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
/*
|
|
* Copyright 2015, Yahoo Inc.
|
|
* Copyrights licensed under the New BSD License.
|
|
* See the accompanying LICENSE file for terms.
|
|
*/
|
|
var React = require("react");
|
|
var injectIntl_1 = require("./injectIntl");
|
|
var utils_1 = require("../utils");
|
|
var intl_utils_1 = require("@formatjs/intl-utils");
|
|
var MINUTE = 60;
|
|
var HOUR = 60 * 60;
|
|
var DAY = 60 * 60 * 24;
|
|
function selectUnit(seconds) {
|
|
var absValue = Math.abs(seconds);
|
|
if (absValue < MINUTE) {
|
|
return 'second';
|
|
}
|
|
if (absValue < HOUR) {
|
|
return 'minute';
|
|
}
|
|
if (absValue < DAY) {
|
|
return 'hour';
|
|
}
|
|
return 'day';
|
|
}
|
|
function getDurationInSeconds(unit) {
|
|
switch (unit) {
|
|
case 'second':
|
|
return 1;
|
|
case 'minute':
|
|
return MINUTE;
|
|
case 'hour':
|
|
return HOUR;
|
|
default:
|
|
return DAY;
|
|
}
|
|
}
|
|
function valueToSeconds(value, unit) {
|
|
if (!value) {
|
|
return 0;
|
|
}
|
|
switch (unit) {
|
|
case 'second':
|
|
return value;
|
|
case 'minute':
|
|
return value * MINUTE;
|
|
default:
|
|
return value * HOUR;
|
|
}
|
|
}
|
|
var INCREMENTABLE_UNITS = ['second', 'minute', 'hour'];
|
|
function canIncrement(unit) {
|
|
if (unit === void 0) { unit = 'second'; }
|
|
return INCREMENTABLE_UNITS.includes(unit);
|
|
}
|
|
var FormattedRelativeTime = /** @class */ (function (_super) {
|
|
__extends(FormattedRelativeTime, _super);
|
|
function FormattedRelativeTime(props) {
|
|
var _this = _super.call(this, props) || this;
|
|
// Public for testing
|
|
_this._updateTimer = null;
|
|
_this.state = {
|
|
prevUnit: _this.props.unit,
|
|
prevValue: _this.props.value,
|
|
currentValueInSeconds: canIncrement(_this.props.unit)
|
|
? valueToSeconds(_this.props.value, _this.props.unit)
|
|
: 0,
|
|
};
|
|
intl_utils_1.invariant(!props.updateIntervalInSeconds ||
|
|
!!(props.updateIntervalInSeconds && canIncrement(props.unit)), 'Cannot schedule update with unit longer than hour');
|
|
return _this;
|
|
}
|
|
FormattedRelativeTime.prototype.scheduleNextUpdate = function (_a, _b) {
|
|
var _this = this;
|
|
var updateIntervalInSeconds = _a.updateIntervalInSeconds, unit = _a.unit;
|
|
var currentValueInSeconds = _b.currentValueInSeconds;
|
|
clearTimeout(this._updateTimer);
|
|
this._updateTimer = null;
|
|
// If there's no interval and we cannot increment this unit, do nothing
|
|
if (!updateIntervalInSeconds || !canIncrement(unit)) {
|
|
return;
|
|
}
|
|
// Figure out the next interesting time
|
|
var nextValueInSeconds = currentValueInSeconds - updateIntervalInSeconds;
|
|
var nextUnit = selectUnit(nextValueInSeconds);
|
|
// We've reached the max auto incrementable unit, don't schedule another update
|
|
if (nextUnit === 'day') {
|
|
return;
|
|
}
|
|
var unitDuration = getDurationInSeconds(nextUnit);
|
|
var remainder = nextValueInSeconds % unitDuration;
|
|
var prevInterestingValueInSeconds = nextValueInSeconds - remainder;
|
|
var nextInterestingValueInSeconds = prevInterestingValueInSeconds >= currentValueInSeconds
|
|
? prevInterestingValueInSeconds - unitDuration
|
|
: prevInterestingValueInSeconds;
|
|
var delayInSeconds = Math.abs(nextInterestingValueInSeconds - currentValueInSeconds);
|
|
this._updateTimer = setTimeout(function () {
|
|
return _this.setState({
|
|
currentValueInSeconds: nextInterestingValueInSeconds,
|
|
});
|
|
}, delayInSeconds * 1e3);
|
|
};
|
|
FormattedRelativeTime.prototype.componentDidMount = function () {
|
|
this.scheduleNextUpdate(this.props, this.state);
|
|
};
|
|
FormattedRelativeTime.prototype.componentDidUpdate = function () {
|
|
this.scheduleNextUpdate(this.props, this.state);
|
|
};
|
|
FormattedRelativeTime.prototype.componentWillUnmount = function () {
|
|
clearTimeout(this._updateTimer);
|
|
this._updateTimer = null;
|
|
};
|
|
FormattedRelativeTime.getDerivedStateFromProps = function (props, state) {
|
|
if (props.unit !== state.prevUnit || props.value !== state.prevValue) {
|
|
return {
|
|
prevValue: props.value,
|
|
prevUnit: props.unit,
|
|
currentValueInSeconds: canIncrement(props.unit)
|
|
? valueToSeconds(props.value, props.unit)
|
|
: 0,
|
|
};
|
|
}
|
|
return null;
|
|
};
|
|
FormattedRelativeTime.prototype.render = function () {
|
|
var _this = this;
|
|
return (React.createElement(injectIntl_1.Context.Consumer, null, function (intl) {
|
|
utils_1.invariantIntlContext(intl);
|
|
var formatRelativeTime = intl.formatRelativeTime, Text = intl.textComponent;
|
|
var _a = _this.props, children = _a.children, value = _a.value, unit = _a.unit, updateIntervalInSeconds = _a.updateIntervalInSeconds;
|
|
var currentValueInSeconds = _this.state.currentValueInSeconds;
|
|
var currentValue = value || 0;
|
|
var currentUnit = unit;
|
|
if (canIncrement(unit) &&
|
|
typeof currentValueInSeconds === 'number' &&
|
|
updateIntervalInSeconds) {
|
|
currentUnit = selectUnit(currentValueInSeconds);
|
|
var unitDuration = getDurationInSeconds(currentUnit);
|
|
currentValue = Math.round(currentValueInSeconds / unitDuration);
|
|
}
|
|
var formattedRelativeTime = formatRelativeTime(currentValue, currentUnit, __assign({}, _this.props));
|
|
if (typeof children === 'function') {
|
|
return children(formattedRelativeTime);
|
|
}
|
|
if (Text) {
|
|
return React.createElement(Text, null, formattedRelativeTime);
|
|
}
|
|
return formattedRelativeTime;
|
|
}));
|
|
};
|
|
FormattedRelativeTime.displayName = 'FormattedRelativeTime';
|
|
FormattedRelativeTime.defaultProps = {
|
|
value: 0,
|
|
unit: 'second',
|
|
};
|
|
return FormattedRelativeTime;
|
|
}(React.PureComponent));
|
|
exports.FormattedRelativeTime = FormattedRelativeTime;
|
|
exports.default = FormattedRelativeTime;
|