Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | import { FeatureCollection } from "geojson";
import { SearchUser } from "proto/search_pb";
import { MapRef } from "react-map-gl/maplibre";
import userPin from "../resources/userPin.png";
import { MapSearchState } from "../state/mapSearchReducers";
import { Coordinates } from "./constants";
import { USERS_SOURCE_ID } from "./mapLayers";
const usersToGeoJSON = (pins: SearchUser.AsObject[]): FeatureCollection => ({
type: "FeatureCollection",
features: pins.map((pin) => ({
type: "Feature",
geometry: {
type: "Point",
coordinates: [pin.lng, pin.lat], // GeoJSON expects [lng, lat]
},
properties: {
id: pin.userId,
hasCompletedProfile: pin.hasCompletedProfile,
},
})),
});
const clearMapFeatureState = (mapRef: React.RefObject<MapRef>) => {
const map = mapRef.current?.getMap();
Iif (map) {
map.removeFeatureState({ source: USERS_SOURCE_ID });
}
};
const setMapFeatureState = (
mapRef: React.RefObject<MapRef>,
id: string,
selected: boolean,
) => {
mapRef.current?.setFeatureState(
{ source: USERS_SOURCE_ID, id },
{ selected },
);
};
const loadMapUserPins = async (mapRef: React.RefObject<MapRef>) => {
const image = await mapRef.current?.loadImage(userPin.src);
Iif (mapRef.current?.hasImage("user-pin")) return;
Iif (image) {
mapRef.current?.addImage("user-pin", image.data, { sdf: true });
}
return;
};
// @TODO(NA) - Maybe stringify state and initialState and compare them instead? As long as order is the same.
const getHasActiveFilters = (
state: MapSearchState,
initialState: MapSearchState,
) => {
return (
state.filters.ageMin !== initialState.filters.ageMin ||
state.filters.ageMax !== initialState.filters.ageMax ||
state.filters.acceptsPets !== initialState.filters.acceptsPets ||
state.filters.hostingStatus !== initialState.filters.hostingStatus ||
state.filters.numGuests !== initialState.filters.numGuests ||
state.filters.showEmptyProfile !== initialState.filters.showEmptyProfile ||
state.filters.acceptsKids !== initialState.filters.acceptsKids ||
state.filters.acceptsLastMinRequests !==
initialState.filters.acceptsLastMinRequests ||
state.filters.drinkingAllowed !== initialState.filters.drinkingAllowed ||
state.filters.hasReferences !== initialState.filters.hasReferences ||
state.filters.sleepingArrangement !==
initialState.filters.sleepingArrangement ||
state.filters.hasStrongVerification !==
initialState.filters.hasStrongVerification ||
state.filters.smokesAtHome !== initialState.filters.smokesAtHome ||
state.filters.lastActive !== initialState.filters.lastActive ||
state.filters.sameGenderOnly !== initialState.filters.sameGenderOnly
);
};
const getMapBounds = (mapRef: React.RefObject<MapRef>) => {
const mapBounds = mapRef.current?.getMap().getBounds();
Iif (!mapBounds) return;
const ne = mapBounds.getNorthEast();
const sw = mapBounds.getSouthWest();
const bbox: Coordinates = [sw.lng, sw.lat, ne.lng, ne.lat];
return bbox;
};
export {
clearMapFeatureState,
getHasActiveFilters,
getMapBounds,
loadMapUserPins,
setMapFeatureState,
usersToGeoJSON,
};
|