Improve subscription setup UI
This commit is contained in:
parent
5c1cbe8405
commit
8835669772
2 changed files with 70 additions and 21 deletions
|
@ -379,10 +379,6 @@ async function onCancelSubscription() {
|
||||||
color: $error-color;
|
color: $error-color;
|
||||||
}
|
}
|
||||||
|
|
||||||
.loader {
|
|
||||||
margin: 0 auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.info {
|
.info {
|
||||||
background-color: $block-background-color;
|
background-color: $block-background-color;
|
||||||
border-radius: $block-border-radius;
|
border-radius: $block-border-radius;
|
||||||
|
@ -451,4 +447,8 @@ async function onCancelSubscription() {
|
||||||
gap: $block-inner-padding;
|
gap: $block-inner-padding;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.loader {
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -9,10 +9,11 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="info" v-if="subscriptionConfigured !== null">
|
<div class="info" v-if="subscriptionConfigured !== null">
|
||||||
<template v-if="subscription">
|
<template v-if="subscription">
|
||||||
<div>Recipient address: {{ subscription.recipientAddress }}</div>
|
<span>Subscription is enabled</span>
|
||||||
<div>Token address: {{ subscription.tokenAddress }}</div>
|
<div class="price">
|
||||||
<div>Token symbol: {{ subscription.tokenSymbol }}</div>
|
{{ subscription.pricePerMonth }} {{ subscription.tokenSymbol }}
|
||||||
<div>Price of one month: {{ subscription.pricePerMonth }}</div>
|
<span class="price-subtext">per month</span>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
Subscription is not configured
|
Subscription is not configured
|
||||||
|
@ -32,13 +33,23 @@
|
||||||
Set up subscription
|
Set up subscription
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
<div class="withdraw" v-if="subscription !== null">
|
<form class="withdraw" v-if="subscription !== null">
|
||||||
<input v-model="subscriberAddress" placeholder="Subscriber address">
|
<input v-model="subscriberAddress" placeholder="Subscriber address">
|
||||||
<button class="btn" @click="onCheckSubsciptionState()">Check</button>
|
<button
|
||||||
<button class="btn" v-if="subscriptionState !== null" @click="onWithdrawReceived()">
|
class="btn"
|
||||||
|
@click.prevent="onCheckSubsciptionState()"
|
||||||
|
>
|
||||||
|
Check
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
class="btn"
|
||||||
|
v-if="subscriptionState !== null"
|
||||||
|
@click.prevent="onWithdrawReceived()"
|
||||||
|
>
|
||||||
Withdraw {{ subscription.formatAmount(subscriptionState.recipientBalance) }} {{ subscription.tokenSymbol }}
|
Withdraw {{ subscription.formatAmount(subscriptionState.recipientBalance) }} {{ subscription.tokenSymbol }}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</form>
|
||||||
|
<loader v-if="isLoading"></loader>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -59,6 +70,7 @@ import {
|
||||||
SubscriptionState,
|
SubscriptionState,
|
||||||
SubscriptionToken,
|
SubscriptionToken,
|
||||||
} from "@/api/subscriptions"
|
} from "@/api/subscriptions"
|
||||||
|
import Loader from "@/components/Loader.vue"
|
||||||
import { useWallet } from "@/composables/wallet"
|
import { useWallet } from "@/composables/wallet"
|
||||||
import { useInstanceInfo } from "@/store/instance"
|
import { useInstanceInfo } from "@/store/instance"
|
||||||
import { useCurrentUser } from "@/store/user"
|
import { useCurrentUser } from "@/store/user"
|
||||||
|
@ -75,6 +87,7 @@ const { connectWallet: connectEthereumWallet, getSigner } = useWallet()
|
||||||
const profileEthereumAddress = getVerifiedEthereumAddress(props.profile)
|
const profileEthereumAddress = getVerifiedEthereumAddress(props.profile)
|
||||||
const subscriptionPrice = $ref<number>(1)
|
const subscriptionPrice = $ref<number>(1)
|
||||||
let { walletAddress, walletError } = $(useWallet())
|
let { walletAddress, walletError } = $(useWallet())
|
||||||
|
let isLoading = $ref(false)
|
||||||
let subscriptionToken = $ref<SubscriptionToken | null>(null)
|
let subscriptionToken = $ref<SubscriptionToken | null>(null)
|
||||||
let subscriptionConfigured = $ref<boolean | null>(null)
|
let subscriptionConfigured = $ref<boolean | null>(null)
|
||||||
let subscription = $ref<Subscription | null>(null)
|
let subscription = $ref<Subscription | null>(null)
|
||||||
|
@ -128,6 +141,7 @@ async function checkSubscription() {
|
||||||
walletError = "Incorrect wallet address"
|
walletError = "Incorrect wallet address"
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
isLoading = true
|
||||||
const signer = getSigner()
|
const signer = getSigner()
|
||||||
subscription = await getSubscriptionInfo(
|
subscription = await getSubscriptionInfo(
|
||||||
instance.blockchain_contract_address,
|
instance.blockchain_contract_address,
|
||||||
|
@ -143,6 +157,7 @@ async function checkSubscription() {
|
||||||
signer,
|
signer,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
isLoading = false
|
||||||
}
|
}
|
||||||
|
|
||||||
function canConfigureSubscription(): boolean {
|
function canConfigureSubscription(): boolean {
|
||||||
|
@ -162,6 +177,7 @@ async function onConfigureSubscription() {
|
||||||
) {
|
) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
isLoading = true
|
||||||
const signer = getSigner()
|
const signer = getSigner()
|
||||||
const authToken = ensureAuthToken()
|
const authToken = ensureAuthToken()
|
||||||
const pricePerSec = getPricePerSec(
|
const pricePerSec = getPricePerSec(
|
||||||
|
@ -169,13 +185,20 @@ async function onConfigureSubscription() {
|
||||||
subscriptionToken.decimals,
|
subscriptionToken.decimals,
|
||||||
)
|
)
|
||||||
const signature = await getSubscriptionAuthorization(authToken, pricePerSec)
|
const signature = await getSubscriptionAuthorization(authToken, pricePerSec)
|
||||||
const transaction = await configureSubscription(
|
let transaction
|
||||||
instance.blockchain_contract_address,
|
try {
|
||||||
signer,
|
transaction = await configureSubscription(
|
||||||
profileEthereumAddress,
|
instance.blockchain_contract_address,
|
||||||
pricePerSec,
|
signer,
|
||||||
signature,
|
profileEthereumAddress,
|
||||||
)
|
pricePerSec,
|
||||||
|
signature,
|
||||||
|
)
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error)
|
||||||
|
isLoading = false
|
||||||
|
return
|
||||||
|
}
|
||||||
await transaction.wait()
|
await transaction.wait()
|
||||||
subscriptionConfigured = true
|
subscriptionConfigured = true
|
||||||
subscription = await getSubscriptionInfo(
|
subscription = await getSubscriptionInfo(
|
||||||
|
@ -183,6 +206,7 @@ async function onConfigureSubscription() {
|
||||||
signer,
|
signer,
|
||||||
profileEthereumAddress,
|
profileEthereumAddress,
|
||||||
)
|
)
|
||||||
|
isLoading = false
|
||||||
}
|
}
|
||||||
|
|
||||||
async function onCheckSubsciptionState() {
|
async function onCheckSubsciptionState() {
|
||||||
|
@ -193,6 +217,7 @@ async function onCheckSubsciptionState() {
|
||||||
) {
|
) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
isLoading = true
|
||||||
const signer = getSigner()
|
const signer = getSigner()
|
||||||
subscriptionState = await getSubscriptionState(
|
subscriptionState = await getSubscriptionState(
|
||||||
instance.blockchain_contract_address,
|
instance.blockchain_contract_address,
|
||||||
|
@ -200,6 +225,7 @@ async function onCheckSubsciptionState() {
|
||||||
subscriberAddress,
|
subscriberAddress,
|
||||||
profileEthereumAddress,
|
profileEthereumAddress,
|
||||||
)
|
)
|
||||||
|
isLoading = false
|
||||||
}
|
}
|
||||||
|
|
||||||
async function onWithdrawReceived() {
|
async function onWithdrawReceived() {
|
||||||
|
@ -209,6 +235,7 @@ async function onWithdrawReceived() {
|
||||||
) {
|
) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
isLoading = true
|
||||||
const signer = getSigner()
|
const signer = getSigner()
|
||||||
await withdrawReceived(
|
await withdrawReceived(
|
||||||
instance.blockchain_contract_address,
|
instance.blockchain_contract_address,
|
||||||
|
@ -216,6 +243,7 @@ async function onWithdrawReceived() {
|
||||||
subscriberAddress,
|
subscriberAddress,
|
||||||
)
|
)
|
||||||
subscriptionState = null
|
subscriptionState = null
|
||||||
|
isLoading = false
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
@ -231,10 +259,22 @@ async function onWithdrawReceived() {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.wallet-error {
|
||||||
|
color: $error-color;
|
||||||
|
}
|
||||||
|
|
||||||
.info {
|
.info {
|
||||||
background-color: $block-background-color;
|
background-color: $block-background-color;
|
||||||
border-radius: $block-border-radius;
|
border-radius: $block-border-radius;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: $block-inner-padding / 2;
|
||||||
padding: $block-inner-padding;
|
padding: $block-inner-padding;
|
||||||
|
|
||||||
|
.price {
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.setup {
|
.setup {
|
||||||
|
@ -261,8 +301,17 @@ async function onWithdrawReceived() {
|
||||||
}
|
}
|
||||||
|
|
||||||
.withdraw {
|
.withdraw {
|
||||||
|
align-items: center;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-wrap: wrap;
|
flex-direction: column;
|
||||||
gap: $block-inner-padding / 2;
|
gap: $block-inner-padding;
|
||||||
|
|
||||||
|
input {
|
||||||
|
width: 400px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader {
|
||||||
|
margin: 0 auto;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
Loading…
Reference in a new issue