4
1
mirror of https://github.com/Qortal/qortal-ui.git synced 2025-02-15 19:55:49 +00:00

added popup to indicate progress

This commit is contained in:
Phillip Lang Martinez 2022-08-26 00:15:38 +03:00
parent fa9765e510
commit 6e43dddd52
3 changed files with 296 additions and 140 deletions

View File

@ -30,6 +30,7 @@ html {
--nav-icon-color: #080808; --nav-icon-color: #080808;
--nav-border-color: #eeeeee; --nav-border-color: #eeeeee;
--nav-border-selected-color: #03a9f4; --nav-border-selected-color: #03a9f4;
--error: #d50000;
--background: url("/img/qortal_background_light_.jpg"); --background: url("/img/qortal_background_light_.jpg");
} }
@ -65,5 +66,6 @@ html[theme="dark"] {
--nav-icon-color: #008fd5; --nav-icon-color: #008fd5;
--nav-border-color: #0b305e; --nav-border-color: #0b305e;
--nav-border-selected-color: #76c8f5; --nav-border-selected-color: #76c8f5;
--error: #d50000;
--background: url("/img/qortal_background_dark_.jpg"); --background: url("/img/qortal_background_dark_.jpg");
} }

View File

@ -37,8 +37,8 @@ export const pageStyles = css`
.message { .message-error {
color: var(--gray); color: var(--error);
} }
@ -62,6 +62,15 @@ export const pageStyles = css`
.row { .row {
display: flex; display: flex;
width: 100%; width: 100%;
align-items: center;
}
.hide {
visibility: hidden
}
.inactiveText {
opacity: .60
} }
.column { .column {
display: flex; display: flex;
@ -156,6 +165,30 @@ export const pageStyles = css`
z-index: 9; z-index: 9;
position: fixed; position: fixed;
} }
.marginLoader {
margin-left: 10px;
}
.marginRight {
margin-right: 10px;
}
.smallLoading,
.smallLoading:after {
border-radius: 50%;
width: 2px;
height: 2px;
}
.smallLoading {
border-width: 0.6em;
border-style: solid;
border-color: rgba(3, 169, 244, 0.2) rgba(3, 169, 244, 0.2)
rgba(3, 169, 244, 0.2) rgb(3, 169, 244);
font-size: 10px;
position: relative;
text-indent: -9999em;
transform: translateZ(0px);
animation: 1.1s linear 0s infinite normal none running loadingAnimation;
}
.loading, .loading,
.loading:after { .loading:after {
@ -277,7 +310,9 @@ export const pageStyles = css`
} }
.word-break {
word-break:break-all;
}
.dialog-container { .dialog-container {
width: 300px; width: 300px;
min-height: 300px; min-height: 300px;
@ -367,4 +402,37 @@ export const pageStyles = css`
grid-column: 1 / -1; grid-column: 1 / -1;
} }
} }
.between {
justify-content: space-between;
}
.no-width {
width: auto
}
.between p {
margin: 0;
padding: 0;
}
#showDialogRewardShareCreationStatus .dialog-container {
width: 300px;
min-height: 250px;
max-height: 75vh;
padding: 5px;
display: flex;
align-items: flex-start;
flex-direction: column;
}
.warning{
display: flex;
flex-grow: 1
}
#showDialogRewardShareCreationStatus li {
margin-bottom: 15px;
}
` `

View File

@ -16,11 +16,25 @@ import "@vaadin/button"
import "@material/mwc-button" import "@material/mwc-button"
import "@polymer/paper-spinner/paper-spinner-lite.js" import "@polymer/paper-spinner/paper-spinner-lite.js"
import '@material/mwc-dialog' import '@material/mwc-dialog'
import {asyncReplace} from 'lit/directives/async-replace.js';
import { pageStyles } from "./sponsorship-list-css.src.js" import { pageStyles } from "./sponsorship-list-css.src.js"
const parentEpml = new Epml({ type: "WINDOW", source: window.parent }) const parentEpml = new Epml({ type: "WINDOW", source: window.parent })
async function* countDown(count, callback) {
while (count > 0) {
yield count--;
await new Promise((r) => setTimeout(r, 1000));
if(count === 0){
console.log('hello call')
callback()
}
}
}
class SponsorshipList extends LitElement { class SponsorshipList extends LitElement {
static get properties() { static get properties() {
return { return {
@ -32,11 +46,14 @@ class SponsorshipList extends LitElement {
mintingAccountData: { type: Array }, mintingAccountData: { type: Array },
sponsorships: { type: Array }, sponsorships: { type: Array },
removeRewardShareLoading: { type: Array }, removeRewardShareLoading: { type: Array },
createSponsorshipMessage: { type: String }, errorMessage: { type: String },
isLoadingCreateSponsorship: { type: Array }, isLoadingCreateSponsorship: { type: Array },
publicKeyValue: { type: String }, publicKeyValue: { type: String },
error: { type: Boolean }, isOpenModal: {type: Boolean},
isOpenModal: {type: Boolean} status: {type: Number},
privateRewardShareKey: {type: String},
timer: {type: Number},
openDialogRewardShare: {type: Boolean}
} }
} }
@ -54,11 +71,14 @@ class SponsorshipList extends LitElement {
this.mintingAccountData = null this.mintingAccountData = null
this.sponsorships = [] this.sponsorships = []
this.removeRewardShareLoading = false this.removeRewardShareLoading = false
this.error = false
this.createSponsorshipMessage = "" this.errorMessage = ""
this.isLoadingCreateSponsorship = false this.isLoadingCreateSponsorship = false
this.publicKeyValue = "" this.publicKeyValue = ""
this.isOpenModal = false this.isOpenModal = false
this.status = 0
this.privateRewardShareKey = ""
this.openDialogRewardShare = false
} }
inputHandler(e) { inputHandler(e) {
@ -108,17 +128,38 @@ class SponsorshipList extends LitElement {
return nodeInfo return nodeInfo
} }
async saveToClipboard(text) {
try {
await navigator.clipboard.writeText(text)
parentEpml.request('showSnackBar', this.onSuccessMessage)
} catch (err) {
parentEpml.request('showSnackBar', this.onErrorMessage)
console.error('Copy to clipboard error:', err)
}
}
changeStatus(value){
this.status = value
saveToClipboard(translate(
"walletpage.wchange4"
))
}
async atMount() { async atMount() {
this.changeLanguage() this.changeLanguage()
this.addressInfo = this.addressInfo =
window.parent.reduxStore.getState().app.accountInfo.addressInfo window.parent.reduxStore.getState().app.accountInfo.addressInfo
this.isPageLoading = true this.isPageLoading = true
try { try {
const address = // const address =
window.parent.reduxStore.getState().app?.selectedAddress // window.parent.reduxStore.getState().app?.selectedAddress
?.address // ?.address
const address = 'QPsjHoKhugEADrtSQP5xjFgsaQPn9WmE3Y'
let rewardShares = await this.getRewardShareRelationship( let rewardShares = await this.getRewardShareRelationship(
address address
@ -153,6 +194,7 @@ class SponsorshipList extends LitElement {
if(openModal){ if(openModal){
this.shadowRoot.querySelector('#showDialog').show() this.shadowRoot.querySelector('#showDialog').show()
} }
} catch (error) { } catch (error) {
@ -251,18 +293,20 @@ class SponsorshipList extends LitElement {
removeReceiver() removeReceiver()
} }
async createRewardShare(e) { async createRewardShare(publicKeyValue) {
this.error = false this.openDialogRewardShare = true
this.createSponsorshipMessage = ""
const recipientPublicKey = this.publicKeyValue this.privateRewardShareKey = ""
this.errorMessage = ""
const recipientPublicKey = publicKeyValue
const percentageShare = 0 const percentageShare = 0
const selectedAddress = const selectedAddress =
window.parent.reduxStore.getState().app?.selectedAddress window.parent.reduxStore.getState().app?.selectedAddress
// Check for valid... // Check for valid...
this.isLoadingCreateSponsorship = true this.isLoadingCreateSponsorship = true
let recipientAddress =
window.parent.base58PublicKeyToAddress(recipientPublicKey)
// Get Last Ref // Get Last Ref
const getLastRef = async () => { const getLastRef = async () => {
@ -282,96 +326,39 @@ class SponsorshipList extends LitElement {
return myAccountDetails return myAccountDetails
} }
// Get Reward Relationship if it already exists
const getRewardShareRelationship = async (minterAddr) => {
let isRewardShareExisting = false
let myRewardShareArray = await parentEpml.request("apiCall", {
type: "api",
url: `/addresses/rewardshares?minters=${minterAddr}&recipients=${recipientAddress}`,
})
isRewardShareExisting =
myRewardShareArray.length !== 0 ? true : false
return isRewardShareExisting
}
// Validate Reward Share by Level // Validate Reward Share by Level
const validateReceiver = async () => { const validateReceiver = async () => {
let accountDetails = await getAccountDetails() let accountDetails
let lastRef = await getLastRef() try {
let isExisting = await getRewardShareRelationship( accountDetails = await getAccountDetails()
selectedAddress.address } catch (error) {
) this.errorMessage = "Couldn't fetch account details"
// Check for creating self share at different levels (also adding check for flags...)
if (accountDetails.flags === 1) {
this.error = false
this.createSponsorshipMessage = ""
let myTransaction = await makeTransactionRequest(lastRef)
if (isExisting === true) {
this.error = true
this.createSponsorshipMessage = `Cannot Create Multiple Reward Shares!`
} else {
// Send the transaction for confirmation by the user
this.error = false
this.createSponsorshipMessage = ""
getTxnRequestResponse(myTransaction)
}
} else if (accountDetails.address === recipientAddress) {
if (accountDetails.level >= 1 && accountDetails.level <= 4) {
this.error = false
this.createSponsorshipMessage = ""
let myTransaction = await makeTransactionRequest(lastRef)
if (isExisting === true) {
let err1string = get("rewardsharepage.rchange18")
this.error = true
this.createSponsorshipMessage = `${err1string}`
} else {
// Send the transaction for confirmation by the user
this.error = false
this.createSponsorshipMessage = ""
getTxnRequestResponse(myTransaction)
}
} else if (accountDetails.level >= 5) {
this.error = false
this.createSponsorshipMessage = ""
let myTransaction = await makeTransactionRequest(lastRef)
if (isExisting === true) {
let err2string = get("rewardsharepage.rchange19")
this.error = true
this.createSponsorshipMessage = `${err2string}`
} else {
// Send the transaction for confirmation by the user
this.error = false
this.createSponsorshipMessage = ""
getTxnRequestResponse(myTransaction)
}
} else {
let err3string = get("rewardsharepage.rchange20")
this.error = true
this.createSponsorshipMessage = `${err3string} ${accountDetails.level}`
}
} else {
//Check for creating reward shares
if (accountDetails.level >= 5) {
this.error = false
this.createSponsorshipMessage = ""
let myTransaction = await makeTransactionRequest(lastRef)
if (isExisting === true) {
let err4string = get("rewardsharepage.rchange18")
this.error = true
this.createSponsorshipMessage = `${err4string}`
} else {
// Send the transaction for confirmation by the user
this.error = false
this.createSponsorshipMessage = ""
getTxnRequestResponse(myTransaction)
}
} else {
this.error = true
let err5string = get("rewardsharepage.rchange20")
this.createSponsorshipMessage = `${err5string} ${accountDetails.level}`
}
} }
let lastRef = await getLastRef()
if (accountDetails.level >= 5) {
this.status = 1
this.errorMessage = ""
try {
const myTransaction = await makeTransactionRequest(lastRef)
getTxnRequestResponse(myTransaction)
} catch (error) {
this.errorMessage = error?.message || 'Error creating relationship'
}
} else {
let err5string = get("rewardsharepage.rchange20")
this.errorMessage = `${err5string} ${accountDetails.level}`
}
} }
// Make Transaction Request // Make Transaction Request
@ -399,27 +386,70 @@ class SponsorshipList extends LitElement {
const getTxnRequestResponse = (txnResponse) => { const getTxnRequestResponse = (txnResponse) => {
if (txnResponse.success === false && txnResponse.message) { if (txnResponse.success === false && txnResponse.message) {
this.error = true
this.createSponsorshipMessage = txnResponse.message this.errorMessage = txnResponse.message
throw new Error(txnResponse) this.isLoadingCreateSponsorship = false
throw(txnResponse)
} else if ( } else if (
txnResponse.success === true && txnResponse.success === true &&
!txnResponse.data.error !txnResponse.data.error
) { ) {
let err6string = get("rewardsharepage.rchange21")
this.createSponsorshipMessage = err6string this.isLoadingCreateSponsorship = false
this.error = false
this.privateRewardShareKey = txnResponse.data
this.confirmRelationship()
} else { } else {
this.error = true
this.createSponsorshipMessage = txnResponse.data.message this.errorMessage = txnResponse.data.message
throw new Error(txnResponse) this.isLoadingCreateSponsorship = false
throw(txnResponse)
} }
} }
validateReceiver() validateReceiver()
this.isLoadingCreateSponsorship = false
} }
async confirmRelationship(){
let interval = null
let stop = false
const getAnswer = async () => {
if (!stop) {
stop= true;
try {
const recipientAddress =
window.parent.base58PublicKeyToAddress(recipientPublicKey)
const minterAddress = window.parent.reduxStore.getState().app?.selectedAddress.address
const myRewardShareArray = await parentEpml.request("apiCall", {
type: "api",
url: `/addresses/rewardshares?minters=${minterAddress}&recipients=${recipientAddress}`,
})
if(myRewardShareArray.length > 0){
clearInterval(interval)
this.status = 3
this.timer = countDown(180, ()=> this.changeStatus(4));
}
} catch (error) {
}
stop = false
}
};
interval = setInterval(getAnswer, 2000);
}
render() { render() {
console.log({sponsors: this.sponsorships}) console.log({sponsors: this.sponsorships})
return html` return html`
@ -490,22 +520,8 @@ class SponsorshipList extends LitElement {
<p class="grid-item-text"> <p class="grid-item-text">
Copy Sponsorship Key Copy Sponsorship Key
</p> </p>
<button-icon-copy
title="${translate( <mwc-button @click=${()=> this.createRewardShare(sponsorship.publicKey)}>copy</mwc-button>
"becomeMinterPage.bchange17"
)}"
onSuccessMessage="${translate(
"walletpage.wchange4"
)}"
onErrorMessage="${translate(
"walletpage.wchange39"
)}"
textToCopy=${sponsorship.rewardSharePublicKey}
buttonSize="28px"
iconSize="16px"
color="var(--copybutton)"
offsetLeft="4px"
></button-icon-copy>
</li> </li>
<li class="grid-item grid-item-button"> <li class="grid-item grid-item-button">
<mwc-button <mwc-button
@ -547,7 +563,7 @@ class SponsorshipList extends LitElement {
</div> </div>
` `
: ''} : ''}
<p class="message">${this.createSponsorshipMessage}</p> <p class="message-error">${this.errorMessage}</p>
<div class="form-wrapper"> <div class="form-wrapper">
<div class="sponsor-minter-wrapper"> <div class="sponsor-minter-wrapper">
<p class="sponsor-minter-text">${translate("sponsorshipspage.schange5")}</p> <p class="sponsor-minter-text">${translate("sponsorshipspage.schange5")}</p>
@ -566,17 +582,11 @@ class SponsorshipList extends LitElement {
<div class="form-item form-item--button"> <div class="form-item form-item--button">
<vaadin-button <vaadin-button
?disabled="${this.isLoadingCreateSponsorship || !this.publicKeyValue}" ?disabled="${this.isLoadingCreateSponsorship || !this.publicKeyValue}"
@click="${this.createRewardShare}" @click="${()=> this.createRewardShare(this.publicKeyValue)}"
> >
${ ${translate(
this.isLoadingCreateSponsorship === false
? html`${translate(
"puzzlepage.pchange15" "puzzlepage.pchange15"
)}` )}
: html`<paper-spinner-lite
active
></paper-spinner-lite>`
}
</vaadin-button> </vaadin-button>
</div> </div>
</div> </div>
@ -605,6 +615,82 @@ class SponsorshipList extends LitElement {
${translate("general.close")} ${translate("general.close")}
</mwc-button> </mwc-button>
</mwc-dialog>
<mwc-dialog escapeKeyAction="" scrimClickAction="" id="showDialogRewardShareCreationStatus" ?hideActions=${this.errorMessage ? false : this.status < 4 ? true : false} ?open=${this.openDialogRewardShare}>
<div class="dialog-header" >
<div class="row">
<h1>In progress </h1> <div class=${`smallLoading marginLoader ${this.status > 3 && 'hide'}`}></div>
</div>
<hr />
</div>
<div class="dialog-container">
<ul>
<li class="row between">1. Creating relationship <div class=${`smallLoading marginLoader ${this.status !== 1 && 'hide'}`}></div></li>
<li class=${`row between ${this.status < 2 && 'inactiveText' }`}>
<p>
2. Awaiting confirmation on blockchain
</p>
<div class=${`smallLoading marginLoader ${this.status !== 2 && 'hide'}`}></div>
</li>
<li class=${`row between ${this.status < 3 && 'inactiveText' }`}>
<p>
3. Finishing up
</p>
<div class="row no-width">
<div class=${`smallLoading marginLoader marginRight ${this.status !== 3 && 'hide'}`} ></div> ${asyncReplace(this.timer)}
</div>
</li>
<li class=${`row between ${this.status < 3 && 'inactiveText' }`}>
<p>
4. Complete
</p>
</li>
${this.privateRewardShareKey && this.status === 4 ? html`
<li class=${`column word-break ${this.status < 3 && 'inactiveText' }`}>
<p>Copy the key below and share it with your sponsored person.</p>
<div style="background: #eee; padding: 8px; margin: 8px 0; border-radius: 5px;">
<span style="color: #000;">${this.privateRewardShareKey}</span>
</div>
</li>
` : ''}
</ul>
<div class="warning column">
<p>
Warning: do not close the Qortal UI until completion!
</p>
<p class="message-error">${this.errorMessage}</p>
</div>
</div>
<mwc-button
slot="primaryAction"
@click=${()=>{
this.openDialogRewardShare = false
this.errorMessage = ''
}}
class="red"
>
${translate("general.close")}
</mwc-button>
</mwc-dialog> </mwc-dialog>
</div> </div>
` `