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';
7import {calculateHaversineDistance} from '../../lib/geography';
8
9const useDisplayTravels = () => {
10 const datesFilter = useTravelsStore(s => s.datesFilter);
11 const meetingFilter = useTravelsStore(s => s.meetingFilter);
12 const {userId} = useProfile();
13 const event = useEventStore(s => s.event);
14
15 const dateFileredTravels = useMemo(() => {
16 const travels = event?.travels?.data || [];
17 return travels
18 .slice()
19 .sort(sortTravels(userId))
20 .filter(travel => {
21 if (datesFilter.length === 0) return true;
22 const departureDate = travel?.attributes?.departureDate
23 ? moment(travel.attributes.departureDate)
24 : null;
25 return datesFilter.some(date => date.isSame(departureDate));
26 });
27 }, [event?.travels?.data, datesFilter, userId]);
28
29 const meetingFilteredTravels = useMemo(() => {
30 if (!meetingFilter.latitude || !meetingFilter.longitude)
31 return dateFileredTravels;
32
33 return dateFileredTravels
34 .map(travel => ({
35 ...travel,
36 distance: calculateHaversineDistance(
37 [meetingFilter.latitude, meetingFilter.longitude],
38 [
39 travel.attributes.meeting_latitude,
40 travel.attributes.meeting_longitude,
41 ]
42 ),
43 }))
44 .sort((a, b) => a.distance - b.distance)
45 .slice(0, 3);
46 }, [dateFileredTravels, meetingFilter]);
47
48 return {displayedTravels: meetingFilteredTravels};
49};
50
51const sortTravels =
52 userId =>
53 ({attributes: a}: TravelEntity, {attributes: b}: TravelEntity) => {
54 if (a?.user?.data?.id === userId && b?.user?.data?.id !== userId) return -1;
55 else if (a?.user?.data?.id !== userId && b?.user?.data?.id == userId)
56 return 1;
57
58 const passengerFirst =
59 Number(
60 b?.passengers?.data?.some(
61 passenger => passenger.attributes.user?.data?.id === userId
62 )
63 ) -
64 Number(
65 a?.passengers?.data?.some(
66 passenger => passenger.attributes.user?.data?.id === userId
67 )
68 );
69 if (passengerFirst !== 0) return passengerFirst;
70 const dateA = new Date(a.departureDate).getTime();
71 const dateB = new Date(b.departureDate).getTime();
72 if (dateA === dateB)
73 return new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime();
74 else return dateA - dateB;
75 };
76
77export default useDisplayTravels;