You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
41 lines
1.1 KiB
TypeScript
41 lines
1.1 KiB
TypeScript
2 years ago
|
import { MIN_ZOOM } from "../constants";
|
||
3 years ago
|
import { AppState, NormalizedZoomValue } from "../types";
|
||
5 years ago
|
|
||
4 years ago
|
export const getNormalizedZoom = (zoom: number): NormalizedZoomValue => {
|
||
2 years ago
|
return Math.max(MIN_ZOOM, Math.min(zoom, 30)) as NormalizedZoomValue;
|
||
5 years ago
|
};
|
||
3 years ago
|
|
||
|
export const getStateForZoom = (
|
||
|
{
|
||
|
viewportX,
|
||
|
viewportY,
|
||
|
nextZoom,
|
||
|
}: {
|
||
|
viewportX: number;
|
||
|
viewportY: number;
|
||
|
nextZoom: NormalizedZoomValue;
|
||
|
},
|
||
|
appState: AppState,
|
||
|
) => {
|
||
|
const appLayerX = viewportX - appState.offsetLeft;
|
||
|
const appLayerY = viewportY - appState.offsetTop;
|
||
|
|
||
|
const currentZoom = appState.zoom.value;
|
||
|
|
||
|
// get original scroll position without zoom
|
||
|
const baseScrollX = appState.scrollX + (appLayerX - appLayerX / currentZoom);
|
||
|
const baseScrollY = appState.scrollY + (appLayerY - appLayerY / currentZoom);
|
||
|
|
||
|
// get scroll offsets for target zoom level
|
||
|
const zoomOffsetScrollX = -(appLayerX - appLayerX / nextZoom);
|
||
|
const zoomOffsetScrollY = -(appLayerY - appLayerY / nextZoom);
|
||
|
|
||
|
return {
|
||
|
scrollX: baseScrollX + zoomOffsetScrollX,
|
||
|
scrollY: baseScrollY + zoomOffsetScrollY,
|
||
|
zoom: {
|
||
|
value: nextZoom,
|
||
|
},
|
||
|
};
|
||
|
};
|