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. import 'windi.css'
  7. const { pwa } = defaultSettings
  8. const isHttps = document.location.protocol === 'https:' // if pwa is true
  9. if (pwa) {
  10. // Notify user if offline now
  11. window.addEventListener('sw.offline', () => {
  12. message.warning(
  13. useIntl().formatMessage({
  14. id: 'app.pwa.offline'
  15. })
  16. )
  17. }) // Pop up a prompt on the page asking the user if they want to use the latest version
  18. window.addEventListener('sw.updated', event => {
  19. const e = event
  20. const reloadSW = async () => {
  21. // Check if there is sw whose state is waiting in ServiceWorkerRegistration
  22. // https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration
  23. const worker = e.detail && e.detail.waiting
  24. if (!worker) {
  25. return true
  26. } // Send skip-waiting event to waiting SW with MessageChannel
  27. await new Promise((resolve, reject) => {
  28. const channel = new MessageChannel()
  29. channel.port1.onmessage = msgEvent => {
  30. if (msgEvent.data.error) {
  31. reject(msgEvent.data.error)
  32. } else {
  33. resolve(msgEvent.data)
  34. }
  35. }
  36. worker.postMessage(
  37. {
  38. type: 'skip-waiting'
  39. },
  40. [channel.port2]
  41. )
  42. }) // Refresh current page to use the updated HTML and other assets after SW has skiped waiting
  43. window.location.reload(true)
  44. return true
  45. }
  46. const key = `open${Date.now()}`
  47. const btn = (
  48. <Button
  49. type="primary"
  50. onClick={() => {
  51. notification.close(key)
  52. reloadSW()
  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. }