btcpayserver/BTCPayServer/Plugins/BoltcardBalance/Views/ScanCard.cshtml

151 lines
4.6 KiB
Text
Raw Normal View History

2024-02-14 16:45:03 +09:00
@{
2024-02-14 17:00:03 +09:00
ViewData["Title"] = "Boltcard Balances";
ViewData["ShowFooter"] = false;
2024-02-14 16:45:03 +09:00
Layout = "/Views/Shared/_LayoutWizard.cshtml";
}
2024-02-14 17:00:03 +09:00
@section PageHeadContent
{
<style>
.amount-col {
text-align: right;
white-space: nowrap;
}
</style>
}
2024-02-14 16:45:03 +09:00
<header class="text-center">
<h1>Consult balance</h1>
<p class="lead text-secondary mt-3" id="explanation">Scan your card for consulting the balance</p>
</header>
<div id="body" class="my-4">
2024-02-14 17:00:03 +09:00
<div id="actions" class="d-flex align-items-center justify-content-center d-none">
2024-02-14 16:45:03 +09:00
<div class="d-flex gap-3 mt-3 mt-sm-0">
2024-02-14 17:00:03 +09:00
<a id="start-scan-btn" class="btn btn-primary" href="#">Ask permission...</a>
2024-02-14 16:45:03 +09:00
</div>
</div>
2024-02-14 17:00:03 +09:00
<div id="qr" class="d-flex flex-column align-items-center justify-content-center d-none">
2024-02-14 16:45:03 +09:00
<div class="d-inline-flex flex-column" style="width:256px">
<div class="qr-container mb-2">
<vc:qr-code data="@Context.Request.GetCurrentUrl()" />
</div>
</div>
<p class="text-secondary">NFC not supported in this device</p>
</div>
2024-02-14 17:00:03 +09:00
<div id="scanning-btn" class="d-flex align-items-center justify-content-center d-none">
2024-02-14 16:45:03 +09:00
<div class="d-flex gap-3 mt-3 mt-sm-0">
2024-02-14 17:00:03 +09:00
<a id="scanning-btn-link" class="action-button" style="font-size: 50px;" ></a>
2024-02-14 16:45:03 +09:00
</div>
</div>
2024-02-14 17:00:03 +09:00
<div id="balance" class="row">
<div id="balance-table"></div>
</div>
2024-02-14 16:45:03 +09:00
</div>
<script>
(function () {
var permissionGranted = false;
var ndef = null;
var abortController = null;
2024-02-14 17:00:03 +09:00
function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function showBalance(lnurlw) {
setState("Submitting");
await delay(1000);
var url = window.location.href.replace("#", "");
url = url.split("?")[0] + "?" + lnurlw.split("?")[1];
// url = "https://testnet.demo.btcpayserver.org/boltcards/balance?p=...&c=..."
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200 && this.responseText) {
document.getElementById("balance-table").innerHTML = this.responseText;
document.getElementById("CancelWizard").addEventListener("click", function (e) {
e.preventDefault();
setState("WaitingForCard");
document.getElementById("balance-table").innerHTML = "";
});
setState("ShowBalance");
}
2024-02-19 12:23:46 +09:00
else {
setState("WaitingForCard");
}
2024-02-14 17:00:03 +09:00
};
xhttp.open('GET', url, true);
xhttp.send(new FormData());
}
async function startScan() {
2024-02-14 16:45:03 +09:00
if (!('NDEFReader' in window)) {
return;
}
2024-02-14 17:00:03 +09:00
ndef = new NDEFReader();
abortController = new AbortController();
abortController.signal.onabort = () => setState("WaitingForCard");
2024-02-14 16:45:03 +09:00
2024-02-14 17:00:03 +09:00
await ndef.scan({ signal: abortController.signal })
setState("WaitingForCard");
ndef.onreading = async ({ message }) => {
const record = message.records[0];
const textDecoder = new TextDecoder('utf-8');
const decoded = textDecoder.decode(record.data);
await showBalance(decoded);
};
2024-02-14 16:45:03 +09:00
}
function setState(state)
{
2024-02-14 17:00:03 +09:00
document.getElementById("actions").classList.add("d-none");
document.getElementById("qr").classList.add("d-none");
document.getElementById("scanning-btn").classList.add("d-none");
document.getElementById("balance").classList.add("d-none");
2024-02-14 16:45:03 +09:00
if (state === "NFCNotSupported")
{
document.getElementById("qr").classList.remove("d-none");
}
else if (state === "WaitingForPermission")
{
document.getElementById("actions").classList.remove("d-none");
}
else if (state === "WaitingForCard")
{
document.getElementById("scanning-btn").classList.remove("d-none");
2024-02-14 17:00:03 +09:00
document.getElementById("scanning-btn-link").innerHTML = "<i class=\"fa fa-wifi\"></i>";
2024-02-14 16:45:03 +09:00
}
2024-02-14 17:00:03 +09:00
else if (state == "Submitting")
2024-02-14 16:45:03 +09:00
{
document.getElementById("scanning-btn").classList.remove("d-none");
2024-02-14 17:00:03 +09:00
document.getElementById("scanning-btn-link").innerHTML = "<i class=\"fa fa-spinner\"></i>"
}
else if (state == "ShowBalance") {
document.getElementById("scanning-btn").classList.remove("d-none");
document.getElementById("scanning-btn-link").innerHTML = "<i class=\"fa fa-wifi\"></i>";
document.getElementById("balance").classList.remove("d-none");
2024-02-14 16:45:03 +09:00
}
}
2024-02-14 17:00:03 +09:00
document.addEventListener("DOMContentLoaded", async () => {
2024-02-14 16:45:03 +09:00
var nfcSupported = 'NDEFReader' in window;
if (!nfcSupported) {
setState("NFCNotSupported");
}
else {
setState("WaitingForPermission");
2024-02-14 17:00:03 +09:00
var granted = (await navigator.permissions.query({ name: 'nfc' })).state === 'granted';
if (granted)
{
setState("WaitingForCard");
startScan();
}
2024-02-14 16:45:03 +09:00
}
2024-02-14 17:00:03 +09:00
delegate('click', "#start-scan-btn", startScan);
// showBalance("lnurl://ewfw?p=test&c=test");
2024-02-14 16:45:03 +09:00
});
})();
</script>