global.jsx 2.7 KB

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