refactor(core,viewport): use useResizeHandler composable

This commit is contained in:
braks
2024-01-29 21:56:44 +01:00
committed by Braks
parent b65f43c5d8
commit a5091b9b0c
2 changed files with 51 additions and 22 deletions
@@ -0,0 +1,44 @@
import type { Ref } from 'vue'
import { watchEffect } from 'vue'
import { ErrorCode, VueFlowError, getDimensions } from '../utils'
import { useVueFlow } from './useVueFlow'
export function useResizeHandler(viewportEl: Ref<HTMLDivElement | null>): void {
const { emits, dimensions } = useVueFlow()
let resizeObserver: ResizeObserver
watchEffect((onCleanup) => {
const rendererNode = viewportEl.value
const updateDimensions = () => {
if (!rendererNode) {
return
}
const size = getDimensions(rendererNode)
if (size.width === 0 || size.height === 0) {
emits.error(new VueFlowError(ErrorCode.MISSING_VIEWPORT_DIMENSIONS))
}
dimensions.value = size
}
updateDimensions()
window.addEventListener('resize', updateDimensions)
if (rendererNode) {
resizeObserver = new ResizeObserver(() => updateDimensions())
resizeObserver.observe(rendererNode)
}
onCleanup(() => {
window.removeEventListener('resize', updateDimensions)
if (resizeObserver && rendererNode) {
resizeObserver.unobserve(rendererNode!)
}
})
})
}
@@ -3,12 +3,13 @@ import type { D3ZoomEvent, ZoomTransform } from 'd3-zoom'
import { zoom, zoomIdentity } from 'd3-zoom'
import { pointer, select } from 'd3-selection'
import { onMounted, ref, watch } from 'vue'
import { toRef, useEventListener, useResizeObserver } from '@vueuse/core'
import { toRef } from '@vueuse/core'
import type { CoordinateExtent, D3ZoomHandler, ViewportTransform } from '../../types'
import { PanOnScrollMode } from '../../types'
import { useKeyPress, useVueFlow, useWindow } from '../../composables'
import { ErrorCode, VueFlowError, clamp, getDimensions, isMacOs, warn } from '../../utils'
import { clamp, isMacOs, warn } from '../../utils'
import Pane from '../Pane/Pane.vue'
import { useResizeHandler } from '../../composables/useResizeHandler'
import Transform from './Transform.vue'
const window = useWindow()
@@ -19,7 +20,6 @@ const {
maxZoom,
defaultViewport,
translateExtent,
dimensions,
zoomActivationKeyCode,
selectionKeyCode,
panActivationKeyCode,
@@ -44,6 +44,8 @@ const {
viewportRef,
} = useVueFlow()
useResizeHandler(viewportRef)
const isZoomingOrPanning = ref(false)
const isPanScrolling = ref(false)
@@ -72,10 +74,6 @@ const shouldPanOnScroll = toRef(() => panKeyPressed.value || panOnScroll.value)
const isSelecting = toRef(() => selectionKeyPressed.value || (selectionKeyCode.value === true && shouldPanOnDrag.value !== true))
useResizeObserver(viewportRef, setDimensions)
useEventListener(window, 'resize', setDimensions)
onMounted(() => {
if (!viewportRef.value) {
warn('Viewport element is missing')
@@ -107,6 +105,8 @@ onMounted(() => {
storeD3Selection.value = d3Selection
storeD3ZoomHandler.value = d3ZoomHandler as D3ZoomHandler
console.log('d3Zoom', d3Zoom)
viewport.value = { x: constrainedTransform.x, y: constrainedTransform.y, zoom: constrainedTransform.k }
d3Zoom.on('start', (event: D3ZoomEvent<HTMLDivElement, any>) => {
@@ -369,21 +369,6 @@ function eventToFlowTransform(eventTransform: ZoomTransform): ViewportTransform
}
}
function setDimensions() {
if (!viewportRef.value) {
return
}
const { width, height } = getDimensions(viewportRef.value)
if (width === 0 || height === 0) {
emits.error(new VueFlowError(ErrorCode.MISSING_VIEWPORT_DIMENSIONS))
}
dimensions.value.width = width || 500
dimensions.value.height = height || 500
}
function isWrappedWithClass(event: Event, className: string | undefined) {
return (event.target as Element).closest(`.${className}`)
}