UNPKG

@nteract/timeago

Version:

A simple Time-Ago component for React

79 lines (56 loc) 2.88 kB
"use strict"; 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); }; }