all repos — caroster @ d2e622c85d686fafcb7ba38d2d47b959f085de8c

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

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;