| import { useIntl } from '@umijs/max'; |
| import { Button, message, notification } from 'antd'; |
| import defaultSettings from '../config/defaultSettings'; |
| |
| const { pwa } = defaultSettings; |
| const isHttps = document.location.protocol === 'https:'; |
| |
| const clearCache = () => { |
| // remove all caches |
| if (window.caches) { |
| caches |
| .keys() |
| .then((keys) => { |
| keys.forEach((key) => { |
| caches.delete(key); |
| }); |
| }) |
| .catch((e) => console.log(e)); |
| } |
| }; |
| |
| // if pwa is true |
| if (pwa) { |
| // Notify user if offline now |
| window.addEventListener('sw.offline', () => { |
| message.warning(useIntl().formatMessage({ id: 'app.pwa.offline' })); |
| }); |
| |
| // Pop up a prompt on the page asking the user if they want to use the latest version |
| window.addEventListener('sw.updated', (event: Event) => { |
| const e = event as CustomEvent; |
| const reloadSW = async () => { |
| // Check if there is sw whose state is waiting in ServiceWorkerRegistration |
| // https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration |
| const worker = e.detail && e.detail.waiting; |
| if (!worker) { |
| return true; |
| } |
| // Send skip-waiting event to waiting SW with MessageChannel |
| 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 btn = ( |
| <Button |
| type="primary" |
| onClick={() => { |
| notification.destroy(key); |
| reloadSW(); |
| }} |
| > |
| {useIntl().formatMessage({ id: 'app.pwa.serviceworker.updated.ok' })} |
| </Button> |
| ); |
| notification.open({ |
| message: useIntl().formatMessage({ id: 'app.pwa.serviceworker.updated' }), |
| description: useIntl().formatMessage({ id: 'app.pwa.serviceworker.updated.hint' }), |
| btn, |
| key, |
| onClose: async () => null, |
| }); |
| }); |
| } else if ('serviceWorker' in navigator && isHttps) { |
| // unregister service worker |
| const { serviceWorker } = navigator; |
| if (serviceWorker.getRegistrations) { |
| serviceWorker.getRegistrations().then((sws) => { |
| sws.forEach((sw) => { |
| sw.unregister(); |
| }); |
| }); |
| } |
| serviceWorker.getRegistration().then((sw) => { |
| if (sw) sw.unregister(); |
| }); |
| |
| clearCache(); |
| } |