global.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import React from 'react';
  2. import { notification, Button, message } from 'antd';
  3. import { formatMessage } from 'umi/locale';
  4. import defaultSettings from './defaultSettings';
  5. window.React = React;
  6. const { pwa } = defaultSettings;
  7. // if pwa is true
  8. if (pwa) {
  9. // Notify user if offline now
  10. window.addEventListener('sw.offline', () => {
  11. message.warning(formatMessage({ id: 'app.pwa.offline' }));
  12. });
  13. // Pop up a prompt on the page asking the user if they want to use the latest version
  14. window.addEventListener('sw.updated', e => {
  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 Promise.resolve();
  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 = event => {
  26. if (event.data.error) {
  27. reject(event.data.error);
  28. } else {
  29. resolve(event.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(true);
  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. {formatMessage({ id: 'app.pwa.serviceworker.updated.ok' })}
  48. </Button>
  49. );
  50. notification.open({
  51. message: formatMessage({ id: 'app.pwa.serviceworker.updated' }),
  52. description: formatMessage({ id: 'app.pwa.serviceworker.updated.hint' }),
  53. btn,
  54. key,
  55. onClose: async () => {},
  56. });
  57. });
  58. }