@nteract/timeago
Version:
A simple Time-Ago component for React
79 lines (56 loc) • 2.88 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = buildFormatter;
var _now = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/date/now"));
var _parseInt2 = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/parse-int"));
// If the numbers array is present, format numbers with it,
// otherwise just cast the number to a string and return it
var normalizeNumber = function normalizeNumber(numbers, value) {
return numbers && numbers.length === 10 ? String(value).split("").map(function (digit) {
return digit.match(/^[0-9]$/) ? numbers[(0, _parseInt2.default)(digit)] : digit;
}).join("") : String(value);
}; // Take a string or a function that takes number of days and returns a string
// and provide a uniform API to create string parts
var normalizeFn = function normalizeFn(value, millisDelta, numbers) {
return function (stringOrFn) {
return typeof stringOrFn === "function" ? stringOrFn(value, millisDelta).replace(/%d/g, normalizeNumber(numbers, value)) : stringOrFn.replace(/%d/g, normalizeNumber(numbers, value));
};
};
function buildFormatter(strings) {
return function formatter(value, unit, suffix, epochMillis) {
// convert weeks to days if strings don't handle weeks
var now = (0, _now.default)();
if (unit === "week" && !strings.week && !strings.weeks) {
var days = Math.round(Math.abs(epochMillis - now) / (1000 * 60 * 60 * 24));
value = days;
unit = "day";
} // create a normalize function for given value
var normalize = normalizeFn(value, now - epochMillis, strings.numbers); // The eventual return value stored in an array so that the wordSeparator can be used
var dateString = []; // handle prefixes
if (suffix === "ago" && strings.prefixAgo) {
dateString.push(normalize(strings.prefixAgo));
}
if (suffix === "from now" && strings.prefixFromNow) {
dateString.push(normalize(strings.prefixFromNow));
} // Handle Main number and unit
var isPlural = value > 1;
if (isPlural) {
var stringFn = strings[unit + "s"] || strings[unit] || "%d " + unit;
dateString.push(normalize(stringFn));
} else {
var _stringFn = strings[unit] || strings[unit + "s"] || "%d " + unit;
dateString.push(normalize(_stringFn));
} // Handle Suffixes
if (suffix === "ago" && strings.suffixAgo) {
dateString.push(normalize(strings.suffixAgo));
}
if (suffix === "from now" && strings.suffixFromNow) {
dateString.push(normalize(strings.suffixFromNow));
} // join the array into a string and return it
var wordSeparator = typeof strings.wordSeparator === "string" ? strings.wordSeparator : " ";
return dateString.join(wordSeparator);
};
}