mirror of
https://github.com/bitcoinresearchkit/brk.git
synced 2026-07-10 10:38:14 -07:00
98 lines
2.5 KiB
JavaScript
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);
|
|
}
|