diff --git a/src/constants.ts b/src/constants.ts index c1e48ba4..87cc737f 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -40,6 +40,7 @@ export enum EVENT { GESTURE_CHANGE = "gesturechange", POINTER_MOVE = "pointermove", POINTER_UP = "pointerup", + STATE_CHANGE = "statechange", WHEEL = "wheel", TOUCH_START = "touchstart", } diff --git a/src/index.tsx b/src/index.tsx index bf6e6cf3..00f518bd 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -3,6 +3,7 @@ import ReactDOM from "react-dom"; import * as Sentry from "@sentry/browser"; import * as SentryIntegrations from "@sentry/integrations"; +import { EVENT } from "./constants"; import { TopErrorBoundary } from "./components/TopErrorBoundary"; import { IsMobileProvider } from "./is-mobile"; import App from "./components/App"; @@ -69,4 +70,21 @@ ReactDOM.render( rootElement, ); -registerServiceWorker(); +registerServiceWorker({ + onUpdate: (registration) => { + const waitingServiceWorker = registration.waiting; + if (waitingServiceWorker) { + waitingServiceWorker.addEventListener( + EVENT.STATE_CHANGE, + (event: Event) => { + const target = event.target as ServiceWorker; + const state = target.state as ServiceWorkerState; + if (state === "activated") { + window.location.reload(); + } + }, + ); + waitingServiceWorker.postMessage({ type: "SKIP_WAITING" }); + } + }, +});