Something went wrong. Try again.
Mirror of https://github.com/improsocial/improAn extensible Bluesky client for web
Something went wrong. Try again.
HTML
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143<!doctype html><html lang="en"> <head> {% include "head.html" %} </head> <body> <div id="app-root"></div>
<script> window.hasLoaded = false; window.hasErrored = false;
const appRoot = document.getElementById("app-root");
function showGlobalLoadingState() { appRoot.innerHTML = /* html */ ` <div class="app-loading-state"> <div class="app-loading-state-content"> <div class="loading-spinner"></div> </div> </div> `; }
function showGlobalErrorState() { appRoot.innerHTML = /* html */ ` <div class="error-state app-error-state"> <div>There was an error loading the app.</div> <button class="rounded-button" onclick="window.location.reload()"> Try again </button> </div> `; }
// Show loading state if the app hasn't loaded within 2 seconds, and show an error state if it hasn't loaded within 10 seconds. setTimeout(() => { if (window.hasLoaded || window.hasErrored) { return; } showGlobalLoadingState(); }, 2000);
setTimeout(() => { if (window.hasLoaded || window.hasErrored) { return; } window.hasErrored = true; showGlobalErrorState(); }, 10000); </script>
<script type="module"> import { enableErrorLogs } from "/js/errorLogs.js"; import "/js/perf.js";
// Reload when a newer version is deployed const RELOAD_GUARD_KEY = "version-check-last-reload"; const RELOAD_GUARD_MS = 60 * 1000;
async function fetchDeployedVersion() { try { const response = await fetch("/version.json", { cache: "no-store" }); if (!response.ok) { return null; } const data = await response.json(); return data.version ?? null; } catch { return null; } }
async function reloadIfOutdated() { const deployedVersion = await fetchDeployedVersion(); if ( deployedVersion === null || deployedVersion === window.env.version ) { return; } // Guard against a reload loop if the server keeps returning stale HTML const lastReload = Number(sessionStorage.getItem(RELOAD_GUARD_KEY)); if (lastReload && Date.now() - lastReload < RELOAD_GUARD_MS) { console.warn( `Deployed version ${deployedVersion} differs from running version ${window.env.version}, but a reload was already attempted recently - skipping`, ); return; } sessionStorage.setItem(RELOAD_GUARD_KEY, String(Date.now())); window.location.reload(); }
reloadIfOutdated(); window.addEventListener("visibilitychange", () => { if (document.visibilityState === "visible") { reloadIfOutdated(); } }); window.addEventListener("pageshow", (event) => { if (event.persisted) { reloadIfOutdated(); } });
const params = new URLSearchParams(window.location.search);
// Dev tools if ( (window.env.environment === "development" && !window.env.playwright) || params.has("enable-debug") ) { enableErrorLogs(); const devVersionOverlay = document.createElement("div"); devVersionOverlay.className = "dev-version-overlay"; devVersionOverlay.textContent = `v${window.env.version} - ${window.env.gitCommit}`; document.body.appendChild(devVersionOverlay); } </script>
<script type="module"> import("/js/app.js").then( ({ main }) => main().then( () => { window.hasLoaded = true; }, (error) => { console.error("Error in main function:", error); window.hasErrored = true; showGlobalErrorState(); }, ), (error) => { console.error("Error loading app module:", error); window.hasErrored = true; showGlobalErrorState(); }, ); </script> </body></html>