Skip to content

Instantly share code, notes, and snippets.

@leesalminen
Created August 23, 2022 16:25
Show Gist options
  • Save leesalminen/8f6efdc99ffe7425a64ba32b4a1e0d86 to your computer and use it in GitHub Desktop.
Save leesalminen/8f6efdc99ffe7425a64ba32b4a1e0d86 to your computer and use it in GitHub Desktop.
improve btcpayserver lnurlwnfc.js
Vue.component("LNURLWithdrawContactless", {
data: function () {
return {
supported: 'NDEFReader' in window,
scanning: false,
submitting: false,
readerAbortController: null,
}
},
methods: {
startScan: async function () {
try {
if (this.scanning || this.submitting) {
return;
}
const self = this;
self.submitting = false;
self.scanning = true;
if (!this.supported) {
const result = prompt("enter lnurl withdraw");
if (result) {
self.sendData.bind(self)(result);
return;
}
self.scanning = false;
}
ndef = new NDEFReader()
self.readerAbortController = new AbortController()
await ndef.scan({signal: self.readerAbortController.signal})
ndef.addEventListener('readingerror', () => {
self.scanning = false;
self.readerAbortController.abort()
})
ndef.addEventListener('reading', ({message, serialNumber}) => {
//Decode NDEF data from tag
const record = message.records[0]
const textDecoder = new TextDecoder('utf-8')
const lnurl = textDecoder.decode(record.data)
//User feedback, show loader icon
self.scanning = false;
self.sendData.bind(self)(lnurl);
})
} catch(e) {
self.scanning = false;
self.submitting = false;
}
},
sendData: function (lnurl) {
this.submitting = true;
//Post LNURLW data to server
var xhr = new XMLHttpRequest()
xhr.open('POST', window.lnurlWithdrawSubmitUrl, true)
xhr.setRequestHeader('Content-Type', 'application/json')
xhr.send(JSON.stringify({lnurl, destination: this.$parent.srvModel.btcAddress}))
const self = this;
//User feedback, reset on failure
xhr.onload = function () {
if (xhr.readyState === xhr.DONE) {
console.log(xhr.response);
console.log(xhr.responseText);
self.scanning = false;
self.submitting = false;
if(self.readerAbortController) {
self.readerAbortController.abort()
}
try {
var data = JSON.parse(xhr.response)
if(data && data.status == "ERROR") {
alert(data.reason)
}
} catch (err) {
alert("Error parsing response.")
}
}
}
}
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment