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