global.tsx 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import { Button, message, notification } from 'antd';
  2. import React from 'react';
  3. import { useIntl } from 'umi';
  4. import defaultSettings from '../config/defaultSettings';
  5. const { pwa } = defaultSettings;
  6. // if pwa is true
  7. if (pwa) {
  8. // Notify user if offline now
  9. window.addEventListener('sw.offline', () => {
  10. message.warning(useIntl().formatMessage({ id: 'app.pwa.offline' }));
  11. });
  12. // Pop up a prompt on the page asking the user if they want to use the latest version
  13. window.addEventListener('sw.updated', (event: Event) => {
  14. const e = event as CustomEvent;
  15. const reloadSW = async () => {
  16. // Check if there is sw whose state is waiting in ServiceWorkerRegistration
  17. // https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration
  18. const worker = e.detail && e.detail.waiting;
  19. if (!worker) {
  20. return true;
  21. }
  22. // Send skip-waiting event to waiting SW with MessageChannel
  23. await new Promise((resolve, reject) => {
  24. const channel = new MessageChannel();
  25. channel.port1.onmessage = (msgEvent) => {
  26. if (msgEvent.data.error) {
  27. reject(msgEvent.data.error);
  28. } else {
  29. resolve(msgEvent.data);
  30. }
  31. };
  32. worker.postMessage({ type: 'skip-waiting' }, [channel.port2]);
  33. });
  34. // Refresh current page to use the updated HTML and other assets after SW has skiped waiting
  35. window.location.reload();
  36. return true;
  37. };
  38. const key = `open${Date.now()}`;
  39. const btn = (
  40. <Button
  41. type="primary"
  42. onClick={() => {
  43. notification.close(key);
  44. reloadSW();
  45. }}
  46. >
  47. {useIntl().formatMessage({ id: 'app.pwa.serviceworker.updated.ok' })}
  48. </Button>
  49. );
  50. notification.open({
  51. message: useIntl().formatMessage({ id: 'app.pwa.serviceworker.updated' }),
  52. description: useIntl().formatMessage({ id: 'app.pwa.serviceworker.updated.hint' }),
  53. btn,
  54. key,
  55. onClose: async () => { },
  56. });
  57. });
  58. } else if ('serviceWorker' in navigator) {
  59. // unregister service worker
  60. const { serviceWorker } = navigator;
  61. if (serviceWorker.getRegistrations) {
  62. serviceWorker.getRegistrations().then((sws) => {
  63. sws.forEach((sw) => {
  64. sw.unregister();
  65. });
  66. });
  67. }
  68. serviceWorker.getRegistration().then((sw) => {
  69. if (sw) sw.unregister();
  70. });
  71. // remove all caches
  72. if (window.caches && (window.caches.keys as any)) {
  73. caches.keys().then((keys) => {
  74. keys.forEach((key) => {
  75. caches.delete(key);
  76. });
  77. });
  78. }
  79. }