Show invoice status immediately
This commit is contained in:
parent
26fb7b3178
commit
e0c1085145
|
@ -1,12 +1,12 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="flex flex-col">
|
<div class="flex flex-col">
|
||||||
<router-link v-if="success" :to="callbackUrl" class="label success font-mono">
|
<div class="font-mono my-1">
|
||||||
<div>Paid</div>
|
|
||||||
<small v-if="redirectTimeout > 0">Redirecting in {{ redirectTimeout }} ...</small>
|
|
||||||
</router-link>
|
|
||||||
<div class="font-mono my-3">
|
|
||||||
Payment Required
|
Payment Required
|
||||||
</div>
|
</div>
|
||||||
|
<router-link v-if="invoice.ConfirmedAt" :to="callbackUrl" class="label success font-mono">
|
||||||
|
<div>Paid</div>
|
||||||
|
<small v-if="redirectTimeout < 4">Redirecting in {{ redirectTimeout }} ...</small>
|
||||||
|
</router-link>
|
||||||
<div v-if="error" class="label error font-mono">
|
<div v-if="error" class="label error font-mono">
|
||||||
<div>Error</div>
|
<div>Error</div>
|
||||||
<small>{{ error }}</small>
|
<small>{{ error }}</small>
|
||||||
|
@ -64,35 +64,9 @@ import ago from 's-ago'
|
||||||
|
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
// TODO validate callback url
|
|
||||||
const callbackUrl = ref('/')
|
|
||||||
let pollCount = 0
|
|
||||||
const INVOICE_POLL = 2000
|
|
||||||
const poll = async () => {
|
|
||||||
pollCount++
|
|
||||||
const url = window.origin + '/api/invoice/' + route.params.id
|
|
||||||
const res = await fetch(url)
|
|
||||||
const body = await res.json()
|
|
||||||
if (body.ConfirmedAt) {
|
|
||||||
success.value = true
|
|
||||||
clearInterval(interval)
|
|
||||||
if (pollCount > 1) {
|
|
||||||
// only redirect if the invoice was not immediately paid
|
|
||||||
setInterval(() => {
|
|
||||||
if (--redirectTimeout.value === 0) {
|
|
||||||
router.push(callbackUrl.value)
|
|
||||||
}
|
|
||||||
}, 1000)
|
|
||||||
} else {
|
|
||||||
redirectTimeout.value = -1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let interval
|
|
||||||
const invoice = ref(undefined)
|
const invoice = ref(undefined)
|
||||||
const redirectTimeout = ref(3)
|
const redirectTimeout = ref(4)
|
||||||
const success = ref(null)
|
|
||||||
const error = ref(null)
|
const error = ref(null)
|
||||||
const label = ref('copy')
|
const label = ref('copy')
|
||||||
let copyTimeout = null
|
let copyTimeout = null
|
||||||
|
@ -104,7 +78,12 @@ const copy = () => {
|
||||||
copyTimeout = setTimeout(() => { label.value = 'copy' }, 1500)
|
copyTimeout = setTimeout(() => { label.value = 'copy' }, 1500)
|
||||||
}
|
}
|
||||||
|
|
||||||
await (async () => {
|
const callbackUrl = ref('/')
|
||||||
|
let pollCount = 0
|
||||||
|
let pollTimeout
|
||||||
|
let redirectInterval
|
||||||
|
const INVOICE_POLL = 2000
|
||||||
|
const fetchInvoice = async () => {
|
||||||
const url = window.origin + '/api/invoice/' + route.params.id
|
const url = window.origin + '/api/invoice/' + route.params.id
|
||||||
const res = await fetch(url)
|
const res = await fetch(url)
|
||||||
if (res.status === 404) {
|
if (res.status === 404) {
|
||||||
|
@ -113,6 +92,7 @@ await (async () => {
|
||||||
}
|
}
|
||||||
const body = await res.json()
|
const body = await res.json()
|
||||||
if (body.Description) {
|
if (body.Description) {
|
||||||
|
// parse invoice description to show links
|
||||||
const regexp = /\[market:(?<id>[0-9]+)\]/
|
const regexp = /\[market:(?<id>[0-9]+)\]/
|
||||||
const m = body.Description.match(regexp)
|
const m = body.Description.match(regexp)
|
||||||
const marketId = m?.groups?.id
|
const marketId = m?.groups?.id
|
||||||
|
@ -123,10 +103,29 @@ await (async () => {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
invoice.value = body
|
invoice.value = body
|
||||||
interval = setInterval(poll, INVOICE_POLL)
|
if (!invoice.value.ConfirmedAt) {
|
||||||
})()
|
// invoice not pad (yet?)
|
||||||
|
pollTimeout = setTimeout(() => {
|
||||||
|
pollCount++
|
||||||
|
fetchInvoice()
|
||||||
|
}, INVOICE_POLL)
|
||||||
|
} else {
|
||||||
|
// invoice paid
|
||||||
|
// we check for pollCount > 0 to only redirect if invoice wasn't already paid when we visited the page
|
||||||
|
if (pollCount > 0) {
|
||||||
|
redirectInterval = setInterval(() => {
|
||||||
|
redirectTimeout.value--
|
||||||
|
if (redirectTimeout.value === 0) {
|
||||||
|
clearInterval(redirectInterval)
|
||||||
|
return router.push(callbackUrl.value)
|
||||||
|
}
|
||||||
|
}, 1000)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
await fetchInvoice()
|
||||||
|
|
||||||
onUnmounted(() => { clearInterval(interval) })
|
onUnmounted(() => { clearTimeout(pollTimeout); clearInterval(redirectInterval) })
|
||||||
|
|
||||||
const faucet = window.location.hostname === 'delphi.market' ? 'https://faucet.mutinynet.com' : ''
|
const faucet = window.location.hostname === 'delphi.market' ? 'https://faucet.mutinynet.com' : ''
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue