index.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. "use strict";
  2. "use client";
  3. var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
  4. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  5. Object.defineProperty(exports, "__esModule", {
  6. value: true
  7. });
  8. exports.default = void 0;
  9. var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
  10. var React = _interopRequireWildcard(require("react"));
  11. var _usePatchElement = _interopRequireDefault(require("../../_util/hooks/usePatchElement"));
  12. var _confirm = require("../confirm");
  13. var _destroyFns = _interopRequireDefault(require("../destroyFns"));
  14. var _HookModal = _interopRequireDefault(require("./HookModal"));
  15. let uuid = 0;
  16. const ElementsHolder = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef((_props, ref) => {
  17. const [elements, patchElement] = (0, _usePatchElement.default)();
  18. React.useImperativeHandle(ref, () => ({
  19. patchElement
  20. }), []);
  21. return /*#__PURE__*/React.createElement(React.Fragment, null, elements);
  22. }));
  23. function useModal() {
  24. const holderRef = React.useRef(null);
  25. // ========================== Effect ==========================
  26. const [actionQueue, setActionQueue] = React.useState([]);
  27. React.useEffect(() => {
  28. if (actionQueue.length) {
  29. const cloneQueue = (0, _toConsumableArray2.default)(actionQueue);
  30. cloneQueue.forEach(action => {
  31. action();
  32. });
  33. setActionQueue([]);
  34. }
  35. }, [actionQueue]);
  36. // =========================== Hook ===========================
  37. const getConfirmFunc = React.useCallback(withFunc => function hookConfirm(config) {
  38. var _a;
  39. uuid += 1;
  40. const modalRef = /*#__PURE__*/React.createRef();
  41. // Proxy to promise with `onClose`
  42. let resolvePromise;
  43. const promise = new Promise(resolve => {
  44. resolvePromise = resolve;
  45. });
  46. let silent = false;
  47. let closeFunc;
  48. const modal = /*#__PURE__*/React.createElement(_HookModal.default, {
  49. key: `modal-${uuid}`,
  50. config: withFunc(config),
  51. ref: modalRef,
  52. afterClose: () => {
  53. closeFunc === null || closeFunc === void 0 ? void 0 : closeFunc();
  54. },
  55. isSilent: () => silent,
  56. onConfirm: confirmed => {
  57. resolvePromise(confirmed);
  58. }
  59. });
  60. closeFunc = (_a = holderRef.current) === null || _a === void 0 ? void 0 : _a.patchElement(modal);
  61. if (closeFunc) {
  62. _destroyFns.default.push(closeFunc);
  63. }
  64. const instance = {
  65. destroy: () => {
  66. function destroyAction() {
  67. var _a;
  68. (_a = modalRef.current) === null || _a === void 0 ? void 0 : _a.destroy();
  69. }
  70. if (modalRef.current) {
  71. destroyAction();
  72. } else {
  73. setActionQueue(prev => [].concat((0, _toConsumableArray2.default)(prev), [destroyAction]));
  74. }
  75. },
  76. update: newConfig => {
  77. function updateAction() {
  78. var _a;
  79. (_a = modalRef.current) === null || _a === void 0 ? void 0 : _a.update(newConfig);
  80. }
  81. if (modalRef.current) {
  82. updateAction();
  83. } else {
  84. setActionQueue(prev => [].concat((0, _toConsumableArray2.default)(prev), [updateAction]));
  85. }
  86. },
  87. then: resolve => {
  88. silent = true;
  89. return promise.then(resolve);
  90. }
  91. };
  92. return instance;
  93. }, []);
  94. const fns = React.useMemo(() => ({
  95. info: getConfirmFunc(_confirm.withInfo),
  96. success: getConfirmFunc(_confirm.withSuccess),
  97. error: getConfirmFunc(_confirm.withError),
  98. warning: getConfirmFunc(_confirm.withWarn),
  99. confirm: getConfirmFunc(_confirm.withConfirm)
  100. }), []);
  101. return [fns, /*#__PURE__*/React.createElement(ElementsHolder, {
  102. key: "modal-holder",
  103. ref: holderRef
  104. })];
  105. }
  106. var _default = exports.default = useModal;