codekingpro/portable-devtools
115k
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.default = relativeDateFactory;
7var calculateDelta = function calculateDelta(now, date) {
8 return Math.round(Math.abs(now - date) / 1000);
9};
10
11function relativeDateFactory(translations) {
12 return function relativeDate(date) {
13 var now = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Date();
14
15 if (!(date instanceof Date)) {
16 date = new Date(date);
17 }
18
19 var delta = null;
20
21 var minute = 60;
22 var hour = minute * 60;
23 var day = hour * 24;
24 var week = day * 7;
25 var month = day * 30;
26 var year = day * 365;
27
28 delta = calculateDelta(now, date);
29
30 if (delta > day && delta < week) {
31 date = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);
32 delta = calculateDelta(now, date);
33 }
34
35 var translate = function translate(translatePhrase, timeValue, rawValue) {
36 var key = void 0;
37
38 if (translatePhrase === 'justNow') {
39 key = translatePhrase;
40 } else if (now >= date) {
41 key = translatePhrase + 'Ago';
42 } else {
43 key = translatePhrase + 'FromNow';
44 }
45
46 var translation = translations[key];
47
48 if (typeof translation === 'function') {
49 return translation(timeValue, rawValue);
50 }
51
52 return translation.replace('{{time}}', timeValue);
53 };
54
55 switch (false) {
56 case !(delta < 30):
57 return translate('justNow', delta, delta);
58
59 case !(delta < minute):
60 return translate('seconds', delta, delta);
61
62 case !(delta < 2 * minute):
63 return translate('aMinute', 1, delta);
64
65 case !(delta < hour):
66 return translate('minutes', Math.floor(delta / minute), delta);
67
68 case Math.floor(delta / hour) !== 1:
69 return translate('anHour', Math.floor(delta / minute), delta);
70
71 case !(delta < day):
72 return translate('hours', Math.floor(delta / hour), delta);
73
74 case !(delta < day * 2):
75 return translate('aDay', 1, delta);
76
77 case !(delta < week):
78 return translate('days', Math.floor(delta / day), delta);
79
80 case Math.floor(delta / week) !== 1:
81 return translate('aWeek', 1, delta);
82
83 case !(delta < month):
84 return translate('weeks', Math.floor(delta / week), delta);
85
86 case Math.floor(delta / month) !== 1:
87 return translate('aMonth', 1, delta);
88
89 case !(delta < year):
90 return translate('months', Math.floor(delta / month), delta);
91
92 case Math.floor(delta / year) !== 1:
93 return translate('aYear', 1, delta);
94
95 default:
96 return translate('overAYear', Math.floor(delta / year), delta);
97 }
98 };
99}
100module.exports = exports['default'];