yzsd
Version:
a niubi UI component
133 lines • 5.17 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
import React, { forwardRef, useEffect, useImperativeHandle, useState } from 'react';
import { createPortal } from 'react-dom';
import Notice from './notice';
import classNames from 'classnames';
import { TransitionGroup, CSSTransition } from 'react-transition-group';
var timeout = 200;
var noTifications = /*#__PURE__*/forwardRef(function (props, ref) {
var container = props.container,
prefixCls = props.prefixCls,
className = props.className,
style = props.style,
_props$maxCount = props.maxCount,
maxCount = _props$maxCount === void 0 ? 0 : _props$maxCount,
onAllRemoved = props.onAllRemoved;
var _useState = useState([]),
_useState2 = _slicedToArray(_useState, 2),
configList = _useState2[0],
setConfigList = _useState2[1];
var _useState3 = useState({}),
_useState4 = _slicedToArray(_useState3, 2),
placements = _useState4[0],
setPlacements = _useState4[1];
useImperativeHandle(ref, function () {
return {
open: function open(config) {
setConfigList(function (list) {
var _a;
var clone = _toConsumableArray(list);
var index = clone.findIndex(function (i) {
return i.key === config.key;
});
var innerConfig = _extends({}, config);
if (index >= 0) {
innerConfig.times = (((_a = list[index]) === null || _a === void 0 ? void 0 : _a.times) || 0) + 1;
clone[index] = innerConfig;
} else {
innerConfig.times = 0;
clone.push(innerConfig);
}
if (maxCount > 0 && clone.length > maxCount) {
clone = clone.slice(-maxCount);
}
return clone;
});
},
close: function close() {},
destroy: function destroy() {}
};
});
useEffect(function () {
var nextPlacements = {};
configList.forEach(function (config) {
var _config$placement = config.placement,
placement = _config$placement === void 0 ? 'topRight' : _config$placement;
nextPlacements[placement] = nextPlacements[placement] || [];
(nextPlacements[placement] || []).push(config);
});
// Fill exist placements to avoid empty list causing remove without motion
Object.keys(placements).forEach(function (placement) {
nextPlacements[placement] = nextPlacements[placement] || [];
});
setPlacements(nextPlacements);
}, [configList]);
// Effect tell that placements is empty now
var emptyRef = React.useRef(false);
React.useEffect(function () {
if (Object.keys(placements).length > 0) {
emptyRef.current = true;
} else if (emptyRef.current) {
// Trigger only when from exist to empty
onAllRemoved === null || onAllRemoved === void 0 ? void 0 : onAllRemoved();
emptyRef.current = false;
}
}, [placements]);
var onAllNoticeRemoved = function onAllNoticeRemoved(placement) {
setPlacements(function (originPlacements) {
var clone = _extends({}, originPlacements);
var list = clone[placement];
if (!(list === null || list === void 0 ? void 0 : list.length)) {
delete clone[placement];
}
return clone;
});
};
var onNoticeClose = function onNoticeClose(key) {
var _a;
var config = configList.find(function (i) {
return i.key === key;
});
(_a = config === null || config === void 0 ? void 0 : config.onClose) === null || _a === void 0 ? void 0 : _a.call(config);
setConfigList(function (list) {
return list.filter(function (i) {
return i.key !== key;
});
});
};
var placementList = Object.keys(placements);
if (!container) {
return null;
}
return /*#__PURE__*/createPortal( /*#__PURE__*/React.createElement(React.Fragment, null, placementList.map(function (placement) {
var keys = placements[placement];
if (!(keys === null || keys === void 0 ? void 0 : keys.length)) {
setTimeout(function () {
onAllNoticeRemoved(placement);
}, timeout);
}
return /*#__PURE__*/React.createElement(TransitionGroup, {
key: placement,
className: classNames("".concat(prefixCls), "".concat(prefixCls, "-").concat(placement), className === null || className === void 0 ? void 0 : className(placement)),
style: style === null || style === void 0 ? void 0 : style(placement),
appear: true
}, keys === null || keys === void 0 ? void 0 : keys.map(function (config) {
return /*#__PURE__*/React.createElement(CSSTransition, {
key: config.key,
timeout: timeout,
classNames: "".concat(prefixCls)
}, /*#__PURE__*/React.createElement(Notice, _extends({}, config, {
key: config.key,
eventKey: config.key,
prefixCls: prefixCls,
className: config.className,
style: config.style,
times: config.times,
onNoticeClose: onNoticeClose
})));
}));
})), container);
});
export default noTifications;