Passed
Pull Request — main (#350)
by Alejandro
21:55
created

src/utils/dates/types/index.ts   A

Complexity

Total Complexity 7
Complexity/F 0

Size

Lines of Code 81
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 7
eloc 67
mnd 7
bc 7
fnc 0
dl 0
loc 81
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
rs 10
1
import moment from 'moment';
2
import { filter, isEmpty } from 'ramda';
3
import { formatInternational } from '../../helpers/date';
4
5
export interface DateRange {
6
  startDate?: moment.Moment | null;
7
  endDate?: moment.Moment | null;
8
}
9
10
export type DateInterval = 'today' | 'yesterday' | 'last7Days' | 'last30Days' | 'last90Days' | 'last180days' | 'last365Days';
11
12
export const dateRangeIsEmpty = (dateRange?: DateRange): boolean => dateRange === undefined
13
  || isEmpty(filter(Boolean, dateRange as any));
14
15
export const rangeIsInterval = (range?: DateRange | DateInterval): range is DateInterval => typeof range === 'string';
16
17
const INTERVAL_TO_STRING_MAP: Record<DateInterval, string> = {
18
  today: 'Today',
19
  yesterday: 'Yesterday',
20
  last7Days: 'Last 7 days',
21
  last30Days: 'Last 30 days',
22
  last90Days: 'Last 90 days',
23
  last180days: 'Last 180 days',
24
  last365Days: 'Last 365 days',
25
};
26
27
const dateRangeToString = (range?: DateRange): string | undefined => {
28
  if (!range || dateRangeIsEmpty(range)) {
29
    return undefined;
30
  }
31
32
  if (range.startDate && !range.endDate) {
33
    return `Since ${formatInternational(range.startDate)}`;
34
  }
35
36
  if (!range.startDate && range.endDate) {
37
    return `Until ${formatInternational(range.endDate)}`;
38
  }
39
40
  return `${formatInternational(range.startDate)} - ${formatInternational(range.endDate)}`;
41
};
42
43
export const rangeOrIntervalToString = (range?: DateRange | DateInterval): string | undefined => {
44
  if (!range) {
45
    return undefined;
46
  }
47
48
  if (!rangeIsInterval(range)) {
49
    return dateRangeToString(range);
50
  }
51
52
  return INTERVAL_TO_STRING_MAP[range];
53
};
54
55
export const intervalToDateRange = (dateInterval?: DateInterval): DateRange => {
56
  if (!dateInterval) {
57
    return {};
58
  }
59
60
  switch (dateInterval) {
61
    case 'today':
62
      return { startDate: moment().startOf('day'), endDate: moment() };
63
    case 'yesterday':
64
      const yesterday = moment().subtract(1, 'day');
65
66
      return { startDate: yesterday.startOf('day'), endDate: yesterday.endOf('day') };
67
    case 'last7Days':
68
      return { startDate: moment().subtract(7, 'days').startOf('day'), endDate: moment() };
69
    case 'last30Days':
70
      return { startDate: moment().subtract(30, 'days').startOf('day'), endDate: moment() };
71
    case 'last90Days':
72
      return { startDate: moment().subtract(90, 'days').startOf('day'), endDate: moment() };
73
    case 'last180days':
74
      return { startDate: moment().subtract(180, 'days').startOf('day'), endDate: moment() };
75
    case 'last365Days':
76
      return { startDate: moment().subtract(365, 'days').startOf('day'), endDate: moment() };
77
  }
78
79
  return {};
80
};
81