useMessage.js 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = useMessage;
  7. exports.useInternalMessage = useInternalMessage;
  8. var _vue = require("vue");
  9. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  10. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  11. var _vcNotification = require("../vc-notification");
  12. var _CloseOutlined = _interopRequireDefault(require("@ant-design/icons-vue/lib/icons/CloseOutlined"));
  13. var _style = _interopRequireDefault(require("./style"));
  14. var _PurePanel = require("./PurePanel");
  15. var _motionUtil = require("../vc-trigger/utils/motionUtil");
  16. var _util = require("../_util/util");
  17. var _useConfigInject = _interopRequireDefault(require("../config-provider/hooks/useConfigInject"));
  18. var _classNames = _interopRequireDefault(require("../_util/classNames"));
  19. var __rest = void 0 && (void 0).__rest || function (s, e) {
  20. var t = {};
  21. for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
  22. if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
  23. if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
  24. }
  25. return t;
  26. };
  27. const DEFAULT_OFFSET = 8;
  28. const DEFAULT_DURATION = 3;
  29. const Holder = (0, _vue.defineComponent)({
  30. name: 'Holder',
  31. inheritAttrs: false,
  32. props: ['top', 'prefixCls', 'getContainer', 'maxCount', 'duration', 'rtl', 'transitionName', 'onAllRemoved'],
  33. setup(props, _ref) {
  34. let {
  35. expose
  36. } = _ref;
  37. var _a, _b;
  38. const {
  39. getPrefixCls,
  40. getPopupContainer
  41. } = (0, _useConfigInject.default)('message', props);
  42. const prefixCls = (0, _vue.computed)(() => getPrefixCls('message', props.prefixCls));
  43. const [, hashId] = (0, _style.default)(prefixCls);
  44. // =============================== Style ===============================
  45. const getStyles = () => {
  46. var _a;
  47. const top = (_a = props.top) !== null && _a !== void 0 ? _a : DEFAULT_OFFSET;
  48. return {
  49. left: '50%',
  50. transform: 'translateX(-50%)',
  51. top: typeof top === 'number' ? `${top}px` : top
  52. };
  53. };
  54. const getClassName = () => (0, _classNames.default)(hashId.value, props.rtl ? `${prefixCls.value}-rtl` : '');
  55. // ============================== Motion ===============================
  56. const getNotificationMotion = () => {
  57. var _a;
  58. return (0, _motionUtil.getMotion)({
  59. prefixCls: prefixCls.value,
  60. animation: (_a = props.animation) !== null && _a !== void 0 ? _a : `move-up`,
  61. transitionName: props.transitionName
  62. });
  63. };
  64. // ============================ Close Icon =============================
  65. const mergedCloseIcon = (0, _vue.createVNode)("span", {
  66. "class": `${prefixCls.value}-close-x`
  67. }, [(0, _vue.createVNode)(_CloseOutlined.default, {
  68. "class": `${prefixCls.value}-close-icon`
  69. }, null)]);
  70. // ============================== Origin ===============================
  71. const [api, holder] = (0, _vcNotification.useNotification)({
  72. //@ts-ignore
  73. getStyles,
  74. prefixCls: prefixCls.value,
  75. getClassName,
  76. motion: getNotificationMotion,
  77. closable: false,
  78. closeIcon: mergedCloseIcon,
  79. duration: (_a = props.duration) !== null && _a !== void 0 ? _a : DEFAULT_DURATION,
  80. getContainer: (_b = props.staticGetContainer) !== null && _b !== void 0 ? _b : getPopupContainer.value,
  81. maxCount: props.maxCount,
  82. onAllRemoved: props.onAllRemoved
  83. });
  84. // ================================ Ref ================================
  85. expose((0, _extends2.default)((0, _extends2.default)({}, api), {
  86. prefixCls,
  87. hashId
  88. }));
  89. return holder;
  90. }
  91. });
  92. // ==============================================================================
  93. // == Hook ==
  94. // ==============================================================================
  95. let keyIndex = 0;
  96. function useInternalMessage(messageConfig) {
  97. const holderRef = (0, _vue.shallowRef)(null);
  98. const holderKey = Symbol('messageHolderKey');
  99. // ================================ API ================================
  100. // Wrap with notification content
  101. // >>> close
  102. const close = key => {
  103. var _a;
  104. (_a = holderRef.value) === null || _a === void 0 ? void 0 : _a.close(key);
  105. };
  106. // >>> Open
  107. const open = config => {
  108. if (!holderRef.value) {
  109. const fakeResult = () => {};
  110. fakeResult.then = () => {};
  111. return fakeResult;
  112. }
  113. const {
  114. open: originOpen,
  115. prefixCls,
  116. hashId
  117. } = holderRef.value;
  118. const noticePrefixCls = `${prefixCls}-notice`;
  119. const {
  120. content,
  121. icon,
  122. type,
  123. key,
  124. class: className,
  125. onClose
  126. } = config,
  127. restConfig = __rest(config, ["content", "icon", "type", "key", "class", "onClose"]);
  128. let mergedKey = key;
  129. if (mergedKey === undefined || mergedKey === null) {
  130. keyIndex += 1;
  131. mergedKey = `antd-message-${keyIndex}`;
  132. }
  133. return (0, _util.wrapPromiseFn)(resolve => {
  134. originOpen((0, _extends2.default)((0, _extends2.default)({}, restConfig), {
  135. key: mergedKey,
  136. content: () => (0, _vue.createVNode)(_PurePanel.PureContent, {
  137. "prefixCls": prefixCls,
  138. "type": type,
  139. "icon": typeof icon === 'function' ? icon() : icon
  140. }, {
  141. default: () => [typeof content === 'function' ? content() : content]
  142. }),
  143. placement: 'top',
  144. // @ts-ignore
  145. class: (0, _classNames.default)(type && `${noticePrefixCls}-${type}`, hashId, className),
  146. onClose: () => {
  147. onClose === null || onClose === void 0 ? void 0 : onClose();
  148. resolve();
  149. }
  150. }));
  151. // Return close function
  152. return () => {
  153. close(mergedKey);
  154. };
  155. });
  156. };
  157. // >>> destroy
  158. const destroy = key => {
  159. var _a;
  160. if (key !== undefined) {
  161. close(key);
  162. } else {
  163. (_a = holderRef.value) === null || _a === void 0 ? void 0 : _a.destroy();
  164. }
  165. };
  166. const wrapAPI = {
  167. open,
  168. destroy
  169. };
  170. const keys = ['info', 'success', 'warning', 'error', 'loading'];
  171. keys.forEach(type => {
  172. const typeOpen = (jointContent, duration, onClose) => {
  173. let config;
  174. if (jointContent && typeof jointContent === 'object' && 'content' in jointContent) {
  175. config = jointContent;
  176. } else {
  177. config = {
  178. content: jointContent
  179. };
  180. }
  181. // Params
  182. let mergedDuration;
  183. let mergedOnClose;
  184. if (typeof duration === 'function') {
  185. mergedOnClose = duration;
  186. } else {
  187. mergedDuration = duration;
  188. mergedOnClose = onClose;
  189. }
  190. const mergedConfig = (0, _extends2.default)((0, _extends2.default)({
  191. onClose: mergedOnClose,
  192. duration: mergedDuration
  193. }, config), {
  194. type
  195. });
  196. return open(mergedConfig);
  197. };
  198. wrapAPI[type] = typeOpen;
  199. });
  200. // ============================== Return ===============================
  201. return [wrapAPI, () => (0, _vue.createVNode)(Holder, (0, _objectSpread2.default)((0, _objectSpread2.default)({
  202. "key": holderKey
  203. }, messageConfig), {}, {
  204. "ref": holderRef
  205. }), null)];
  206. }
  207. function useMessage(messageConfig) {
  208. return useInternalMessage(messageConfig);
  209. }