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

src/utils/dates/DateRangeSelector.tsx   A

Complexity

Total Complexity 6
Complexity/F 0

Size

Lines of Code 76
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 6
eloc 63
mnd 6
bc 6
fnc 0
dl 0
loc 76
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
rs 10
1
import { useState } from 'react';
2
import { Dropdown, DropdownItem, DropdownMenu, DropdownToggle } from 'reactstrap';
3
import { useToggle } from '../helpers/hooks';
4
import {
5
  DateInterval,
6
  DateRange,
7
  dateRangeIsEmpty,
8
  rangeOrIntervalToString,
9
  intervalToDateRange,
10
  rangeIsInterval,
11
} from './types';
12
import DateRangeRow from './DateRangeRow';
13
import './DateRangeSelector.scss';
14
15
export interface DateRangeSelectorProps {
16
  initialDateRange?: DateInterval | DateRange;
17
  disabled?: boolean;
18
  onDatesChange: (dateRange: DateRange) => void;
19
  defaultText: string;
20
}
21
22
export const DateRangeSelector = (
23
  { onDatesChange, initialDateRange, defaultText, disabled = false }: DateRangeSelectorProps,
24
) => {
25
  const [ isOpen, toggle ] = useToggle();
26
  const [ activeInterval, setActiveInterval ] = useState(
27
    rangeIsInterval(initialDateRange) ? initialDateRange : undefined,
28
  );
29
  const [ activeDateRange, setActiveDateRange ] = useState(
30
    !rangeIsInterval(initialDateRange) ? initialDateRange : undefined,
31
  );
32
  const updateDateRange = (dateRange: DateRange) => {
33
    setActiveInterval(undefined);
34
    setActiveDateRange(dateRange);
35
    onDatesChange(dateRange);
36
  };
37
  const updateInterval = (dateInterval?: DateInterval) => () => {
38
    setActiveInterval(dateInterval);
39
    setActiveDateRange(undefined);
40
    onDatesChange(intervalToDateRange(dateInterval));
41
  };
42
43
  return (
44
    <Dropdown isOpen={isOpen} toggle={toggle} disabled={disabled}>
45
      <DropdownToggle caret className="date-range-selector__btn btn-block" color="primary">
46
        {rangeOrIntervalToString(activeInterval ?? activeDateRange) ?? defaultText}
47
      </DropdownToggle>
48
      <DropdownMenu className="w-100">
49
        <DropdownItem
50
          active={activeInterval === undefined && dateRangeIsEmpty(activeDateRange)}
51
          onClick={updateInterval(undefined)}
52
        >
53
          {defaultText}
54
        </DropdownItem>
55
        <DropdownItem divider />
56
        {([ 'today', 'yesterday', 'last7Days', 'last30Days', 'last90Days', 'last180days', 'last365Days' ] as DateInterval[]).map(
57
          (interval) => (
58
            <DropdownItem key={interval} active={activeInterval === interval} onClick={updateInterval(interval)}>
59
              {rangeOrIntervalToString(interval)}
60
            </DropdownItem>
61
          ),
62
        )}
63
        <DropdownItem divider />
64
        <DropdownItem header>Custom:</DropdownItem>
65
        <DropdownItem text>
66
          <DateRangeRow
67
            {...activeDateRange}
68
            onStartDateChange={(startDate) => updateDateRange({ ...activeDateRange, startDate })}
69
            onEndDateChange={(endDate) => updateDateRange({ ...activeDateRange, endDate })}
70
          />
71
        </DropdownItem>
72
      </DropdownMenu>
73
    </Dropdown>
74
  );
75
};
76