Team Ai
Datasetpublic

codekingpro/portable-devtools

sourceHugging Faceupdated 5mo agoView on Hugging Face
1likes15kdownloads
factory.js113 linesDownload Raw Back to src
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 
codekingpro/portable-devtools · Team Ai