Newer
Older
gnexus-creds / frontend / src / main.js
import "gnexus-ui-kit/dist/css/kit.css";
import "gnexus-ui-kit/dist/assets/fonts/phosphor-icons/src/css/icons.css";

import { createApp } from "vue";
import { GnexusUiVue } from "gnexus-ui-kit/vue";

import App from "./App.vue";
import "./styles.css";

createApp(App).use(GnexusUiVue).mount("#app");

// PWA service worker (public/sw.js). localhost/127.0.0.1 are secure contexts,
// so local runs register too; plain-http LAN origins stay unregistered — same
// condition the biometric gate uses. Updates are silent: sw.js uses
// stale-while-revalidate, so no reload prompt is needed.
if ("serviceWorker" in navigator && window.isSecureContext) {
  window.addEventListener("load", () => {
    navigator.serviceWorker
      .register("/sw.js", { scope: "/" })
      .then((registration) => {
        // No update tick right after register(): Chrome already update-checks
        // on every navigation, and racing install/claim with one more check
        // once left an offline reload unintercepted. Background ticks below
        // cover assets changed server-side while the app stays open.
        const updateTick = () => registration.update().catch(() => {});
        document.addEventListener("visibilitychange", () => {
          if (!document.hidden) updateTick();
        });
        window.addEventListener("online", updateTick);
        setInterval(updateTick, 15 * 60 * 1000);
      })
      .catch(() => {
        // unreachable SW (old bundle, restrictive proxy) — app still works
      });
  });
}