Files
brk/website_next/wallets/wallet/receive/index.js
T
2026-07-06 15:54:25 +02:00

98 lines
2.5 KiB
JavaScript

import { createQrDataUrl } from "../../../qr/index.js";
import { openDialog } from "../../../dialog/index.js";
import { createGroupedAddress } from "../address/index.js";
import { createWalletPart } from "../../dom.js";
/**
* @typedef {import("../../scan/index.js").WalletAddress} ReceiveAddress
*/
/**
* @param {ReceiveAddress} receiveAddress
*/
function createReceiveQr(receiveAddress) {
const image = document.createElement("img");
const uri = `bitcoin:${receiveAddress.address}`;
image.alt = `QR code for ${receiveAddress.address}`;
image.src = createQrDataUrl(uri, { scale: 6 });
return image;
}
/**
* @param {ReceiveAddress} receiveAddress
*/
function createReceiveAddress(receiveAddress) {
const element = document.createElement("p");
element.append(createGroupedAddress(receiveAddress.address));
return element;
}
/**
* @param {ReceiveAddress} receiveAddress
* @param {HTMLElement} content
* @param {() => void} onCopied
*/
async function copyReceiveAddress(receiveAddress, content, onCopied) {
await navigator.clipboard.writeText(receiveAddress.address);
content.dataset.copied = "";
onCopied();
}
/**
* @param {HTMLElement} host
* @param {ReceiveAddress} receiveAddress
*/
function openReceiveDialog(host, receiveAddress) {
const dialog = createWalletPart("dialog", "receive");
const content = document.createElement("article");
let copiedTimeout = 0;
content.role = "button";
content.tabIndex = 0;
content.append(
createReceiveQr(receiveAddress),
createReceiveAddress(receiveAddress),
);
dialog.append(content);
function copy() {
void copyReceiveAddress(receiveAddress, content, () => {
window.clearTimeout(copiedTimeout);
copiedTimeout = window.setTimeout(() => {
delete content.dataset.copied;
}, 1_000);
}).catch(() => {});
}
content.addEventListener("click", copy);
content.addEventListener("keydown", (event) => {
if (event.key !== "Enter" && event.key !== " ") return;
event.preventDefault();
copy();
});
openDialog(dialog, host);
}
/**
* @param {HTMLElement} element
* @param {ReceiveAddress | undefined} receiveAddress
*/
export function renderReceiveButton(element, receiveAddress) {
const button = document.createElement("button");
button.type = "button";
button.disabled = !receiveAddress;
button.append("Receive");
button.addEventListener("click", () => {
if (receiveAddress) {
openReceiveDialog(element, receiveAddress);
}
});
element.append(button);
}