|
@@ -0,0 +1,78 @@
|
|
|
+import dayjs from 'dayjs'
|
|
|
+import NotificationWorker from 'worker-loader!../workers/notification.js'
|
|
|
+import { createRandom } from '@/helpers/uuidv4'
|
|
|
+
|
|
|
+const clickEvents = {}
|
|
|
+const showEvents = {}
|
|
|
+const errorEvents = {}
|
|
|
+const closeEvents = {}
|
|
|
+
|
|
|
+const noop = () => {}
|
|
|
+
|
|
|
+export const notificationWorker = new NotificationWorker()
|
|
|
+
|
|
|
+const notificationClicked = data => {
|
|
|
+ const activeFn = clickEvents[data.callback_key]
|
|
|
+ if (typeof activeFn === 'function') {
|
|
|
+ activeFn(data)
|
|
|
+ }
|
|
|
+ delete clickEvents[data.callback_key]
|
|
|
+}
|
|
|
+
|
|
|
+const notificationShowed = data => {
|
|
|
+ const activeFn = showEvents[data.callback_key]
|
|
|
+ if (typeof activeFn === 'function') {
|
|
|
+ activeFn(data)
|
|
|
+ }
|
|
|
+ delete showEvents[data.callback_key]
|
|
|
+}
|
|
|
+
|
|
|
+const notificationErrored = data => {
|
|
|
+ const activeFn = errorEvents[data.callback_key]
|
|
|
+ if (typeof activeFn === 'function') {
|
|
|
+ activeFn(data)
|
|
|
+ }
|
|
|
+ delete errorEvents[data.callback_key]
|
|
|
+}
|
|
|
+
|
|
|
+const notificationClosed = data => {
|
|
|
+ const activeFn = closeEvents[data.callback_key]
|
|
|
+ if (typeof activeFn === 'function') {
|
|
|
+ activeFn(data)
|
|
|
+ }
|
|
|
+ delete closeEvents[data.callback_key]
|
|
|
+}
|
|
|
+
|
|
|
+notificationWorker.addEventListener('message', evt => {
|
|
|
+ if (evt.data.type === 'NotificationClicked') {
|
|
|
+ notificationClicked(evt.data.data || {})
|
|
|
+ } else if (evt.data.type === 'NotificationShowed') {
|
|
|
+ notificationShowed(evt.data.data || {})
|
|
|
+ } else if (evt.data.type === 'NotificationErrored') {
|
|
|
+ notificationErrored(evt.data.data || {})
|
|
|
+ } else if (evt.data.type === 'NotificationClosed') {
|
|
|
+ notificationClosed(evt.data.data || {})
|
|
|
+ }
|
|
|
+})
|
|
|
+
|
|
|
+export const createNotification = data => {
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * @param { Object } 会原样在onClick返回
|
|
|
+ *
|
|
|
+ */
|
|
|
+
|
|
|
+ const { onClick = noop, onShow = noop, onError = noop, onClose = noop, ...rest } = data
|
|
|
+ const timemap = dayjs().valueOf()
|
|
|
+ const callback_key = `${timemap}_${createRandom()}`
|
|
|
+ clickEvents[callback_key] = onClick
|
|
|
+ clickEvents[callback_key] = onShow
|
|
|
+ clickEvents[callback_key] = onError
|
|
|
+ clickEvents[callback_key] = onClose
|
|
|
+ notificationWorker.postMessage({
|
|
|
+ ...rest,
|
|
|
+ timemap,
|
|
|
+ callback_key,
|
|
|
+ type: 'create'
|
|
|
+ })
|
|
|
+}
|