global.tsx 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import { message, notification } from '@/utils/antdAppInstance';
  2. import { getIntl } from '@umijs/max';
  3. import { Button } from 'antd';
  4. import defaultSettings from '../config/defaultSettings';
  5. const { pwa } = defaultSettings;
  6. const isHttps = document.location.protocol === 'https:';
  7. const clearCache = () => {
  8. if (window.caches) {
  9. caches
  10. .keys()
  11. .then((keys) => {
  12. keys.forEach((key) => {
  13. caches.delete(key);
  14. });
  15. })
  16. .catch((e) => console.log(e));
  17. }
  18. };
  19. if (pwa) {
  20. window.addEventListener('sw.offline', () => {
  21. message.warning(getIntl().formatMessage({ id: 'app.pwa.offline' }));
  22. });
  23. window.addEventListener('sw.updated', (event: Event) => {
  24. const e = event as CustomEvent;
  25. const reloadSW = async () => {
  26. const worker = e.detail && e.detail.waiting;
  27. if (!worker) {
  28. return true;
  29. }
  30. await new Promise((resolve, reject) => {
  31. const channel = new MessageChannel();
  32. channel.port1.onmessage = (msgEvent) => {
  33. if (msgEvent.data.error) {
  34. reject(msgEvent.data.error);
  35. } else {
  36. resolve(msgEvent.data);
  37. }
  38. };
  39. worker.postMessage({ type: 'skip-waiting' }, [channel.port2]);
  40. });
  41. clearCache();
  42. window.location.reload();
  43. return true;
  44. };
  45. const key = `open${Date.now()}`;
  46. const intl = getIntl();
  47. const btn = (
  48. <Button
  49. type="primary"
  50. onClick={() => {
  51. notification.destroy(key);
  52. reloadSW();
  53. }}
  54. >
  55. {intl.formatMessage({ id: 'app.pwa.serviceWorker.updated.ok' })}
  56. </Button>
  57. );
  58. notification.open({
  59. message: intl.formatMessage({ id: 'app.pwa.serviceWorker.updated' }),
  60. description: intl.formatMessage({ id: 'app.pwa.serviceWorker.updated.hint' }),
  61. btn,
  62. key,
  63. onClose: async () => null,
  64. });
  65. });
  66. } else if ('serviceWorker' in navigator && isHttps) {
  67. const { serviceWorker } = navigator;
  68. if (serviceWorker.getRegistrations) {
  69. serviceWorker.getRegistrations().then((sws) => {
  70. sws.forEach((sw) => {
  71. sw.unregister();
  72. });
  73. });
  74. }
  75. serviceWorker.getRegistration().then((sw) => {
  76. if (sw) sw.unregister();
  77. });
  78. clearCache();
  79. }