ActionButton.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
  2. import { createVNode as _createVNode, resolveDirective as _resolveDirective } from "vue";
  3. import { onMounted, ref, defineComponent, onBeforeUnmount } from 'vue';
  4. import Button from '../button';
  5. import { convertLegacyProps } from '../button/buttonTypes';
  6. import useDestroyed from './hooks/useDestroyed';
  7. var actionButtonProps = {
  8. type: {
  9. type: String
  10. },
  11. actionFn: Function,
  12. close: Function,
  13. autofocus: Boolean,
  14. prefixCls: String,
  15. buttonProps: Object,
  16. emitEvent: Boolean,
  17. quitOnNullishReturnValue: Boolean
  18. };
  19. function isThenable(thing) {
  20. return !!(thing && !!thing.then);
  21. }
  22. export default defineComponent({
  23. compatConfig: {
  24. MODE: 3
  25. },
  26. name: 'ActionButton',
  27. props: actionButtonProps,
  28. setup: function setup(props, _ref) {
  29. var slots = _ref.slots;
  30. var clickedRef = ref(false);
  31. var buttonRef = ref();
  32. var loading = ref(false);
  33. var timeoutId;
  34. var isDestroyed = useDestroyed();
  35. onMounted(function () {
  36. if (props.autofocus) {
  37. timeoutId = setTimeout(function () {
  38. var _buttonRef$value$$el;
  39. return (_buttonRef$value$$el = buttonRef.value.$el) === null || _buttonRef$value$$el === void 0 ? void 0 : _buttonRef$value$$el.focus();
  40. });
  41. }
  42. });
  43. onBeforeUnmount(function () {
  44. clearTimeout(timeoutId);
  45. });
  46. var handlePromiseOnOk = function handlePromiseOnOk(returnValueOfOnOk) {
  47. var close = props.close;
  48. if (!isThenable(returnValueOfOnOk)) {
  49. return;
  50. }
  51. loading.value = true;
  52. returnValueOfOnOk.then(function () {
  53. if (!isDestroyed.value) {
  54. loading.value = false;
  55. }
  56. close.apply(void 0, arguments);
  57. clickedRef.value = false;
  58. }, function (e) {
  59. // Emit error when catch promise reject
  60. // eslint-disable-next-line no-console
  61. console.error(e);
  62. // See: https://github.com/ant-design/ant-design/issues/6183
  63. if (!isDestroyed.value) {
  64. loading.value = false;
  65. }
  66. clickedRef.value = false;
  67. });
  68. };
  69. var onClick = function onClick(e) {
  70. var actionFn = props.actionFn,
  71. _props$close = props.close,
  72. close = _props$close === void 0 ? function () {} : _props$close;
  73. if (clickedRef.value) {
  74. return;
  75. }
  76. clickedRef.value = true;
  77. if (!actionFn) {
  78. close();
  79. return;
  80. }
  81. var returnValueOfOnOk;
  82. if (props.emitEvent) {
  83. returnValueOfOnOk = actionFn(e);
  84. if (props.quitOnNullishReturnValue && !isThenable(returnValueOfOnOk)) {
  85. clickedRef.value = false;
  86. close(e);
  87. return;
  88. }
  89. } else if (actionFn.length) {
  90. returnValueOfOnOk = actionFn(close);
  91. // https://github.com/ant-design/ant-design/issues/23358
  92. clickedRef.value = false;
  93. } else {
  94. returnValueOfOnOk = actionFn();
  95. if (!returnValueOfOnOk) {
  96. close();
  97. return;
  98. }
  99. }
  100. handlePromiseOnOk(returnValueOfOnOk);
  101. };
  102. return function () {
  103. var type = props.type,
  104. prefixCls = props.prefixCls,
  105. buttonProps = props.buttonProps;
  106. return _createVNode(Button, _objectSpread(_objectSpread(_objectSpread({}, convertLegacyProps(type)), {}, {
  107. "onClick": onClick,
  108. "loading": loading.value,
  109. "prefixCls": prefixCls
  110. }, buttonProps), {}, {
  111. "ref": buttonRef
  112. }), slots);
  113. };
  114. }
  115. });