all repos — caroster @ 406456e1af7399c4bf12340f443334a004070db9

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

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

 1import moment, {Moment} from 'moment';
 2import {useEffect, useMemo} from 'react';
 3import useMapStore from '../../stores/useMapStore';
 4import dynamic from 'next/dynamic';
 5import {Event} from '../../generated/graphql';
 6
 7const EventMarker = dynamic(() => import('../EventMarker'), {ssr: false});
 8const TravelMarker = dynamic(() => import('../TravelMarker'), {ssr: false});
 9
10interface Props {
11  event: Event & {id: string};
12  selectedDates: Moment[];
13}
14
15const useDisplayMarkers = ({event, selectedDates}: Props) => {
16  const setMarkers = useMapStore(s => s.setMarkers);
17  const setBounds = useMapStore(s => s.setBounds);
18  const focusedTravel = useMapStore(s => s.focusedTravel);
19
20  const travelsWithGeoloc = useMemo(() => {
21    const travels = event?.travels?.data || [];
22    const filteredTravels =
23      selectedDates.length >= 1
24        ? travels.filter(travel => {
25            const departureDate = moment(travel?.attributes?.departureDate);
26            return selectedDates.some(date =>
27              date.isSame(departureDate, 'day')
28            );
29          })
30        : travels;
31
32    return filteredTravels.filter(
33      travel =>
34        travel.attributes.meeting_latitude &&
35        travel.attributes.meeting_longitude
36    );
37  }, [event, selectedDates]);
38
39  // Set markers
40  useEffect(() => {
41    let markers = [];
42
43    // Set event marker
44    const {latitude, longitude} = event || {};
45    if (latitude && longitude)
46      markers.push(<EventMarker key="event" event={event} />);
47
48    // Set travels markers
49    const travelMarkers = travelsWithGeoloc.map(travel => (
50      <TravelMarker
51        key={travel.id}
52        travel={travel}
53        focused={focusedTravel === travel.id}
54      />
55    ));
56    markers.push(...travelMarkers);
57
58    setMarkers(markers);
59  }, [event, travelsWithGeoloc, focusedTravel, setMarkers]);
60
61  // Set bounds
62  useEffect(() => {
63    let bounds = [];
64
65    // Set event bounds
66    const {latitude, longitude} = event || {};
67    if (latitude && longitude) bounds.push([latitude, longitude]);
68
69    // Set travels bounds
70    const travelCoords = travelsWithGeoloc.map(travel => [
71      travel.attributes.meeting_latitude,
72      travel.attributes.meeting_longitude,
73    ]);
74    bounds.push(...travelCoords);
75
76    setBounds(bounds);
77  }, [event, travelsWithGeoloc, setBounds]);
78};
79
80export default useDisplayMarkers;