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.

usePageShapes.ts 960B

123456789101112131415161718192021222324252627282930313233343536
  1. import { useSelector } from 'state'
  2. import { getShapeUtils } from 'state/shape-utils'
  3. import { PageState, Bounds } from 'types'
  4. import {
  5. boundsCollide,
  6. boundsContain,
  7. deepCompareArrays,
  8. getPage,
  9. getViewport,
  10. } from 'utils'
  11. const viewportCache = new WeakMap<PageState, Bounds>()
  12. export default function usePageShapes(): string[] {
  13. return useSelector((s) => {
  14. const page = getPage(s.data)
  15. const pageState = s.data.pageStates[page.id]
  16. if (!viewportCache.has(pageState)) {
  17. const viewport = getViewport(s.data)
  18. viewportCache.set(pageState, viewport)
  19. }
  20. const viewport = viewportCache.get(pageState)
  21. return s.values.currentShapes
  22. .filter((shape) => {
  23. const shapeBounds = getShapeUtils(shape).getBounds(shape)
  24. return (
  25. boundsContain(viewport, shapeBounds) ||
  26. boundsCollide(viewport, shapeBounds)
  27. )
  28. })
  29. .map((shape) => shape.id)
  30. }, deepCompareArrays)
  31. }