2021-11-03 00:44:53 +01:00
|
|
|
import BaseUIElement from "../BaseUIElement"
|
|
|
|
import { VariableUiElement } from "./VariableUIElement"
|
2022-06-05 02:24:14 +02:00
|
|
|
import { Stores, UIEventSource } from "../../Logic/UIEventSource"
|
2021-11-03 00:44:53 +01:00
|
|
|
import Loading from "./Loading"
|
|
|
|
|
2021-11-07 16:34:51 +01:00
|
|
|
export default class AsyncLazy extends BaseUIElement {
|
2021-11-03 00:44:53 +01:00
|
|
|
private readonly _f: () => Promise<BaseUIElement>
|
2021-11-07 16:34:51 +01:00
|
|
|
|
2021-11-03 00:44:53 +01:00
|
|
|
constructor(f: () => Promise<BaseUIElement>) {
|
|
|
|
super()
|
|
|
|
this._f = f
|
|
|
|
}
|
2021-11-07 16:34:51 +01:00
|
|
|
|
2021-11-03 00:44:53 +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
|
|
|
|
2021-11-03 00:44:53 +01:00
|
|
|
return new VariableUiElement(
|
2022-06-05 02:24:14 +02:00
|
|
|
Stores.FromPromise(this._f()).map((el) => {
|
2021-11-07 16:34:51 +01:00
|
|
|
if (el === undefined) {
|
2021-11-03 00:44:53 +01:00
|
|
|
return new Loading()
|
|
|
|
}
|
|
|
|
return el
|
|
|
|
})
|
|
|
|
).ConstructElement()
|
|
|
|
}
|
|
|
|
}
|