linkmore-design
Version:
π πlmη»δ»ΆεΊγπ
83 lines (80 loc) β’ 2.67 kB
JavaScript
;
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = createUseMessage;
var _useNotification = _interopRequireDefault(require("rc-notification/lib/useNotification"));
var React = _interopRequireWildcard(require("react"));
var _ = require("..");
var _configProvider = require("../../config-provider");
function createUseMessage(getRcNotificationInstance, getRCNoticeProps) {
const useMessage = () => {
// We can only get content by render
let getPrefixCls;
let getPopupContainer;
// We create a proxy to handle delay created instance
let innerInstance = null;
const proxy = {
add: (noticeProps, holderCallback) => {
innerInstance?.component.add(noticeProps, holderCallback);
}
};
const [hookNotify, holder] = (0, _useNotification.default)(proxy);
function notify(args) {
const {
prefixCls: customizePrefixCls
} = args;
const mergedPrefixCls = getPrefixCls('message', customizePrefixCls);
const rootPrefixCls = getPrefixCls();
const target = args.key || (0, _.getKeyThenIncreaseKey)();
const closePromise = new Promise(resolve => {
const callback = () => {
if (typeof args.onClose === 'function') {
args.onClose();
}
return resolve(true);
};
getRcNotificationInstance({
...args,
prefixCls: mergedPrefixCls,
rootPrefixCls,
getPopupContainer
}, ({
prefixCls,
instance
}) => {
innerInstance = instance;
hookNotify(getRCNoticeProps({
...args,
key: target,
onClose: callback
}, prefixCls));
});
});
const result = () => {
if (innerInstance) {
innerInstance.removeNotice(target);
}
};
result.then = (filled, rejected) => closePromise.then(filled, rejected);
result.promise = closePromise;
return result;
}
// Fill functions
const hookApiRef = React.useRef({});
hookApiRef.current.open = notify;
_.typeList.forEach(type => (0, _.attachTypeApi)(hookApiRef.current, type));
return [hookApiRef.current, /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, {
key: "holder"
}, context => {
({
getPrefixCls,
getPopupContainer
} = context);
return holder;
})];
};
return useMessage;
}