aboutsummaryrefslogtreecommitdiff
path: root/src/components/DateString/compactDateString.ts
blob: dffd912f35e98d71ce87449339a18e7fad4f43a6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
const metrics = [
  { name: 'minute', ratio: 60 },
  { name: 'hour', ratio: 60 },
  { name: 'day', ratio: 24 },
  { name: 'week', ratio: 7 },
  { name: 'month', ratio: 4 },
  { name: 'year', ratio: 12 }
];

const PRECISION = 0.75;

const resolve = (value: number, metricIndex = 0): string => {
  // Recursively divide value until it's ready to be presented as a string
  const metric = metrics[metricIndex];
  const nextMetric = metrics[metricIndex + 1];
  const newValue = value / metric.ratio;

  if (newValue < nextMetric.ratio * PRECISION) {
    const rounded = Math.round(newValue);
    const isPlural = rounded > 1;
    const count = isPlural ? rounded : 'a';
    const ending = isPlural ? 's' : '';
    return `${count} ${metric.name}${ending} ago`;
  }
  return resolve(newValue, metricIndex + 1);
};

const compactDateString = (date: Date): string => {
  const now = new Date();
  const diff = (now.valueOf() - date.valueOf()) / 1000;
  return resolve(diff);
};

export default compactDateString;