fix(viewport): make onViewportChange prop dynamic #4579
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||
import { useEffect, useRef } from 'react';
|
||||
import { useCallback, useEffect, useRef } from 'react';
|
||||
import { shallow } from 'zustand/shallow';
|
||||
import { XYPanZoom, PanOnScrollMode, type Transform, type PanZoomInstance } from '@xyflow/system';
|
||||
|
||||
@@ -57,6 +57,17 @@ export function ZoomPane({
|
||||
|
||||
useResizeHandler(zoomPane);
|
||||
|
||||
const onTransformChange = useCallback(
|
||||
(transform: Transform) => {
|
||||
onViewportChange?.({ x: transform[0], y: transform[1], zoom: transform[2] });
|
||||
|
||||
if (!isControlledViewport) {
|
||||
store.setState({ transform });
|
||||
}
|
||||
},
|
||||
[onViewportChange, isControlledViewport]
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
if (zoomPane.current) {
|
||||
panZoom.current = XYPanZoom({
|
||||
@@ -66,13 +77,6 @@ export function ZoomPane({
|
||||
translateExtent,
|
||||
viewport: defaultViewport,
|
||||
paneClickDistance,
|
||||
onTransformChange: (transform: Transform) => {
|
||||
onViewportChange?.({ x: transform[0], y: transform[1], zoom: transform[2] });
|
||||
|
||||
if (!isControlledViewport) {
|
||||
store.setState({ transform });
|
||||
}
|
||||
},
|
||||
onDraggingChange: (paneDragging: boolean) => store.setState({ paneDragging }),
|
||||
onPanZoomStart: (event, vp) => {
|
||||
const { onViewportChangeStart, onMoveStart } = store.getState();
|
||||
@@ -121,6 +125,7 @@ export function ZoomPane({
|
||||
userSelectionActive,
|
||||
noWheelClassName,
|
||||
lib,
|
||||
onTransformChange,
|
||||
});
|
||||
}, [
|
||||
onPaneContextMenu,
|
||||
@@ -137,6 +142,7 @@ export function ZoomPane({
|
||||
userSelectionActive,
|
||||
noWheelClassName,
|
||||
lib,
|
||||
onTransformChange,
|
||||
]);
|
||||
|
||||
return (
|
||||
|
||||
@@ -5,6 +5,7 @@ import {
|
||||
type CoordinateExtent,
|
||||
type OnPanZoom,
|
||||
type PanZoomInstance,
|
||||
type Transform,
|
||||
type Viewport
|
||||
} from '@xyflow/system';
|
||||
|
||||
@@ -36,6 +37,7 @@ type ZoomParams = {
|
||||
userSelectionActive: boolean;
|
||||
lib: string;
|
||||
paneClickDistance: number;
|
||||
onTransformChange: (transform: Transform) => void;
|
||||
};
|
||||
|
||||
export default function zoom(domNode: Element, params: ZoomParams) {
|
||||
@@ -57,8 +59,6 @@ export default function zoom(domNode: Element, params: ZoomParams) {
|
||||
translateExtent,
|
||||
viewport: initialViewport,
|
||||
paneClickDistance,
|
||||
onTransformChange: (transform) =>
|
||||
viewport.set({ x: transform[0], y: transform[1], zoom: transform[2] }),
|
||||
onDraggingChange: dragging.set
|
||||
});
|
||||
const currentViewport = panZoomInstance.getViewport();
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
<script lang="ts">
|
||||
import { PanOnScrollMode } from '@xyflow/system';
|
||||
import { onMount } from 'svelte';
|
||||
import { PanOnScrollMode, type Transform } from '@xyflow/system';
|
||||
|
||||
import { useStore } from '$lib/store';
|
||||
import zoom from '$lib/actions/zoom';
|
||||
import type { ZoomProps } from './types';
|
||||
import { onMount } from 'svelte';
|
||||
|
||||
type $$Props = ZoomProps;
|
||||
|
||||
@@ -39,6 +39,9 @@
|
||||
$: _panOnDrag = $panActivationKeyPressed || panOnDrag;
|
||||
$: _panOnScroll = $panActivationKeyPressed || panOnScroll;
|
||||
|
||||
const onTransformChange = (transform: Transform) =>
|
||||
viewport.set({ x: transform[0], y: transform[1], zoom: transform[2] });
|
||||
|
||||
onMount(() => {
|
||||
$viewportInitialized = true;
|
||||
});
|
||||
@@ -70,7 +73,8 @@
|
||||
userSelectionActive: !!$selectionRect,
|
||||
translateExtent: $translateExtent,
|
||||
lib: $lib,
|
||||
paneClickDistance
|
||||
paneClickDistance,
|
||||
onTransformChange
|
||||
}}
|
||||
>
|
||||
<slot />
|
||||
|
||||
@@ -12,7 +12,6 @@ export type PanZoomParams = {
|
||||
paneClickDistance: number;
|
||||
viewport: Viewport;
|
||||
translateExtent: CoordinateExtent;
|
||||
onTransformChange: OnTransformChange;
|
||||
onDraggingChange: OnDraggingChange;
|
||||
onPanZoomStart?: OnPanZoom;
|
||||
onPanZoom?: OnPanZoom;
|
||||
@@ -40,6 +39,7 @@ export type PanZoomUpdateOptions = {
|
||||
zoomOnDoubleClick: boolean;
|
||||
zoomActivationKeyPressed: boolean;
|
||||
lib: string;
|
||||
onTransformChange: OnTransformChange;
|
||||
};
|
||||
|
||||
export type PanZoomInstance = {
|
||||
|
||||
@@ -40,7 +40,6 @@ export function XYPanZoom({
|
||||
onPanZoom,
|
||||
onPanZoomStart,
|
||||
onPanZoomEnd,
|
||||
onTransformChange,
|
||||
onDraggingChange,
|
||||
}: PanZoomParams): PanZoomInstance {
|
||||
const zoomPanValues: ZoomPanValues = {
|
||||
@@ -105,6 +104,7 @@ export function XYPanZoom({
|
||||
zoomOnDoubleClick,
|
||||
zoomActivationKeyPressed,
|
||||
lib,
|
||||
onTransformChange,
|
||||
}: PanZoomUpdateOptions) {
|
||||
if (userSelectionActive && !zoomPanValues.isZoomingOrPanning) {
|
||||
destroy();
|
||||
|
||||
Reference in New Issue
Block a user