UNPKG

6.12 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4var _typeof = require("@babel/runtime/helpers/typeof");
5Object.defineProperty(exports, "__esModule", {
6 value: true
7});
8exports.default = useNotification;
9var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
10var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
12var React = _interopRequireWildcard(require("react"));
13var _Notifications = _interopRequireDefault(require("./Notifications"));
14var _excluded = ["getContainer", "motion", "prefixCls", "maxCount", "className", "style", "onAllRemoved"];
15function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
16function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
17var defaultGetContainer = function defaultGetContainer() {
18 return document.body;
19};
20var uniqueKey = 0;
21function mergeConfig() {
22 var clone = {};
23 for (var _len = arguments.length, objList = new Array(_len), _key = 0; _key < _len; _key++) {
24 objList[_key] = arguments[_key];
25 }
26 objList.forEach(function (obj) {
27 if (obj) {
28 Object.keys(obj).forEach(function (key) {
29 var val = obj[key];
30 if (val !== undefined) {
31 clone[key] = val;
32 }
33 });
34 }
35 });
36 return clone;
37}
38function useNotification() {
39 var rootConfig = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
40 var _rootConfig$getContai = rootConfig.getContainer,
41 getContainer = _rootConfig$getContai === void 0 ? defaultGetContainer : _rootConfig$getContai,
42 motion = rootConfig.motion,
43 prefixCls = rootConfig.prefixCls,
44 maxCount = rootConfig.maxCount,
45 className = rootConfig.className,
46 style = rootConfig.style,
47 onAllRemoved = rootConfig.onAllRemoved,
48 shareConfig = (0, _objectWithoutProperties2.default)(rootConfig, _excluded);
49 var _React$useState = React.useState(),
50 _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2),
51 container = _React$useState2[0],
52 setContainer = _React$useState2[1];
53 var notificationsRef = React.useRef();
54 var contextHolder = /*#__PURE__*/React.createElement(_Notifications.default, {
55 container: container,
56 ref: notificationsRef,
57 prefixCls: prefixCls,
58 motion: motion,
59 maxCount: maxCount,
60 className: className,
61 style: style,
62 onAllRemoved: onAllRemoved
63 });
64 var _React$useState3 = React.useState([]),
65 _React$useState4 = (0, _slicedToArray2.default)(_React$useState3, 2),
66 taskQueue = _React$useState4[0],
67 setTaskQueue = _React$useState4[1];
68 // ========================= Refs =========================
69 var api = React.useMemo(function () {
70 return {
71 open: function open(config) {
72 var mergedConfig = mergeConfig(shareConfig, config);
73 if (mergedConfig.key === null || mergedConfig.key === undefined) {
74 mergedConfig.key = "rc-notification-".concat(uniqueKey);
75 uniqueKey += 1;
76 }
77 setTaskQueue(function (queue) {
78 return [].concat((0, _toConsumableArray2.default)(queue), [{
79 type: 'open',
80 config: mergedConfig
81 }]);
82 });
83 },
84 close: function close(key) {
85 setTaskQueue(function (queue) {
86 return [].concat((0, _toConsumableArray2.default)(queue), [{
87 type: 'close',
88 key: key
89 }]);
90 });
91 },
92 destroy: function destroy() {
93 setTaskQueue(function (queue) {
94 return [].concat((0, _toConsumableArray2.default)(queue), [{
95 type: 'destroy'
96 }]);
97 });
98 }
99 };
100 }, []);
101 // ======================= Container ======================
102 // React 18 should all in effect that we will check container in each render
103 // Which means getContainer should be stable.
104 React.useEffect(function () {
105 setContainer(getContainer());
106 });
107 // ======================== Effect ========================
108 React.useEffect(function () {
109 // Flush task when node ready
110 if (notificationsRef.current && taskQueue.length) {
111 taskQueue.forEach(function (task) {
112 switch (task.type) {
113 case 'open':
114 notificationsRef.current.open(task.config);
115 break;
116 case 'close':
117 notificationsRef.current.close(task.key);
118 break;
119 case 'destroy':
120 notificationsRef.current.destroy();
121 break;
122 }
123 });
124 // React 17 will mix order of effect & setState in async
125 // - open: setState[0]
126 // - effect[0]
127 // - open: setState[1]
128 // - effect setState([]) * here will clean up [0, 1] in React 17
129 setTaskQueue(function (oriQueue) {
130 return oriQueue.filter(function (task) {
131 return !taskQueue.includes(task);
132 });
133 });
134 }
135 }, [taskQueue]);
136 // ======================== Return ========================
137 return [api, contextHolder];
138}
\No newline at end of file