UNPKG

yzsd

Version:
133 lines 5.17 kB
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;