import { createRoot } from "react-dom/client";
import App from "./App.tsx";
import "./index.css";

// Installed apps: when a new version is published, remove any old service worker
// and its caches, then reload once so the app always opens the latest version.
const UPDATE_FLAG = "reloaded_for_update";
const cleanup = () => setTimeout(() => sessionStorage.removeItem(UPDATE_FLAG), 10000);

navigator.serviceWorker?.getRegistrations?.().then(async (regs) => {
  let removedActive = false;
  for (const r of regs) {
    const url = r.active?.scriptURL || r.waiting?.scriptURL || r.installing?.scriptURL || "";
    if (/\/(sw|service-worker)\.js$/.test(url)) {
      removedActive = removedActive || !!r.active;
      await r.unregister().catch(() => {});
    }
  }
  if (!removedActive) return;
  const names = await caches.keys().catch(() => [] as string[]);
  await Promise.all(names.map((n) => caches.delete(n))).catch(() => {});
  if (!sessionStorage.getItem(UPDATE_FLAG)) {
    sessionStorage.setItem(UPDATE_FLAG, "1");
    cleanup();
    window.location.reload();
  }
}).catch(() => {});

// After a new version is published, old file chunks disappear: reload once to fetch the new version.
window.addEventListener("vite:preloadError", (e) => {
  e.preventDefault();
  if (sessionStorage.getItem(UPDATE_FLAG)) return;
  sessionStorage.setItem(UPDATE_FLAG, "1");
  cleanup();
  window.location.reload();
});

createRoot(document.getElementById("root")!).render(<App />);
