Fix I/O failing to load if image takes too longer

This commit is contained in:
Damien Elmes 2023-10-28 07:59:06 +10:00
parent 9600f033f7
commit 6a0b96d7ea

View file

@ -40,13 +40,40 @@ interface SetupImageOcclusionOptions {
onDidDrawShapes?: DrawShapesCallback; onDidDrawShapes?: DrawShapesCallback;
} }
function setupImageOcclusion(setupOptions?: SetupImageOcclusionOptions): void { async function setupImageOcclusion(setupOptions?: SetupImageOcclusionOptions): Promise<void> {
await waitForImage();
window.addEventListener("load", () => { window.addEventListener("load", () => {
window.addEventListener("resize", () => setupImageOcclusion(setupOptions)); window.addEventListener("resize", () => setupImageOcclusion(setupOptions));
}); });
window.requestAnimationFrame(() => setupImageOcclusionInner(setupOptions)); window.requestAnimationFrame(() => setupImageOcclusionInner(setupOptions));
} }
/** We must make sure the image has loaded before we can access its dimensions.
* This can happen if not preloading, or if preloading takes too long. */
async function waitForImage(): Promise<void> {
const image = document.querySelector(
"#image-occlusion-container img",
) as HTMLImageElement | null;
if (!image) {
// error will be handled later
return;
}
if (image.complete) {
return;
}
// Wait for the image to load
await new Promise<void>(resolve => {
image.addEventListener("load", () => {
resolve();
});
image.addEventListener("error", () => {
resolve();
});
});
}
function setupImageOcclusionInner(setupOptions?: SetupImageOcclusionOptions): void { function setupImageOcclusionInner(setupOptions?: SetupImageOcclusionOptions): void {
const canvas = document.querySelector( const canvas = document.querySelector(
"#image-occlusion-canvas", "#image-occlusion-canvas",