From 7ba59b5d71c66c83bf89a945a18b9d2a06c6f131 Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Mon, 10 Nov 2025 19:45:20 +1300 Subject: [PATCH] Better theme, better errors --- static/jsonp.js | 57 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/static/jsonp.js b/static/jsonp.js index 63f4141..99c4885 100644 --- a/static/jsonp.js +++ b/static/jsonp.js @@ -34,6 +34,20 @@ window.proxy = new Proxy(jsonpData, { } }) +// *** Page theme + +// Try to make it a bit more accurate. Normally this is done server-side by sending a `theme=x` cookie with the parse request. But that's not possible in jsonp mode, and there's no equivalent URL query string to set the theme. +// Helps on Minecraft wiki. Might not be complete on some wikis. +cookieStore.get("theme").then(cookie => { + if (cookie && cookie.value !== "default") { + document.body.classList.remove("theme-fandomdesktop-light") + document.body.classList.remove("theme-fandomdesktop-dark") + document.body.removeAttribute("data-theme") + document.body.classList.add(`theme-fandomdesktop-${cookie.value}`) + document.body.setAttribute("data-theme", cookie.value) + } +}) + // *** Data upload and download async function cont() { @@ -45,6 +59,19 @@ async function cont() { const uploadFraction = 0.7 + const pkg = { + url: "/api/render/wiki", + init: { + method: "POST", + body: JSON.stringify({ + data: jsonpData.wikipage, + siteinfo: jsonpData.siteinfo, + wikiname: BWData.wikiname, + path: BWData.path + }) + } + } + // Upload progress xhr.upload.addEventListener("progress", event => { if (event.lengthComputable) { @@ -61,8 +88,11 @@ async function cont() { xhr.addEventListener("load", () => { console.log(xhr) + if (xhr.status === 500) return fetch(pkg.url, pkg.init).then(res => res.text()).then(error) + // page -> #content const imported = document.importNode(xhr.responseXML.getElementById("content"), true) document.getElementById("content").replaceWith(imported) + // document.title = xhr.responseXML.title for (const e of xhr.responseXML.head.children) { const alreadyImported = [...document.querySelectorAll("link[href]")].map(e => e.href) @@ -71,6 +101,7 @@ async function cont() { document.head.appendChild(imported) } } + // Redirects const redirectTo = document.querySelector("#content .redirectMsg a") if (redirectTo) { redirectTo.click() @@ -78,28 +109,20 @@ async function cont() { loaded.value = true }) - xhr.open("POST", "/api/render/wiki") + xhr.open(pkg.init.method, pkg.url) xhr.responseType = "document" - xhr.send(JSON.stringify({ - data: jsonpData.wikipage, - siteinfo: jsonpData.siteinfo, - wikiname: BWData.wikiname, - path: BWData.path - })); + xhr.send(pkg.init.body); } function error(data) { const eContent = document.getElementById("content") while (eContent.childNodes[0] !== undefined) eContent.childNodes[0].remove() // clear out loading indicators document.title = `Error | BreezeWiki` - render(html` -${data.error.code === "missingtitle" -? html`

This page doesn't exist on Fandom.

` -: html` -

BreezeWiki wasn't able to load this page.

-

${data.error.code}: ${data.error.info}

-` -} -

Return to the homepage?

-`, eContent) + if (typeof data === "string") { + render(html`

BreezeWiki ran into an error on this page.

Try reloading the page.

If this keeps happening, you could send a public bug report. Please include the following information:

URL: ${window.location.href}${"\n"}${data}
`, eContent) + } else if (data.error.code === "missingtitle") { + render(html`

This page doesn't exist on Fandom.

Return to the homepage?

`, eContent) + } else { + render(html`

BreezeWiki wasn't able to load this page.

${data.error.code}: ${data.error.info}

`, eContent) + } }