70 lines
2 KiB
JavaScript
70 lines
2 KiB
JavaScript
import { useCallback } from "react";
|
|
import { useNavigation } from "@react-navigation/native";
|
|
|
|
import { ANIMATION_DURATION } from "~/containers/Map/constants";
|
|
|
|
import { alertActions, defibsActions } from "~/stores";
|
|
import { createLogger } from "~/lib/logger";
|
|
import { FEATURE_SCOPES, UI_SCOPES } from "~/lib/logger/scopes";
|
|
|
|
import prioritizeFeatures from "./prioritizeFeatures";
|
|
|
|
const mapLogger = createLogger({
|
|
module: FEATURE_SCOPES.MAP,
|
|
feature: "alert-map-interaction",
|
|
});
|
|
|
|
export default function useOnPress({
|
|
superCluster,
|
|
cameraRef,
|
|
setSelectedFeature,
|
|
}) {
|
|
const navigation = useNavigation();
|
|
return useCallback(
|
|
async (event) => {
|
|
const features = prioritizeFeatures(event.features);
|
|
if (!features.length > 0) {
|
|
return;
|
|
}
|
|
const [feature] = features;
|
|
const { properties } = feature;
|
|
|
|
if (properties?.isDefib && properties?.defib) {
|
|
defibsActions.setSelectedDefib(properties.defib);
|
|
navigation.navigate("DAEItem");
|
|
return;
|
|
}
|
|
|
|
if (properties.cluster) {
|
|
// center and expand to cluster's points
|
|
const { current: camera } = cameraRef;
|
|
camera.setCamera({
|
|
centerCoordinate: feature.geometry.coordinates,
|
|
zoomLevel: superCluster.getClusterExpansionZoom(
|
|
feature.properties.cluster_id,
|
|
),
|
|
animationDuration: ANIMATION_DURATION,
|
|
});
|
|
return;
|
|
}
|
|
|
|
if (properties.alert) {
|
|
const { alert } = properties;
|
|
if (alert) {
|
|
if (setSelectedFeature) {
|
|
setSelectedFeature(feature);
|
|
} else {
|
|
alertActions.setNavAlertCur({ alert });
|
|
navigation.navigate("AlertCur", {
|
|
screen: "AlertCurOverview",
|
|
});
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
// mapLogger.debug("Unexpected feature pressed", { features: JSON.stringify(features) });
|
|
},
|
|
[cameraRef, superCluster, setSelectedFeature, navigation],
|
|
);
|
|
}
|