UNPKG

@vela-ventures/ao-sync-sdk

Version:
102 lines (101 loc) 4.07 kB
import { modalStyles, mobileStylesCSS } from "../styles/modalStyles"; import { ICONS } from "../constants/modalAssets"; import { objectToInlineStyle } from "../utils/styleUtils"; const modalCSS = ` .aosync-modal-fade-in { animation: fadeIn 0.1s ease; } .aosync-modal-fade-out { animation: fadeOut 0.2s ease; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } @keyframes fadeOut { from { opacity: 1; } to { opacity: 0; } } `; export const createModalTemplate = ({ subTitle, description, qrCodeData, animationData, autoClose, walletClient, }) => { if (!document.getElementById("aosync-modal-styles")) { const style = document.createElement("style"); style.id = "aosync-modal-styles"; style.textContent = modalCSS + mobileStylesCSS; document.head.appendChild(style); } const modal = document.createElement("div"); Object.assign(modal.style, modalStyles.modal); modal.className = "aosync-modal-fade-in"; modal.id = `aosync-modal-container`; const backdrop = document.createElement("div"); Object.assign(backdrop.style, modalStyles.backdrop); backdrop.onclick = () => closeModal(modal, walletClient); const content = document.createElement("div"); Object.assign(content.style, modalStyles.content); content.style.setProperty("font-family", "Sora", "important"); content.id = "aosync-modal-content"; content.innerHTML = ` <div style="${objectToInlineStyle(modalStyles.iconContainer)}"> ${ICONS.qrCode.scanner} </div> <h3 style="${objectToInlineStyle(modalStyles.title)}">AOSync</h3> <div style="${objectToInlineStyle(modalStyles.subtitle)}">${subTitle}</div> ${qrCodeData ? `<img id="aosync-beacon-connection-qrCode" src="${qrCodeData}" alt="QR Code" style="width: 200px; height: 200px; margin-bottom: 10px;">` : ""} ${animationData ? '<div id="aosync-lottie-animation" style="width: 200px; height: 200px; margin-bottom: 10px;"></div>' : ""} <div style="${objectToInlineStyle(modalStyles.description)}"> <span id="aosync-beacon-modal-description">${description}</span> <a href="https://beaconwallet.app" target="_blank" style="${objectToInlineStyle(modalStyles.modalLink)}; text-decoration: none; display: block; margin-top: 8px;"> beaconwallet.app </a> </div> `; modal.appendChild(backdrop); modal.appendChild(content); document.body.appendChild(modal); if (animationData) { const lottieContainer = document.getElementById("aosync-lottie-animation"); if (lottieContainer) { const img = document.createElement("img"); img.src = ICONS.loadingAnimation; img.style.width = "100%"; lottieContainer.appendChild(img); } } if (autoClose) { setTimeout(() => { closeModal(modal); if (document.getElementById("aosync-modal-container")) { document.body.removeChild(document.getElementById("aosync-modal-container")); } }, 1000); } return modal; }; function closeModal(modal, walletClient) { if (walletClient) { walletClient.connectionListener("connection_canceled"); } modal.className = "aosync-modal-fade-out"; setTimeout(() => modal.remove(), 150); } export function connectionModalMessage(modalMessage) { const qrCode = document.getElementById("aosync-beacon-connection-qrCode") || document.getElementById("aosync-lottie-animation"); if (!qrCode) return; const modal = document.getElementById("aosync-modal-container"); if (!modal) return; const statusMark = document.createElement("div"); Object.assign(statusMark.style, modalStyles.statusMark); statusMark.className = "aosync-modal-fade-in"; statusMark.innerHTML = modalMessage === "success" ? ICONS.qrCode.success : ICONS.qrCode.fail; qrCode.replaceWith(statusMark); setTimeout(() => closeModal(modal), 1000); }