frontend/containers/TravelColumns/useDisplayTravels.tsx (view raw)
1import {useState} from 'react';
2import useEventStore from '../../stores/useEventStore';
3import {TravelEntity} from '../../generated/graphql';
4import useProfile from '../../hooks/useProfile';
5import moment, {Moment} from 'moment';
6
7const useDisplayTravels = () => {
8 const [selectedDates, setSelectedDates] = useState<Moment[]>([]);
9 const {userId} = useProfile();
10 const event = useEventStore(s => s.event);
11 const travels = event?.travels?.data || [];
12
13 const sortTravels = (
14 {attributes: a}: TravelEntity,
15 {attributes: b}: TravelEntity
16 ) => {
17 if (a?.user?.data?.id === userId && b?.user?.data?.id !== userId) return -1;
18 else if (a?.user?.data?.id !== userId && b?.user?.data?.id == userId)
19 return 1;
20
21 const passengerFirst =
22 Number(
23 b?.passengers?.data?.some(
24 passenger => passenger.attributes.user?.data?.id === userId
25 )
26 ) -
27 Number(
28 a?.passengers?.data?.some(
29 passenger => passenger.attributes.user?.data?.id === userId
30 )
31 );
32 if (passengerFirst !== 0) return passengerFirst;
33 const dateA = new Date(a.departureDate).getTime();
34 const dateB = new Date(b.departureDate).getTime();
35 if (dateA === dateB)
36 return new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime();
37 else return dateA - dateB;
38 };
39
40 const sortedTravels = travels?.slice().sort(sortTravels);
41
42 const filteredTravels = sortedTravels.filter(travel => {
43 const departureDate = travel?.attributes?.departureDate
44 ? moment(travel.attributes.departureDate)
45 : null;
46 return selectedDates.some(date => date.isSame(departureDate));
47 });
48
49 const displayedTravels =
50 selectedDates.length > 0 ? filteredTravels : sortedTravels;
51
52 return {selectedDates, setSelectedDates, displayedTravels};
53};
54
55export default useDisplayTravels;