global.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import React from 'react';
  2. import { notification, Button, message } from 'antd';
  3. import { formatMessage } from 'umi/locale';
  4. import { sldComLanguage } from '@/utils/utils';
  5. // Notify user if offline now
  6. window.addEventListener('sw.offline', () => {
  7. message.warning(formatMessage({ id: 'app.pwa.offline' }));
  8. });
  9. // Pop up a prompt on the page asking the user if they want to use the latest version
  10. window.addEventListener('sw.updated', e => {
  11. const reloadSW = async () => {
  12. // Check if there is sw whose state is waiting in ServiceWorkerRegistration
  13. // https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration
  14. const worker = e.detail && e.detail.waiting;
  15. if (!worker) {
  16. return Promise.resolve();
  17. }
  18. // Send skip-waiting event to waiting SW with MessageChannel
  19. await new Promise((resolve, reject) => {
  20. const channel = new MessageChannel();
  21. channel.port1.onmessage = event => {
  22. if (event.data.error) {
  23. reject(event.data.error);
  24. } else {
  25. resolve(event.data);
  26. }
  27. };
  28. worker.postMessage({ type: 'skip-waiting' }, [channel.port2]);
  29. });
  30. // Refresh current page to use the updated HTML and other assets after SW has skiped waiting
  31. window.location.reload(true);
  32. return true;
  33. };
  34. const key = `open${Date.now()}`;
  35. const btn = (
  36. <Button
  37. type="primary"
  38. onClick={() => {
  39. notification.close(key);
  40. reloadSW();
  41. }}
  42. >
  43. {formatMessage({ id: `${sldComLanguage('刷新')}` })}
  44. </Button>
  45. );
  46. notification.open({
  47. message: formatMessage({ id: `${sldComLanguage('有新内容')}` }),
  48. description: formatMessage({ id: `${sldComLanguage('请点击"刷新"按钮或手动刷新页面')}` }),
  49. btn,
  50. key,
  51. onClose: async () => {},
  52. });
  53. });