mapcomplete/UI/Base/AsyncLazy.ts

27 lines
821 B
TypeScript
Raw Normal View History

import BaseUIElement from "../BaseUIElement";
import {VariableUiElement} from "./VariableUIElement";
import {UIEventSource} from "../../Logic/UIEventSource";
import Loading from "./Loading";
2021-11-07 16:34:51 +01:00
export default class AsyncLazy extends BaseUIElement {
private readonly _f: () => Promise<BaseUIElement>;
2021-11-07 16:34:51 +01:00
constructor(f: () => Promise<BaseUIElement>) {
super();
this._f = f;
}
2021-11-07 16:34:51 +01:00
protected InnerConstructElement(): HTMLElement {
// The caching of the BaseUIElement will guarantee that _f will only be called once
2021-11-07 16:34:51 +01:00
return new VariableUiElement(
UIEventSource.FromPromise(this._f()).map(el => {
2021-11-07 16:34:51 +01:00
if (el === undefined) {
return new Loading()
}
return el
})
).ConstructElement()
}
2021-11-07 16:34:51 +01:00
}