Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

useCamera.ts 932B

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