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, }; }