import React from 'react'; import ReactDOM from 'react-dom/client'; import App from '@/App.jsx'; import '@/index.css'; import { initPwaSettings } from '@/lib/pwaSettings.js'; initPwaSettings(); if ('serviceWorker' in navigator) { window.addEventListener('load', async () => { const registrations = await navigator.serviceWorker.getRegistrations(); // Vite development harus selalu membaca source/dependency terbaru. // Service worker production dapat mencampur optimized chunks lintas restart. if (import.meta.env.DEV) { await Promise.all(registrations.map((registration) => registration.unregister())); return; } // Unregister semua SW lama (sw.js dari Horizon, dll) for (const reg of registrations) { const swUrl = reg.active?.scriptURL || reg.installing?.scriptURL || ''; if (swUrl.includes('sw.js') && !swUrl.includes('service-worker.js')) { await reg.unregister(); } } navigator.serviceWorker.register('/service-worker.js') .then(() => { // Dengarkan pesan manual clear dari SW navigator.serviceWorker.addEventListener('message', (event) => { if (event.data?.type === 'CACHE_CLEARED_RELOAD') { window.location.reload(true); } }); }) .catch(() => {}); // Cek force_refresh_mode saat halaman pertama dibuka // Lebih aman dari polling di SW checkForceRefresh(); }); } async function checkForceRefresh() { const controller = new AbortController(); const timeoutId = window.setTimeout(() => controller.abort(), 5000); try { const LAST_CACHE_VERSION_KEY = 'jl_cache_version'; const res = await fetch('/api/shop-settings/first', { headers: { 'Accept': 'application/json', 'Cache-Control': 'no-cache', }, signal: controller.signal, }); if (!res.ok) return; const data = await res.json(); const shopSettings = data?.settings; if (!shopSettings) return; const forceActive = shopSettings.force_refresh_mode === true; const serverVersion = String(shopSettings.cache_version || ''); const localVersion = localStorage.getItem(LAST_CACHE_VERSION_KEY); if (forceActive && serverVersion && serverVersion !== localVersion) { // Simpan versi baru supaya tidak reload terus-menerus localStorage.setItem(LAST_CACHE_VERSION_KEY, serverVersion); // Hapus semua cache via SW lalu reload if (navigator.serviceWorker.controller) { navigator.serviceWorker.controller.postMessage({ type: 'FORCE_CLEAR_CACHE' }); // Beri waktu SW untuk clear cache sebelum reload setTimeout(() => window.location.reload(true), 500); } else { window.location.reload(true); } } } catch { // Ignore - jangan crash kalau API tidak respond } finally { window.clearTimeout(timeoutId); } } ReactDOM.createRoot(document.getElementById('root')).render( );