79 lines
2.2 KiB
JavaScript
79 lines
2.2 KiB
JavaScript
(function (global) {
|
|
"use strict";
|
|
|
|
const THEME_KEY = "xiaobaiTheme";
|
|
|
|
function readTheme() {
|
|
try {
|
|
return global.localStorage.getItem(THEME_KEY) === "dark" ? "dark" : "light";
|
|
} catch (_error) {
|
|
return "light";
|
|
}
|
|
}
|
|
|
|
function applyTheme(theme) {
|
|
const normalized = theme === "dark" ? "dark" : "light";
|
|
const app = document.getElementById("m-app");
|
|
app.dataset.theme = normalized;
|
|
app.style.colorScheme = normalized;
|
|
document.body.style.backgroundColor = normalized === "dark" ? "#141519" : "#f4f5f7";
|
|
return normalized;
|
|
}
|
|
|
|
function toggle() {
|
|
const next = readTheme() === "dark" ? "light" : "dark";
|
|
try {
|
|
global.localStorage.setItem(THEME_KEY, next);
|
|
} catch (_error) {
|
|
// Theme still applies for the current page when storage is unavailable.
|
|
}
|
|
applyTheme(next);
|
|
}
|
|
|
|
global.MobileTheme = { readTheme: readTheme, applyTheme: applyTheme, toggle: toggle };
|
|
|
|
function syncKeyboardInset() {
|
|
const app = document.getElementById("m-app");
|
|
const visual = global.visualViewport;
|
|
if (!visual) {
|
|
app.style.setProperty("--m-keyboard-inset", "0px");
|
|
return;
|
|
}
|
|
const inset = Math.max(0, global.innerHeight - visual.height - visual.offsetTop);
|
|
app.style.setProperty("--m-keyboard-inset", inset + "px");
|
|
}
|
|
|
|
function bindViewport() {
|
|
const visual = global.visualViewport;
|
|
if (visual) {
|
|
visual.addEventListener("resize", syncKeyboardInset);
|
|
visual.addEventListener("scroll", syncKeyboardInset);
|
|
}
|
|
syncKeyboardInset();
|
|
}
|
|
|
|
async function boot() {
|
|
applyTheme(readTheme());
|
|
bindViewport();
|
|
let session = { authenticated: false };
|
|
try {
|
|
session = await global.MobileSession.me();
|
|
} catch (_error) {
|
|
session = { authenticated: false };
|
|
}
|
|
const hash = global.location.hash || "";
|
|
if (!session.authenticated) {
|
|
if (!/^#\/?auth/.test(hash)) global.location.replace("#/auth");
|
|
} else if (/^#\/?auth/.test(hash)) {
|
|
global.location.replace("#/hub/market");
|
|
}
|
|
global.MobileRouter.init();
|
|
}
|
|
|
|
if (document.readyState === "loading") {
|
|
document.addEventListener("DOMContentLoaded", boot, { once: true });
|
|
} else {
|
|
boot();
|
|
}
|
|
})(window);
|