import { MAP_MAX_SCALE, MAP_MIN_SCALE, MAP_SCALE_PER_EVENT, MAP_SIZE_IN_PIXELS } from "../components/app/map/MapConstants"; export const SET_MAP_POSITION = "SET_MAP_POSITION"; export const SET_MAP_DIMENSIONS = "SET_MAP_DIMENSIONS"; export const SET_MAP_SCALE = "SET_MAP_SCALE"; export function setMapPosition(x, y) { return { type: SET_MAP_POSITION, x, y }; } export function setMapDimensions(width, height) { return { type: SET_MAP_DIMENSIONS, width, height }; } export function setMapScale(scale) { return { type: SET_MAP_SCALE, scale }; } export function zoomInOnCenter(zoomIn) { return (dispatch, getState) => { const state = getState(); dispatch(zoomInOnPosition(zoomIn, state.map.dimensions.width / 2, state.map.dimensions.height / 2)); } } export function zoomInOnPosition(zoomIn, x, y) { return (dispatch, getState) => { const state = getState(); const centerPoint = { x: x / state.map.scale - state.map.position.x / state.map.scale, y: y / state.map.scale - state.map.position.y / state.map.scale, }; const newScale = zoomIn ? state.map.scale * MAP_SCALE_PER_EVENT : state.map.scale / MAP_SCALE_PER_EVENT; const boundedScale = Math.min(Math.max(MAP_MIN_SCALE, newScale), MAP_MAX_SCALE); const newX = -(centerPoint.x - x / boundedScale) * boundedScale; const newY = -(centerPoint.y - y / boundedScale) * boundedScale; dispatch(setMapPositionWithBoundsCheck(newX, newY)); dispatch(setMapScale(boundedScale)); } } export function setMapPositionWithBoundsCheck(x, y) { return (dispatch, getState) => { const state = getState(); const scaledMapSize = MAP_SIZE_IN_PIXELS * state.map.scale; const updatedX = x > 0 ? 0 : (x < -scaledMapSize + state.map.dimensions.width ? -scaledMapSize + state.map.dimensions.width : x); const updatedY = y > 0 ? 0 : (y < -scaledMapSize + state.map.dimensions.height ? -scaledMapSize + state.map.dimensions.height : y); dispatch(setMapPosition(updatedX, updatedY)); } }