import { message, notification } from '@/utils/antdAppInstance'; import { getIntl } from '@umijs/max'; import { Button } from 'antd'; import defaultSettings from '../config/defaultSettings'; const { pwa } = defaultSettings; const isHttps = document.location.protocol === 'https:'; const clearCache = () => { if (window.caches) { caches .keys() .then((keys) => { keys.forEach((key) => { caches.delete(key); }); }) .catch((e) => console.log(e)); } }; if (pwa) { window.addEventListener('sw.offline', () => { message.warning(getIntl().formatMessage({ id: 'app.pwa.offline' })); }); window.addEventListener('sw.updated', (event: Event) => { const e = event as CustomEvent; const reloadSW = async () => { const worker = e.detail && e.detail.waiting; if (!worker) { return true; } await new Promise((resolve, reject) => { const channel = new MessageChannel(); channel.port1.onmessage = (msgEvent) => { if (msgEvent.data.error) { reject(msgEvent.data.error); } else { resolve(msgEvent.data); } }; worker.postMessage({ type: 'skip-waiting' }, [channel.port2]); }); clearCache(); window.location.reload(); return true; }; const key = `open${Date.now()}`; const intl = getIntl(); const btn = ( ); notification.open({ message: intl.formatMessage({ id: 'app.pwa.serviceWorker.updated' }), description: intl.formatMessage({ id: 'app.pwa.serviceWorker.updated.hint' }), btn, key, onClose: async () => null, }); }); } else if ('serviceWorker' in navigator && isHttps) { const { serviceWorker } = navigator; if (serviceWorker.getRegistrations) { serviceWorker.getRegistrations().then((sws) => { sws.forEach((sw) => { sw.unregister(); }); }); } serviceWorker.getRegistration().then((sw) => { if (sw) sw.unregister(); }); clearCache(); }