For triaging webview rendering issues without devtools: settings panel now shows app version, the webview user agent, and the application log (pre-wrap, 80ch, scrollable, refreshable). New endpoints /api/version, /api/log; client-side JS errors are captured globally and posted to /api/client-log (client-errors.log in the log dir).
74 lines
2.1 KiB
TypeScript
74 lines
2.1 KiB
TypeScript
import { createApp } from "vue"
|
|
import App from "./App.vue"
|
|
import router from "./router"
|
|
import "./styles/main.css"
|
|
import { installKeyboardNavigation } from "./composables/useKeyboardNavigation"
|
|
import { installGamepadNavigation } from "./composables/useGamepadNavigation"
|
|
import { installInputModalityTracking } from "./composables/useInputModality"
|
|
|
|
function postClientError(payload: {
|
|
message: string
|
|
stack: string | null
|
|
source: string | null
|
|
}) {
|
|
fetch("/api/client-log", {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify(payload),
|
|
}).catch(() => {})
|
|
}
|
|
|
|
function installErrorCapture() {
|
|
window.addEventListener("error", (event) => {
|
|
const source =
|
|
event.filename != null ? `${event.filename}:${event.lineno ?? 0}:${event.colno ?? 0}` : null
|
|
postClientError({
|
|
message: event.message || String(event.error ?? "Unknown error"),
|
|
stack: event.error?.stack ?? null,
|
|
source,
|
|
})
|
|
})
|
|
window.addEventListener("unhandledrejection", (event) => {
|
|
const reason = event.reason
|
|
postClientError({
|
|
message: reason instanceof Error ? reason.message : `Unhandled rejection: ${String(reason)}`,
|
|
stack: reason instanceof Error ? (reason.stack ?? null) : null,
|
|
source: "unhandledrejection",
|
|
})
|
|
})
|
|
}
|
|
|
|
function installReloadShortcut() {
|
|
document.addEventListener(
|
|
"keydown",
|
|
(event) => {
|
|
if (
|
|
event.key === "F5" ||
|
|
((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === "r")
|
|
) {
|
|
event.preventDefault()
|
|
window.location.reload()
|
|
}
|
|
},
|
|
{ capture: true },
|
|
)
|
|
}
|
|
|
|
// Install global keyboard navigation handlers immediately
|
|
installInputModalityTracking()
|
|
installKeyboardNavigation()
|
|
installGamepadNavigation()
|
|
installReloadShortcut()
|
|
installErrorCapture()
|
|
|
|
// Unregister any legacy service workers — MediaHive no longer uses a PWA/SW.
|
|
if ("serviceWorker" in navigator) {
|
|
navigator.serviceWorker.getRegistrations().then((registrations) => {
|
|
for (const registration of registrations) {
|
|
registration.unregister()
|
|
}
|
|
})
|
|
}
|
|
|
|
createApp(App).use(router).mount("#app")
|