/ src / modules / reserve-overview / TimeRangeSelector.tsx
TimeRangeSelector.tsx
 1  import { SxProps, Theme, ToggleButton, ToggleButtonGroup, Typography } from '@mui/material';
 2  
 3  export const supportedTimeRangeOptions = ['1m', '3m', '6m', '1y'] as const;
 4  
 5  export enum ESupportedTimeRanges {
 6    OneMonth = '1m',
 7    ThreeMonths = '3m',
 8    SixMonths = '6m',
 9    OneYear = '1y',
10    TwoYears = '2y',
11    FiveYears = '5y',
12  }
13  
14  export interface TimeRangeSelectorProps {
15    disabled?: boolean;
16    timeRanges: ESupportedTimeRanges[];
17    selectedTimeRange: ESupportedTimeRanges;
18    onTimeRangeChanged: (value: ESupportedTimeRanges) => void;
19    sx?: {
20      buttonGroup: SxProps<Theme>;
21      button: SxProps<Theme>;
22    };
23  }
24  
25  export const TimeRangeSelector = ({
26    disabled = false, // support default fallback
27    timeRanges,
28    selectedTimeRange,
29    onTimeRangeChanged,
30    ...props
31  }: TimeRangeSelectorProps) => {
32    const handleChange = (
33      _event: React.MouseEvent<HTMLElement>,
34      newInterval: ESupportedTimeRanges
35    ) => {
36      if (newInterval !== null) {
37        // Invoke callback
38        onTimeRangeChanged(newInterval);
39      }
40    };
41  
42    return (
43      <ToggleButtonGroup
44        disabled={disabled}
45        value={selectedTimeRange}
46        exclusive
47        onChange={handleChange}
48        aria-label="Date range"
49        sx={{
50          height: '24px',
51          '&.MuiToggleButtonGroup-grouped': {
52            borderRadius: 'unset',
53          },
54          ...props.sx?.buttonGroup,
55        }}
56      >
57        {timeRanges.map((interval) => {
58          return (
59            <ToggleButton
60              key={interval}
61              value={interval}
62              // eslint-disable-next-line @typescript-eslint/ban-ts-comment
63              // @ts-ignore
64              sx={(theme): SxProps<Theme> | undefined => ({
65                '&.MuiToggleButtonGroup-grouped:not(.Mui-selected), &.MuiToggleButtonGroup-grouped&.Mui-disabled':
66                  {
67                    border: '0.5px solid transparent',
68                    backgroundColor: 'background.surface',
69                    color: 'action.disabled',
70                  },
71                '&.MuiToggleButtonGroup-grouped&.Mui-selected': {
72                  borderRadius: '4px',
73                  border: `0.5px solid ${theme.palette.divider}`,
74                  boxShadow: '0px 2px 1px rgba(0, 0, 0, 0.05), 0px 0px 1px rgba(0, 0, 0, 0.25)',
75                  backgroundColor: 'background.paper',
76                },
77                ...props.sx?.button,
78              })}
79            >
80              <Typography variant="buttonM">{interval}</Typography>
81            </ToggleButton>
82          );
83        })}
84      </ToggleButtonGroup>
85    );
86  };