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.
tailchat/web/src/utils/sw-helper.ts

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);
});
});
}
}