// @refresh reload import * as Sentry from "@sentry/solidstart"; import { mount, StartClient } from "@solidjs/start/client"; Sentry.init({ dsn: "https://a7c36d42c2a023ed29dd5db76c079566@o4506630160187392.ingest.us.sentry.io/4511784457666560", dataCollection: { // To disable sending user data and HTTP bodies, uncomment the lines below. For more info visit: // https://docs.sentry.io/platforms/javascript/guides/solidstart/configuration/options/#dataCollection // userInfo: false, // httpBodies: [] } }); // Deployment version detection and chunk loading error handling const RELOAD_STORAGE_KEY = "chunk-reload-count"; const RELOAD_TIMESTAMP_KEY = "chunk-reload-timestamp"; const MAX_RELOADS = 3; const RELOAD_WINDOW_MS = 30000; // 30 seconds /** * Check if we should attempt reload or show error * Prevents infinite reload loops by tracking reload attempts */ function shouldAttemptReload(): boolean { try { const now = Date.now(); const reloadCount = parseInt( sessionStorage.getItem(RELOAD_STORAGE_KEY) || "0", 10 ); const lastReloadTime = parseInt( sessionStorage.getItem(RELOAD_TIMESTAMP_KEY) || "0", 10 ); // Reset counter if outside the time window if (now - lastReloadTime > RELOAD_WINDOW_MS) { sessionStorage.setItem(RELOAD_STORAGE_KEY, "0"); sessionStorage.setItem(RELOAD_TIMESTAMP_KEY, now.toString()); return true; } // Check if we've exceeded max reloads if (reloadCount >= MAX_RELOADS) { console.error( `Exceeded ${MAX_RELOADS} reload attempts in ${RELOAD_WINDOW_MS}ms. Stopping to prevent infinite loop.` ); return false; } // Increment counter and allow reload sessionStorage.setItem(RELOAD_STORAGE_KEY, (reloadCount + 1).toString()); sessionStorage.setItem(RELOAD_TIMESTAMP_KEY, now.toString()); return true; } catch (e) { // If sessionStorage fails, allow reload but log error console.warn("Failed to access sessionStorage:", e); return true; } } /** * Handle chunk loading errors with smart reload logic */ function handleChunkError(source: string): void { console.warn(`[Chunk Error] ${source} - chunk load failure detected`); if (shouldAttemptReload()) { const reloadCount = sessionStorage.getItem(RELOAD_STORAGE_KEY) || "1"; console.log( `[Chunk Error] Attempting reload (${reloadCount}/${MAX_RELOADS})...` ); // Add small delay to prevent race conditions setTimeout(() => { window.location.reload(); }, 100); } else { // Show user-friendly error message const errorDiv = document.createElement("div"); errorDiv.style.cssText = ` position: fixed; top: 0; left: 0; right: 0; background: #f59e0b; color: #000; padding: 16px; text-align: center; font-family: system-ui, -apple-system, sans-serif; font-size: 14px; z-index: 9999; box-shadow: 0 2px 8px rgba(0,0,0,0.2); `; errorDiv.innerHTML = ` Update Required
A new version is available. Please refresh the page manually or click here. `; document.body.appendChild(errorDiv); } } // Handle runtime chunk loading errors window.addEventListener("error", (event) => { if ( event.message?.includes("Importing a module script failed") || event.message?.includes("Failed to fetch dynamically imported module") ) { event.preventDefault(); handleChunkError("error event"); } }); // Handle promise-based chunk loading errors window.addEventListener("unhandledrejection", (event) => { if ( event.reason?.message?.includes("Importing a module script failed") || event.reason?.message?.includes( "Failed to fetch dynamically imported module" ) ) { event.preventDefault(); handleChunkError("unhandled rejection"); } }); // Clear reload counter on successful page load window.addEventListener("load", () => { // Only clear if we successfully loaded (we're past the critical chunk loading phase) setTimeout(() => { sessionStorage.removeItem(RELOAD_STORAGE_KEY); sessionStorage.removeItem(RELOAD_TIMESTAMP_KEY); }, 2000); }); mount(() => , document.getElementById("app")!);