next-pwa-pack
Version:
PWA cache provider for Next.js/React apps (service worker, manifest, offline page, SPA cache, offline)
2 lines • 1.17 kB
JavaScript
"use client";
import{useEffect}from"react";export default function CacheCurrentPage(){return useEffect((()=>{let e=!1;const t=async()=>{if("serviceWorker"in navigator&&navigator.serviceWorker.controller&&navigator.onLine)try{const e=window.location.href,t=await fetch(e,{headers:{Accept:"text/html"}}),r=await t.text();navigator.serviceWorker.controller.postMessage({type:"CACHE_CURRENT_HTML",url:e,html:r,ts:Date.now()}),console.log("[CacheCurrentPage] Cached via fetch:",e)}catch(e){console.error("[CacheCurrentPage] fetch failed",e)}},r=()=>{if("serviceWorker"in navigator&&navigator.onLine)if(navigator.serviceWorker.controller)t();else{const r=()=>{e||t(),navigator.serviceWorker.removeEventListener("controllerchange",r)};navigator.serviceWorker.addEventListener("controllerchange",r)}};r();const n=e=>{const t=history[e];history[e]=function(...e){const r=t.apply(this,e);return window.dispatchEvent(new Event("next-navigate")),r}};return n("pushState"),n("replaceState"),window.addEventListener("popstate",r),window.addEventListener("next-navigate",r),()=>{e=!0,window.removeEventListener("popstate",r),window.removeEventListener("next-navigate",r)}}),[]),null}