import { createElement } from "../lib/skeleton/index.js";
import rxjs, { effect, applyMutation } from "../lib/rxjs/index.js";
import { qs } from "../lib/dom/index.js";
import t from "../lib/locales/index.js";
import { AjaxError, ApplicationError } from "../lib/error/index.js";
import CSSLoader from "../helpers/css.js";
import "../../components/icon.js";
export default function(err) {
return function(render) {
const [msg, trace] = processError(err);
// const [msg, trace] = ["Hooo", "trace"];
const $page = createElement(`
home
${t("Oops!")}
${t(msg)}
${trace}
`);
render($page);
// feature: show error details
effect(rxjs.fromEvent(qs($page, `button[data-bind="details"]`), "click").pipe(
rxjs.mapTo(["hidden"]),
applyMutation(qs($page, "pre"), "classList", "toggle"),
));
// feature: refresh button
effect(rxjs.fromEvent(qs($page, `button[data-bind="refresh"]`), "click").pipe(
rxjs.tap(() => location.reload()),
));
return rxjs.of(err);
}
}
function processError(err) {
let msg, trace;
if (err instanceof AjaxError) {
msg = t(err.code());
trace = `
type: ${err.type()}
message: ${err.message}
code: ${err.code()}
trace: ${err.stack}`;
} else if (err instanceof ApplicationError) {
msg = t(err.message);
trace = `
type: ${err.type()}
debug: ${err.debug()}
trace: ${err.stack}`;
} else {
msg = t("Internal Error");
trace = `
type: Error
message: ${err.message}
trace: ${err.stack || "N/A"}`;
}
return [msg, trace.trim()];
}
const css = await CSSLoader(import.meta, "ctrl_error.css");