global.tsx 2.5 KB

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