/** * @fileoverview * All structured UI classes. * * TODO(mebjas): Migrate all UI components to modular UI classes so they are * easy to improve. * TODO(mebjas): Add tests for all UI components. * @author mebjas */ import { ASSET_CLOSE_ICON_16PX, ASSET_INFO_ICON_16PX } from "./image-assets"; import { LibraryInfoStrings } from "./strings"; type OnClickListener0 = () => void; //#region Info Icon + Div class LibraryInfoDiv { private infoDiv: HTMLDivElement; constructor() { this.infoDiv = document.createElement("div"); } public renderInto(parent: HTMLElement) { this.infoDiv.style.position = "absolute"; this.infoDiv.style.top = "10px"; this.infoDiv.style.right = "10px"; this.infoDiv.style.zIndex = "2"; this.infoDiv.style.display = "none"; this.infoDiv.style.padding = "5pt"; this.infoDiv.style.border = "1px solid #171717"; this.infoDiv.style.fontSize = "10pt"; this.infoDiv.style.background = "rgb(0 0 0 / 69%)"; this.infoDiv.style.borderRadius = "5px"; this.infoDiv.style.textAlign = "center"; this.infoDiv.style.fontWeight = "400"; this.infoDiv.style.color = "white"; this.infoDiv.innerText = LibraryInfoStrings.poweredBy(); const projectLink = document.createElement("a"); projectLink.innerText = "ScanApp"; projectLink.href = "https://scanapp.org"; projectLink.target = "new"; projectLink.style.color = "white"; this.infoDiv.appendChild(projectLink); const breakElemFirst = document.createElement("br"); const breakElemSecond = document.createElement("br"); this.infoDiv.appendChild(breakElemFirst); this.infoDiv.appendChild(breakElemSecond); const reportIssueLink = document.createElement("a"); reportIssueLink.innerText = LibraryInfoStrings.reportIssues(); reportIssueLink.href = "https://github.com/mebjas/html5-qrcode/issues"; reportIssueLink.target = "new"; reportIssueLink.style.color = "white"; this.infoDiv.appendChild(reportIssueLink); parent.appendChild(this.infoDiv); } public show() { this.infoDiv.style.display = "block"; } public hide() { this.infoDiv.style.display = "none"; } } class LibraryInfoIcon { private infoIcon: HTMLImageElement; private onTapIn: OnClickListener0; private onTapOut: OnClickListener0; private isShowingInfoIcon: boolean = true; constructor(onTapIn: OnClickListener0, onTapOut: OnClickListener0) { this.onTapIn = onTapIn; this.onTapOut = onTapOut; this.infoIcon = document.createElement("img"); } public renderInto(parent: HTMLElement) { this.infoIcon.alt = "Info icon"; this.infoIcon.src = ASSET_INFO_ICON_16PX; this.infoIcon.style.position = "absolute"; this.infoIcon.style.top = "4px"; this.infoIcon.style.right = "4px"; this.infoIcon.style.opacity = "0.6"; this.infoIcon.style.cursor = "pointer"; this.infoIcon.style.zIndex = "2"; this.infoIcon.style.width = "16px"; this.infoIcon.style.height = "16px"; this.infoIcon.onmouseover = (_) => this.onHoverIn(); this.infoIcon.onmouseout = (_) => this.onHoverOut(); this.infoIcon.onclick = (_) => this.onClick(); parent.appendChild(this.infoIcon); } private onHoverIn() { if (this.isShowingInfoIcon) { this.infoIcon.style.opacity = "1"; } } private onHoverOut() { if (this.isShowingInfoIcon) { this.infoIcon.style.opacity = "0.6"; } } private onClick() { if (this.isShowingInfoIcon) { this.isShowingInfoIcon = false; this.onTapIn(); this.infoIcon.src = ASSET_CLOSE_ICON_16PX; this.infoIcon.style.opacity = "1"; } else { this.isShowingInfoIcon = true; this.onTapOut(); this.infoIcon.src = ASSET_INFO_ICON_16PX; this.infoIcon.style.opacity = "0.6"; } } } export class LibraryInfoContainer { private infoDiv: LibraryInfoDiv; private infoIcon: LibraryInfoIcon; constructor() { this.infoDiv = new LibraryInfoDiv(); this.infoIcon = new LibraryInfoIcon(() => { this.infoDiv.show(); }, () => { this.infoDiv.hide(); }); } public renderInto(parent: HTMLElement) { this.infoDiv.renderInto(parent); this.infoIcon.renderInto(parent); } } //#endregion