mirror of https://github.com/msgbyte/tailchat
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
2.3 KiB
TypeScript
78 lines
2.3 KiB
TypeScript
import { notification } from 'antd';
|
|
import React from 'react';
|
|
import _once from 'lodash/once';
|
|
import { t } from 'tailchat-shared';
|
|
import { UpdateNotificationBtn } from '@/components/UpdateNotificationBtn';
|
|
|
|
/**
|
|
* 弹出更新提示框
|
|
*/
|
|
const handleShowUpdateTip = _once(() => {
|
|
setTimeout(() => {
|
|
// 两秒后再弹出以确保不会出现加载到一半的情况
|
|
notification.open({
|
|
message: t('更新版本'),
|
|
description: t('检测到有新版本, 是否立即刷新以升级到最新内容'),
|
|
duration: 0,
|
|
btn: React.createElement(UpdateNotificationBtn),
|
|
});
|
|
}, 2000);
|
|
});
|
|
|
|
/**
|
|
* 处理registration相关任务和状态
|
|
*/
|
|
function handleRegistration(registration: ServiceWorkerRegistration) {
|
|
console.log('registered', registration);
|
|
if (registration.waiting) {
|
|
console.log('updated', registration);
|
|
handleShowUpdateTip();
|
|
return;
|
|
}
|
|
registration.onupdatefound = () => {
|
|
console.log('updatefound', registration);
|
|
const installingWorker = registration.installing;
|
|
if (installingWorker === null) {
|
|
return;
|
|
}
|
|
|
|
installingWorker.onstatechange = () => {
|
|
if (installingWorker.state === 'installed') {
|
|
if (navigator.serviceWorker.controller) {
|
|
// At this point, the old content will have been purged and
|
|
// the fresh content will have been added to the cache.
|
|
// It's the perfect time to display a "New content is
|
|
// available; please refresh." message in your web app.
|
|
console.log('updated', registration);
|
|
handleShowUpdateTip();
|
|
} else {
|
|
// At this point, everything has been precached.
|
|
// It's the perfect time to display a
|
|
// "Content is cached for offline use." message.
|
|
console.log('cached', registration);
|
|
}
|
|
}
|
|
};
|
|
};
|
|
}
|
|
|
|
/**
|
|
* 初始化ws服务
|
|
*/
|
|
export function installServiceWorker() {
|
|
if ('serviceWorker' in navigator) {
|
|
window.addEventListener('load', () => {
|
|
navigator.serviceWorker
|
|
.register('/service-worker.js')
|
|
.then((registration) => {
|
|
console.log('SW registered: ', registration);
|
|
|
|
handleRegistration(registration);
|
|
})
|
|
.catch((registrationError) => {
|
|
console.log('SW registration failed: ', registrationError);
|
|
});
|
|
});
|
|
}
|
|
}
|