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