2020-08-05 22:08:55 +05:30
|
|
|
/*
|
2021-09-06 20:42:14 +05:30
|
|
|
Copyright 2021 The Matrix.org Foundation C.I.C.
|
2020-08-05 22:08:55 +05:30
|
|
|
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
you may not use this file except in compliance with the License.
|
|
|
|
You may obtain a copy of the License at
|
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
See the License for the specific language governing permissions and
|
|
|
|
limitations under the License.
|
|
|
|
*/
|
|
|
|
|
2021-09-06 20:42:14 +05:30
|
|
|
import {UIView, IMountArgs} from "./types";
|
2020-04-23 00:23:18 +05:30
|
|
|
import {tag} from "./html.js";
|
|
|
|
|
2021-09-06 20:42:14 +05:30
|
|
|
export function mountView(view: UIView, mountArgs: IMountArgs): HTMLElement {
|
|
|
|
let node;
|
|
|
|
try {
|
|
|
|
node = view.mount(mountArgs);
|
|
|
|
} catch (err) {
|
|
|
|
node = errorToDOM(err);
|
|
|
|
}
|
|
|
|
return node;
|
|
|
|
}
|
|
|
|
|
|
|
|
export function errorToDOM(error: Error): HTMLElement {
|
2020-04-23 00:23:18 +05:30
|
|
|
const stack = new Error().stack;
|
2021-09-06 20:42:14 +05:30
|
|
|
let callee: string | null = null;
|
2021-05-31 15:58:42 +05:30
|
|
|
if (stack) {
|
|
|
|
callee = stack.split("\n")[1];
|
|
|
|
}
|
2020-04-23 00:23:18 +05:30
|
|
|
return tag.div([
|
|
|
|
tag.h2("Something went wrong…"),
|
|
|
|
tag.h3(error.message),
|
|
|
|
tag.p(`This occurred while running ${callee}.`),
|
|
|
|
tag.pre(error.stack),
|
|
|
|
]);
|
|
|
|
}
|
2021-09-06 20:42:14 +05:30
|
|
|
|
|
|
|
export function insertAt(parentNode: HTMLElement, idx: number, childNode: HTMLElement): void {
|
|
|
|
const isLast = idx === parentNode.childElementCount;
|
|
|
|
if (isLast) {
|
|
|
|
parentNode.appendChild(childNode);
|
|
|
|
} else {
|
|
|
|
const nextDomNode = parentNode.children[idx];
|
|
|
|
parentNode.insertBefore(childNode, nextDomNode);
|
|
|
|
}
|
|
|
|
}
|