index.js 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  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 = exports.actWrapper = exports.actDestroy = void 0;
  9. var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
  10. var _react = _interopRequireWildcard(require("react"));
  11. var _context = require("../app/context");
  12. var _configProvider = _interopRequireWildcard(require("../config-provider"));
  13. var _UnstableContext = require("../config-provider/UnstableContext");
  14. var _PurePanel = _interopRequireDefault(require("./PurePanel"));
  15. var _useMessage = _interopRequireWildcard(require("./useMessage"));
  16. var _util = require("./util");
  17. let message = null;
  18. let act = callback => callback();
  19. let taskQueue = [];
  20. let defaultGlobalConfig = {};
  21. function getGlobalContext() {
  22. const {
  23. getContainer,
  24. duration,
  25. rtl,
  26. maxCount,
  27. top
  28. } = defaultGlobalConfig;
  29. const mergedContainer = (getContainer === null || getContainer === void 0 ? void 0 : getContainer()) || document.body;
  30. return {
  31. getContainer: () => mergedContainer,
  32. duration,
  33. rtl,
  34. maxCount,
  35. top
  36. };
  37. }
  38. const GlobalHolder = /*#__PURE__*/_react.default.forwardRef((props, ref) => {
  39. const {
  40. messageConfig,
  41. sync
  42. } = props;
  43. const {
  44. getPrefixCls
  45. } = (0, _react.useContext)(_configProvider.ConfigContext);
  46. const prefixCls = defaultGlobalConfig.prefixCls || getPrefixCls('message');
  47. const appConfig = (0, _react.useContext)(_context.AppConfigContext);
  48. const [api, holder] = (0, _useMessage.useInternalMessage)(Object.assign(Object.assign(Object.assign({}, messageConfig), {
  49. prefixCls
  50. }), appConfig.message));
  51. _react.default.useImperativeHandle(ref, () => {
  52. const instance = Object.assign({}, api);
  53. Object.keys(instance).forEach(method => {
  54. instance[method] = (...args) => {
  55. sync();
  56. return api[method].apply(api, args);
  57. };
  58. });
  59. return {
  60. instance,
  61. sync
  62. };
  63. });
  64. return holder;
  65. });
  66. const GlobalHolderWrapper = /*#__PURE__*/_react.default.forwardRef((_, ref) => {
  67. const [messageConfig, setMessageConfig] = _react.default.useState(getGlobalContext);
  68. const sync = () => {
  69. setMessageConfig(getGlobalContext);
  70. };
  71. _react.default.useEffect(sync, []);
  72. const global = (0, _configProvider.globalConfig)();
  73. const rootPrefixCls = global.getRootPrefixCls();
  74. const rootIconPrefixCls = global.getIconPrefixCls();
  75. const theme = global.getTheme();
  76. const dom = /*#__PURE__*/_react.default.createElement(GlobalHolder, {
  77. ref: ref,
  78. sync: sync,
  79. messageConfig: messageConfig
  80. });
  81. return /*#__PURE__*/_react.default.createElement(_configProvider.default, {
  82. prefixCls: rootPrefixCls,
  83. iconPrefixCls: rootIconPrefixCls,
  84. theme: theme
  85. }, global.holderRender ? global.holderRender(dom) : dom);
  86. });
  87. const flushMessageQueue = () => {
  88. if (!message) {
  89. const holderFragment = document.createDocumentFragment();
  90. const newMessage = {
  91. fragment: holderFragment
  92. };
  93. message = newMessage;
  94. // Delay render to avoid sync issue
  95. act(() => {
  96. const reactRender = (0, _UnstableContext.unstableSetRender)();
  97. reactRender(/*#__PURE__*/_react.default.createElement(GlobalHolderWrapper, {
  98. ref: node => {
  99. const {
  100. instance,
  101. sync
  102. } = node || {};
  103. // React 18 test env will throw if call immediately in ref
  104. Promise.resolve().then(() => {
  105. if (!newMessage.instance && instance) {
  106. newMessage.instance = instance;
  107. newMessage.sync = sync;
  108. flushMessageQueue();
  109. }
  110. });
  111. }
  112. }), holderFragment);
  113. });
  114. return;
  115. }
  116. // Notification not ready
  117. if (!message.instance) {
  118. return;
  119. }
  120. // >>> Execute task
  121. taskQueue.forEach(task => {
  122. const {
  123. type,
  124. skipped
  125. } = task;
  126. // Only `skipped` when user call notice but cancel it immediately
  127. // and instance not ready
  128. if (!skipped) {
  129. switch (type) {
  130. case 'open':
  131. {
  132. act(() => {
  133. const closeFn = message.instance.open(Object.assign(Object.assign({}, defaultGlobalConfig), task.config));
  134. closeFn === null || closeFn === void 0 ? void 0 : closeFn.then(task.resolve);
  135. task.setCloseFn(closeFn);
  136. });
  137. break;
  138. }
  139. case 'destroy':
  140. act(() => {
  141. message === null || message === void 0 ? void 0 : message.instance.destroy(task.key);
  142. });
  143. break;
  144. // Other type open
  145. default:
  146. {
  147. act(() => {
  148. var _message$instance;
  149. const closeFn = (_message$instance = message.instance)[type].apply(_message$instance, (0, _toConsumableArray2.default)(task.args));
  150. closeFn === null || closeFn === void 0 ? void 0 : closeFn.then(task.resolve);
  151. task.setCloseFn(closeFn);
  152. });
  153. }
  154. }
  155. }
  156. });
  157. // Clean up
  158. taskQueue = [];
  159. };
  160. // ==============================================================================
  161. // == Export ==
  162. // ==============================================================================
  163. function setMessageGlobalConfig(config) {
  164. defaultGlobalConfig = Object.assign(Object.assign({}, defaultGlobalConfig), config);
  165. // Trigger sync for it
  166. act(() => {
  167. var _a;
  168. (_a = message === null || message === void 0 ? void 0 : message.sync) === null || _a === void 0 ? void 0 : _a.call(message);
  169. });
  170. }
  171. function open(config) {
  172. const result = (0, _util.wrapPromiseFn)(resolve => {
  173. let closeFn;
  174. const task = {
  175. type: 'open',
  176. config,
  177. resolve,
  178. setCloseFn: fn => {
  179. closeFn = fn;
  180. }
  181. };
  182. taskQueue.push(task);
  183. return () => {
  184. if (closeFn) {
  185. act(() => {
  186. closeFn();
  187. });
  188. } else {
  189. task.skipped = true;
  190. }
  191. };
  192. });
  193. flushMessageQueue();
  194. return result;
  195. }
  196. function typeOpen(type, args) {
  197. const global = (0, _configProvider.globalConfig)();
  198. if (process.env.NODE_ENV !== 'production' && !global.holderRender) {
  199. (0, _configProvider.warnContext)('message');
  200. }
  201. const result = (0, _util.wrapPromiseFn)(resolve => {
  202. let closeFn;
  203. const task = {
  204. type,
  205. args,
  206. resolve,
  207. setCloseFn: fn => {
  208. closeFn = fn;
  209. }
  210. };
  211. taskQueue.push(task);
  212. return () => {
  213. if (closeFn) {
  214. act(() => {
  215. closeFn();
  216. });
  217. } else {
  218. task.skipped = true;
  219. }
  220. };
  221. });
  222. flushMessageQueue();
  223. return result;
  224. }
  225. const destroy = key => {
  226. taskQueue.push({
  227. type: 'destroy',
  228. key
  229. });
  230. flushMessageQueue();
  231. };
  232. const methods = ['success', 'info', 'warning', 'error', 'loading'];
  233. const baseStaticMethods = {
  234. open,
  235. destroy,
  236. config: setMessageGlobalConfig,
  237. useMessage: _useMessage.default,
  238. _InternalPanelDoNotUseOrYouWillBeFired: _PurePanel.default
  239. };
  240. const staticMethods = baseStaticMethods;
  241. methods.forEach(type => {
  242. staticMethods[type] = (...args) => typeOpen(type, args);
  243. });
  244. // ==============================================================================
  245. // == Test ==
  246. // ==============================================================================
  247. const noop = () => {};
  248. let _actWrapper = noop;
  249. if (process.env.NODE_ENV === 'test') {
  250. _actWrapper = wrapper => {
  251. act = wrapper;
  252. };
  253. }
  254. const actWrapper = exports.actWrapper = _actWrapper;
  255. let _actDestroy = noop;
  256. if (process.env.NODE_ENV === 'test') {
  257. _actDestroy = () => {
  258. message = null;
  259. };
  260. }
  261. const actDestroy = exports.actDestroy = _actDestroy;
  262. var _default = exports.default = staticMethods;