Something went wrong. Try again.
[READ-ONLY] Mirror of https://github.com/improsocial/impro
An extensible Bluesky client for web impro.social
Something went wrong. Try again.
HTML
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159<!doctype html><html lang="en"> <head> {% include "head.html" %} <link rel="modulepreload" href="/js/app.js" /> </head> <body> <div id="app-root"></div> <div id="boot-state" class="boot-state-layer" hidden></div>
<script> const bootStateElement = document.getElementById("boot-state");
window.bootUi = { // "init" -> "loading" (still booting after 1s) -> "ready" (app // finished loading) or "error" (scripts failed to load, bootstrap // threw, or timeout). state: "init",
showLoading() { this.state = "loading"; bootStateElement.innerHTML = /* html */ ` <div class="app-loading-state" data-testid="boot-loading"> <div class="app-loading-state-content"> <div class="loading-spinner"></div> </div> </div> `; bootStateElement.hidden = false; },
showError() { this.state = "error"; bootStateElement.innerHTML = /* html */ ` <div class="error-state app-error-state" data-testid="boot-error"> <div>There was an error loading the app.</div> <button class="rounded-button rounded-button-secondary-inverted" onclick="window.location.reload()" > Try again </button> </div> `; bootStateElement.hidden = false; },
ready() { this.state = "ready"; bootStateElement.hidden = true; bootStateElement.innerHTML = ""; }, };
setTimeout(() => { if (window.bootUi.state === "init") { window.bootUi.showLoading(); } }, 1000);
setTimeout(() => { if ( window.bootUi.state === "init" || window.bootUi.state === "loading" ) { window.bootUi.showError(); } }, 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.bootUi.ready(); }, (error) => { console.error("Error in main function:", error); window.bootUi.showError(); }, ), (error) => { console.error("Error loading app module:", error); window.bootUi.showError(); }, ); </script> </body></html>