You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

useCamera.ts 868B

123456789101112131415161718192021222324252627282930313233
  1. import React, { useEffect } from 'react'
  2. import state from 'state'
  3. import storage from 'state/storage'
  4. import { getCurrentCamera } from 'utils/utils'
  5. /**
  6. * When the state's camera changes, update the transform of
  7. * the SVG group to reflect the correct zoom and pan.
  8. * @param ref
  9. */
  10. export default function useCamera(ref: React.MutableRefObject<SVGGElement>) {
  11. useEffect(() => {
  12. let prev = getCurrentCamera(state.data)
  13. return state.onUpdate(() => {
  14. const g = ref.current
  15. if (!g) return
  16. const { point, zoom } = getCurrentCamera(state.data)
  17. if (point !== prev.point || zoom !== prev.zoom) {
  18. g.setAttribute(
  19. 'transform',
  20. `scale(${zoom}) translate(${point[0]} ${point[1]})`
  21. )
  22. storage.savePageState(state.data)
  23. prev = getCurrentCamera(state.data)
  24. }
  25. })
  26. }, [state])
  27. }