mirror of https://github.com/msgbyte/tailchat
feat: add service worker
parent
cf5ee30ce8
commit
0e3a2ece69
@ -0,0 +1,21 @@
|
||||
import React from 'react';
|
||||
import { Button, Space } from 'antd';
|
||||
import { t } from 'tailchat-shared';
|
||||
|
||||
/**
|
||||
* sw更新提示的按钮
|
||||
*/
|
||||
export const UpdateNotificationBtn: React.FC = React.memo(() => {
|
||||
return (
|
||||
<Space>
|
||||
<Button
|
||||
type="primary"
|
||||
size="small"
|
||||
onClick={() => window.location.reload()}
|
||||
>
|
||||
{t('立即刷新')}
|
||||
</Button>
|
||||
</Space>
|
||||
);
|
||||
});
|
||||
UpdateNotificationBtn.displayName = 'UpdateNotificationBtn';
|
@ -0,0 +1,77 @@
|
||||
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);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue