all repos — caroster @ 1e4cd2561ddba0d298160a89d3e9b78da1e68fe2

[Octree] Group carpool to your event https://caroster.io

frontend/containers/TravelColumns/FilterByDate.tsx (view raw)

 1import {useState} from 'react';
 2import {
 3  Button,
 4  Checkbox,
 5  FormControlLabel,
 6  Icon,
 7  Menu,
 8  MenuItem,
 9} from '@mui/material';
10import {type Moment} from 'moment';
11import useTravelsStore from '../../stores/travelsStore';
12
13interface FilterByDateProps {
14  dates: Moment[];
15  buttonFilterContent: string | string[];
16}
17
18const FilterByDate = ({dates, buttonFilterContent}: FilterByDateProps) => {
19  const datesFilters = useTravelsStore(s => s.datesFilter);
20  const setDatesFilter = useTravelsStore(s => s.setDatesFilter);
21  const [anchorElement, setAnchorElement] = useState<null | HTMLElement>(null);
22  const [checkedItems, setCheckedItems] = useState<boolean[]>(
23    new Array(dates.length).fill(false)
24  );
25  const menuOpen = Boolean(anchorElement);
26
27  const handleClickListItem = (event: React.MouseEvent<HTMLElement>) =>
28    setAnchorElement(event.currentTarget);
29
30  const handleCheckboxChange = (index: number) => {
31    const newCheckedItems = [...checkedItems];
32    newCheckedItems[index] = !checkedItems[index];
33    setCheckedItems(newCheckedItems);
34    const selectedDate = dates[index];
35    const newDatesFilters = checkedItems[index]
36      ? datesFilters.filter(date => !date.isSame(selectedDate))
37      : [...datesFilters, selectedDate];
38    setDatesFilter(newDatesFilters);
39  };
40
41  return (
42    <>
43      <Button
44        sx={{bgcolor: 'background.paper'}}
45        variant="contained"
46        color="inherit"
47        onClick={handleClickListItem}
48        endIcon={<Icon>calendar_today_outlined</Icon>}
49      >
50        {buttonFilterContent}
51      </Button>
52      <Menu
53        anchorEl={anchorElement}
54        open={menuOpen}
55        onClose={() => setAnchorElement(null)}
56        MenuListProps={{
57          'aria-labelledby': 'lock-button',
58          role: 'listbox',
59        }}
60      >
61        {dates
62          ?.filter(date => date.isValid())
63          .map((date, index) => (
64            <MenuItem key={index}>
65              <FormControlLabel
66                control={
67                  <Checkbox
68                    checked={checkedItems[index]}
69                    onChange={() => handleCheckboxChange(index)}
70                  />
71                }
72                label={date.format('dddd Do MMMM')}
73              />
74            </MenuItem>
75          ))}
76      </Menu>
77    </>
78  );
79};
80
81export default FilterByDate;