import moment from 'moment';
import {useEffect, useMemo} from 'react';
import useMapStore from '../../stores/useMapStore';
import dynamic from 'next/dynamic';
import {Event} from '../../generated/graphql';
import useTravelsStore from '../../stores/useTravelsStore';
import {calculateHaversineDistance} from '../../lib/geography';
const EventMarker = dynamic(() => import('../Markers/EventMarker'), {
ssr: false,
});
const TravelMarker = dynamic(() => import('../Markers/TravelMarker'), {
ssr: false,
});
const MeetingFilterMarker = dynamic(
() => import('../Markers/MeetingFilterMarker'),
{ssr: false}
);
interface Props {
event: Event & {id: string};
}
const useDisplayMarkers = ({event}: Props) => {
const setMarkers = useMapStore(s => s.setMarkers);
const setBounds = useMapStore(s => s.setBounds);
const focusedTravel = useMapStore(s => s.focusedTravel);
const datesFilters = useTravelsStore(s => s.datesFilter);
const meetingFilter = useTravelsStore(s => s.meetingFilter);
const travelsWithGeoloc = useMemo(() => {
const travels = event?.travels?.data || [];
const filteredTravels =
datesFilters.length >= 1
? travels.filter(travel => {
const departureDate = moment(travel?.attributes?.departureDate);
return datesFilters.some(date => date.isSame(departureDate, 'day'));
})
: travels;
return filteredTravels.filter(
travel =>
travel.attributes.meeting_latitude &&
travel.attributes.meeting_longitude
);
}, [event, datesFilters]);
// Set markers
useEffect(() => {
let markers = [];
// Set event marker
const {latitude, longitude} = event || {};
if (latitude && longitude)
markers.push();
// Set meeting filter marker
if (meetingFilter?.latitude && meetingFilter?.longitude)
markers.push(
);
// Set travels markers
const travelMarkers = travelsWithGeoloc.map(travel => (
));
markers.push(...travelMarkers);
setMarkers(markers);
}, [event, travelsWithGeoloc, focusedTravel, setMarkers, meetingFilter]);
// Set bounds
useEffect(() => {
let bounds = [];
if (meetingFilter?.latitude && meetingFilter?.longitude) {
bounds.push([meetingFilter.latitude, meetingFilter.longitude]);
// Set travels bounds
const travelCoords = travelsWithGeoloc
.map(travel => ({
...travel,
distance: calculateHaversineDistance(
[meetingFilter.latitude, meetingFilter.longitude],
[
travel.attributes.meeting_latitude,
travel.attributes.meeting_longitude,
]
),
}))
.sort((a, b) => a.distance - b.distance)
.slice(0, 3)
.map(travel => [
travel.attributes.meeting_latitude,
travel.attributes.meeting_longitude,
]);
bounds.push(...travelCoords);
} else {
// Set event bounds
const {latitude, longitude} = event || {};
if (latitude && longitude) bounds.push([latitude, longitude]);
// Set travels bounds
const travelCoords = travelsWithGeoloc.map(travel => [
travel.attributes.meeting_latitude,
travel.attributes.meeting_longitude,
]);
bounds.push(...travelCoords);
}
setBounds(bounds);
}, [event, travelsWithGeoloc, setBounds, meetingFilter]);
};
export default useDisplayMarkers;