{"version":3,"file":"Helpers.jsx","sourceRoot":"lib/","sources":["widgets/AuxToolWidget/Helpers.tsx"],"names":[],"mappings":"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","sourcesContent":["import { TreeNode } from '@designable/core'\nimport { reaction } from '@formily/reactive'\nimport cls from 'classnames'\nimport { useDesigner, usePrefix, useViewport } from '../../hooks'\nimport { Selector } from './Selector'\nimport { Copy } from './Copy'\nimport { Delete } from './Delete'\nimport { composeExport } from '@jeamn/formily-components/src/__builtins__'\nimport { defineComponent, nextTick, ref, unref } from 'vue-demi'\nimport { useEffect } from '../../shared/useEffect'\nimport { DragHandler } from './DragHandler'\n\nconst HELPER_DEBOUNCE_TIMEOUT = 100\n\nexport interface IHelpersProps {\n  node: TreeNode\n  nodeRect: DOMRect\n}\nexport interface IViewportState {\n  viewportWidth?: number\n  viewportHeight?: number\n  viewportScrollX?: number\n  viewportScrollY?: number\n  viewportIsScrollTop?: boolean\n  viewportIsScrollBottom?: boolean\n}\n\nconst HelpersComponent = defineComponent({\n  name: 'Helpers',\n  props: ['node', 'nodeRect'],\n  emits: ['click'],\n  setup(props, { }) {\n    const prefixRef = usePrefix('aux-helpers')\n    const designerRef = useDesigner()\n    const viewportRef = useViewport()\n    const unmountRef = ref(false)\n    const refContainer = ref<HTMLDivElement>()\n\n    const position = ref('top-right')\n\n    useEffect(\n      () => {\n        let request: NodeJS.Timeout\n        const getYInViewport = (nodeRect: DOMRect, helpersRect: DOMRect) => {\n          if (nodeRect.top - viewportRef.value.scrollY > helpersRect.height) {\n            return 'top'\n          } else if (\n            viewportRef.value.isScrollTop &&\n            nodeRect.height + helpersRect.height > viewportRef.value.height\n          ) {\n            return 'inner-top'\n          } else if (\n            viewportRef.value.isScrollBottom &&\n            nodeRect.height + helpersRect.height > viewportRef.value.height\n          ) {\n            return 'inner-bottom'\n          }\n\n          return 'bottom'\n        }\n\n        const getXInViewport = (nodeRect: DOMRect, helpersRect: DOMRect) => {\n          const widthDelta = helpersRect.width - nodeRect.width\n          if (widthDelta >= 0) {\n            if (nodeRect.x < widthDelta) {\n              return 'left'\n            } else if (nodeRect.right + widthDelta > viewportRef.value.width) {\n              return 'right'\n            } else {\n              return 'center'\n            }\n          }\n          return 'right'\n        }\n\n        const update = () => {\n          const nodeRect = props.nodeRect\n          const ref = refContainer\n          const helpersRect = ref.value?.getBoundingClientRect()\n          if (!helpersRect || !nodeRect) return\n          if (unmountRef.value) return\n          position.value =\n            getYInViewport(nodeRect, helpersRect) +\n            '-' +\n            getXInViewport(nodeRect, helpersRect)\n        }\n\n        nextTick(() => {\n          update()\n        })\n\n        return reaction(\n          () => [\n            viewportRef.value.width,\n            viewportRef.value.height,\n            viewportRef.value.scrollX,\n            viewportRef.value.scrollY,\n            viewportRef.value.isScrollBottom,\n            viewportRef.value.isScrollTop,\n          ],\n          () => {\n            clearTimeout(request)\n            request = setTimeout(update, HELPER_DEBOUNCE_TIMEOUT)\n          }\n        )\n      },\n      () => [viewportRef.value, props.nodeRect]\n    )\n\n    return () => {\n      const node = props.node\n      const nodeRect = props.nodeRect\n      const designer = designerRef.value\n      if (!nodeRect || !node) return null\n\n      return (\n        <div\n          class={cls(prefixRef.value, {\n            [unref(position)]: true,\n          })}\n          ref={refContainer}\n          onClick={e => e.stopPropagation()}\n        >\n          <div class={cls(prefixRef.value + '-content')}>\n            <Selector node={node} />\n            {node?.allowClone() === false ? null : <Copy node={node} />}\n            {node?.allowDrag() === false ? null : <DragHandler node={node} />}\n            {node?.allowDelete() === false ? null : <Delete node={node} />}\n          </div>\n        </div>\n      )\n    }\n  },\n})\n\nexport const Helpers = composeExport(HelpersComponent, {\n  displayName: 'Helpers',\n})\n"]}