import {Utils} from "../../Utils"; import BaseUIElement from "../BaseUIElement"; export default class Img extends BaseUIElement { private readonly _src: string; private readonly _rawSvg: boolean; private readonly _options: { readonly fallbackImage?: string }; constructor(src: string, rawSvg = false, options?: { fallbackImage?: string }) { super(); if (src === undefined || src === "undefined") { throw "Undefined src for image" } this._src = src; this._rawSvg = rawSvg; this._options = options; } static AsData(source: string) { if (Utils.runningFromConsole) { return source; } try{ return `data:image/svg+xml;base64,${(btoa(source))}`; }catch (e){ console.error("Cannot create an image for", source.slice(0, 100)) console.trace("Cannot create an image for the given source string due to ", e) return "" } } static AsImageElement(source: string, css_class: string = "", style = ""): string { return ``; } AsMarkdown(): string { if (this._rawSvg === true) { console.warn("Converting raw svgs to markdown is not supported"); return undefined } let src = this._src if (this._src.startsWith("./")) { src = "https://mapcomplete.osm.be/" + src } return "![](" + src + ")"; } protected InnerConstructElement(): HTMLElement { const self = this; if (this._rawSvg) { const e = document.createElement("div") e.innerHTML = this._src return e; } const el = document.createElement("img") el.src = this._src; el.onload = () => { el.style.opacity = "1" } el.onerror = () => { if (self._options?.fallbackImage) { if (el.src === self._options.fallbackImage) { // Sigh... nothing to be done anymore return; } el.src = self._options.fallbackImage } } return el; } }