ActionButton.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = void 0;
  7. var _vue = require("vue");
  8. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  9. var _button = _interopRequireDefault(require("../button"));
  10. var _buttonTypes = require("../button/buttonTypes");
  11. var _useDestroyed = _interopRequireDefault(require("./hooks/useDestroyed"));
  12. var _type = require("./type");
  13. var _propsUtil = require("./props-util");
  14. const actionButtonProps = {
  15. type: {
  16. type: String
  17. },
  18. actionFn: Function,
  19. close: Function,
  20. autofocus: Boolean,
  21. prefixCls: String,
  22. buttonProps: (0, _type.objectType)(),
  23. emitEvent: Boolean,
  24. quitOnNullishReturnValue: Boolean
  25. };
  26. function isThenable(thing) {
  27. return !!(thing && thing.then);
  28. }
  29. var _default = exports.default = (0, _vue.defineComponent)({
  30. compatConfig: {
  31. MODE: 3
  32. },
  33. name: 'ActionButton',
  34. props: actionButtonProps,
  35. setup(props, _ref) {
  36. let {
  37. slots
  38. } = _ref;
  39. const clickedRef = (0, _vue.shallowRef)(false);
  40. const buttonRef = (0, _vue.shallowRef)();
  41. const loading = (0, _vue.shallowRef)(false);
  42. let timeoutId;
  43. const isDestroyed = (0, _useDestroyed.default)();
  44. (0, _vue.onMounted)(() => {
  45. if (props.autofocus) {
  46. timeoutId = setTimeout(() => {
  47. var _a, _b;
  48. return (_b = (_a = (0, _propsUtil.findDOMNode)(buttonRef.value)) === null || _a === void 0 ? void 0 : _a.focus) === null || _b === void 0 ? void 0 : _b.call(_a);
  49. });
  50. }
  51. });
  52. (0, _vue.onBeforeUnmount)(() => {
  53. clearTimeout(timeoutId);
  54. });
  55. const onInternalClose = function () {
  56. var _a;
  57. for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
  58. args[_key] = arguments[_key];
  59. }
  60. (_a = props.close) === null || _a === void 0 ? void 0 : _a.call(props, ...args);
  61. };
  62. const handlePromiseOnOk = returnValueOfOnOk => {
  63. if (!isThenable(returnValueOfOnOk)) {
  64. return;
  65. }
  66. loading.value = true;
  67. returnValueOfOnOk.then(function () {
  68. if (!isDestroyed.value) {
  69. loading.value = false;
  70. }
  71. onInternalClose(...arguments);
  72. clickedRef.value = false;
  73. }, e => {
  74. // See: https://github.com/ant-design/ant-design/issues/6183
  75. if (!isDestroyed.value) {
  76. loading.value = false;
  77. }
  78. clickedRef.value = false;
  79. return Promise.reject(e);
  80. });
  81. };
  82. const onClick = e => {
  83. const {
  84. actionFn
  85. } = props;
  86. if (clickedRef.value) {
  87. return;
  88. }
  89. clickedRef.value = true;
  90. if (!actionFn) {
  91. onInternalClose();
  92. return;
  93. }
  94. let returnValueOfOnOk;
  95. if (props.emitEvent) {
  96. returnValueOfOnOk = actionFn(e);
  97. if (props.quitOnNullishReturnValue && !isThenable(returnValueOfOnOk)) {
  98. clickedRef.value = false;
  99. onInternalClose(e);
  100. return;
  101. }
  102. } else if (actionFn.length) {
  103. returnValueOfOnOk = actionFn(props.close);
  104. // https://github.com/ant-design/ant-design/issues/23358
  105. clickedRef.value = false;
  106. } else {
  107. returnValueOfOnOk = actionFn();
  108. if (!returnValueOfOnOk) {
  109. onInternalClose();
  110. return;
  111. }
  112. }
  113. handlePromiseOnOk(returnValueOfOnOk);
  114. };
  115. return () => {
  116. const {
  117. type,
  118. prefixCls,
  119. buttonProps
  120. } = props;
  121. return (0, _vue.createVNode)(_button.default, (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, (0, _buttonTypes.convertLegacyProps)(type)), {}, {
  122. "onClick": onClick,
  123. "loading": loading.value,
  124. "prefixCls": prefixCls
  125. }, buttonProps), {}, {
  126. "ref": buttonRef
  127. }), slots);
  128. };
  129. }
  130. });