@ant-design/x
Version:
Craft AI-driven interfaces effortlessly
100 lines (99 loc) • 2.92 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.XNotification = void 0;
var _react = require("react");
var _warning = _interopRequireDefault(require("../_util/warning"));
let uuid = 0;
class XNotification {
static permissionMap = new Map();
static permissible;
constructor() {
XNotification.permissible = !!globalThis?.Notification;
(0, _warning.default)(XNotification.permissible, 'XNotification', 'Notification API is not supported in this environment.');
}
get permission() {
if (!XNotification.permissible) {
return 'denied';
}
return globalThis.Notification?.permission;
}
open(arg) {
if (!XNotification.permissible) return;
const {
title,
tag,
onClick,
duration,
onClose,
onError,
onShow,
...config
} = arg || {};
if (tag && XNotification.permissionMap.has(tag)) return;
uuid += 1;
const mergeKey = tag || `x_notification_${uuid}`;
const notification = new globalThis.Notification(title, config || {});
const close = notification.close.bind(notification);
if (typeof duration === 'number') {
const timeoutId = setTimeout(() => {
clearTimeout(timeoutId);
close();
}, duration * 1000);
}
notification.onclick = event => {
onClick?.(event, close);
};
notification.onshow = event => {
onShow?.(event);
XNotification.permissionMap.set(mergeKey, {
close
});
};
notification.onclose = event => {
onClose?.(event);
XNotification.permissionMap.delete(mergeKey);
};
notification.onerror = event => {
onError?.(event);
};
}
async requestPermission() {
return this._requestPermission();
}
async _requestPermission(setPermissionState) {
if (!XNotification.permissible) {
return 'denied';
}
const permissionRes = await globalThis.Notification.requestPermission();
if (typeof setPermissionState === 'function') {
setPermissionState?.(permissionRes);
}
return permissionRes;
}
useNotification() {
const [permission, setPermission] = (0, _react.useState)(this?.permission);
return [{
permission
}, {
open: this.open,
close: this.close,
requestPermission: () => this._requestPermission.call(this, setPermission)
}];
}
close(tags) {
if (!XNotification.permissible) return;
Array.from(XNotification.permissionMap.keys()).forEach(key => {
if (tags === undefined) {
XNotification.permissionMap.get(key)?.close?.();
}
if (tags?.includes(key)) {
XNotification.permissionMap.get(key)?.close?.();
}
});
}
}
exports.XNotification = XNotification;
var _default = exports.default = new XNotification();