import { useIntl } from '@umijs/max'; 
 | 
import { Button, message, notification } from 'antd'; 
 | 
import defaultSettings from '../config/defaultSettings'; 
 | 
  
 | 
const { pwa } = defaultSettings; 
 | 
const isHttps = document.location.protocol === 'https:'; 
 | 
  
 | 
const clearCache = () => { 
 | 
  // remove all caches 
 | 
  if (window.caches) { 
 | 
    caches 
 | 
      .keys() 
 | 
      .then((keys) => { 
 | 
        keys.forEach((key) => { 
 | 
          caches.delete(key); 
 | 
        }); 
 | 
      }) 
 | 
      .catch((e) => console.log(e)); 
 | 
  } 
 | 
}; 
 | 
  
 | 
// if pwa is true 
 | 
if (pwa) { 
 | 
  // Notify user if offline now 
 | 
  window.addEventListener('sw.offline', () => { 
 | 
    message.warning(useIntl().formatMessage({ id: 'app.pwa.offline' })); 
 | 
  }); 
 | 
  
 | 
  // Pop up a prompt on the page asking the user if they want to use the latest version 
 | 
  window.addEventListener('sw.updated', (event: Event) => { 
 | 
    const e = event as CustomEvent; 
 | 
    const reloadSW = async () => { 
 | 
      // Check if there is sw whose state is waiting in ServiceWorkerRegistration 
 | 
      // https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration 
 | 
      const worker = e.detail && e.detail.waiting; 
 | 
      if (!worker) { 
 | 
        return true; 
 | 
      } 
 | 
      // Send skip-waiting event to waiting SW with MessageChannel 
 | 
      await new Promise((resolve, reject) => { 
 | 
        const channel = new MessageChannel(); 
 | 
        channel.port1.onmessage = (msgEvent) => { 
 | 
          if (msgEvent.data.error) { 
 | 
            reject(msgEvent.data.error); 
 | 
          } else { 
 | 
            resolve(msgEvent.data); 
 | 
          } 
 | 
        }; 
 | 
        worker.postMessage({ type: 'skip-waiting' }, [channel.port2]); 
 | 
      }); 
 | 
  
 | 
      clearCache(); 
 | 
      window.location.reload(); 
 | 
      return true; 
 | 
    }; 
 | 
    const key = `open${Date.now()}`; 
 | 
    const btn = ( 
 | 
      <Button 
 | 
        type="primary" 
 | 
        onClick={() => { 
 | 
          notification.destroy(key); 
 | 
          reloadSW(); 
 | 
        }} 
 | 
      > 
 | 
        {useIntl().formatMessage({ id: 'app.pwa.serviceworker.updated.ok' })} 
 | 
      </Button> 
 | 
    ); 
 | 
    notification.open({ 
 | 
      message: useIntl().formatMessage({ id: 'app.pwa.serviceworker.updated' }), 
 | 
      description: useIntl().formatMessage({ id: 'app.pwa.serviceworker.updated.hint' }), 
 | 
      btn, 
 | 
      key, 
 | 
      onClose: async () => null, 
 | 
    }); 
 | 
  }); 
 | 
} else if ('serviceWorker' in navigator && isHttps) { 
 | 
  // unregister service worker 
 | 
  const { serviceWorker } = navigator; 
 | 
  if (serviceWorker.getRegistrations) { 
 | 
    serviceWorker.getRegistrations().then((sws) => { 
 | 
      sws.forEach((sw) => { 
 | 
        sw.unregister(); 
 | 
      }); 
 | 
    }); 
 | 
  } 
 | 
  serviceWorker.getRegistration().then((sw) => { 
 | 
    if (sw) sw.unregister(); 
 | 
  }); 
 | 
  
 | 
  clearCache(); 
 | 
} 
 |