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