useWinClick.js 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import { getShadowRoot } from "rc-util/es/Dom/shadow";
  2. import { warning } from "rc-util/es/warning";
  3. import * as React from 'react';
  4. import { getWin } from "../util";
  5. export default function useWinClick(open, clickToHide, targetEle, popupEle, mask, maskClosable, inPopupOrChild, triggerOpen) {
  6. var openRef = React.useRef(open);
  7. openRef.current = open;
  8. var popupPointerDownRef = React.useRef(false);
  9. // Click to hide is special action since click popup element should not hide
  10. React.useEffect(function () {
  11. if (clickToHide && popupEle && (!mask || maskClosable)) {
  12. var onPointerDown = function onPointerDown() {
  13. popupPointerDownRef.current = false;
  14. };
  15. var onTriggerClose = function onTriggerClose(e) {
  16. var _e$composedPath;
  17. if (openRef.current && !inPopupOrChild(((_e$composedPath = e.composedPath) === null || _e$composedPath === void 0 || (_e$composedPath = _e$composedPath.call(e)) === null || _e$composedPath === void 0 ? void 0 : _e$composedPath[0]) || e.target) && !popupPointerDownRef.current) {
  18. triggerOpen(false);
  19. }
  20. };
  21. var win = getWin(popupEle);
  22. win.addEventListener('pointerdown', onPointerDown, true);
  23. win.addEventListener('mousedown', onTriggerClose, true);
  24. win.addEventListener('contextmenu', onTriggerClose, true);
  25. // shadow root
  26. var targetShadowRoot = getShadowRoot(targetEle);
  27. if (targetShadowRoot) {
  28. targetShadowRoot.addEventListener('mousedown', onTriggerClose, true);
  29. targetShadowRoot.addEventListener('contextmenu', onTriggerClose, true);
  30. }
  31. // Warning if target and popup not in same root
  32. if (process.env.NODE_ENV !== 'production') {
  33. var _targetEle$getRootNod, _popupEle$getRootNode;
  34. var targetRoot = targetEle === null || targetEle === void 0 || (_targetEle$getRootNod = targetEle.getRootNode) === null || _targetEle$getRootNod === void 0 ? void 0 : _targetEle$getRootNod.call(targetEle);
  35. var popupRoot = (_popupEle$getRootNode = popupEle.getRootNode) === null || _popupEle$getRootNode === void 0 ? void 0 : _popupEle$getRootNode.call(popupEle);
  36. warning(targetRoot === popupRoot, "trigger element and popup element should in same shadow root.");
  37. }
  38. return function () {
  39. win.removeEventListener('pointerdown', onPointerDown, true);
  40. win.removeEventListener('mousedown', onTriggerClose, true);
  41. win.removeEventListener('contextmenu', onTriggerClose, true);
  42. if (targetShadowRoot) {
  43. targetShadowRoot.removeEventListener('mousedown', onTriggerClose, true);
  44. targetShadowRoot.removeEventListener('contextmenu', onTriggerClose, true);
  45. }
  46. };
  47. }
  48. }, [clickToHide, targetEle, popupEle, mask, maskClosable]);
  49. function onPopupPointerDown() {
  50. popupPointerDownRef.current = true;
  51. }
  52. return onPopupPointerDown;
  53. }