122 lines
3.2 KiB
JavaScript
122 lines
3.2 KiB
JavaScript
import { useCallback, useEffect } from "react";
|
|
import useMobileMapAutoFit from "./useMobileMapAutoFit";
|
|
import { getObjectKey } from "../lib/locationMapUtils";
|
|
|
|
export default function useLocationMapViewControls({
|
|
filters,
|
|
hasUnsavedChanges,
|
|
mapSize,
|
|
mapState,
|
|
mode,
|
|
objects,
|
|
previewDraft,
|
|
selectedObjectKey,
|
|
setFuture,
|
|
setHasUnsavedChanges,
|
|
setHistory,
|
|
setLayersOpen,
|
|
setMode,
|
|
setObjects,
|
|
setPreviewDraft,
|
|
setSelectedObjectKey,
|
|
setZoom,
|
|
svgRef,
|
|
syncMapDraftFromState,
|
|
}) {
|
|
useEffect(() => {
|
|
if (!selectedObjectKey) return;
|
|
|
|
const selectedMapObject = objects.find((object) => getObjectKey(object) === selectedObjectKey);
|
|
if (!selectedMapObject || !filters.showZones || selectedMapObject.visible === false) {
|
|
setSelectedObjectKey(null);
|
|
}
|
|
}, [filters.showZones, objects, selectedObjectKey, setSelectedObjectKey]);
|
|
|
|
const fitMapToCanvas = useMobileMapAutoFit({
|
|
mapSize,
|
|
mapState,
|
|
mode,
|
|
setZoom,
|
|
svgRef,
|
|
});
|
|
|
|
const handleUndo = useCallback(() => {
|
|
setHistory((previous) => {
|
|
if (previous.length === 0) return previous;
|
|
const priorObjects = previous[previous.length - 1];
|
|
setFuture((nextFuture) => [objects.map((object) => ({ ...object })), ...nextFuture.slice(0, 19)]);
|
|
setObjects(priorObjects);
|
|
setHasUnsavedChanges(true);
|
|
return previous.slice(0, -1);
|
|
});
|
|
}, [objects, setFuture, setHasUnsavedChanges, setHistory, setObjects]);
|
|
|
|
const handleRedo = useCallback(() => {
|
|
setFuture((previous) => {
|
|
if (previous.length === 0) return previous;
|
|
const nextObjects = previous[0];
|
|
setHistory((nextHistory) => [...nextHistory.slice(-19), objects.map((object) => ({ ...object }))]);
|
|
setObjects(nextObjects);
|
|
setHasUnsavedChanges(true);
|
|
return previous.slice(1);
|
|
});
|
|
}, [objects, setFuture, setHasUnsavedChanges, setHistory, setObjects]);
|
|
|
|
const handlePreviewDraft = useCallback(() => {
|
|
setMode("view");
|
|
setLayersOpen(false);
|
|
setPreviewDraft(true);
|
|
setSelectedObjectKey(null);
|
|
}, [setLayersOpen, setMode, setPreviewDraft, setSelectedObjectKey]);
|
|
|
|
const handleViewMode = useCallback(() => {
|
|
setMode("view");
|
|
setLayersOpen(false);
|
|
if ((mode === "edit" || previewDraft) && (hasUnsavedChanges || mapState?.draft_map)) {
|
|
setPreviewDraft(true);
|
|
setSelectedObjectKey(null);
|
|
return;
|
|
}
|
|
setPreviewDraft(false);
|
|
if (mapState) {
|
|
syncMapDraftFromState(mapState, "view", false);
|
|
}
|
|
}, [
|
|
hasUnsavedChanges,
|
|
mapState,
|
|
mode,
|
|
previewDraft,
|
|
setLayersOpen,
|
|
setMode,
|
|
setPreviewDraft,
|
|
setSelectedObjectKey,
|
|
syncMapDraftFromState,
|
|
]);
|
|
|
|
const handleEditMode = useCallback(() => {
|
|
setMode("edit");
|
|
setLayersOpen(false);
|
|
setPreviewDraft(true);
|
|
if (!previewDraft && mapState && !hasUnsavedChanges) {
|
|
syncMapDraftFromState(mapState, "edit", true);
|
|
}
|
|
}, [
|
|
hasUnsavedChanges,
|
|
mapState,
|
|
previewDraft,
|
|
setLayersOpen,
|
|
setMode,
|
|
setPreviewDraft,
|
|
syncMapDraftFromState,
|
|
]);
|
|
|
|
return {
|
|
handleEditMode,
|
|
handleFitMap: fitMapToCanvas,
|
|
handlePreviewDraft,
|
|
handleRedo,
|
|
handleUndo,
|
|
handleViewMode,
|
|
};
|
|
}
|