// Shared DOM helpers used by all views. const { DEBUG } = require("../../shared/constants"); const { formatUsd, getPrice, getAddressValueUsd, } = require("../../shared/prices"); const VIEWS = [ "welcome", "add-wallet", "import-key", "main", "address", "send", "confirm-tx", "receive", "add-token", "settings", "transaction", "approve", ]; function $(id) { return document.getElementById(id); } function showError(id, msg) { const el = $(id); el.textContent = msg; el.classList.remove("hidden"); } function hideError(id) { $(id).classList.add("hidden"); } function showView(name) { for (const v of VIEWS) { const el = document.getElementById(`view-${v}`); if (el) { el.classList.toggle("hidden", v !== name); } } clearFlash(); if (DEBUG) { const banner = document.getElementById("debug-banner"); if (banner) { banner.textContent = "DEBUG / INSECURE (" + name + ")"; } } } let flashTimer = null; function clearFlash() { if (flashTimer) { clearTimeout(flashTimer); flashTimer = null; } $("flash-msg").textContent = ""; } function showFlash(msg, duration = 2000) { clearFlash(); $("flash-msg").textContent = msg; flashTimer = setTimeout(() => { $("flash-msg").textContent = ""; flashTimer = null; }, duration); } function balanceLine(symbol, amount, price) { const qty = amount.toFixed(4); const usd = price ? formatUsd(amount * price) : ""; return ( `
` + `` + `${symbol}` + `${qty}` + `` + `${usd}` + `
` ); } function balanceLinesForAddress(addr) { let html = balanceLine( "ETH", parseFloat(addr.balance || "0"), getPrice("ETH"), ); for (const t of addr.tokenBalances || []) { const bal = parseFloat(t.balance || "0"); if (bal === 0) continue; html += balanceLine(t.symbol, bal, getPrice(t.symbol)); } return html; } function truncateMiddle(str, maxLen) { if (str.length <= maxLen) return str; if (maxLen < 5) return str.slice(0, maxLen); const half = Math.floor((maxLen - 1) / 2); return str.slice(0, half) + "\u2026" + str.slice(-(maxLen - 1 - half)); } // 16 colors evenly spaced around the hue wheel (22.5° apart), // all at HSL saturation 70%, lightness 50% for uniform vibrancy. const ADDRESS_COLORS = [ "#d92626", "#d96926", "#d9ac26", "#c2d926", "#80d926", "#3dd926", "#26d953", "#26d996", "#26d9d9", "#2696d9", "#2653d9", "#3d26d9", "#8026d9", "#c226d9", "#d926ac", "#d92669", ]; function addressColor(address) { const idx = parseInt(address.slice(2, 6), 16) % 16; return ADDRESS_COLORS[idx]; } function addressDotHtml(address) { const color = addressColor(address); return ``; } module.exports = { $, showError, hideError, showView, showFlash, balanceLinesForAddress, addressColor, addressDotHtml, truncateMiddle, };