From 669f652f87aa549688d25b3ea274f2904de525bc Mon Sep 17 00:00:00 2001 From: proto <34919827+protoniuman@users.noreply.github.com> Date: Mon, 8 Aug 2022 15:41:08 +0100 Subject: [PATCH 01/12] Filtering offers based on foreign chain fixed an issue with websocket offers being shown even though it's not the correct selected coin --- .../core/trade-portal/trade-portal.src.js | 197 +++++++++++------- 1 file changed, 116 insertions(+), 81 deletions(-) diff --git a/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js b/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js index 28bc5809..4e902f6f 100644 --- a/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js +++ b/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js @@ -1199,106 +1199,142 @@ class TradePortal extends LitElement { } processOfferingTrade(offer) { - const offerItem = { - ...offer, - qortAmount: parseFloat(offer.qortAmount), - price: parseFloat(offer.foreignAmount) / parseFloat(offer.qortAmount), + try{ + if(this.listedCoins.get(offer.foreignBlockchain).name!=''){//check if the foreignBlockchain value is part of supported blockchains + const offerItem = { + ...offer, + qortAmount: parseFloat(offer.qortAmount), + price: parseFloat(offer.foreignAmount) / parseFloat(offer.qortAmount), + } + const addOffer = () => { + this.listedCoins.get(offer.foreignBlockchain).openOrders.unshift(offerItem) + } + const initOffer = () => { + this.listedCoins.get(offer.foreignBlockchain).openOrders.push(offerItem) + } + this.listedCoins.get(offer.foreignBlockchain).openOrders.length === 0 ? initOffer() : addOffer() + this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._openOrdersGrid.clearCache() : null + } + }catch(e){ + console.log("Error adding offer from "+offer.foreignBlockchain) } - const addOffer = () => { - this.listedCoins.get(this.selectedCoin).openOrders.unshift(offerItem) - } - const initOffer = () => { - this.listedCoins.get(this.selectedCoin).openOrders.push(offerItem) - } - this.listedCoins.get(this.selectedCoin).openOrders.length === 0 ? initOffer() : addOffer() - this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter > 1 ? this._openOrdersGrid.clearCache() : null } processRedeemedTrade(offer) { - // If trade is mine, add it to my historic trades and also add it to historic trades - if (offer.qortalCreator === this.selectedAddress.address) { - // Check and Update Wallet Balance - if (this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter > 1) { - this.updateWalletBalance() + try{ + if(this.listedCoins.get(offer.foreignBlockchain).name!=''){//check if the foreignBlockchain value is part of supported blockchains + + // If trade is mine, add it to my historic trades and also add it to historic trades + if (offer.qortalCreator === this.selectedAddress.address) { + // Check and Update Wallet Balance + if (this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1) { + this.updateWalletBalance() + } + const offerItem = { + ...offer, + mode: 'SOLD', + } + // Add to my historic trades + this._myHistoricTradesGrid.items.unshift(offerItem) + this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._myHistoricTradesGrid.clearCache() : null + } else if (offer.partnerQortalReceivingAddress === this.selectedAddress.address) { + // Check and Update Wallet Balance + if (this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1) { + this.updateWalletBalance() + } + const offerItem = { + ...offer, + mode: 'BOUGHT', + } + // Add to my historic trades + this._myHistoricTradesGrid.items.unshift(offerItem) + this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._myHistoricTradesGrid.clearCache() : null + } + // Add to historic trades + const addNewHistoricTrade = () => { + this._historicTradesGrid.items.unshift(offer) + this._historicTradesGrid.clearCache() + } + this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? addNewHistoricTrade() : null + } - const offerItem = { - ...offer, - mode: 'SOLD', - } - // Add to my historic trades - this._myHistoricTradesGrid.items.unshift(offerItem) - this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter > 1 ? this._myHistoricTradesGrid.clearCache() : null - } else if (offer.partnerQortalReceivingAddress === this.selectedAddress.address) { - // Check and Update Wallet Balance - if (this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter > 1) { - this.updateWalletBalance() - } - const offerItem = { - ...offer, - mode: 'BOUGHT', - } - // Add to my historic trades - this._myHistoricTradesGrid.items.unshift(offerItem) - this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter > 1 ? this._myHistoricTradesGrid.clearCache() : null + }catch(e){ + console.log("Error processing redeemed trade offer from "+offer.foreignBlockchain) } - // Add to historic trades - const addNewHistoricTrade = () => { - this._historicTradesGrid.items.unshift(offer) - this._historicTradesGrid.clearCache() - } - this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter > 1 ? addNewHistoricTrade() : null } processTradingTrade(offer) { - // Remove from open market orders - if (offer.qortalCreator === this.selectedAddress.address && this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter > 1) { - // Check and Update Wallet Balance - this.updateWalletBalance() - } - this._openOrdersGrid.items.forEach((item, index) => { - if (item.qortalAtAddress === offer.qortalAtAddress) { - this._openOrdersGrid.items.splice(index, 1) - this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter > 1 ? this._openOrdersGrid.clearCache() : null + try{ + if(this.listedCoins.get(offer.foreignBlockchain).name!=''){//check if the foreignBlockchain value is part of supported blockchains + + // Remove from open market orders + if (offer.qortalCreator === this.selectedAddress.address && this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1) { + // Check and Update Wallet Balance + this.updateWalletBalance() + } + this._openOrdersGrid.items.forEach((item, index) => { + if (item.qortalAtAddress === offer.qortalAtAddress) { + this._openOrdersGrid.items.splice(index, 1) + this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._openOrdersGrid.clearCache() : null + } + }) + this.listedCoins.get(offer.foreignBlockchain).openOrders = this.listedCoins.get(offer.foreignBlockchain).openOrders.filter((order) => order.qortalAtAddress !== offer.qortalAtAddress) } - }) - this.listedCoins.get(this.selectedCoin).openOrders = this.listedCoins.get(this.selectedCoin).openOrders.filter((order) => order.qortalAtAddress !== offer.qortalAtAddress) + }catch(e){ + console.log("Error processing trading trade offer from "+offer.foreignBlockchain) + } } processRefundedTrade(offer) { - if (offer.qortalCreator === this.selectedAddress.address) { - // Check and Update Wallet Balance - if (this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter > 1) { - this.updateWalletBalance() + try{ + if(this.listedCoins.get(offer.foreignBlockchain).name!=''){//check if the foreignBlockchain value is part of supported blockchains + + if (offer.qortalCreator === this.selectedAddress.address) { + // Check and Update Wallet Balance + if (this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1) { + this.updateWalletBalance() + } + // Add to my historic trades + this._myHistoricTradesGrid.items.unshift(offer) + this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._myHistoricTradesGrid.clearCache() : null } - // Add to my historic trades - this._myHistoricTradesGrid.items.unshift(offer) - this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter > 1 ? this._myHistoricTradesGrid.clearCache() : null + + } + }catch(e){ + console.log("Error processing refunded trade offer from "+offer.foreignBlockchain) } } processCancelledTrade(offer) { - if (offer.qortalCreator === this.selectedAddress.address) { - // Check and Update Wallet Balance - if (this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter > 1) { - this.updateWalletBalance() + try{ + if(this.listedCoins.get(offer.foreignBlockchain).name!=''){//check if the foreignBlockchain value is part of supported blockchains + + if (offer.qortalCreator === this.selectedAddress.address) { + // Check and Update Wallet Balance + if (this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1) { + this.updateWalletBalance() + } + // Add to my historic trades + this._myHistoricTradesGrid.items.unshift(offer) + this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._myHistoricTradesGrid.clearCache() : null + } + this._openOrdersGrid.items.forEach((item, index) => { + if (item.qortalAtAddress === offer.qortalAtAddress) { + this._openOrdersGrid.items.splice(index, 1) + this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._openOrdersGrid.clearCache() : null + } + }) + this.listedCoins.get(offer.foreignBlockchain).openOrders = this.listedCoins.get(offer.foreignBlockchain).openOrders.filter((order) => order.qortalAtAddress !== offer.qortalAtAddress) + this._stuckOrdersGrid.items.forEach((item, index) => { + if (item.qortalAtAddress === offer.qortalAtAddress) { + this._stuckOrdersGrid.items.splice(index, 1) + this._stuckOrdersGrid.clearCache() + } + }) } - // Add to my historic trades - this._myHistoricTradesGrid.items.unshift(offer) - this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter > 1 ? this._myHistoricTradesGrid.clearCache() : null + }catch(e){ + console.log("Error processing cancelled trade offer from "+offer.foreignBlockchain) } - this._openOrdersGrid.items.forEach((item, index) => { - if (item.qortalAtAddress === offer.qortalAtAddress) { - this._openOrdersGrid.items.splice(index, 1) - this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter > 1 ? this._openOrdersGrid.clearCache() : null - } - }) - this.listedCoins.get(this.selectedCoin).openOrders = this.listedCoins.get(this.selectedCoin).openOrders.filter((order) => order.qortalAtAddress !== offer.qortalAtAddress) - this._stuckOrdersGrid.items.forEach((item, index) => { - if (item.qortalAtAddress === offer.qortalAtAddress) { - this._stuckOrdersGrid.items.splice(index, 1) - this._stuckOrdersGrid.clearCache() - } - }) } /** @@ -1314,7 +1350,6 @@ class TradePortal extends LitElement { offers.forEach((offer) => { if (offer.mode === 'OFFERING') { this.processOfferingTrade(offer) - this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter > 1 ? this._openOrdersGrid.clearCache() : null } else if (offer.mode === 'REDEEMED') { this.processRedeemedTrade(offer) } else if (offer.mode === 'TRADING') { From 9964d7f121e616fa3bf5c0c00b05fa8e29eda6e2 Mon Sep 17 00:00:00 2001 From: Phillip Lang Martinez Date: Sun, 14 Aug 2022 17:35:38 +0300 Subject: [PATCH 02/12] started new plugin --- qortal-ui-core/src/components/sidenav-menu.js | 6 + .../side-menu-item-style.js | 1 + qortal-ui-plugins/build-config.js | 4 + qortal-ui-plugins/plugins/core/main.src.js | 9 + .../plugins/core/sponsorship-list/index.html | 53 ++ .../sponsorship-list-css.src.js | 306 ++++++++++ .../sponsorship-list/sponsorship-list.src.js | 573 ++++++++++++++++++ 7 files changed, 952 insertions(+) create mode 100644 qortal-ui-plugins/plugins/core/sponsorship-list/index.html create mode 100644 qortal-ui-plugins/plugins/core/sponsorship-list/sponsorship-list-css.src.js create mode 100644 qortal-ui-plugins/plugins/core/sponsorship-list/sponsorship-list.src.js diff --git a/qortal-ui-core/src/components/sidenav-menu.js b/qortal-ui-core/src/components/sidenav-menu.js index 3b058c7e..bc29d8d4 100644 --- a/qortal-ui-core/src/components/sidenav-menu.js +++ b/qortal-ui-core/src/components/sidenav-menu.js @@ -158,6 +158,12 @@ class SidenavMenu extends connect(store)(LitElement) { > + + + { in: 'plugins/core/become-minter/become-minter.src.js', out: 'plugins/core/become-minter/become-minter.js', }, + { + in: 'plugins/core/sponsorship-list/sponsorship-list.src.js', + out: 'plugins/core/sponsorship-list/sponsorship-list.js', + }, { in: 'plugins/core/puzzles/puzzles.src.js', out: 'plugins/core/puzzles/puzzles.js', diff --git a/qortal-ui-plugins/plugins/core/main.src.js b/qortal-ui-plugins/plugins/core/main.src.js index b4efcb9f..7c554a84 100644 --- a/qortal-ui-plugins/plugins/core/main.src.js +++ b/qortal-ui-plugins/plugins/core/main.src.js @@ -25,6 +25,15 @@ parentEpml.ready().then(() => { menus: [], parent: false, }, + { + url: 'sponsorship-list', + domain: 'core', + page: 'sponsorship-list/index.html', + title: 'Become a Minter', + icon: 'vaadin:info-circle', + menus: [], + parent: false, + }, { url: 'wallet', domain: 'core', diff --git a/qortal-ui-plugins/plugins/core/sponsorship-list/index.html b/qortal-ui-plugins/plugins/core/sponsorship-list/index.html new file mode 100644 index 00000000..b4e15984 --- /dev/null +++ b/qortal-ui-plugins/plugins/core/sponsorship-list/index.html @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + diff --git a/qortal-ui-plugins/plugins/core/sponsorship-list/sponsorship-list-css.src.js b/qortal-ui-plugins/plugins/core/sponsorship-list/sponsorship-list-css.src.js new file mode 100644 index 00000000..07eec912 --- /dev/null +++ b/qortal-ui-plugins/plugins/core/sponsorship-list/sponsorship-list-css.src.js @@ -0,0 +1,306 @@ +import { css } from "lit" + +export const pageStyles = css` + * { + --mdc-theme-surface: var(--white); + --mdc-dialog-content-ink-color: var(--black); + } + + .header-title { + font-size: 40px; + color: var(--black); + font-weight: 400; + text-align: center; + } + .divider { + color: #eee; + border-radius: 80%; + margin-bottom: 2rem; + } + .fullWidth { + width: 100%; + } + .page-container { + display: flex; + align-items: center; + flex-direction: column; + margin-bottom: 75px; + } + .inner-container { + display: flex; + align-items: center; + flex-direction: column; + width: 95%; + max-width: 1100px; + } + + .description { + color: var(--black); + } + + .message { + color: var(--gray); + } + + .sub-main { + width: 95%; + display: flex; + + flex-direction: column; + max-width: 1100px; + } + + .level-black { + font-size: 32px; + color: var(--black); + font-weight: 400; + text-align: center; + margin-top: 2rem; + } + + .form-wrapper { + display: flex; + align-items: center; + width: 100%; + max-width: 700px; + height: 50px; + } + + .row { + display: flex; + width: 100%; + } + .column { + display: flex; + flex-direction: column; + width: 100%; + } + + .column-center { + align-items: center; + } + .no-margin { + margin: 0; + } + .no-wrap { + flex-wrap: nowrap !important; + } + + .row-center { + justify-content: center; + flex-wrap: wrap; + } + .form-item { + display: flex; + height: 100%; + } + + .form-item--button { + flex-grow: 0; + } + + .form-item--input { + flex-grow: 1; + margin-right: 25px; + } + + .center-box { + position: absolute; + width: 100%; + top: 50%; + left: 50%; + transform: translate(-50%, 0%); + text-align: center; + } + + .content-box { + border: 1px solid var(--border); + border-radius: 10px; + padding: 10px 25px; + text-align: center; + display: inline-block; + + margin-bottom: 5px; + flex-basis: 250px; + } + .gap { + gap: 10px; + } + .level-black { + font-size: 32px; + color: var(--black); + font-weight: 400; + text-align: center; + margin-top: 2rem; + text-align: center; + } + .title { + font-weight: 600; + font-size: 20px; + line-height: 28px; + opacity: 0.66; + color: var(--switchborder); + } + + .address { + overflow-wrap: anywhere; + color: var(--black); + } + + h4 { + font-weight: 600; + font-size: 20px; + line-height: 28px; + color: var(--black); + } + mwc-textfield { + width: 100%; + } + vaadin-button { + height: 100%; + margin: 0; + cursor: pointer; + outline: 1px var(--black) solid; + min-width: 80px; + } + .loader, + .loader:after { + border-radius: 50%; + width: 10em; + height: 10em; + } + .loadingContainer { + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + z-index: 10; + } + + .backdrop { + height: 100vh; + width: 100vw; + opacity: 0.6; + background-color: var(--border); + z-index: 9; + position: fixed; + } + + .loading, + .loading:after { + border-radius: 50%; + width: 5em; + height: 5em; + } + + .loading { + margin: 10px auto; + 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; + } + + @-webkit-keyframes loadingAnimation { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } + } + + @keyframes loadingAnimation { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } + } + + .tableGrid { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr) minmax( + 0, + 1fr + ) minmax(0, 1fr); + align-items: center; + gap: 5px; + width: 100%; + margin-bottom: 15px; + + padding: 5px; + + } + + + .grid-item { + text-align: center; + color: var(--black); + word-break: break-all; + overflow: hidden; + } + + .grid-item p { + text-decoration: underline; + } + + ul { + list-style-type: none; + margin: 0; + padding: 0; + } + .red { + --mdc-theme-primary: #f44336; + } + + .grid-item-text { + display: none; + } + + @media (max-width: 710px) { + .table-header { + display: none; + } + .grid-item-text { + display: inline; + color: var(--black); + text-decoration: none; + margin: 0px; + margin-right: 10px; + } + + .grid-item { + text-align: start; + align-items: center; + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); + } + + .grid-item p { + text-decoration: none; + } + + .tableGrid { + grid-template-columns: minmax(0, 1fr); + border-radius: 5px; + border: 1px solid var(--black); + padding: 10px; + margin-bottom: 20px; + } + + mwc-button { + grid-column: 1 / -1; + } + } +` diff --git a/qortal-ui-plugins/plugins/core/sponsorship-list/sponsorship-list.src.js b/qortal-ui-plugins/plugins/core/sponsorship-list/sponsorship-list.src.js new file mode 100644 index 00000000..adc3251b --- /dev/null +++ b/qortal-ui-plugins/plugins/core/sponsorship-list/sponsorship-list.src.js @@ -0,0 +1,573 @@ +import { LitElement, html } from "lit" +import { Epml } from "../../../epml.js" +import "../components/ButtonIconCopy.js" +import { use, get, translate, registerTranslateConfig } from "lit-translate" +import { blocksNeed } from "../../utils/blocks-needed.js" +import "../components/ButtonIconCopy.js" + +registerTranslateConfig({ + loader: (lang) => fetch(`/language/${lang}.json`).then((res) => res.json()), +}) + +import "@polymer/paper-spinner/paper-spinner-lite.js" +import "@material/mwc-button" +import "@material/mwc-textfield" +import "@vaadin/button" +import "@material/mwc-button" +import "@polymer/paper-spinner/paper-spinner-lite.js" + +import { pageStyles } from "./sponsorship-list-css.src.js" + +const parentEpml = new Epml({ type: "WINDOW", source: window.parent }) + +class SponsorshipList extends LitElement { + static get properties() { + return { + theme: { type: String, reflect: true }, + sponsorshipKeyValue: { type: String }, + nodeInfo: { type: Object }, + isPageLoading: { type: Boolean }, + addressInfo: { type: Object }, + rewardSharePublicKey: { type: String }, + mintingAccountData: { type: Array }, + sponsorships: { type: Array }, + removeRewardShareLoading: { type: Array }, + createSponsorshipMessage: { type: String }, + isLoadingCreateSponsorship: { type: Array }, + publicKeyValue: { type: String }, + error: { type: Boolean }, + } + } + + static styles = [pageStyles] + + constructor() { + super() + this.theme = localStorage.getItem("qortalTheme") + ? localStorage.getItem("qortalTheme") + : "light" + this.sponsorshipKeyValue = "" + this.isPageLoading = true + this.nodeInfo = {} + this.addressInfo = {} + this.rewardSharePublicKey = "" + this.mintingAccountData = null + this.sponsorships = [] + this.removeRewardShareLoading = false + this.error = false + this.createSponsorshipMessage = "" + this.isLoadingCreateSponsorship = false + this.publicKeyValue = "" + } + + inputHandler(e) { + this.publicKeyValue = e.target.value + } + + changeLanguage() { + const checkLanguage = localStorage.getItem("qortalLanguage") + + if (checkLanguage === null || checkLanguage.length === 0) { + localStorage.setItem("qortalLanguage", "us") + use("us") + } else { + use(checkLanguage) + } + } + + _handleStorage() { + const checkLanguage = localStorage.getItem("qortalLanguage") + const checkTheme = localStorage.getItem("qortalTheme") + + use(checkLanguage) + + if (checkTheme === "dark") { + this.theme = "dark" + } else { + this.theme = "light" + } + document.querySelector("html").setAttribute("theme", this.theme) + } + + connectedCallback() { + super.connectedCallback() + window.addEventListener("storage", this._handleStorage) + } + + disconnectedCallback() { + window.removeEventListener("storage", this._handleStorage) + super.disconnectedCallback() + } + + async getNodeInfo() { + const nodeInfo = await parentEpml.request("apiCall", { + url: `/admin/status`, + }) + + return nodeInfo + } + + async atMount() { + this.changeLanguage() + + this.addressInfo = + window.parent.reduxStore.getState().app.accountInfo.addressInfo + this.isPageLoading = true + try { + const address = + window.parent.reduxStore.getState().app?.selectedAddress + ?.address + let rewardShares = await this.getRewardShareRelationship( + "QPsjHoKhugEADrtSQP5xjFgsaQPn9WmE3Y" + ) + + rewardShares = rewardShares.filter((rs) => rs.recipient !== address) + + const getAccountInfo = rewardShares.map(async (rs) => { + const addressInfo = await parentEpml.request("apiCall", { + type: "api", + url: `/addresses/${rs.recipient}`, + }) + const recentBlocksInfo = await parentEpml.request("apiCall", { + type: "api", + url: `/blocks/signer/${rs.recipient}?limit=5&reverse=true`, + }) + let blocksRemaining = this._levelUpBlocks(addressInfo) + blocksRemaining = +blocksRemaining > 0 ? +blocksRemaining : 0 + return { + ...addressInfo, + ...rs, + lastActiveBlock: recentBlocksInfo[0]?.height, + blocksRemaining: blocksRemaining, + } + }) + const accountInfoValues = await Promise.all(getAccountInfo) + + this.sponsorships = accountInfoValues + this.nextSponsorshipEnding = accountInfoValues + .filter((sponsorship) => sponsorship.blocksRemaining !== 0) + .sort((a, b) => a.blocksRemaining - b.blocksRemaining)[0] + this.isPageLoading = false + } catch (error) { + console.error(error) + + this.isPageLoading = false + } + } + + async firstUpdated() { + await this.atMount() + } + + async getRewardShareRelationship(recipientAddress) { + const myRewardShareArray = await parentEpml.request("apiCall", { + type: "api", + url: `/addresses/rewardshares?minters=${recipientAddress}`, + }) + + return myRewardShareArray + } + + _levelUpBlocks(accountInfo) { + let countBlocksString = ( + blocksNeed(0) - + (accountInfo?.blocksMinted + accountInfo?.blocksMintedAdjustment) + ).toString() + return countBlocksString + } + + async removeRewardShare(rewardShareObject) { + const selectedAddress = + window.parent.reduxStore.getState().app?.selectedAddress + + const myPercentageShare = -1 + + // Check for valid... + this.removeRewardShareLoading = true + + // Get Last Ref + const getLastRef = async () => { + let myRef = await parentEpml.request("apiCall", { + type: "api", + url: `/addresses/lastreference/${selectedAddress?.address}`, + }) + return myRef + } + + // Remove Reward Share + const removeReceiver = async () => { + let lastRef = await getLastRef() + + let myTransaction = await makeTransactionRequest(lastRef) + getTxnRequestResponse(myTransaction) + } + + // Make Transaction Request + const makeTransactionRequest = async (lastRef) => { + let mylastRef = lastRef + let rewarddialog5 = get("transactions.rewarddialog5") + let rewarddialog6 = get("transactions.rewarddialog6") + let myTxnrequest = await parentEpml.request("transaction", { + type: 381, + nonce: selectedAddress?.nonce, + params: { + rewardShareKeyPairPublicKey: + rewardShareObject.rewardSharePublicKey, + recipient: rewardShareObject.recipient, + percentageShare: myPercentageShare, + lastReference: mylastRef, + rewarddialog5: rewarddialog5, + rewarddialog6: rewarddialog6, + }, + }) + return myTxnrequest + } + + const getTxnRequestResponse = (txnResponse) => { + if (txnResponse.success === false && txnResponse.message) { + this.removeRewardShareLoading = false + parentEpml.request("showSnackBar", txnResponse.message) + throw new Error(txnResponse) + } else if ( + txnResponse.success === true && + !txnResponse.data.error + ) { + let err7tring = get("rewardsharepage.rchange22") + this.removeRewardShareLoading = false + parentEpml.request("showSnackBar", `${err7tring}`) + this.atMount() + } else { + this.removeRewardShareLoading = false + parentEpml.request("showSnackBar", txnResponse.data.message) + throw new Error(txnResponse) + } + } + removeReceiver() + } + + async createRewardShare(e) { + this.error = false + this.createSponsorshipMessage = "" + const recipientPublicKey = this.publicKeyValue + const percentageShare = 0 + const selectedAddress = + window.parent.reduxStore.getState().app?.selectedAddress + // Check for valid... + this.isLoadingCreateSponsorship = true + + let recipientAddress = + window.parent.base58PublicKeyToAddress(recipientPublicKey) + + // Get Last Ref + const getLastRef = async () => { + let myRef = await parentEpml.request("apiCall", { + type: "api", + url: `/addresses/lastreference/${selectedAddress.address}`, + }) + return myRef + } + + // Get Account Details + const getAccountDetails = async () => { + let myAccountDetails = await parentEpml.request("apiCall", { + type: "api", + url: `/addresses/${selectedAddress.address}`, + }) + 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 + const validateReceiver = async () => { + let accountDetails = await getAccountDetails() + let lastRef = await getLastRef() + let isExisting = await getRewardShareRelationship( + selectedAddress.address + ) + + // 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}` + } + } + } + + // Make Transaction Request + const makeTransactionRequest = async (lastRef) => { + let mylastRef = lastRef + let rewarddialog1 = get("transactions.rewarddialog1") + let rewarddialog2 = get("transactions.rewarddialog2") + let rewarddialog3 = get("transactions.rewarddialog3") + let rewarddialog4 = get("transactions.rewarddialog4") + let myTxnrequest = await parentEpml.request("transaction", { + type: 38, + nonce: selectedAddress.nonce, + params: { + recipientPublicKey, + percentageShare, + lastReference: mylastRef, + rewarddialog1: rewarddialog1, + rewarddialog2: rewarddialog2, + rewarddialog3: rewarddialog3, + rewarddialog4: rewarddialog4, + }, + }) + return myTxnrequest + } + + const getTxnRequestResponse = (txnResponse) => { + if (txnResponse.success === false && txnResponse.message) { + this.error = true + this.createSponsorshipMessage = txnResponse.message + throw new Error(txnResponse) + } else if ( + txnResponse.success === true && + !txnResponse.data.error + ) { + let err6string = get("rewardsharepage.rchange21") + this.createSponsorshipMessage = err6string + this.error = false + } else { + this.error = true + this.createSponsorshipMessage = txnResponse.data.message + throw new Error(txnResponse) + } + } + validateReceiver() + this.isLoadingCreateSponsorship = false + } + + render() { + console.log({ sponsorships: this.sponsorships }) + + return html` + ${ + this.isPageLoading + ? html` +
+
+
+
+ ` + : "" + } + +
+

+ ${translate("mintingpage.mchange35")} +

+
+
+
+
+
+
+

Account Address

+
+
+

Blocks Minted

+
+
+

Last Active Block

+
+
+

Sponsorship Key

+
+
+ +
+
+ + + ${this.sponsorships.map( + (sponsorship) => html` +
    +
  • +

    + Account Address +

    + ${sponsorship.address} +
  • +
  • +

    + Blocks Minted +

    + ${+sponsorship.blocksMinted + + +sponsorship.blocksMintedAdjustment} +
  • +
  • +

    + Last Active Block +

    + ${sponsorship.lastActiveBlock} +
  • +
  • +

    + Copy Sponsorship Key +

    + +
  • +
  • + + this.removeRewardShare( + sponsorship + )} + >create${translate( + "rewardsharepage.rchange17" + )} +
  • +
+ ` + )} + + ${ + this.sponsorships.length > 0 && + html` +
+

+ Total Sponsorships active + ${this.sponsorships.length} +

+

+ Next sponsorship ending in + ${this.nextSponsorshipEnding + ?.blocksRemaining} + blocks +

+
+ ` + } +

${this.createSponsorshipMessage}

+
+
+ + +
+
+ + ${ + this.isLoadingCreateSponsorship === false + ? html`${translate( + "puzzlepage.pchange15" + )}` + : html`` + } + +
+
+
+
+ ` + } +} + +window.customElements.define("sponsorship-list", SponsorshipList) From c444c325ceda690c858c00bac57f59b33f6fb9c4 Mon Sep 17 00:00:00 2001 From: Phillip Lang Martinez Date: Wed, 17 Aug 2022 00:55:13 +0300 Subject: [PATCH 03/12] added text --- qortal-ui-core/language/us.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/qortal-ui-core/language/us.json b/qortal-ui-core/language/us.json index 67d8de7d..31a74cac 100644 --- a/qortal-ui-core/language/us.json +++ b/qortal-ui-core/language/us.json @@ -610,5 +610,15 @@ "rewarddialog4":"On pressing confirm, the rewardshare will be created, but you will still need to supply the above key to a node in order to mint with the account.", "rewarddialog5":"You are removing a reward share transaction associated with account:", "rewarddialog6":"On pressing confirm, the rewardshare will be removed and the minting key will become invalid." + }, + "sponsorshipspage": { + "schange1": "Active Sponsorships", + "schange2" : "Account Address", + "schange3" : "Total Sponsorships active", + "schange4" : "Next sponsorship ending in", + "schange5" : "Sponsor New Minter", + "schange6" : "Finished Sponsorships", + "schange7" : "Completed", + "schange8" : "Addresses" } } \ No newline at end of file From c3f3737e42c3433a6e6d37dc7d976583dfbc0008 Mon Sep 17 00:00:00 2001 From: Phillip Lang Martinez Date: Wed, 17 Aug 2022 00:55:43 +0300 Subject: [PATCH 04/12] added modal with finished sponsorships --- .../sponsorship-list-css.src.js | 143 ++++++++++++------ .../sponsorship-list/sponsorship-list.src.js | 126 +++++++++------ 2 files changed, 175 insertions(+), 94 deletions(-) diff --git a/qortal-ui-plugins/plugins/core/sponsorship-list/sponsorship-list-css.src.js b/qortal-ui-plugins/plugins/core/sponsorship-list/sponsorship-list-css.src.js index 07eec912..1851c584 100644 --- a/qortal-ui-plugins/plugins/core/sponsorship-list/sponsorship-list-css.src.js +++ b/qortal-ui-plugins/plugins/core/sponsorship-list/sponsorship-list-css.src.js @@ -4,6 +4,7 @@ export const pageStyles = css` * { --mdc-theme-surface: var(--white); --mdc-dialog-content-ink-color: var(--black); + box-sizing: border-box; } .header-title { @@ -34,36 +35,28 @@ export const pageStyles = css` max-width: 1100px; } - .description { - color: var(--black); - } + .message { color: var(--gray); } - .sub-main { - width: 95%; - display: flex; - - flex-direction: column; - max-width: 1100px; - } - - .level-black { - font-size: 32px; - color: var(--black); - font-weight: 400; - text-align: center; - margin-top: 2rem; - } + .form-wrapper { display: flex; align-items: center; width: 100%; max-width: 700px; height: 50px; + flex-wrap: wrap; + } + + .sponsor-minter-text { + color: var(--black); + font-weight: bold; + margin-right: 15px; + font-size: 18px; } .row { @@ -102,38 +95,16 @@ export const pageStyles = css` .form-item--input { flex-grow: 1; margin-right: 25px; + min-width: 275px; } - .center-box { - position: absolute; - width: 100%; - top: 50%; - left: 50%; - transform: translate(-50%, 0%); - text-align: center; - } + - .content-box { - border: 1px solid var(--border); - border-radius: 10px; - padding: 10px 25px; - text-align: center; - display: inline-block; - - margin-bottom: 5px; - flex-basis: 250px; - } + .gap { gap: 10px; } - .level-black { - font-size: 32px; - color: var(--black); - font-weight: 400; - text-align: center; - margin-top: 2rem; - text-align: center; - } + .title { font-weight: 600; font-size: 20px; @@ -230,7 +201,7 @@ export const pageStyles = css` .tableGrid { display: grid; - grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr) minmax( + grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax( 0, 1fr ) minmax(0, 1fr); @@ -251,6 +222,29 @@ export const pageStyles = css` overflow: hidden; } + .text { + color: var(--black) + } + .text--bold { + font-weight: bold; + } + + .summary-box { + + display: flex; + margin-top: 25px; + width: 100%; + flex-wrap: wrap; + } + + .summary-box p:first-child { + margin-right: 30px; + } + + .text--normal { + font-weight: normal; + } + .grid-item p { text-decoration: underline; } @@ -262,12 +256,71 @@ export const pageStyles = css` } .red { --mdc-theme-primary: #f44336; + border-radius: 2px; + + } + .btn--sponsorshipfinished { + background-color: var(--menuactive); + transition: all .2s; + animation: onOff 2s infinite; + --mdc-theme-primary: var(--black); } + + + .dialog-container { + width: 300px; + min-height: 300px; + max-height: 75vh; + padding: 5px; + display: flex; + align-items: flex-start; + flex-direction: column; + + + } + + .dialog-paragraph { + word-break: break-all; + color: var(--black) + } + + + + .dialog-header h1 { + font-size: 18px; + } + + @keyframes onOff { + from {opacity: 1} + to {opacity: .5} +} .grid-item-text { display: none; } + .sub-title { + margin-bottom: 10px; + } + + .sub-title p { + font-size: 18px; + color: var(--black); + } + + @media (max-width: 610px) { + .sponsor-minter-wrapper { + width: 100%; + margin-bottom: 10px; + } + + .form-item--input { + flex-grow: 1; + margin-right: 25px; + min-width: unset; + } + } + @media (max-width: 710px) { .table-header { display: none; diff --git a/qortal-ui-plugins/plugins/core/sponsorship-list/sponsorship-list.src.js b/qortal-ui-plugins/plugins/core/sponsorship-list/sponsorship-list.src.js index adc3251b..492a0782 100644 --- a/qortal-ui-plugins/plugins/core/sponsorship-list/sponsorship-list.src.js +++ b/qortal-ui-plugins/plugins/core/sponsorship-list/sponsorship-list.src.js @@ -15,6 +15,7 @@ import "@material/mwc-textfield" import "@vaadin/button" import "@material/mwc-button" import "@polymer/paper-spinner/paper-spinner-lite.js" +import '@material/mwc-dialog' import { pageStyles } from "./sponsorship-list-css.src.js" @@ -24,7 +25,6 @@ class SponsorshipList extends LitElement { static get properties() { return { theme: { type: String, reflect: true }, - sponsorshipKeyValue: { type: String }, nodeInfo: { type: Object }, isPageLoading: { type: Boolean }, addressInfo: { type: Object }, @@ -36,6 +36,7 @@ class SponsorshipList extends LitElement { isLoadingCreateSponsorship: { type: Array }, publicKeyValue: { type: String }, error: { type: Boolean }, + isOpenModal: {type: Boolean} } } @@ -46,7 +47,6 @@ class SponsorshipList extends LitElement { this.theme = localStorage.getItem("qortalTheme") ? localStorage.getItem("qortalTheme") : "light" - this.sponsorshipKeyValue = "" this.isPageLoading = true this.nodeInfo = {} this.addressInfo = {} @@ -58,6 +58,7 @@ class SponsorshipList extends LitElement { this.createSponsorshipMessage = "" this.isLoadingCreateSponsorship = false this.publicKeyValue = "" + this.isOpenModal = false } inputHandler(e) { @@ -114,11 +115,12 @@ class SponsorshipList extends LitElement { window.parent.reduxStore.getState().app.accountInfo.addressInfo this.isPageLoading = true try { + const address = window.parent.reduxStore.getState().app?.selectedAddress ?.address let rewardShares = await this.getRewardShareRelationship( - "QPsjHoKhugEADrtSQP5xjFgsaQPn9WmE3Y" + address ) rewardShares = rewardShares.filter((rs) => rs.recipient !== address) @@ -128,16 +130,13 @@ class SponsorshipList extends LitElement { type: "api", url: `/addresses/${rs.recipient}`, }) - const recentBlocksInfo = await parentEpml.request("apiCall", { - type: "api", - url: `/blocks/signer/${rs.recipient}?limit=5&reverse=true`, - }) + let blocksRemaining = this._levelUpBlocks(addressInfo) blocksRemaining = +blocksRemaining > 0 ? +blocksRemaining : 0 return { ...addressInfo, ...rs, - lastActiveBlock: recentBlocksInfo[0]?.height, + blocksRemaining: blocksRemaining, } }) @@ -148,8 +147,13 @@ class SponsorshipList extends LitElement { .filter((sponsorship) => sponsorship.blocksRemaining !== 0) .sort((a, b) => a.blocksRemaining - b.blocksRemaining)[0] this.isPageLoading = false + + const openModal = accountInfoValues.find(s=> s.blocksRemaining <= 0) + if(openModal){ + this.shadowRoot.querySelector('#showDialog').show() + } } catch (error) { - console.error(error) + this.isPageLoading = false } @@ -177,6 +181,7 @@ class SponsorshipList extends LitElement { } async removeRewardShare(rewardShareObject) { + const selectedAddress = window.parent.reduxStore.getState().app?.selectedAddress @@ -235,7 +240,7 @@ class SponsorshipList extends LitElement { let err7tring = get("rewardsharepage.rchange22") this.removeRewardShareLoading = false parentEpml.request("showSnackBar", `${err7tring}`) - this.atMount() + this.sponsorships = this.sponsorships.filter((s)=> s.address !== rewardShareObject.address) } else { this.removeRewardShareLoading = false parentEpml.request("showSnackBar", txnResponse.data.message) @@ -413,8 +418,8 @@ class SponsorshipList extends LitElement { this.isLoadingCreateSponsorship = false } + render() { - console.log({ sponsorships: this.sponsorships }) return html` ${ @@ -436,21 +441,22 @@ class SponsorshipList extends LitElement {
+
+

${translate("sponsorshipspage.schange1")}

+
-

Account Address

+

${translate("sponsorshipspage.schange2")}

-

Blocks Minted

+

${translate("walletprofile.blocksminted")}

+
+ +
+

${translate("becomeMinterPage.bchange17")}

-

Last Active Block

-
-
-

Sponsorship Key

-
-
- +
@@ -459,31 +465,20 @@ class SponsorshipList extends LitElement { (sponsorship) => html`
  • -

    - Account Address -

    + ${sponsorship.address}
  • -

    - Blocks Minted -

    + ${+sponsorship.blocksMinted + +sponsorship.blocksMintedAdjustment}
  • +
  • -

    - Last Active Block -

    - ${sponsorship.lastActiveBlock} -
  • -
  • -

    - Copy Sponsorship Key -

    +
  • @@ -510,32 +505,40 @@ class SponsorshipList extends LitElement { >create${translate( "rewardsharepage.rchange17" - )} + )} +
` )} - - ${ - this.sponsorships.length > 0 && + + ${this.sponsorships.length > 0 ? html` -
-

- Total Sponsorships active +

+

+ ${translate("sponsorshipspage.schange3")} = + ${this.sponsorships.length} + +

-

- Next sponsorship ending in +

+ ${translate("sponsorshipspage.schange4")} = + ${this.nextSponsorshipEnding ?.blocksRemaining} - blocks + ${translate("mintingpage.mchange26")} + +

` - } + : ''}

${this.createSponsorshipMessage}

+
+ + +
+

${translate("sponsorshipspage.schange6")}

+
+
+
+ +

${this.sponsorships.filter(s=> s.blocksRemaining <= 0).length} ${translate("sponsorshipspage.schange7")}!

+ +

${translate("sponsorshipspage.schange8")}

+ ${this.sponsorships.filter(s=> s.blocksRemaining <= 0).map((ms)=> html` +

${ms.address}

+ `)} +
+ + + ${translate("general.close")} + + +
` } From 934bdeada7e766a7701d5da77429f7f5300ed385 Mon Sep 17 00:00:00 2001 From: Phillip Lang Martinez Date: Wed, 17 Aug 2022 01:10:08 +0300 Subject: [PATCH 05/12] added text when no sponsorships --- .../core/sponsorship-list/sponsorship-list.src.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/qortal-ui-plugins/plugins/core/sponsorship-list/sponsorship-list.src.js b/qortal-ui-plugins/plugins/core/sponsorship-list/sponsorship-list.src.js index 492a0782..3a3696d0 100644 --- a/qortal-ui-plugins/plugins/core/sponsorship-list/sponsorship-list.src.js +++ b/qortal-ui-plugins/plugins/core/sponsorship-list/sponsorship-list.src.js @@ -441,6 +441,13 @@ class SponsorshipList extends LitElement {
+ ${this.sponsorships.length === 0 ? html` +
+

${translate("sponsorshipspage.schange9")}

+
+ ` : ''} + ${this.sponsorships.length > 0 ? + html`

${translate("sponsorshipspage.schange1")}

@@ -460,7 +467,7 @@ class SponsorshipList extends LitElement {
- + ${this.sponsorships.map( (sponsorship) => html`
    @@ -512,8 +519,7 @@ class SponsorshipList extends LitElement { ` )} - ${this.sponsorships.length > 0 ? - html` +

    ${translate("sponsorshipspage.schange3")} = From d1ad8e173536dc29e2cc013edf5e89ad0ee465e5 Mon Sep 17 00:00:00 2001 From: Phillip Lang Martinez Date: Wed, 17 Aug 2022 01:10:51 +0300 Subject: [PATCH 06/12] dynamic sidenav for sponsorships --- qortal-ui-core/language/us.json | 3 ++- qortal-ui-core/src/components/sidenav-menu.js | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/qortal-ui-core/language/us.json b/qortal-ui-core/language/us.json index 31a74cac..9eccecbe 100644 --- a/qortal-ui-core/language/us.json +++ b/qortal-ui-core/language/us.json @@ -619,6 +619,7 @@ "schange5" : "Sponsor New Minter", "schange6" : "Finished Sponsorships", "schange7" : "Completed", - "schange8" : "Addresses" + "schange8" : "Addresses", + "schange9" : "You currently have no active sponsorships" } } \ No newline at end of file diff --git a/qortal-ui-core/src/components/sidenav-menu.js b/qortal-ui-core/src/components/sidenav-menu.js index bc29d8d4..aa3ccd6e 100644 --- a/qortal-ui-core/src/components/sidenav-menu.js +++ b/qortal-ui-core/src/components/sidenav-menu.js @@ -102,6 +102,7 @@ class SidenavMenu extends connect(store)(LitElement) { renderNodeTypeMenu() { const addressInfo = this.addressInfo; const isMinter = addressInfo?.error !== 124 && +addressInfo?.level > 0; + const isSponsor = +addressInfo?.level >= 5 if (this.nodeType === 'lite') { return html` @@ -158,12 +159,15 @@ class SidenavMenu extends connect(store)(LitElement) { > + ${isSponsor ? html` - + + ` : ''} + Date: Sun, 21 Aug 2022 18:14:48 +0200 Subject: [PATCH 07/12] Finisah Adress Book --- qortal-ui-core/language/de.json | 9 +- qortal-ui-core/language/es.json | 9 +- qortal-ui-core/language/fr.json | 9 +- qortal-ui-core/language/hindi.json | 9 +- qortal-ui-core/language/hr.json | 9 +- qortal-ui-core/language/hu.json | 9 +- qortal-ui-core/language/it.json | 9 +- qortal-ui-core/language/ko.json | 9 +- qortal-ui-core/language/no.json | 11 +- qortal-ui-core/language/pl.json | 9 +- qortal-ui-core/language/pt.json | 9 +- qortal-ui-core/language/ro.json | 9 +- qortal-ui-core/language/rs.json | 9 +- qortal-ui-core/language/ru.json | 11 +- qortal-ui-core/language/us.json | 13 +- qortal-ui-core/language/zhc.json | 9 +- qortal-ui-core/language/zht.json | 9 +- qortal-ui-core/src/components/sidenav-menu.js | 12 +- qortal-ui-plugins/package.json | 1 + .../plugins/core/wallet/wallet-app.src.js | 1369 ++++++++++++++++- 20 files changed, 1498 insertions(+), 45 deletions(-) diff --git a/qortal-ui-core/language/de.json b/qortal-ui-core/language/de.json index 429a41b7..2171ecd6 100644 --- a/qortal-ui-core/language/de.json +++ b/qortal-ui-core/language/de.json @@ -244,7 +244,14 @@ "wchange46":"An diese Adresse verschicken", "wchange47":"Adressbuch", "wchange48":"Dieses Adressbuch ist leer !", - "wchange49":"Zum Adressbuch hinzufügen" + "wchange49":"Zum Adressbuch hinzufügen", + "wchange50":"Der Name darf nicht leer sein!", + "wchange51":"Adresse darf nicht leer sein!", + "wchange52":"Erfolgreich hinzugefügt!", + "wchange53":"Adressbuch importieren", + "wchange54":"Adressbuch exportieren", + "wchange55":"Ihr bestehendes Adressbuch wird gelöscht und aus einem Backup neu erstellt.", + "wchange56":"WARNUNG!" }, "tradepage":{ "tchange1":"Handelsportal", diff --git a/qortal-ui-core/language/es.json b/qortal-ui-core/language/es.json index 80e463c0..41fa7f48 100644 --- a/qortal-ui-core/language/es.json +++ b/qortal-ui-core/language/es.json @@ -244,7 +244,14 @@ "wchange46":"Enviar a esta dirección", "wchange47":"Directorio", "wchange48":"Esta libreta de direcciones está vacía !", - "wchange49":"Agregar a la libreta de direcciones" + "wchange49":"Agregar a la libreta de direcciones", + "wchange50":"El nombre no puede estar vacío!", + "wchange51":"La dirección no puede estar vacía!", + "wchange52":"Agregado exitosamente!", + "wchange53":"Importar libreta de direcciones", + "wchange54":"Exportar libreta de direcciones", + "wchange55":"Su libreta de direcciones existente se eliminará y se creará una nueva copia de seguridad.", + "wchange56":"ADVERTENCIA!" }, "tradepage":{ "tchange1":"Portal de Comercio", diff --git a/qortal-ui-core/language/fr.json b/qortal-ui-core/language/fr.json index cc8548e0..28027be6 100644 --- a/qortal-ui-core/language/fr.json +++ b/qortal-ui-core/language/fr.json @@ -244,7 +244,14 @@ "wchange46":"Envoyer à cette adresse", "wchange47":"Carnet d'adresses", "wchange48":"Ce carnet d'adresses est vide !", - "wchange49":"Ajouter au carnet d'adresses" + "wchange49":"Ajouter au carnet d'adresses", + "wchange50":"Le nom ne peut pas être vide!", + "wchange51":"L'adresse ne peut pas être vide!", + "wchange52":"Ajouté avec succès!", + "wchange53":"Importer le carnet d'adresses", + "wchange54":"Exporter le carnet d'adresses", + "wchange55":"Votre carnet d'adresses existant sera supprimé et une nouvelle sauvegarde sera créée.", + "wchange56":"ATTENTION!" }, "tradepage":{ "tchange1":"Portail de commerce", diff --git a/qortal-ui-core/language/hindi.json b/qortal-ui-core/language/hindi.json index abea6eed..7f23f9a1 100644 --- a/qortal-ui-core/language/hindi.json +++ b/qortal-ui-core/language/hindi.json @@ -245,7 +245,14 @@ "wchange46":"इस पते पर भेजें", "wchange47":"पता पुस्तिका", "wchange48":"यह पता पुस्तिका खाली है !", - "wchange49":"पता सूची में जोड़ें" + "wchange49":"पता सूची में जोड़ें", + "wchange50":"नाम खाली नहीं हो सकता!", + "wchange51":"पता खाली नहीं हो सकता!", + "wchange52":"सफलतापूर्वक शामिल!", + "wchange53":"पता पुस्तिका आयात करें", + "wchange54":"निर्यात पता पुस्तिका", + "wchange55":"आपकी मौजूदा पता पुस्तिका हटा दी जाएगी और बैकअप से नया बनाया जाएगा।", + "wchange56":"चेतावनी!" }, "tradepage":{ "tchange1":"व्यापार पोर्टल", diff --git a/qortal-ui-core/language/hr.json b/qortal-ui-core/language/hr.json index ce661bdd..4e09f98f 100644 --- a/qortal-ui-core/language/hr.json +++ b/qortal-ui-core/language/hr.json @@ -244,7 +244,14 @@ "wchange46":"Šaljite na ovu adresu", "wchange47":"Adresar", "wchange48":"Ovaj adresar je prazan !", - "wchange49":"Dodaj u adresar" + "wchange49":"Dodaj u adresar", + "wchange50":"Ime ne može biti prazno!", + "wchange51":"Adresa ne može biti prazna!", + "wchange52":"Uspješno dodano!", + "wchange53":"Uvezi adresar", + "wchange54":"Izvezi adresar", + "wchange55":"Vaš postojeći adresar bit će izbrisan i novi će se stvoriti iz sigurnosne kopije.", + "wchange56":"UPOZORENJE!" }, "tradepage":{ "tchange1":"Portal razmjene", diff --git a/qortal-ui-core/language/hu.json b/qortal-ui-core/language/hu.json index f3fec587..c21a6a21 100644 --- a/qortal-ui-core/language/hu.json +++ b/qortal-ui-core/language/hu.json @@ -244,7 +244,14 @@ "wchange46":"Küldje el erre a címre", "wchange47":"Címjegyzék", "wchange48":"Ez a címjegyzék üres !", - "wchange49":"Hozzáadás a címjegyzékhez" + "wchange49":"Hozzáadás a címjegyzékhez", + "wchange50":"A név nem lehet üres!", + "wchange51":"A cím nem lehet üres!", + "wchange52":"Sikeresen hozzáadva!", + "wchange53":"Címjegyzék importálása", + "wchange54":"Címjegyzék exportálása", + "wchange55":"Meglévő címjegyzéke törlésre kerül, és a biztonsági másolatból új jön létre.", + "wchange56":"FIGYELEM!" }, "tradepage":{ "tchange1":"Kereskedelmi Portál", diff --git a/qortal-ui-core/language/it.json b/qortal-ui-core/language/it.json index b5f6d9a8..91f51ab6 100644 --- a/qortal-ui-core/language/it.json +++ b/qortal-ui-core/language/it.json @@ -244,7 +244,14 @@ "wchange46":"Invia a questo indirizzo", "wchange47":"Rubrica", "wchange48":"Questa rubrica è vuota !", - "wchange49":"Aggiungi alla rubrica" + "wchange49":"Aggiungi alla rubrica", + "wchange50":"Il nome non può essere vuoto!", + "wchange51":"L'indirizzo non può essere vuoto!", + "wchange52":"Aggiunto con successo!", + "wchange53":"Importa rubrica", + "wchange54":"Esporta rubrica", + "wchange55":"La tua rubrica esistente verrà eliminata e dal backup verrà creata una nuova.", + "wchange56":"AVVERTIMENTO!" }, "tradepage":{ "tchange1":"Portale commerciale", diff --git a/qortal-ui-core/language/ko.json b/qortal-ui-core/language/ko.json index e8c57fc0..0628f12f 100644 --- a/qortal-ui-core/language/ko.json +++ b/qortal-ui-core/language/ko.json @@ -244,7 +244,14 @@ "wchange46":"이 주소로 보내기", "wchange47":"주소록", "wchange48":"이 주소록이 비어 있습니다 !", - "wchange49":"주소록에 추가하다" + "wchange49":"주소록에 추가하다", + "wchange50":"이름은 비워둘 수 없습니다!", + "wchange51":"주소는 비워둘 수 없습니다!", + "wchange52":"성공적으로 추가되었습니다!", + "wchange53":"주소록 가져오기", + "wchange54":"주소록 내보내기", + "wchange55":"기존 주소록이 삭제되고 백업에서 새로 생성됩니다.", + "wchange56":"경고!" }, "tradepage":{ "tchange1":"무역 포털", diff --git a/qortal-ui-core/language/no.json b/qortal-ui-core/language/no.json index a0ca2e06..0feb8239 100644 --- a/qortal-ui-core/language/no.json +++ b/qortal-ui-core/language/no.json @@ -181,7 +181,7 @@ "mchange35":"Sponsing", "mchange36":"Sponsoren din vil utstede deg en sponsenøkkel (Sponsorship Key) som du vil bruke for å legge til noden din, så du kan begynne å minte (der er ingen belønninger før du når nivå 1.) Når du har nådd nivå 1, oppretter/tildeler du din egen ‘mintenøkkel’ og begynner å tjene belønninger. Du har XXXX blokker igjen i sponsingsperioden.", "mchange37":"Simpelthen ta kontakt med en minter i Qortal som har et høyt nok nivå til å utstede en sponsenøkkel, skaff den nøkkelen, og kom så tilbake hit og fyll inn nøkkelen for å begynne mintereisen!", - "mchange38":"i" + "mchange38":"om" }, "becomeMinterPage":{ "bchange7":"Skriv inn sponsornøkkel", @@ -244,7 +244,14 @@ "wchange46":"Send til denne adressen", "wchange47":"Adressebok", "wchange48":"Denne adresseboken er tom !", - "wchange49":"Legg til i Adresseboken" + "wchange49":"Legg til i Adresseboken", + "wchange50":"Navnet kan ikke stå tomt!", + "wchange51":"Adressen kan ikke være tom!", + "wchange52":"Lagt til!", + "wchange53":"Importer adressebok", + "wchange54":"Eksporter adressebok", + "wchange55":"Din eksisterende adressebok vil bli slettet og ny opprettet fra sikkerhetskopi.", + "wchange56":"ADVARSEL!" }, "tradepage":{ "tchange1":"Handelsportal", diff --git a/qortal-ui-core/language/pl.json b/qortal-ui-core/language/pl.json index be76d298..42d45e0b 100644 --- a/qortal-ui-core/language/pl.json +++ b/qortal-ui-core/language/pl.json @@ -244,7 +244,14 @@ "wchange46":"Wyślij na ten adres", "wchange47":"Książka adresowa", "wchange48":"Ta książka adresowa jest pusta !", - "wchange49":"Dodaj do książki adresowej" + "wchange49":"Dodaj do książki adresowej", + "wchange50":"Nazwa nie może być pusta!", + "wchange51":"Adres nie może być pusty!", + "wchange52":"Pomyslnie dodano!", + "wchange53":"Importuj książkę adresową", + "wchange54":"Eksportuj książkę adresową", + "wchange55":"Twoja istniejąca książka adresowa zostanie usunięta, az kopii zapasowej utworzona nowa.", + "wchange56":"OSTRZEŻENIE!" }, "tradepage":{ "tchange1":"Portal Handlowy", diff --git a/qortal-ui-core/language/pt.json b/qortal-ui-core/language/pt.json index 58906973..1e019d99 100644 --- a/qortal-ui-core/language/pt.json +++ b/qortal-ui-core/language/pt.json @@ -244,7 +244,14 @@ "wchange46":"Enviar para este endereço", "wchange47":"Livro de endereços", "wchange48":"Este catálogo de endereços está vazio !", - "wchange49":"Adicionar ao catálogo de endereços" + "wchange49":"Adicionar ao catálogo de endereços", + "wchange50":"O nome não pode ficar vazio!", + "wchange51":"O endereço não pode estar vazio!", + "wchange52":"Adicionado com sucesso!", + "wchange53":"Importar catálogo de endereços", + "wchange54":"Exportar catálogo de endereços", + "wchange55":"Seu catálogo de endereços existente será excluído e o backup será criado novamente.", + "wchange56":"AVISO!" }, "tradepage":{ "tchange1":"Portal do Comércio", diff --git a/qortal-ui-core/language/ro.json b/qortal-ui-core/language/ro.json index 7a638f71..0243a13b 100644 --- a/qortal-ui-core/language/ro.json +++ b/qortal-ui-core/language/ro.json @@ -244,7 +244,14 @@ "wchange46":"Trimiteti la aceasta adresa", "wchange47":"Carte de adrese", "wchange48":"Aceasta agenda de adrese este goala !", - "wchange49":"Adauga la agenda cu adrese" + "wchange49":"Adauga la agenda cu adrese", + "wchange50":"Numele nu poate fi gol!", + "wchange51":"Adresa nu poate fi goala!", + "wchange52":"Adaugat cu succes!", + "wchange53":"Import agenda de adrese", + "wchange54":"Exportati agenda de adrese", + "wchange55":"Agenda dvs. existenta va fi stearsa si din backup va fi creata o noua.", + "wchange56":"AVERTIZARE!" }, "tradepage":{ "tchange1":"Portal de Tranzactionare", diff --git a/qortal-ui-core/language/rs.json b/qortal-ui-core/language/rs.json index d480eb9d..f4dca3cd 100644 --- a/qortal-ui-core/language/rs.json +++ b/qortal-ui-core/language/rs.json @@ -244,7 +244,14 @@ "wchange46":"Pošaljite na ovu adresu", "wchange47":"Adresar", "wchange48":"Ovaj adresar je prazan !", - "wchange49":"Dodaj u Adresar" + "wchange49":"Dodaj u Adresar", + "wchange50":"Ime ne može biti prazno!", + "wchange51":"Adresa ne može biti prazna!", + "wchange52":"Uspešno dodato!", + "wchange53":"Uvezite adresar", + "wchange54":"Izvezi adresar", + "wchange55":"Vaš postojeći adresar će biti obrisan, a iz rezervne kopije biće kreiran novi.", + "wchange56":"UPOZORENJE!" }, "tradepage":{ "tchange1":"Trgovinski prozor", diff --git a/qortal-ui-core/language/ru.json b/qortal-ui-core/language/ru.json index 97cc5ab3..ee6c61ed 100644 --- a/qortal-ui-core/language/ru.json +++ b/qortal-ui-core/language/ru.json @@ -212,7 +212,7 @@ "wchange14":"Время", "wchange15":"Подпись транзакции", "wchange16":"Хэш транзакции", - "wchange17":"Отправлять", + "wchange17":"Отправь", "wchange18":"От адреса", "wchange19":"Доступные средства", "wchange20":"Кому (адрес или имя)", @@ -244,7 +244,14 @@ "wchange46":"Отправить на этот адрес", "wchange47":"Адресная книга", "wchange48":"Эта адресная книга пуста !", - "wchange49":"Добавить в адресную книгу" + "wchange49":"Добавить в адресную книгу", + "wchange50":"Имя не может быть пустым!", + "wchange51":"Адрес не может быть пустым!", + "wchange52":"Успешно добавлено!", + "wchange53":"Импорт адресной книги", + "wchange54":"Экспорт адресной книги", + "wchange55":"Ваша существующая адресная книга будет удалена, а из резервной копии создана новая.", + "wchange56":"ПРЕДУПРЕЖДЕНИЕ!" }, "tradepage":{ "tchange1":"Торговый портал", diff --git a/qortal-ui-core/language/us.json b/qortal-ui-core/language/us.json index f830a7df..4698dce6 100644 --- a/qortal-ui-core/language/us.json +++ b/qortal-ui-core/language/us.json @@ -237,9 +237,16 @@ "wchange44":"Please try again...", "wchange45":"Send all", "wchange46":"Send to this address", - "wchange47":"Addressbook", - "wchange48":"This Addressbook is empty !", - "wchange49":"Add to Addressbook" + "wchange47":"Address Book", + "wchange48":"This Address Book is empty !", + "wchange49":"Add to Address Book", + "wchange50":"Name cannot be empty!", + "wchange51":"Address cannot be empty!", + "wchange52":"Successfully added!", + "wchange53":"Import Address Book", + "wchange54":"Export Address Book", + "wchange55":"Your existing address book will be deleted and from backup new created.", + "wchange56":"WARNING!" }, "tradepage":{ "tchange1":"Trade Portal", diff --git a/qortal-ui-core/language/zhc.json b/qortal-ui-core/language/zhc.json index 80894f45..7d4d1a16 100644 --- a/qortal-ui-core/language/zhc.json +++ b/qortal-ui-core/language/zhc.json @@ -244,7 +244,14 @@ "wchange46":"发送到这个地址", "wchange47":"地址簿", "wchange48":"此通讯录为空 !", - "wchange49":"加至地址簿" + "wchange49":"加至地址簿", + "wchange50":"名称不能为空!", + "wchange51":"地址不能为空!", + "wchange52":"添加成功!", + "wchange53":"导入通讯录", + "wchange54":"导出通讯录", + "wchange55":"您现有的通讯簿将被删除并从新创建的备份中。", + "wchange56":"警告!" }, "tradepage":{ "tchange1":"交易门户", diff --git a/qortal-ui-core/language/zht.json b/qortal-ui-core/language/zht.json index 4b248e2a..6084d162 100644 --- a/qortal-ui-core/language/zht.json +++ b/qortal-ui-core/language/zht.json @@ -244,7 +244,14 @@ "wchange46":"發送到這個地址", "wchange47":"地址簿", "wchange48":"此通訊錄為空 !", - "wchange49":"加至地址簿" + "wchange49":"加至地址簿", + "wchange50":"名稱不能為空!", + "wchange51":"地址不能為空!", + "wchange52":"添加成功!", + "wchange53":"導入通訊錄", + "wchange54":"導出通訊錄", + "wchange55":"您現有的通訊簿將被刪除並從新創建的備份中。", + "wchange56":"警告!" }, "tradepage":{ "tchange1":"交易門戶", diff --git a/qortal-ui-core/src/components/sidenav-menu.js b/qortal-ui-core/src/components/sidenav-menu.js index b5bbd39c..bac9f3b3 100644 --- a/qortal-ui-core/src/components/sidenav-menu.js +++ b/qortal-ui-core/src/components/sidenav-menu.js @@ -190,6 +190,12 @@ class SidenavMenu extends connect(store)(LitElement) { > + + + ${this.renderNodeManagement()} - - - `; } } diff --git a/qortal-ui-plugins/package.json b/qortal-ui-plugins/package.json index 42ba39b1..9ca4301a 100644 --- a/qortal-ui-plugins/package.json +++ b/qortal-ui-plugins/package.json @@ -50,6 +50,7 @@ "@vaadin/grid": "23.1.5", "@vaadin/icons": "23.1.5", "epml": "0.3.3", + "file-saver": "2.0.5", "html-escaper": "3.0.3", "lit": "2.3.0", "lit-translate": "2.0.1", diff --git a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js index b84beb3d..04f67787 100644 --- a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js +++ b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js @@ -9,6 +9,9 @@ registerTranslateConfig({ import '../components/ButtonIconCopy.js' import '../components/QortalQrcodeGenerator.js' +import '../components/frag-file-input.js' +import FileSaver from 'file-saver' +import '@github/time-elements' import '@material/mwc-button' import '@material/mwc-checkbox' import '@material/mwc-dialog' @@ -25,7 +28,6 @@ import '@vaadin/button' import '@vaadin/grid' import '@vaadin/icon' import '@vaadin/icons' -import '@github/time-elements' const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) @@ -65,7 +67,26 @@ class MultiWallet extends LitElement { dogeFeePerByte: { type: Number }, dgbFeePerByte: { type: Number }, rvnFeePerByte: { type: Number }, - balanceString: { type: String } + balanceString: { type: String }, + exportErrorMessage: { type: String }, + qortBook: { type: Array }, + btcBook: { type: Array }, + ltcBook: { type: Array }, + dogeBook: { type: Array }, + dgbBook: { type: Array }, + rvnBook: { type: Array }, + qortBookName: { type: String }, + btcBookName: { type: String }, + ltcBookName: { type: String }, + dogeBookName: { type: String }, + dgbBookName: { type: String }, + rvnBookName: { type: String }, + qortBookAddress: { type: String }, + btcBookAddress: { type: String }, + ltcBookAddress: { type: String }, + dogeBookAddress: { type: String }, + dgbBookAddress: { type: String }, + rvnBookAddress: { type: String } } } @@ -81,6 +102,8 @@ class MultiWallet extends LitElement { --mdc-theme-secondary: var(--mdc-theme-primary); --mdc-theme-surface: var(--white); --mdc-dialog-content-ink-color: var(--black); + --mdc-dialog-min-width: 400px; + --mdc-dialog-max-width: 1024px; --paper-input-container-focus-color: var(--mdc-theme-primary); --lumo-primary-text-color: rgb(0, 167, 245); --lumo-primary-color-50pct: rgba(0, 167, 245, 0.5); @@ -196,6 +219,14 @@ class MultiWallet extends LitElement { word-break: break-all; } + .floatleft { + float: left; + } + + .floatright { + float: right; + } + .title { font-weight: 600; font-size: 12px; @@ -504,8 +535,20 @@ class MultiWallet extends LitElement { } .qrcode-pos { - margin-top: -180px; - margin-left: 425px; + margin-top: -175px; + margin-left: 450px; + } + + .send-pos { + margin-top: 20px; + margin-left: 20px; + width: 185px; + } + + .book-pos { + margin-top: -44px; + margin-left: 215px; + width: 185px; } @media (max-width: 863px) { @@ -602,6 +645,26 @@ class MultiWallet extends LitElement { this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'; + this.exportErrorMessage = '' + this.qortBook = [] + this.btcBook = [] + this.ltcBook = [] + this.dogeBook = [] + this.dgbBook = [] + this.rvnBook = [] + this.qortBookName = '' + this.btcBookName = '' + this.ltcBookName = '' + this.dogeBookName = '' + this.dgbBookName = '' + this.rvnBookName = '' + this.qortBookAddress = '' + this.btcBookAddress = '' + this.ltcBookAddress = '' + this.dogeBookAddress = '' + this.dgbBookAddress = '' + this.rvnBookAddress = '' + this.recipient = '' this.btcRecipient = '' this.ltcRecipient = '' @@ -732,10 +795,16 @@ class MultiWallet extends LitElement {

    - ${this.balanceString}

    - ${this.renderSendButton()} + ${this.balanceString}
    +
    +
    + ${this.renderSendButton()} +
    +
    + ${this.renderAddressbookButton()} +
    @@ -813,7 +882,9 @@ class MultiWallet extends LitElement { ${translate("walletpage.wchange10")}
    - ${this.selectedTransaction.btcReceiver} this.sendToBtcAddress()} title="${translate("walletpage.wchange46")}"> + ${this.selectedTransaction.btcReceiver} + this.sendToBtcAddress()} title="${translate("walletpage.wchange46")}"> + this.openAddBtcAddressDialog()} title="${translate("walletpage.wchange49")}">

    ${translate("walletpage.wchange12")} @@ -864,7 +935,9 @@ class MultiWallet extends LitElement { ${translate("walletpage.wchange10")}
    - ${this.selectedTransaction.ltcReceiver} this.sendToLtcAddress()} title="${translate("walletpage.wchange46")}"> + ${this.selectedTransaction.ltcReceiver} + this.sendToLtcAddress()} title="${translate("walletpage.wchange46")}"> + this.openAddLtcAddressDialog()} title="${translate("walletpage.wchange49")}">

    ${translate("walletpage.wchange12")} @@ -916,7 +989,9 @@ class MultiWallet extends LitElement { ${translate("walletpage.wchange10")}
    - ${this.selectedTransaction.dogeReceiver} this.sendToDogeAddress()} title="${translate("walletpage.wchange46")}"> + ${this.selectedTransaction.dogeReceiver} + this.sendToDogeAddress()} title="${translate("walletpage.wchange46")}"> + this.openAddDogeAddressDialog()} title="${translate("walletpage.wchange49")}">

    ${translate("walletpage.wchange12")} @@ -967,7 +1042,9 @@ class MultiWallet extends LitElement { ${translate("walletpage.wchange10")}
    - ${this.selectedTransaction.dgbReceiver} this.sendToDgbAddress()} title="${translate("walletpage.wchange46")}"> + ${this.selectedTransaction.dgbReceiver} + this.sendToDgbAddress()} title="${translate("walletpage.wchange46")}"> + this.openAddDgbAddressDialog()} title="${translate("walletpage.wchange49")}">

    ${translate("walletpage.wchange12")} @@ -1018,7 +1095,9 @@ class MultiWallet extends LitElement { ${translate("walletpage.wchange10")}
    - ${this.selectedTransaction.rvnReceiver} this.sendToRvnAddress()} title="${translate("walletpage.wchange46")}"> + ${this.selectedTransaction.rvnReceiver} + this.sendToRvnAddress()} title="${translate("walletpage.wchange46")}"> + this.openAddRvnAddressDialog()} title="${translate("walletpage.wchange49")}">

    ${translate("walletpage.wchange12")} @@ -1505,6 +1584,630 @@ class MultiWallet extends LitElement { ${translate("general.close")} + + +
    + +

    Qortal ${translate("walletpage.wchange47")}

    +
    +
    ${this.renderExportAddressbookButton()}
    ${this.renderImportAddressbookButton()}


    +
    +
    + + + + { + render(html`${this.renderSendFromQortAddressbookButton(data.item)}`, root); + }}> + + + ${this.isEmptyArray(this.qortBook) ? html` + ${translate("walletpage.wchange48")} + `: ''} + + ${translate("general.close")} + + this.openAddToQortAddressbook()} + > + ${translate("rewardsharepage.rchange14")} + +
    + + +
    + +

    Bitcoin ${translate("walletpage.wchange47")}

    +
    +
    ${this.renderExportAddressbookButton()}
    ${this.renderImportAddressbookButton()}


    +
    +
    + + + + { + render(html`${this.renderSendFromBtcAddressbookButton(data.item)}`, root); + }}> + + + ${this.isEmptyArray(this.btcBook) ? html` + ${translate("walletpage.wchange48")} + `: ''} + + ${translate("general.close")} + + this.openAddToBtcAddressbook()} + > + ${translate("rewardsharepage.rchange14")} + +
    + + +
    + +

    Litecoin ${translate("walletpage.wchange47")}

    +
    +
    ${this.renderExportAddressbookButton()}
    ${this.renderImportAddressbookButton()}


    +
    +
    + + + + { + render(html`${this.renderSendFromLtcAddressbookButton(data.item)}`, root); + }}> + + + ${this.isEmptyArray(this.ltcBook) ? html` + ${translate("walletpage.wchange48")} + `: ''} + + ${translate("general.close")} + + this.openAddToLtcAddressbook()} + > + ${translate("rewardsharepage.rchange14")} + +
    + + +
    + +

    Dogecoin ${translate("walletpage.wchange47")}

    +
    +
    ${this.renderExportAddressbookButton()}
    ${this.renderImportAddressbookButton()}


    +
    +
    + + + + { + render(html`${this.renderSendFromDogeAddressbookButton(data.item)}`, root); + }}> + + + ${this.isEmptyArray(this.dogeBook) ? html` + ${translate("walletpage.wchange48")} + `: ''} + + ${translate("general.close")} + + this.openAddToDogeAddressbook()} + > + ${translate("rewardsharepage.rchange14")} + +
    + + +
    + +

    Digibyte ${translate("walletpage.wchange47")}

    +
    +
    ${this.renderExportAddressbookButton()}
    ${this.renderImportAddressbookButton()}


    +
    +
    + + + + { + render(html`${this.renderSendFromDgbAddressbookButton(data.item)}`, root); + }}> + + + ${this.isEmptyArray(this.dgbBook) ? html` + ${translate("walletpage.wchange48")} + `: ''} + + ${translate("general.close")} + + this.openAddToDgbAddressbook()} + > + ${translate("rewardsharepage.rchange14")} + +
    + + +
    + +

    Ravencoin ${translate("walletpage.wchange47")}

    +
    +
    ${this.renderExportAddressbookButton()}
    ${this.renderImportAddressbookButton()}


    +
    +
    + + + + { + render(html`${this.renderSendFromRvnAddressbookButton(data.item)}`, root); + }}> + + + ${this.isEmptyArray(this.rvnBook) ? html` + ${translate("walletpage.wchange48")} + `: ''} + + ${translate("general.close")} + + this.openAddToRvnAddressbook()} + > + ${translate("rewardsharepage.rchange14")} + +
    + + +
    + +

    Qortal ${translate("walletpage.wchange47")}


    +

    ${translate("walletpage.wchange49")}

    +
    +
    +
    +
    +

    + + +

    +

    + + +

    +
    +
    +
    + this.addToQortalAddressbook()}> + + ${translate("walletpage.wchange49")} + +
    +
    + + ${translate("general.close")} + +
    + + +
    + +

    Bitcoin ${translate("walletpage.wchange47")}


    +

    ${translate("walletpage.wchange49")}

    +
    +
    +
    +
    +

    + + +

    +

    + + +

    +
    +
    +
    + this.addToBitcoinAddressbook()}> + + ${translate("walletpage.wchange49")} + +
    +
    + + ${translate("general.close")} + +
    + + +
    + +

    Litecoin ${translate("walletpage.wchange47")}


    +

    ${translate("walletpage.wchange49")}

    +
    +
    +
    +
    +

    + + +

    +

    + + +

    +
    +
    +
    + this.addToLitecoinAddressbook()}> + + ${translate("walletpage.wchange49")} + +
    +
    + + ${translate("general.close")} + +
    + + +
    + +

    Dogecoin ${translate("walletpage.wchange47")}


    +

    ${translate("walletpage.wchange49")}

    +
    +
    +
    +
    +

    + + +

    +

    + + +

    +
    +
    +
    + this.addToDogecoinAddressbook()}> + + ${translate("walletpage.wchange49")} + +
    +
    + + ${translate("general.close")} + +
    + + +
    + +

    Digibyte ${translate("walletpage.wchange47")}


    +

    ${translate("walletpage.wchange49")}

    +
    +
    +
    +
    +

    + + +

    +

    + + +

    +
    +
    +
    + this.addToDigibyteAddressbook()}> + + ${translate("walletpage.wchange49")} + +
    +
    + + ${translate("general.close")} + +
    + + +
    + +

    Ravencoin ${translate("walletpage.wchange47")}


    +

    ${translate("walletpage.wchange49")}

    +
    +
    +
    +
    +

    + + +

    +

    + + +

    +
    +
    +
    + this.addToRavencoinAddressbook()}> + + ${translate("walletpage.wchange49")} + +
    +
    + + ${translate("general.close")} + +
    + + +
    + +

    Qortal ${translate("walletpage.wchange53")}


    +
    +
    +
    +
    + +

    ${translate("walletpage.wchange56")}

    +
    ${translate("walletpage.wchange55")}
    +
    + + ${translate("general.close")} + +
    + + +
    + +

    Bitcoin ${translate("walletpage.wchange53")}


    +
    +
    +
    +
    + +

    ${translate("walletpage.wchange56")}

    +
    ${translate("walletpage.wchange55")}
    +
    + + ${translate("general.close")} + +
    + + +
    + +

    Litecoin ${translate("walletpage.wchange53")}


    +
    +
    +
    +
    + +

    ${translate("walletpage.wchange56")}

    +
    ${translate("walletpage.wchange55")}
    +
    + + ${translate("general.close")} + +
    + + +
    + +

    Dogecoin ${translate("walletpage.wchange53")}


    +
    +
    +
    +
    + +

    ${translate("walletpage.wchange56")}

    +
    ${translate("walletpage.wchange55")}
    +
    + + ${translate("general.close")} + +
    + + +
    + +

    Digibyte ${translate("walletpage.wchange53")}


    +
    +
    +
    +
    + +

    ${translate("walletpage.wchange56")}

    +
    ${translate("walletpage.wchange55")}
    +
    + + ${translate("general.close")} + +
    + + +
    + +

    Litecoin ${translate("walletpage.wchange53")}


    +
    +
    +
    +
    + +

    ${translate("walletpage.wchange56")}

    +
    ${translate("walletpage.wchange55")}
    +
    + + ${translate("general.close")} + +
    ` } @@ -1513,6 +2216,12 @@ class MultiWallet extends LitElement { this.changeTheme() this.changeLanguage() + this.qortAddressbook() + this.btcAddressbook() + this.ltcAddressbook() + this.dogeAddressbook() + this.dgbAddressbook() + this.rvnAddressbook() this.currencyBoxes = this.shadowRoot.querySelectorAll('.currency-box') this.transactionsDOM = this.shadowRoot.getElementById('transactionsDOM') @@ -1866,6 +2575,572 @@ class MultiWallet extends LitElement { } } + qortAddressbook() { + if (localStorage.getItem("adressbookQort") === null) { + localStorage.setItem("adressbookQort", "") + } else { + this.qortBook = JSON.parse(localStorage.getItem("adressbookQort") || "[]") + } + } + + btcAddressbook() { + if (localStorage.getItem("adressbookBtc") === null) { + localStorage.setItem("adressbookBtc", "") + } else { + this.btcBook = JSON.parse(localStorage.getItem("adressbookBtc") || "[]") + } + } + + ltcAddressbook() { + if (localStorage.getItem("adressbookLtc") === null) { + localStorage.setItem("adressbookLtc", "") + } else { + this.ltcBook = JSON.parse(localStorage.getItem("adressbookLtc") || "[]") + } + } + + dogeAddressbook() { + if (localStorage.getItem("adressbookDoge") === null) { + localStorage.setItem("adressbookDoge", "") + } else { + this.dogeBook = JSON.parse(localStorage.getItem("adressbookDoge") || "[]") + } + } + + dgbAddressbook() { + if (localStorage.getItem("adressbookDgb") === null) { + localStorage.setItem("adressbookDgb", "") + } else { + this.dgbBook = JSON.parse(localStorage.getItem("adressbookDgb") || "[]") + } + } + + rvnAddressbook() { + if (localStorage.getItem("adressbookRvn") === null) { + localStorage.setItem("adressbookRvn", "") + } else { + this.rvnBook = JSON.parse(localStorage.getItem("adressbookRvn") || "[]") + } + } + + openQortAddressbook() { + this.shadowRoot.querySelector("#qortBookDialog").show() + } + + openBtcAddressbook() { + this.shadowRoot.querySelector("#btcBookDialog").show() + } + + openLtcAddressbook() { + this.shadowRoot.querySelector("#ltcBookDialog").show() + } + + openDogeAddressbook() { + this.shadowRoot.querySelector("#dogeBookDialog").show() + } + + openDgbAddressbook() { + this.shadowRoot.querySelector("#dgbBookDialog").show() + } + + openRvnAddressbook() { + this.shadowRoot.querySelector("#rvnBookDialog").show() + } + + openAddQortAddressDialog() { + this.qortBookAddress = this.selectedTransaction.recipient + this.openAddToQortAddressbook() + this.shadowRoot.querySelector('#showTransactionDetailsDialog').close() + } + + openAddBtcAddressDialog() { + this.btcBookAddress = this.selectedTransaction.btcReceiver + this.openAddToBtcAddressbook() + this.shadowRoot.querySelector('#showBtcTransactionDetailsDialog').close() + } + + openAddLtcAddressDialog() { + this.qortBookAddress = this.selectedTransaction.ltcReceiver + this.openAddToLtcAddressbook() + this.shadowRoot.querySelector('#showLtcTransactionDetailsDialog').close() + } + + openAddDogeAddressDialog() { + this.qortBookAddress = this.selectedTransaction.dogeReceiver + this.openAddToDogeAddressbook() + this.shadowRoot.querySelector('#showDogeTransactionDetailsDialog').close() + } + + openAddDgbAddressDialog() { + this.qortBookAddress = this.selectedTransaction.dgbReceiver + this.openAddToDgbAddressbook() + this.shadowRoot.querySelector('#showDgbTransactionDetailsDialog').close() + } + + openAddRvnAddressDialog() { + this.qortBookAddress = this.selectedTransaction.rvnReceiver + this.openAddToRvnAddressbook() + this.shadowRoot.querySelector('#showRvnTransactionDetailsDialog').close() + } + + openAddToQortAddressbook() { + this.shadowRoot.querySelector("#addQortAddressDialog").show() + } + + openAddToBtcAddressbook() { + this.shadowRoot.querySelector("#addBtcAddressDialog").show() + } + + openAddToLtcAddressbook() { + this.shadowRoot.querySelector("#addLtcAddressDialog").show() + } + + openAddToDogeAddressbook() { + this.shadowRoot.querySelector("#addDogeAddressDialog").show() + } + + openAddToDgbAddressbook() { + this.shadowRoot.querySelector("#addDgbAddressDialog").show() + } + + openAddToRvnAddressbook() { + this.shadowRoot.querySelector("#addRvnAddressDialog").show() + } + + openImportQortAdressbook() { + this.shadowRoot.querySelector("#importQortAddressbookDialog").show() + } + + openImportBtcAdressbook() { + this.shadowRoot.querySelector("#importBtcAddressbookDialog").show() + } + + openImportLtcAdressbook() { + this.shadowRoot.querySelector("#importLtcAddressbookDialog").show() + } + + openImportDogeAdressbook() { + this.shadowRoot.querySelector("#importDogeAddressbookDialog").show() + } + + openImportDgbAdressbook() { + this.shadowRoot.querySelector("#importDgbAddressbookDialog").show() + } + + openImportRvnAdressbook() { + this.shadowRoot.querySelector("#importRvnAddressbookDialog").show() + } + + closeQortAddressDialog() { + this.shadowRoot.querySelector('#addQortAddressDialog').close() + } + + closeBtcAddressDialog() { + this.shadowRoot.querySelector('#addBtcAddressDialog').close() + } + + closeLtcAddressDialog() { + this.shadowRoot.querySelector('#addLtcAddressDialog').close() + } + + closeDogeAddressDialog() { + this.shadowRoot.querySelector('#addDogeAddressDialog').close() + } + + closeDgbAddressDialog() { + this.shadowRoot.querySelector('#addDgbAddressDialog').close() + } + + closeRvnAddressDialog() { + this.shadowRoot.querySelector('#addRvnAddressDialog').close() + } + + closeImportQortAddressbookDialog() { + this.shadowRoot.querySelector("#importQortAddressbookDialog").close() + } + + closeImportBtcAddressbookDialog() { + this.shadowRoot.querySelector("#importBtcAddressbookDialog").close() + } + + closeImportLtcAddressbookDialog() { + this.shadowRoot.querySelector("#importLtcAddressbookDialog").close() + } + + closeImportDogeAddressbookDialog() { + this.shadowRoot.querySelector("#importDogeAddressbookDialog").close() + } + + closeImportDgbAddressbookDialog() { + this.shadowRoot.querySelector("#importDgbAddressbookDialog").close() + } + + closeImportRvnAddressbookDialog() { + this.shadowRoot.querySelector("#importRvnAddressbookDialog").close() + } + + + + addToQortalAddressbook() { + let name = this.shadowRoot.getElementById('qortNameInput').value + let address = this.shadowRoot.getElementById('qortAddressInput').value + + var oldQortalBook = JSON.parse(localStorage.getItem("adressbookQort") || "[]") + + if (name.length === 0) { + let qortbookstring1 = get("walletpage.wchange50") + parentEpml.request('showSnackBar', `${qortbookstring1}`) + return false + } + + if (address.length === 0) { + let qortbookstring2 = get("walletpage.wchange51") + parentEpml.request('showSnackBar', `${qortbookstring2}`) + return false + } + + const newQortalBookItem = { + name: name, + address: address + } + + oldQortalBook.push(newQortalBookItem) + + localStorage.setItem("adressbookQort", JSON.stringify(oldQortalBook)) + + let qortbookstring2 = get("walletpage.wchange52") + parentEpml.request('showSnackBar', `${qortbookstring2}`) + + this.closeQortAddressDialog() + this.qortBook = JSON.parse(localStorage.getItem("adressbookQort") || "[]") + } + + addToBitcoinAddressbook() { + let name = this.shadowRoot.getElementById('btcNameInput').value + let address = this.shadowRoot.getElementById('btcAddressInput').value + + var oldBitcoinBook = JSON.parse(localStorage.getItem("adressbookBtc") || "[]") + + if (name.length === 0) { + let btcbookstring1 = get("walletpage.wchange50") + parentEpml.request('showSnackBar', `${btcbookstring1}`) + return false + } + + if (address.length === 0) { + let btcbookstring2 = get("walletpage.wchange51") + parentEpml.request('showSnackBar', `${btcbookstring2}`) + return false + } + + const newBitcoinBookItem = { + name: name, + address: address + } + + oldBitcoinBook.push(newBitcoinBookItem) + + localStorage.setItem("adressbookBtc", JSON.stringify(oldBitcoinBook)) + + let btcbookstring3 = get("walletpage.wchange52") + parentEpml.request('showSnackBar', `${btcbookstring3}`) + + this.closeBtcAddressDialog() + this.btcBook = JSON.parse(localStorage.getItem("adressbookBtc") || "[]") + } + + addToLitecoinAddressbook() { + let name = this.shadowRoot.getElementById('ltcNameInput').value + let address = this.shadowRoot.getElementById('ltcAddressInput').value + + var oldLitecoinBook = JSON.parse(localStorage.getItem("adressbookLtc") || "[]") + + if (name.length === 0) { + let ltcbookstring1 = get("walletpage.wchange50") + parentEpml.request('showSnackBar', `${ltcbookstring1}`) + return false + } + + if (address.length === 0) { + let ltcbookstring2 = get("walletpage.wchange51") + parentEpml.request('showSnackBar', `${ltcbookstring2}`) + return false + } + + const newLitecoinBookItem = { + name: name, + address: address + } + + oldLitecoinBook.push(newLitecoinBookItem) + + localStorage.setItem("adressbookLtc", JSON.stringify(oldLitecoinBook)) + + let ltcbookstring3 = get("walletpage.wchange52") + parentEpml.request('showSnackBar', `${ltcbookstring3}`) + + this.closeLtcAddressDialog() + this.ltcBook = JSON.parse(localStorage.getItem("adressbookLtc") || "[]") + } + + addToDogecoinAddressbook() { + let name = this.shadowRoot.getElementById('dogeNameInput').value + let address = this.shadowRoot.getElementById('dogeAddressInput').value + + var oldDogecoinBook = JSON.parse(localStorage.getItem("adressbookDoge") || "[]") + + if (name.length === 0) { + let dogebookstring1 = get("walletpage.wchange50") + parentEpml.request('showSnackBar', `${dogebookstring1}`) + return false + } + + if (address.length === 0) { + let dogebookstring2 = get("walletpage.wchange51") + parentEpml.request('showSnackBar', `${dogebookstring2}`) + return false + } + + const newDogecoinBookItem = { + name: name, + address: address + } + + oldDogecoinBook.push(newDogecoinBookItem) + + localStorage.setItem("adressbookDoge", JSON.stringify(oldDogecoinBook)) + + let dogebookstring3 = get("walletpage.wchange52") + parentEpml.request('showSnackBar', `${dogebookstring3}`) + + this.closeDogeAddressDialog() + this.dogeBook = JSON.parse(localStorage.getItem("adressbookDoge") || "[]") + } + + addToDigibyteAddressbook() { + let name = this.shadowRoot.getElementById('dgbNameInput').value + let address = this.shadowRoot.getElementById('dgbAddressInput').value + + var oldDigibyteBook = JSON.parse(localStorage.getItem("adressbookDgb") || "[]") + + if (name.length === 0) { + let dgbbookstring1 = get("walletpage.wchange50") + parentEpml.request('showSnackBar', `${dgbbookstring1}`) + return false + } + + if (address.length === 0) { + let dgbbookstring2 = get("walletpage.wchange51") + parentEpml.request('showSnackBar', `${dgbbookstring2}`) + return false + } + + const newDigibyteBookItem = { + name: name, + address: address + } + + oldDigibyteBook.push(newDigibyteBookItem) + + localStorage.setItem("adressbookDgb", JSON.stringify(oldDigibyteBook)) + + let dgbbookstring3 = get("walletpage.wchange52") + parentEpml.request('showSnackBar', `${dgbbookstring3}`) + + this.closeDgbAddressDialog() + this.dgbBook = JSON.parse(localStorage.getItem("adressbookDgb") || "[]") + } + + addToRavencoinAddressbook() { + let name = this.shadowRoot.getElementById('rvnNameInput').value + let address = this.shadowRoot.getElementById('rvnAddressInput').value + + var oldRavencoinBook = JSON.parse(localStorage.getItem("adressbookRvn") || "[]") + + if (name.length === 0) { + let rvnbookstring1 = get("walletpage.wchange50") + parentEpml.request('showSnackBar', `${rvnbookstring1}`) + return false + } + + if (address.length === 0) { + let rvnbookstring2 = get("walletpage.wchange51") + parentEpml.request('showSnackBar', `${rvnbookstring2}`) + return false + } + + const newRavencoinBookItem = { + name: name, + address: address + } + + oldRavencoinBook.push(newRavencoinBookItem) + + localStorage.setItem("adressbookRvn", JSON.stringify(oldRavencoinBook)) + + let rvnbookstring3 = get("walletpage.wchange52") + parentEpml.request('showSnackBar', `${rvnbookstring3}`) + + this.closeRvnAddressDialog() + this.rvnBook = JSON.parse(localStorage.getItem("adressbookRvn") || "[]") + } + + sendFromQortAddressbook(websiteObj) { + let address = websiteObj.address + this.recipient = address + this.openSendQort() + this.shadowRoot.querySelector('#qortBookDialog').close() + } + + sendFromBtcAddressbook(websiteObj) { + let address = websiteObj.address + this.recipient = address + this.openSendBtc() + this.shadowRoot.querySelector('#btcBookDialog').close() + } + + sendFromLtcAddressbook(websiteObj) { + let address = websiteObj.address + this.recipient = address + this.openSendLtc() + this.shadowRoot.querySelector('#ltcBookDialog').close() + } + + sendFromDogeAddressbook(websiteObj) { + let address = websiteObj.address + this.recipient = address + this.openSendDoge() + this.shadowRoot.querySelector('#dogeBookDialog').close() + } + + sendFromDgbAddressbook(websiteObj) { + let address = websiteObj.address + this.recipient = address + this.openSendDgb() + this.shadowRoot.querySelector('#dgbBookDialog').close() + } + + sendFromRvnAddressbook(websiteObj) { + let address = websiteObj.address + this.recipient = address + this.openSendRvn() + this.shadowRoot.querySelector('#rvnBookDialog').close() + } + + renderSendFromQortAddressbookButton(websiteObj) { + return html`` + } + + renderSendFromBtcAddressbookButton(websiteObj) { + return html`` + } + + renderSendFromLtcAddressbookButton(websiteObj) { + return html`` + } + + renderSendFromDogeAddressbookButton(websiteObj) { + return html`` + } + + renderSendFromDgbAddressbookButton(websiteObj) { + return html`` + } + + renderSendFromRvnAddressbookButton(websiteObj) { + return html`` + } + + exportQortAdressbook() { + const qortBookData = JSON.stringify(localStorage.getItem("adressbookQort")) + const qortBookSave = JSON.parse((qortBookData) || "[]") + const blob = new Blob([qortBookSave], { type: 'text/plain;charset=utf-8' }) + FileSaver.saveAs(blob, `qortal_addressbook.qort.json`) + } + + exportBtcAdressbook() { + const btcBookData = JSON.stringify(localStorage.getItem("adressbookBtc")) + const btcBookSave = JSON.parse((btcBookData) || "[]") + const blob = new Blob([btcBookSave], { type: 'text/plain;charset=utf-8' }) + FileSaver.saveAs(blob, `bitcoin_addressbook.btc.json`) + } + + exportLtcAdressbook() { + const ltcBookData = JSON.stringify(localStorage.getItem("adressbookLtc")) + const ltcBookSave = JSON.parse((ltcBookData) || "[]") + const blob = new Blob([ltcBookSave], { type: 'text/plain;charset=utf-8' }) + FileSaver.saveAs(blob, `litecoin_addressbook.ltc.json`) + } + + exportDogeAdressbook() { + const dogeBookData = JSON.stringify(localStorage.getItem("adressbookDoge")) + const dogeBookSave = JSON.parse((dogeBookData) || "[]") + const blob = new Blob([dogeBookSave], { type: 'text/plain;charset=utf-8' }) + FileSaver.saveAs(blob, `dogecoin_addressbook.doge.json`) + } + + exportDgbAdressbook() { + const dgbBookData = JSON.stringify(localStorage.getItem("adressbookDgb")) + const dgbBookSave = JSON.parse((dgbBookData) || "[]") + const blob = new Blob([dgbBookSave], { type: 'text/plain;charset=utf-8' }) + FileSaver.saveAs(blob, `digibyte_addressbook.dgb.json`) + } + + exportRvnAdressbook() { + const rvnBookData = JSON.stringify(localStorage.getItem("adressbookRvn")) + const rvnBookSave = JSON.parse((rvnBookData) || "[]") + const blob = new Blob([rvnBookSave], { type: 'text/plain;charset=utf-8' }) + FileSaver.saveAs(blob, `ravencoin_addressbook.rvn.json`) + } + + importQortAddressbook(file) { + localStorage.removeItem("adressbookQort") + const newItems = JSON.parse((file) || "[]") + localStorage.setItem("adressbookQort", JSON.stringify(newItems)) + this.qortBook = JSON.parse(localStorage.getItem("adressbookQort") || "[]") + this.shadowRoot.querySelector('#importQortAddressbookDialog').close() + } + + importBtcAddressbook(file) { + localStorage.removeItem("adressbookBtc") + const newItems = JSON.parse((file) || "[]") + localStorage.setItem("adressbookBtc", JSON.stringify(newItems)) + this.btcBook = JSON.parse(localStorage.getItem("adressbookBtc") || "[]") + this.shadowRoot.querySelector('#importBtcAddressbookDialog').close() + } + + importLtcAddressbook(file) { + localStorage.removeItem("adressbookLtc") + const newItems = JSON.parse((file) || "[]") + localStorage.setItem("adressbookLtc", JSON.stringify(newItems)) + this.ltcBook = JSON.parse(localStorage.getItem("adressbookLtc") || "[]") + this.shadowRoot.querySelector('#importLtcAddressbookDialog').close() + } + + importDogeAddressbook(file) { + localStorage.removeItem("adressbookDoge") + const newItems = JSON.parse((file) || "[]") + localStorage.setItem("adressbookDoge", JSON.stringify(newItems)) + this.dogeBook = JSON.parse(localStorage.getItem("adressbookDoge") || "[]") + this.shadowRoot.querySelector('#importDogeAddressbookDialog').close() + } + + importDgbAddressbook(file) { + localStorage.removeItem("adressbookDgb") + const newItems = JSON.parse((file) || "[]") + localStorage.setItem("adressbookDgb", JSON.stringify(newItems)) + this.dgbBook = JSON.parse(localStorage.getItem("adressbookDgb") || "[]") + this.shadowRoot.querySelector('#importDgbAddressbookDialog').close() + } + + importRvnAddressbook(file) { + localStorage.removeItem("adressbookRvn") + const newItems = JSON.parse((file) || "[]") + localStorage.setItem("adressbookRvn", JSON.stringify(newItems)) + this.rvnBook = JSON.parse(localStorage.getItem("adressbookRvn") || "[]") + this.shadowRoot.querySelector('#importRvnAddressbookDialog').close() + } + closeQortDialog() { this.shadowRoot.querySelector('#sendQortDialog').close() this.successMessage = '' @@ -2002,7 +3277,11 @@ class MultiWallet extends LitElement { if (displaybutton == null) { return html`${this.selectedTransaction.recipient}` } else { - return html`${this.selectedTransaction.recipient} this.sendToQortAddress()} title="${translate("walletpage.wchange46")}">` + return html` + ${this.selectedTransaction.recipient} + this.sendToQortAddress()} title="${translate("walletpage.wchange46")}"> + this.openAddQortAddressDialog()} title="${translate("walletpage.wchange49")}"> + ` } } @@ -2570,17 +3849,71 @@ class MultiWallet extends LitElement { renderSendButton() { if ( this._selectedWallet === "qort" ) { - return html` this.openSendQort()}> ${translate("walletpage.wchange17")} QORT` + return html` this.openSendQort()}> ${translate("walletpage.wchange17")} QORT` } else if ( this._selectedWallet === "btc" ) { - return html` this.openSendBtc()}> ${translate("walletpage.wchange17")} BTC` + return html` this.openSendBtc()}> ${translate("walletpage.wchange17")} BTC` } else if ( this._selectedWallet === "ltc" ) { - return html` this.openSendLtc()}> ${translate("walletpage.wchange17")} LTC` + return html` this.openSendLtc()}> ${translate("walletpage.wchange17")} LTC` } else if ( this._selectedWallet === "doge" ) { - return html` this.openSendDoge()}> ${translate("walletpage.wchange17")} DOGE` + return html` this.openSendDoge()}> ${translate("walletpage.wchange17")} DOGE` } else if ( this._selectedWallet === "dgb" ) { - return html` this.openSendDgb()}> ${translate("walletpage.wchange17")} DGB` + return html` this.openSendDgb()}> ${translate("walletpage.wchange17")} DGB` } else if ( this._selectedWallet === "rvn" ) { - return html` this.openSendRvn()}> ${translate("walletpage.wchange17")} RVN` + return html` this.openSendRvn()}> ${translate("walletpage.wchange17")} RVN` + } else { + return html`` + } + } + + renderAddressbookButton() { + if ( this._selectedWallet === "qort" ) { + return html` this.openQortAddressbook()}> ${translate("walletpage.wchange47")}` + } else if ( this._selectedWallet === "btc" ) { + return html` this.openBtcAddressbook()}> ${translate("walletpage.wchange47")}` + } else if ( this._selectedWallet === "ltc" ) { + return html` this.openLtcAddressbook()}> ${translate("walletpage.wchange47")}` + } else if ( this._selectedWallet === "doge" ) { + return html` this.openDogeAddressbook()}> ${translate("walletpage.wchange47")}` + } else if ( this._selectedWallet === "dgb" ) { + return html` this.openDgbAddressbook()}> ${translate("walletpage.wchange47")}` + } else if ( this._selectedWallet === "rvn" ) { + return html` this.openRvnAddressbook()}> ${translate("walletpage.wchange47")}` + } else { + return html`` + } + } + + renderExportAddressbookButton() { + if ( this._selectedWallet === "qort" ) { + return html` this.exportQortAdressbook()}> ${translate("walletpage.wchange54")}` + } else if ( this._selectedWallet === "btc" ) { + return html` this.exportBtcAdressbook()}> ${translate("walletpage.wchange54")}` + } else if ( this._selectedWallet === "ltc" ) { + return html` this.exportKLtcAdressbook()}> ${translate("walletpage.wchange54")}` + } else if ( this._selectedWallet === "doge" ) { + return html` this.exportDogeAdressbook()}> ${translate("walletpage.wchange54")}` + } else if ( this._selectedWallet === "dgb" ) { + return html` this.exportDgbAdressbook()}> ${translate("walletpage.wchange54")}` + } else if ( this._selectedWallet === "rvn" ) { + return html` this.exportRvnAdressbook()}> ${translate("walletpage.wchange54")}` + } else { + return html`` + } + } + + renderImportAddressbookButton() { + if ( this._selectedWallet === "qort" ) { + return html` this.openImportQortAdressbook()}> ${translate("walletpage.wchange53")}` + } else if ( this._selectedWallet === "btc" ) { + return html` this.openImportBtcAdressbook()}> ${translate("walletpage.wchange53")}` + } else if ( this._selectedWallet === "ltc" ) { + return html` this.openImportLtcAdressbook()}> ${translate("walletpage.wchange53")}` + } else if ( this._selectedWallet === "doge" ) { + return html` this.openImportDogeAdressbook()}> ${translate("walletpage.wchange53")}` + } else if ( this._selectedWallet === "dgb" ) { + return html` this.openImportDgbAdressbook()}> ${translate("walletpage.wchange53")}` + } else if ( this._selectedWallet === "rvn" ) { + return html` this.openImportRvnAdressbook()}> ${translate("walletpage.wchange53")}` } else { return html`` } From cad45bc63fa851f0a7027068c69a30924ce2d5c5 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Sun, 21 Aug 2022 18:18:05 +0200 Subject: [PATCH 08/12] Add missing files --- .../core/components/QortalFileSaver.js | 162 ++++++++++++++++++ .../core/components/frag-file-input.js | 115 +++++++++++++ 2 files changed, 277 insertions(+) create mode 100644 qortal-ui-plugins/plugins/core/components/QortalFileSaver.js create mode 100644 qortal-ui-plugins/plugins/core/components/frag-file-input.js diff --git a/qortal-ui-plugins/plugins/core/components/QortalFileSaver.js b/qortal-ui-plugins/plugins/core/components/QortalFileSaver.js new file mode 100644 index 00000000..1074fff5 --- /dev/null +++ b/qortal-ui-plugins/plugins/core/components/QortalFileSaver.js @@ -0,0 +1,162 @@ +function saveFile({ data, debug, filename }) { + if (debug) console.log("[qortal-file-saver] starting with ", { data, debug, filename }); + if (!data) throw new Error("[qortal-file-saver] You must pass in data"); + if (!filename) { + if (typeof window !== "undefined" && typeof File !== undefined && data instanceof File) { + filename = data.name; + } + throw new Error("[qortal-file-saver] You must pass in filename"); + } + + const constructorName = (typeof data === "object" && typeof data.constructor === "function" && data.constructor.name) || null; + if (debug) console.log("constructorName:", constructorName); + + const ext = filename.substr(filename.lastIndexOf(".")).toLowerCase(); + + const A = ({ href, download }) => { + const a = document.createElement("a"); + a.href = href; + a.download = download; + return a; + }; + + function convertImageToCanvas({ debug, img }) { + if (debug) console.log("[qortal-file-saver] starting convertImageToCanvas"); + const height = img.height; + const width = img.width; + const canvas = document.createElement("canvas"); + canvas.height = height; + canvas.width = width; + const context = canvas.getContext("2d"); + context.drawImage(img, 0, 0, width, height); + return canvas; + } + + function saveHTML({ data, debug, filename }) { + if (typeof data === "object" && "outerHTML" in data) { + if (debug) console.log("[qortal-file-saver] data appears to be an HTML element, so grabbing it's outer HTML"); + data = data.outerHTML; + } + const url = "data:text/html," + encodeURIComponent(data); + saveDataOrBlobURL({ url, debug, filename }); + } + + function saveCanvas({ data, debug, filename, imageType }) { + const url = data.toDataURL("image/" + imageType); + saveDataOrBlobURL({ url, debug, filename }); + } + + function saveDataOrBlobURL({ url, debug, filename }) { + A({ href: url, download: filename }).click(); + } + + function saveImageAsJPG({ data: img, debug, filename }) { + if (debug) console.log("starting saveImageAsJPG"); + const canvas = convertImageToCanvas({ debug, img }); + saveCanvasAsJPG({ data: canvas, debug, filename }); + } + + function saveImageAsPNG({ data: img, debug, filename }) { + if (debug) console.log("starting saveImageAsPNG"); + const canvas = convertImageToCanvas({ debug, img }); + saveCanvasAsPNG({ data: canvas, debug, filename }); + } + + function saveImageAsWebP({ data: img, debug, filename }) { + if (debug) console.log("starting saveImageAsWebP"); + const canvas = convertImageToCanvas({ debug, img }); + saveCanvasAsWebP({ data: canvas, debug, filename }); + } + + function saveCanvasAsJPG({ data, debug, filename }) { + saveCanvas({ data, debug, filename, imageType: "jpeg" }); + } + + function saveCanvasAsPNG({ data, debug, filename }) { + saveCanvas({ data, debug, filename, imageType: "png" }); + } + + function saveCanvasAsWebP({ data, debug, filename }) { + saveCanvas({ data, debug, filename, imageType: "webp" }); + } + + function saveDSV({ data, debug, delimiter, filename, mediatype }) { + if (!Array.isArray(data)) throw new Error("[qortal-saver] data must be an array to save as a CSV"); + if (!delimiter) throw new Error("[qortal-saver] delimiter must be set"); + if (!mediatype) throw new Error("[qortal-saver] mediatype must be set"); + let output = "data:" + mediatype + ";charset=utf-8,"; + const columns = Array.from(new Set(data.map(Object.keys).flat())).sort(); + const types = new Set(data.map(it => (Array.isArray(it) ? "array" : typeof it))); + const includeHeader = types.has("object"); + if (debug) console.log("includeHeader:", includeHeader); + if (includeHeader) output += columns.map(c => '"' + c.replace(/,/g, "\\,") + '"') + "\n"; + for (let i = 0; i < data.length; i++) { + const row = data[i]; + if (i !== 0) output += "\n"; + output += columns.map(col => '"' + row[col].toString().replace(/,/g, "\\,") + '"'); + } + const url = encodeURI(output); + saveDataOrBlobURL({ url, debug, filename }); + } + + function saveCSV({ data, debug, filename }) { + saveDSV({ data, debug, delimiter: ",", filename, mediatype: "text/csv" }); + } + + function saveTSV({ data, debug, filename }) { + saveDSV({ data, debug, delimiter: "\t", filename, mediatype: "text/tab-separated-values" }); + } + + function saveJSON({ data, debug, filename }) { + const url = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(data, undefined, 2)); + saveDataOrBlobURL({ url, debug, filename }); + } + + function saveText({ data, debug, filename }) { + const url = "data:text/plain;charset=utf-8," + encodeURIComponent(data); + saveDataOrBlobURL({ url, debug, filename }); + } + + function saveBlob({ data, debug, filename }) { + const url = URL.createObjectURL(data); + if (debug) console.log("[qortal-file-saver.saveBlob] url:", url); + saveDataOrBlobURL({ url, debug, filename }); + URL.revokeObjectURL(url); + } + + if (ext === ".csv") { + saveCSV({ data, debug, filename }); + } else if (ext === ".tsv") { + saveTSV({ data, debug, filename }); + } else if (ext === ".html") { + saveHTML({ data, debug, filename }); + } else if (ext === ".json" || ext === ".geojson" || ext === ".topojson") { + saveJSON({ data, debug, filename }); + } else if (ext === ".txt" || ext === ".js" || ext === ".py") { + saveText({ data, debug, filename }); + } else if (constructorName === "HTMLCanvasElement" && ext === ".png") { + saveCanvasAsPNG({ data, debug, filename }); + } else if (constructorName === "HTMLCanvasElement" && ext === ".jpg") { + saveCanvasAsJPG({ data, debug, filename }); + } else if (constructorName === "HTMLCanvasElement" && ext === ".webp") { + saveCanvasAsWebP({ data, debug, filename }); + } else if (constructorName === "HTMLImageElement" && ext === ".jpg") { + saveImageAsJPG({ data, debug, filename }); + } else if (constructorName === "HTMLImageElement" && ext === ".png") { + saveImageAsPNG({ data, debug, filename }); + } else if (constructorName === "HTMLImageElement" && ext === ".webp") { + saveImageAsWebP({ data, debug, filename }); + } else if (constructorName === "Blob") { + saveBlob({ data, debug, filename }); + } else { + throw new Error('[qortal-file-saver] unrecognized extension "' + ext + '"'); + } +} + +if (typeof define === "function" && define.amd) + define(function () { + return saveFile; + }); +if (typeof module === "object") module.exports = saveFile; +if (typeof window === "object") window.saveFile = saveFile; +if (typeof self === "object") self.saveFile = saveFile; \ No newline at end of file diff --git a/qortal-ui-plugins/plugins/core/components/frag-file-input.js b/qortal-ui-plugins/plugins/core/components/frag-file-input.js new file mode 100644 index 00000000..0816f78d --- /dev/null +++ b/qortal-ui-plugins/plugins/core/components/frag-file-input.js @@ -0,0 +1,115 @@ +import { LitElement, html, css } from 'lit' + +import '@material/mwc-button' +import '@material/mwc-icon' + +import { translate, translateUnsafeHTML } from 'lit-translate' + +class FragFileInput extends LitElement { + static get properties () { + return { + accept: { type: String }, + readAs: { type: String } + } + } + + static get styles () { + return css` + #drop-area { + border: 2px dashed #ccc; + font-family: "Roboto", sans-serif; + padding: 20px; + } + + #trigger:hover { + cursor: pointer; + } + + #drop-area.highlight { + border-color: var(--mdc-theme-primary, #000); + } + + p { + margin-top: 0; + } + + form { + margin-bottom: 10px; + } + + #fileInput { + display: none; + } + ` + } + + constructor () { + super() + this.readAs = this.readAs || 'Text' + } + + render () { + return html` +
    + +
    + this.shadowRoot.getElementById('fileInput').click()} style="dispay:inline;"> + cloud_upload  ${translate("fragfile.selectfile")} +
    + ${translate("fragfile.dragfile")} +
    +
    + + ` + } + + readFile (file) { + const fr = new FileReader() + fr.onload = () => { + this.dispatchEvent(new CustomEvent('file-read-success', { + detail: { result: fr.result }, + bubbles: true, + composed: true + })) + } + fr['readAs' + this.readAs](file) + } + + firstUpdated () { + this._dropArea = this.shadowRoot.getElementById('drop-area') + + const preventDefaults = e => { + e.preventDefault() + e.stopPropagation() + } + + ;['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => { + this._dropArea.addEventListener(eventName, preventDefaults, false) + }) + + const highlight = e => { + this._dropArea.classList.add('highlight') + } + + const unhighlight = e => { + this._dropArea.classList.remove('highlight') + } + + ;['dragenter', 'dragover'].forEach(eventName => { + this._dropArea.addEventListener(eventName, highlight, false) + }) + + ;['dragleave', 'drop'].forEach(eventName => { + this._dropArea.addEventListener(eventName, unhighlight, false) + }) + + this._dropArea.addEventListener('drop', e => { + const dt = e.dataTransfer + const file = dt.files[0] + + this.readFile(file) + }, false) + } +} + +window.customElements.define('frag-file-input', FragFileInput) From 20165d28070cf0462ff28be01c6e072d014948e9 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Mon, 22 Aug 2022 07:57:52 +0200 Subject: [PATCH 09/12] Fix address link --- qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js index 04f67787..cf80e59b 100644 --- a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js +++ b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js @@ -2660,25 +2660,25 @@ class MultiWallet extends LitElement { } openAddLtcAddressDialog() { - this.qortBookAddress = this.selectedTransaction.ltcReceiver + this.ltcBookAddress = this.selectedTransaction.ltcReceiver this.openAddToLtcAddressbook() this.shadowRoot.querySelector('#showLtcTransactionDetailsDialog').close() } openAddDogeAddressDialog() { - this.qortBookAddress = this.selectedTransaction.dogeReceiver + this.dogeBookAddress = this.selectedTransaction.dogeReceiver this.openAddToDogeAddressbook() this.shadowRoot.querySelector('#showDogeTransactionDetailsDialog').close() } openAddDgbAddressDialog() { - this.qortBookAddress = this.selectedTransaction.dgbReceiver + this.dgbBookAddress = this.selectedTransaction.dgbReceiver this.openAddToDgbAddressbook() this.shadowRoot.querySelector('#showDgbTransactionDetailsDialog').close() } openAddRvnAddressDialog() { - this.qortBookAddress = this.selectedTransaction.rvnReceiver + this.rvnBookAddress = this.selectedTransaction.rvnReceiver this.openAddToRvnAddressbook() this.shadowRoot.querySelector('#showRvnTransactionDetailsDialog').close() } From 361ed71af5096a388b56e3ce47dd42482d8f1819 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Mon, 22 Aug 2022 10:05:29 +0200 Subject: [PATCH 10/12] Fix address link 2 --- qortal-ui-core/src/components/sidenav-menu.js | 12 +++--------- .../plugins/core/wallet/wallet-app.src.js | 10 +++++----- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/qortal-ui-core/src/components/sidenav-menu.js b/qortal-ui-core/src/components/sidenav-menu.js index e8a54818..0d8e207b 100644 --- a/qortal-ui-core/src/components/sidenav-menu.js +++ b/qortal-ui-core/src/components/sidenav-menu.js @@ -17,7 +17,7 @@ class SidenavMenu extends connect(store)(LitElement) { urls: { type: Object }, nodeType: { type: String, reflect: true }, theme: { type: String, reflect: true }, - addressInfo: { type: Object }, + addressInfo: { type: Object } }; } @@ -152,14 +152,8 @@ class SidenavMenu extends connect(store)(LitElement) { href="/app/become-minter" > - `} - - - - + ` + } ${isSponsor ? html` Date: Mon, 22 Aug 2022 18:09:14 +0200 Subject: [PATCH 11/12] Add Memo --- qortal-ui-core/language/de.json | 3 ++- qortal-ui-core/language/es.json | 3 ++- qortal-ui-core/language/fr.json | 3 ++- qortal-ui-core/language/hindi.json | 3 ++- qortal-ui-core/language/hr.json | 3 ++- qortal-ui-core/language/hu.json | 3 ++- qortal-ui-core/language/it.json | 3 ++- qortal-ui-core/language/ko.json | 3 ++- qortal-ui-core/language/no.json | 3 ++- qortal-ui-core/language/pl.json | 3 ++- qortal-ui-core/language/pt.json | 3 ++- qortal-ui-core/language/ro.json | 3 ++- qortal-ui-core/language/rs.json | 3 ++- qortal-ui-core/language/ru.json | 3 ++- qortal-ui-core/language/us.json | 3 ++- qortal-ui-core/language/zhc.json | 3 ++- qortal-ui-core/language/zht.json | 3 ++- 17 files changed, 34 insertions(+), 17 deletions(-) diff --git a/qortal-ui-core/language/de.json b/qortal-ui-core/language/de.json index 2171ecd6..cdc7f174 100644 --- a/qortal-ui-core/language/de.json +++ b/qortal-ui-core/language/de.json @@ -251,7 +251,8 @@ "wchange53":"Adressbuch importieren", "wchange54":"Adressbuch exportieren", "wchange55":"Ihr bestehendes Adressbuch wird gelöscht und aus einem Backup neu erstellt.", - "wchange56":"WARNUNG!" + "wchange56":"WARNUNG!", + "wchange57":"Memo" }, "tradepage":{ "tchange1":"Handelsportal", diff --git a/qortal-ui-core/language/es.json b/qortal-ui-core/language/es.json index 41fa7f48..9dafa945 100644 --- a/qortal-ui-core/language/es.json +++ b/qortal-ui-core/language/es.json @@ -251,7 +251,8 @@ "wchange53":"Importar libreta de direcciones", "wchange54":"Exportar libreta de direcciones", "wchange55":"Su libreta de direcciones existente se eliminará y se creará una nueva copia de seguridad.", - "wchange56":"ADVERTENCIA!" + "wchange56":"ADVERTENCIA!", + "wchange57":"Memorándum" }, "tradepage":{ "tchange1":"Portal de Comercio", diff --git a/qortal-ui-core/language/fr.json b/qortal-ui-core/language/fr.json index 28027be6..768b25c5 100644 --- a/qortal-ui-core/language/fr.json +++ b/qortal-ui-core/language/fr.json @@ -251,7 +251,8 @@ "wchange53":"Importer le carnet d'adresses", "wchange54":"Exporter le carnet d'adresses", "wchange55":"Votre carnet d'adresses existant sera supprimé et une nouvelle sauvegarde sera créée.", - "wchange56":"ATTENTION!" + "wchange56":"ATTENTION!", + "wchange57":"Mémo" }, "tradepage":{ "tchange1":"Portail de commerce", diff --git a/qortal-ui-core/language/hindi.json b/qortal-ui-core/language/hindi.json index 7f23f9a1..dc1caea4 100644 --- a/qortal-ui-core/language/hindi.json +++ b/qortal-ui-core/language/hindi.json @@ -252,7 +252,8 @@ "wchange53":"पता पुस्तिका आयात करें", "wchange54":"निर्यात पता पुस्तिका", "wchange55":"आपकी मौजूदा पता पुस्तिका हटा दी जाएगी और बैकअप से नया बनाया जाएगा।", - "wchange56":"चेतावनी!" + "wchange56":"चेतावनी!", + "wchange57":"ज्ञापन" }, "tradepage":{ "tchange1":"व्यापार पोर्टल", diff --git a/qortal-ui-core/language/hr.json b/qortal-ui-core/language/hr.json index 4e09f98f..e8624aab 100644 --- a/qortal-ui-core/language/hr.json +++ b/qortal-ui-core/language/hr.json @@ -251,7 +251,8 @@ "wchange53":"Uvezi adresar", "wchange54":"Izvezi adresar", "wchange55":"Vaš postojeći adresar bit će izbrisan i novi će se stvoriti iz sigurnosne kopije.", - "wchange56":"UPOZORENJE!" + "wchange56":"UPOZORENJE!", + "wchange57":"Dopis" }, "tradepage":{ "tchange1":"Portal razmjene", diff --git a/qortal-ui-core/language/hu.json b/qortal-ui-core/language/hu.json index c21a6a21..f99ff5f9 100644 --- a/qortal-ui-core/language/hu.json +++ b/qortal-ui-core/language/hu.json @@ -251,7 +251,8 @@ "wchange53":"Címjegyzék importálása", "wchange54":"Címjegyzék exportálása", "wchange55":"Meglévő címjegyzéke törlésre kerül, és a biztonsági másolatból új jön létre.", - "wchange56":"FIGYELEM!" + "wchange56":"FIGYELEM!", + "wchange57":"Memo" }, "tradepage":{ "tchange1":"Kereskedelmi Portál", diff --git a/qortal-ui-core/language/it.json b/qortal-ui-core/language/it.json index 91f51ab6..d4d8c032 100644 --- a/qortal-ui-core/language/it.json +++ b/qortal-ui-core/language/it.json @@ -251,7 +251,8 @@ "wchange53":"Importa rubrica", "wchange54":"Esporta rubrica", "wchange55":"La tua rubrica esistente verrà eliminata e dal backup verrà creata una nuova.", - "wchange56":"AVVERTIMENTO!" + "wchange56":"AVVERTIMENTO!", + "wchange57":"Memo" }, "tradepage":{ "tchange1":"Portale commerciale", diff --git a/qortal-ui-core/language/ko.json b/qortal-ui-core/language/ko.json index 0628f12f..0917849e 100644 --- a/qortal-ui-core/language/ko.json +++ b/qortal-ui-core/language/ko.json @@ -251,7 +251,8 @@ "wchange53":"주소록 가져오기", "wchange54":"주소록 내보내기", "wchange55":"기존 주소록이 삭제되고 백업에서 새로 생성됩니다.", - "wchange56":"경고!" + "wchange56":"경고!", + "wchange57":"메모" }, "tradepage":{ "tchange1":"무역 포털", diff --git a/qortal-ui-core/language/no.json b/qortal-ui-core/language/no.json index 0feb8239..fda5e7f5 100644 --- a/qortal-ui-core/language/no.json +++ b/qortal-ui-core/language/no.json @@ -251,7 +251,8 @@ "wchange53":"Importer adressebok", "wchange54":"Eksporter adressebok", "wchange55":"Din eksisterende adressebok vil bli slettet og ny opprettet fra sikkerhetskopi.", - "wchange56":"ADVARSEL!" + "wchange56":"ADVARSEL!", + "wchange57":"Memo" }, "tradepage":{ "tchange1":"Handelsportal", diff --git a/qortal-ui-core/language/pl.json b/qortal-ui-core/language/pl.json index 42d45e0b..52486b40 100644 --- a/qortal-ui-core/language/pl.json +++ b/qortal-ui-core/language/pl.json @@ -251,7 +251,8 @@ "wchange53":"Importuj książkę adresową", "wchange54":"Eksportuj książkę adresową", "wchange55":"Twoja istniejąca książka adresowa zostanie usunięta, az kopii zapasowej utworzona nowa.", - "wchange56":"OSTRZEŻENIE!" + "wchange56":"OSTRZEŻENIE!", + "wchange57":"Memo" }, "tradepage":{ "tchange1":"Portal Handlowy", diff --git a/qortal-ui-core/language/pt.json b/qortal-ui-core/language/pt.json index 1e019d99..ca6e1953 100644 --- a/qortal-ui-core/language/pt.json +++ b/qortal-ui-core/language/pt.json @@ -251,7 +251,8 @@ "wchange53":"Importar catálogo de endereços", "wchange54":"Exportar catálogo de endereços", "wchange55":"Seu catálogo de endereços existente será excluído e o backup será criado novamente.", - "wchange56":"AVISO!" + "wchange56":"AVISO!", + "wchange57":"Memorando" }, "tradepage":{ "tchange1":"Portal do Comércio", diff --git a/qortal-ui-core/language/ro.json b/qortal-ui-core/language/ro.json index 0243a13b..53c92726 100644 --- a/qortal-ui-core/language/ro.json +++ b/qortal-ui-core/language/ro.json @@ -251,7 +251,8 @@ "wchange53":"Import agenda de adrese", "wchange54":"Exportati agenda de adrese", "wchange55":"Agenda dvs. existenta va fi stearsa si din backup va fi creata o noua.", - "wchange56":"AVERTIZARE!" + "wchange56":"AVERTIZARE!", + "wchange57":"Nota" }, "tradepage":{ "tchange1":"Portal de Tranzactionare", diff --git a/qortal-ui-core/language/rs.json b/qortal-ui-core/language/rs.json index f4dca3cd..fdf37317 100644 --- a/qortal-ui-core/language/rs.json +++ b/qortal-ui-core/language/rs.json @@ -251,7 +251,8 @@ "wchange53":"Uvezite adresar", "wchange54":"Izvezi adresar", "wchange55":"Vaš postojeći adresar će biti obrisan, a iz rezervne kopije biće kreiran novi.", - "wchange56":"UPOZORENJE!" + "wchange56":"UPOZORENJE!", + "wchange57":"Beleška" }, "tradepage":{ "tchange1":"Trgovinski prozor", diff --git a/qortal-ui-core/language/ru.json b/qortal-ui-core/language/ru.json index ee6c61ed..e35a6d9c 100644 --- a/qortal-ui-core/language/ru.json +++ b/qortal-ui-core/language/ru.json @@ -251,7 +251,8 @@ "wchange53":"Импорт адресной книги", "wchange54":"Экспорт адресной книги", "wchange55":"Ваша существующая адресная книга будет удалена, а из резервной копии создана новая.", - "wchange56":"ПРЕДУПРЕЖДЕНИЕ!" + "wchange56":"ПРЕДУПРЕЖДЕНИЕ!", + "wchange57":"Памятка" }, "tradepage":{ "tchange1":"Торговый портал", diff --git a/qortal-ui-core/language/us.json b/qortal-ui-core/language/us.json index e7338dfe..974495eb 100644 --- a/qortal-ui-core/language/us.json +++ b/qortal-ui-core/language/us.json @@ -246,7 +246,8 @@ "wchange53":"Import Address Book", "wchange54":"Export Address Book", "wchange55":"Your existing address book will be deleted and from backup new created.", - "wchange56":"WARNING!" + "wchange56":"WARNING!", + "wchange57":"Memo" }, "tradepage":{ "tchange1":"Trade Portal", diff --git a/qortal-ui-core/language/zhc.json b/qortal-ui-core/language/zhc.json index 7d4d1a16..9de020d7 100644 --- a/qortal-ui-core/language/zhc.json +++ b/qortal-ui-core/language/zhc.json @@ -251,7 +251,8 @@ "wchange53":"导入通讯录", "wchange54":"导出通讯录", "wchange55":"您现有的通讯簿将被删除并从新创建的备份中。", - "wchange56":"警告!" + "wchange56":"警告!", + "wchange57":"备忘录" }, "tradepage":{ "tchange1":"交易门户", diff --git a/qortal-ui-core/language/zht.json b/qortal-ui-core/language/zht.json index 6084d162..05f89352 100644 --- a/qortal-ui-core/language/zht.json +++ b/qortal-ui-core/language/zht.json @@ -251,7 +251,8 @@ "wchange53":"導入通訊錄", "wchange54":"導出通訊錄", "wchange55":"您現有的通訊簿將被刪除並從新創建的備份中。", - "wchange56":"警告!" + "wchange56":"警告!", + "wchange57":"備忘錄" }, "tradepage":{ "tchange1":"交易門戶", From 017dd8d30a8871dd2550c15949a1ed04e05a308e Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Mon, 22 Aug 2022 18:13:39 +0200 Subject: [PATCH 12/12] add arrr --- .../plugins/core/wallet/wallet-app.src.js | 878 ++++++++++++++++-- 1 file changed, 782 insertions(+), 96 deletions(-) diff --git a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js index 97d2179a..dc3e209d 100644 --- a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js +++ b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js @@ -31,7 +31,7 @@ import '@vaadin/icons' const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) -const coinsNames = ['qort', 'btc', 'ltc', 'doge', 'dgb', 'rvn'] +const coinsNames = ['qort', 'btc', 'ltc', 'doge', 'dgb', 'rvn', 'arrr'] class MultiWallet extends LitElement { static get properties() { @@ -56,6 +56,9 @@ class MultiWallet extends LitElement { dgbAmount: { type: Number }, rvnRecipient: { type: String }, rvnAmount: { type: Number }, + arrrRecipient: { type: String }, + arrrAmount: { type: Number }, + arrrMemo: { type: String }, errorMessage: { type: String }, successMessage: { type: String }, sendMoneyLoading: { type: Boolean }, @@ -68,6 +71,7 @@ class MultiWallet extends LitElement { dgbFeePerByte: { type: Number }, rvnFeePerByte: { type: Number }, balanceString: { type: String }, + arrrWalletAddress: { type: String }, exportErrorMessage: { type: String }, qortBook: { type: Array }, btcBook: { type: Array }, @@ -75,18 +79,21 @@ class MultiWallet extends LitElement { dogeBook: { type: Array }, dgbBook: { type: Array }, rvnBook: { type: Array }, + arrrBook: { type: Array }, qortBookName: { type: String }, btcBookName: { type: String }, ltcBookName: { type: String }, dogeBookName: { type: String }, dgbBookName: { type: String }, rvnBookName: { type: String }, + arrrBookName: { type: String }, qortBookAddress: { type: String }, btcBookAddress: { type: String }, ltcBookAddress: { type: String }, dogeBookAddress: { type: String }, dgbBookAddress: { type: String }, - rvnBookAddress: { type: String } + rvnBookAddress: { type: String }, + arrrBookAddress: { type: String } } } @@ -296,7 +303,7 @@ class MultiWallet extends LitElement { } .wallet { - width: 170px; + width: 200px; height: 100vh; border-top-left-radius: inherit; border-bottom-left-radius: inherit; @@ -470,6 +477,10 @@ class MultiWallet extends LitElement { background-image: url('/img/rvn.png'); } + .arrr .currency-image { + background-image: url('/img/arrr.png'); + } + .card-list { margin-top: 20px; } @@ -652,18 +663,21 @@ class MultiWallet extends LitElement { this.dogeBook = [] this.dgbBook = [] this.rvnBook = [] + this.arrrBook = [] this.qortBookName = '' this.btcBookName = '' this.ltcBookName = '' this.dogeBookName = '' this.dgbBookName = '' this.rvnBookName = '' + this.arrrBookName = '' this.qortBookAddress = '' this.btcBookAddress = '' this.ltcBookAddress = '' this.dogeBookAddress = '' this.dgbBookAddress = '' this.rvnBookAddress = '' + this.arrrBookAddress = '' this.recipient = '' this.btcRecipient = '' @@ -671,6 +685,9 @@ class MultiWallet extends LitElement { this.dogeRecipient = '' this.dgbRecipient = '' this.rvnRecipient = '' + this.arrrRecipient = '' + this.arrrMemo = '' + this.arrrWalletAddress = '' this.errorMessage = '' this.successMessage = '' this.sendMoneyLoading = false @@ -683,6 +700,7 @@ class MultiWallet extends LitElement { this.dogeAmount = 0 this.dgbAmount = 0 this.rvnAmount = 0 + this.arrrAmount = 0 this.btcFeePerByte = 100 this.btcSatMinFee = 20 this.btcSatMaxFee = 150 @@ -719,6 +737,7 @@ class MultiWallet extends LitElement { this.wallets.get('doge').wallet = window.parent.reduxStore.getState().app.selectedAddress.dogeWallet this.wallets.get('dgb').wallet = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet this.wallets.get('rvn').wallet = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet + this.wallets.get('arrr').wallet = window.parent.reduxStore.getState().app.selectedAddress.arrWallet this._selectedWallet = 'qort' @@ -733,6 +752,7 @@ class MultiWallet extends LitElement { this.wallets.get('doge').wallet = window.parent.reduxStore.getState().app.selectedAddress.dogeWallet this.wallets.get('dgb').wallet = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet this.wallets.get('rvn').wallet = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet + this.wallets.get('arrr').wallet = window.parent.reduxStore.getState().app.selectedAddress.arrrWallet }) parentEpml.subscribe('copy_menu_switch', async (value) => { @@ -774,6 +794,10 @@ class MultiWallet extends LitElement {
    Ravencoin
    +
    +
    +
    Pirate Chain
    +
    @@ -1128,6 +1152,59 @@ class MultiWallet extends LitElement { + +
    +

    ${translate("walletpage.wchange5")}

    +
    +
    +
    + ${translate("walletpage.wchange6")} +
    +
    + ${translate("walletpage.wchange40")} + ${this.selectedTransaction.arrrTxnFlow === 'OUT' ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} +
    + ${translate("walletpage.wchange9")} +
    +
    + ${this.selectedTransaction.arrrSender} +
    + ${translate("walletpage.wchange10")} +
    +
    + ${this.selectedTransaction.arrrReceiver} + this.sendToArrrAddress()} title="${translate("walletpage.wchange46")}"> + this.openAddArrrAddressDialog()} title="${translate("walletpage.wchange49")}"> +
    +
    + ${translate("walletpage.wchange12")} +
    +
    + ${(this.selectedTransaction.feeAmount / 1e8).toFixed(8)} ARRR +
    + ${translate("walletpage.wchange37")} +
    +
    + ${(this.selectedTransaction.totalAmount / 1e8).toFixed(8)} ARRR +
    + ${translate("walletpage.wchange14")} +
    +
    ${new Date(this.selectedTransaction.timestamp).toString()}
    + ${translate("walletpage.wchange16")} +
    +
    + ${this.selectedTransaction.txHash} +
    +
    + + ${translate("general.close")} + +
    +
    @@ -1585,6 +1662,80 @@ class MultiWallet extends LitElement { + +
    +
    + +

    ${translate("walletpage.wchange17")} ARRR

    +
    +
    +

    + ${translate("walletpage.wchange18")}:
    + ${this.getSelectedWalletAddress()} +

    +

    + ${translate("walletpage.wchange19")}:
    + ${this.balanceString}
    + + this.calculateArrrAll()}> ${translate("walletpage.wchange45")} ARRR +
      +

    +

    + + +

    +

    + + +

    +

    + + +

    +

    ${this.errorMessage}

    +

    ${this.successMessage}

    + ${this.sendMoneyLoading ? html` ` : ''} +
    +
    + this.sendArrr()}> + + ${translate("walletpage.wchange17")} ARRR + +
    +
    +
    + + ${translate("general.close")} + +
    +
    @@ -1789,6 +1940,41 @@ class MultiWallet extends LitElement { + + +
    + +

    Pirate Chain ${translate("walletpage.wchange47")}

    +
    +
    ${this.renderExportAddressbookButton()}
    ${this.renderImportAddressbookButton()}


    +
    +
    + + + + { + render(html`${this.renderSendFromArrrAddressbookButton(data.item)}`, root); + }}> + + + ${this.isEmptyArray(this.arrrBook) ? html` + ${translate("walletpage.wchange48")} + `: ''} + + ${translate("general.close")} + + this.openAddToArrrAddressbook()} + > + ${translate("rewardsharepage.rchange14")} + +
    +
    @@ -2083,6 +2269,55 @@ class MultiWallet extends LitElement { + +
    + +

    Pirate Chain ${translate("walletpage.wchange47")}


    +

    ${translate("walletpage.wchange49")}

    +
    +
    +
    +
    +

    + + +

    +

    + + +

    +
    +
    +
    + this.addToPiratechainAddressbook()}> + + ${translate("walletpage.wchange49")} + +
    +
    + + ${translate("general.close")} + +
    +
    @@ -2208,6 +2443,27 @@ class MultiWallet extends LitElement { ${translate("general.close")} + + +
    + +

    Pirate Chain ${translate("walletpage.wchange53")}


    +
    +
    +
    +
    + +

    ${translate("walletpage.wchange56")}

    +
    ${translate("walletpage.wchange55")}
    +
    + + ${translate("general.close")} + +
    ` } @@ -2222,6 +2478,7 @@ class MultiWallet extends LitElement { this.dogeAddressbook() this.dgbAddressbook() this.rvnAddressbook() + this.arrrAddressbook() this.currencyBoxes = this.shadowRoot.querySelectorAll('.currency-box') this.transactionsDOM = this.shadowRoot.getElementById('transactionsDOM') @@ -2539,6 +2796,75 @@ class MultiWallet extends LitElement { } checkSelectedTextAndShowMenu() }) + + this.shadowRoot.getElementById('arrrAmountInput').addEventListener('contextmenu', (event) => { + const getSelectedText = () => { + var text = '' + if (typeof window.getSelection != 'undefined') { + text = window.getSelection().toString() + } else if (typeof this.shadowRoot.selection != 'undefined' && this.shadowRoot.selection.type == 'Text') { + text = this.shadowRoot.selection.createRange().text + } + return text + } + const checkSelectedTextAndShowMenu = () => { + let selectedText = getSelectedText() + if (selectedText && typeof selectedText === 'string') { + } else { + this.pasteMenu(event, 'arrrAmountInput') + this.isPasteMenuOpen = true + event.preventDefault() + event.stopPropagation() + } + } + checkSelectedTextAndShowMenu() + }) + + this.shadowRoot.getElementById('arrrRecipient').addEventListener('contextmenu', (event) => { + const getSelectedText = () => { + var text = '' + if (typeof window.getSelection != 'undefined') { + text = window.getSelection().toString() + } else if (typeof this.shadowRoot.selection != 'undefined' && this.shadowRoot.selection.type == 'Text') { + text = this.shadowRoot.selection.createRange().text + } + return text + } + const checkSelectedTextAndShowMenu = () => { + let selectedText = getSelectedText() + if (selectedText && typeof selectedText === 'string') { + } else { + this.pasteMenu(event, 'arrrRecipient') + this.isPasteMenuOpen = true + event.preventDefault() + event.stopPropagation() + } + } + checkSelectedTextAndShowMenu() + }) + + this.shadowRoot.getElementById('arrrMemo').addEventListener('contextmenu', (event) => { + const getSelectedText = () => { + var text = '' + if (typeof window.getSelection != 'undefined') { + text = window.getSelection().toString() + } else if (typeof this.shadowRoot.selection != 'undefined' && this.shadowRoot.selection.type == 'Text') { + text = this.shadowRoot.selection.createRange().text + } + return text + } + const checkSelectedTextAndShowMenu = () => { + let selectedText = getSelectedText() + if (selectedText && typeof selectedText === 'string') { + } else { + this.pasteMenu(event, 'arrrMemo') + this.isPasteMenuOpen = true + event.preventDefault() + event.stopPropagation() + } + } + checkSelectedTextAndShowMenu() + }) } renderClearSuccess() { @@ -2576,50 +2902,58 @@ class MultiWallet extends LitElement { } qortAddressbook() { - if (localStorage.getItem("adressbookQort") === null) { - localStorage.setItem("adressbookQort", "") + if (localStorage.getItem("addressbookQort") === null) { + localStorage.setItem("addressbookQort", "") } else { - this.qortBook = JSON.parse(localStorage.getItem("adressbookQort") || "[]") + this.qortBook = JSON.parse(localStorage.getItem("addressbookQort") || "[]") } } btcAddressbook() { - if (localStorage.getItem("adressbookBtc") === null) { - localStorage.setItem("adressbookBtc", "") + if (localStorage.getItem("addressbookBtc") === null) { + localStorage.setItem("addressbookBtc", "") } else { - this.btcBook = JSON.parse(localStorage.getItem("adressbookBtc") || "[]") + this.btcBook = JSON.parse(localStorage.getItem("addressbookBtc") || "[]") } } ltcAddressbook() { - if (localStorage.getItem("adressbookLtc") === null) { - localStorage.setItem("adressbookLtc", "") + if (localStorage.getItem("addressbookLtc") === null) { + localStorage.setItem("addressbookLtc", "") } else { - this.ltcBook = JSON.parse(localStorage.getItem("adressbookLtc") || "[]") + this.ltcBook = JSON.parse(localStorage.getItem("addressbookLtc") || "[]") } } dogeAddressbook() { - if (localStorage.getItem("adressbookDoge") === null) { - localStorage.setItem("adressbookDoge", "") + if (localStorage.getItem("addressbookDoge") === null) { + localStorage.setItem("addressbookDoge", "") } else { - this.dogeBook = JSON.parse(localStorage.getItem("adressbookDoge") || "[]") + this.dogeBook = JSON.parse(localStorage.getItem("addressbookDoge") || "[]") } } dgbAddressbook() { - if (localStorage.getItem("adressbookDgb") === null) { - localStorage.setItem("adressbookDgb", "") + if (localStorage.getItem("addressbookDgb") === null) { + localStorage.setItem("addressbookDgb", "") } else { - this.dgbBook = JSON.parse(localStorage.getItem("adressbookDgb") || "[]") + this.dgbBook = JSON.parse(localStorage.getItem("addressbookDgb") || "[]") } } rvnAddressbook() { - if (localStorage.getItem("adressbookRvn") === null) { - localStorage.setItem("adressbookRvn", "") + if (localStorage.getItem("addressbookRvn") === null) { + localStorage.setItem("addressbookRvn", "") } else { - this.rvnBook = JSON.parse(localStorage.getItem("adressbookRvn") || "[]") + this.rvnBook = JSON.parse(localStorage.getItem("addressbookRvn") || "[]") + } + } + + arrrAddressbook() { + if (localStorage.getItem("addressbookArrr") === null) { + localStorage.setItem("addressbookArrr", "") + } else { + this.arrrBook = JSON.parse(localStorage.getItem("addressbookArrr") || "[]") } } @@ -2647,6 +2981,10 @@ class MultiWallet extends LitElement { this.shadowRoot.querySelector("#rvnBookDialog").show() } + openArrrAddressbook() { + this.shadowRoot.querySelector("#arrrBookDialog").show() + } + openAddQortAddressDialog() { this.qortBookAddress = this.selectedTransaction.recipient this.openAddToQortAddressbook() @@ -2683,6 +3021,12 @@ class MultiWallet extends LitElement { this.shadowRoot.querySelector('#showRvnTransactionDetailsDialog').close() } + openAddArrrAddressDialog() { + this.arrrBookAddress = this.selectedTransaction.arrrReceiver + this.openAddToArrrAddressbook() + this.shadowRoot.querySelector('#showArrrTransactionDetailsDialog').close() + } + openAddToQortAddressbook() { this.shadowRoot.querySelector("#addQortAddressDialog").show() } @@ -2707,30 +3051,38 @@ class MultiWallet extends LitElement { this.shadowRoot.querySelector("#addRvnAddressDialog").show() } - openImportQortAdressbook() { + openAddToArrrAddressbook() { + this.shadowRoot.querySelector("#addArrrAddressDialog").show() + } + + openImportQortAddressbook() { this.shadowRoot.querySelector("#importQortAddressbookDialog").show() } - openImportBtcAdressbook() { + openImportBtcAddressbook() { this.shadowRoot.querySelector("#importBtcAddressbookDialog").show() } - openImportLtcAdressbook() { + openImportLtcAddressbook() { this.shadowRoot.querySelector("#importLtcAddressbookDialog").show() } - openImportDogeAdressbook() { + openImportDogeAddressbook() { this.shadowRoot.querySelector("#importDogeAddressbookDialog").show() } - openImportDgbAdressbook() { + openImportDgbAddressbook() { this.shadowRoot.querySelector("#importDgbAddressbookDialog").show() } - openImportRvnAdressbook() { + openImportRvnAddressbook() { this.shadowRoot.querySelector("#importRvnAddressbookDialog").show() } + openImportArrrAddressbook() { + this.shadowRoot.querySelector("#importArrrAddressbookDialog").show() + } + closeQortAddressDialog() { this.shadowRoot.querySelector('#addQortAddressDialog').close() } @@ -2755,6 +3107,10 @@ class MultiWallet extends LitElement { this.shadowRoot.querySelector('#addRvnAddressDialog').close() } + closeArrrAddressDialog() { + this.shadowRoot.querySelector('#addArrrAddressDialog').close() + } + closeImportQortAddressbookDialog() { this.shadowRoot.querySelector("#importQortAddressbookDialog").close() } @@ -2779,13 +3135,15 @@ class MultiWallet extends LitElement { this.shadowRoot.querySelector("#importRvnAddressbookDialog").close() } - + closeImportArrrAddressbookDialog() { + this.shadowRoot.querySelector("#importArrrAddressbookDialog").close() + } addToQortalAddressbook() { let name = this.shadowRoot.getElementById('qortNameInput').value let address = this.shadowRoot.getElementById('qortAddressInput').value - var oldQortalBook = JSON.parse(localStorage.getItem("adressbookQort") || "[]") + var oldQortalBook = JSON.parse(localStorage.getItem("addressbookQort") || "[]") if (name.length === 0) { let qortbookstring1 = get("walletpage.wchange50") @@ -2806,20 +3164,20 @@ class MultiWallet extends LitElement { oldQortalBook.push(newQortalBookItem) - localStorage.setItem("adressbookQort", JSON.stringify(oldQortalBook)) + localStorage.setItem("addressbookQort", JSON.stringify(oldQortalBook)) let qortbookstring2 = get("walletpage.wchange52") parentEpml.request('showSnackBar', `${qortbookstring2}`) this.closeQortAddressDialog() - this.qortBook = JSON.parse(localStorage.getItem("adressbookQort") || "[]") + this.qortBook = JSON.parse(localStorage.getItem("addressbookQort") || "[]") } addToBitcoinAddressbook() { let name = this.shadowRoot.getElementById('btcNameInput').value let address = this.shadowRoot.getElementById('btcAddressInput').value - var oldBitcoinBook = JSON.parse(localStorage.getItem("adressbookBtc") || "[]") + var oldBitcoinBook = JSON.parse(localStorage.getItem("addressbookBtc") || "[]") if (name.length === 0) { let btcbookstring1 = get("walletpage.wchange50") @@ -2840,20 +3198,20 @@ class MultiWallet extends LitElement { oldBitcoinBook.push(newBitcoinBookItem) - localStorage.setItem("adressbookBtc", JSON.stringify(oldBitcoinBook)) + localStorage.setItem("addressbookBtc", JSON.stringify(oldBitcoinBook)) let btcbookstring3 = get("walletpage.wchange52") parentEpml.request('showSnackBar', `${btcbookstring3}`) this.closeBtcAddressDialog() - this.btcBook = JSON.parse(localStorage.getItem("adressbookBtc") || "[]") + this.btcBook = JSON.parse(localStorage.getItem("addressbookBtc") || "[]") } addToLitecoinAddressbook() { let name = this.shadowRoot.getElementById('ltcNameInput').value let address = this.shadowRoot.getElementById('ltcAddressInput').value - var oldLitecoinBook = JSON.parse(localStorage.getItem("adressbookLtc") || "[]") + var oldLitecoinBook = JSON.parse(localStorage.getItem("addressbookLtc") || "[]") if (name.length === 0) { let ltcbookstring1 = get("walletpage.wchange50") @@ -2874,20 +3232,20 @@ class MultiWallet extends LitElement { oldLitecoinBook.push(newLitecoinBookItem) - localStorage.setItem("adressbookLtc", JSON.stringify(oldLitecoinBook)) + localStorage.setItem("addressbookLtc", JSON.stringify(oldLitecoinBook)) let ltcbookstring3 = get("walletpage.wchange52") parentEpml.request('showSnackBar', `${ltcbookstring3}`) this.closeLtcAddressDialog() - this.ltcBook = JSON.parse(localStorage.getItem("adressbookLtc") || "[]") + this.ltcBook = JSON.parse(localStorage.getItem("addressbookLtc") || "[]") } addToDogecoinAddressbook() { let name = this.shadowRoot.getElementById('dogeNameInput').value let address = this.shadowRoot.getElementById('dogeAddressInput').value - var oldDogecoinBook = JSON.parse(localStorage.getItem("adressbookDoge") || "[]") + var oldDogecoinBook = JSON.parse(localStorage.getItem("addressbookDoge") || "[]") if (name.length === 0) { let dogebookstring1 = get("walletpage.wchange50") @@ -2908,20 +3266,20 @@ class MultiWallet extends LitElement { oldDogecoinBook.push(newDogecoinBookItem) - localStorage.setItem("adressbookDoge", JSON.stringify(oldDogecoinBook)) + localStorage.setItem("addressbookDoge", JSON.stringify(oldDogecoinBook)) let dogebookstring3 = get("walletpage.wchange52") parentEpml.request('showSnackBar', `${dogebookstring3}`) this.closeDogeAddressDialog() - this.dogeBook = JSON.parse(localStorage.getItem("adressbookDoge") || "[]") + this.dogeBook = JSON.parse(localStorage.getItem("addressbookDoge") || "[]") } addToDigibyteAddressbook() { let name = this.shadowRoot.getElementById('dgbNameInput').value let address = this.shadowRoot.getElementById('dgbAddressInput').value - var oldDigibyteBook = JSON.parse(localStorage.getItem("adressbookDgb") || "[]") + var oldDigibyteBook = JSON.parse(localStorage.getItem("addressbookDgb") || "[]") if (name.length === 0) { let dgbbookstring1 = get("walletpage.wchange50") @@ -2942,20 +3300,20 @@ class MultiWallet extends LitElement { oldDigibyteBook.push(newDigibyteBookItem) - localStorage.setItem("adressbookDgb", JSON.stringify(oldDigibyteBook)) + localStorage.setItem("addressbookDgb", JSON.stringify(oldDigibyteBook)) let dgbbookstring3 = get("walletpage.wchange52") parentEpml.request('showSnackBar', `${dgbbookstring3}`) this.closeDgbAddressDialog() - this.dgbBook = JSON.parse(localStorage.getItem("adressbookDgb") || "[]") + this.dgbBook = JSON.parse(localStorage.getItem("addressbookDgb") || "[]") } addToRavencoinAddressbook() { let name = this.shadowRoot.getElementById('rvnNameInput').value let address = this.shadowRoot.getElementById('rvnAddressInput').value - var oldRavencoinBook = JSON.parse(localStorage.getItem("adressbookRvn") || "[]") + var oldRavencoinBook = JSON.parse(localStorage.getItem("addressbookRvn") || "[]") if (name.length === 0) { let rvnbookstring1 = get("walletpage.wchange50") @@ -2976,13 +3334,47 @@ class MultiWallet extends LitElement { oldRavencoinBook.push(newRavencoinBookItem) - localStorage.setItem("adressbookRvn", JSON.stringify(oldRavencoinBook)) + localStorage.setItem("addressbookRvn", JSON.stringify(oldRavencoinBook)) let rvnbookstring3 = get("walletpage.wchange52") parentEpml.request('showSnackBar', `${rvnbookstring3}`) this.closeRvnAddressDialog() - this.rvnBook = JSON.parse(localStorage.getItem("adressbookRvn") || "[]") + this.rvnBook = JSON.parse(localStorage.getItem("addressbookRvn") || "[]") + } + + addToPiratechainAddressbook() { + let name = this.shadowRoot.getElementById('arrrNameInput').value + let address = this.shadowRoot.getElementById('arrrAddressInput').value + + var oldPiratechainBook = JSON.parse(localStorage.getItem("addressbookArrr") || "[]") + + if (name.length === 0) { + let arrrbookstring1 = get("walletpage.wchange50") + parentEpml.request('showSnackBar', `${arrrbookstring1}`) + return false + } + + if (address.length === 0) { + let arrrbookstring2 = get("walletpage.wchange51") + parentEpml.request('showSnackBar', `${arrrbookstring2}`) + return false + } + + const newPiratechainBookItem = { + name: name, + address: address + } + + oldPiratechainBook.push(newPiratechainBookItem) + + localStorage.setItem("addressbookArrr", JSON.stringify(oldPiratechainBook)) + + let arrrbookstring3 = get("walletpage.wchange52") + parentEpml.request('showSnackBar', `${arrrbookstring3}`) + + this.closeArrrAddressDialog() + this.arrrBook = JSON.parse(localStorage.getItem("addressbookArrr") || "[]") } sendFromQortAddressbook(websiteObj) { @@ -3027,6 +3419,13 @@ class MultiWallet extends LitElement { this.shadowRoot.querySelector('#rvnBookDialog').close() } + sendFromArrrAddressbook(websiteObj) { + let address = websiteObj.address + this.arrrRecipient = address + this.openSendArrr() + this.shadowRoot.querySelector('#arrrBookDialog').close() + } + renderSendFromQortAddressbookButton(websiteObj) { return html`` } @@ -3051,96 +3450,115 @@ class MultiWallet extends LitElement { return html`` } - exportQortAdressbook() { - const qortBookData = JSON.stringify(localStorage.getItem("adressbookQort")) + renderSendFromArrrAddressbookButton(websiteObj) { + return html`` + } + + exportQortAddressbook() { + const qortBookData = JSON.stringify(localStorage.getItem("addressbookQort")) const qortBookSave = JSON.parse((qortBookData) || "[]") const blob = new Blob([qortBookSave], { type: 'text/plain;charset=utf-8' }) FileSaver.saveAs(blob, `qortal_addressbook.qort.json`) } - exportBtcAdressbook() { - const btcBookData = JSON.stringify(localStorage.getItem("adressbookBtc")) + exportBtcAddressbook() { + const btcBookData = JSON.stringify(localStorage.getItem("addressbookBtc")) const btcBookSave = JSON.parse((btcBookData) || "[]") const blob = new Blob([btcBookSave], { type: 'text/plain;charset=utf-8' }) FileSaver.saveAs(blob, `bitcoin_addressbook.btc.json`) } - exportLtcAdressbook() { - const ltcBookData = JSON.stringify(localStorage.getItem("adressbookLtc")) + exportLtcAddressbook() { + const ltcBookData = JSON.stringify(localStorage.getItem("addressbookLtc")) const ltcBookSave = JSON.parse((ltcBookData) || "[]") const blob = new Blob([ltcBookSave], { type: 'text/plain;charset=utf-8' }) FileSaver.saveAs(blob, `litecoin_addressbook.ltc.json`) } - exportDogeAdressbook() { - const dogeBookData = JSON.stringify(localStorage.getItem("adressbookDoge")) + exportDogeAddressbook() { + const dogeBookData = JSON.stringify(localStorage.getItem("addressbookDoge")) const dogeBookSave = JSON.parse((dogeBookData) || "[]") const blob = new Blob([dogeBookSave], { type: 'text/plain;charset=utf-8' }) FileSaver.saveAs(blob, `dogecoin_addressbook.doge.json`) } - exportDgbAdressbook() { - const dgbBookData = JSON.stringify(localStorage.getItem("adressbookDgb")) + exportDgbAddressbook() { + const dgbBookData = JSON.stringify(localStorage.getItem("addressbookDgb")) const dgbBookSave = JSON.parse((dgbBookData) || "[]") const blob = new Blob([dgbBookSave], { type: 'text/plain;charset=utf-8' }) FileSaver.saveAs(blob, `digibyte_addressbook.dgb.json`) } - exportRvnAdressbook() { - const rvnBookData = JSON.stringify(localStorage.getItem("adressbookRvn")) + exportRvnAddressbook() { + const rvnBookData = JSON.stringify(localStorage.getItem("addressbookRvn")) const rvnBookSave = JSON.parse((rvnBookData) || "[]") const blob = new Blob([rvnBookSave], { type: 'text/plain;charset=utf-8' }) FileSaver.saveAs(blob, `ravencoin_addressbook.rvn.json`) } + exportArrrAddressbook() { + const arrrBookData = JSON.stringify(localStorage.getItem("addressbookArrr")) + const arrrBookSave = JSON.parse((arrrBookData) || "[]") + const blob = new Blob([arrrBookSave], { type: 'text/plain;charset=utf-8' }) + FileSaver.saveAs(blob, `piratechain_addressbook.arrr.json`) + } + importQortAddressbook(file) { - localStorage.removeItem("adressbookQort") + localStorage.removeItem("addressbookQort") const newItems = JSON.parse((file) || "[]") - localStorage.setItem("adressbookQort", JSON.stringify(newItems)) - this.qortBook = JSON.parse(localStorage.getItem("adressbookQort") || "[]") + localStorage.setItem("addressbookQort", JSON.stringify(newItems)) + this.qortBook = JSON.parse(localStorage.getItem("addressbookQort") || "[]") this.shadowRoot.querySelector('#importQortAddressbookDialog').close() } importBtcAddressbook(file) { - localStorage.removeItem("adressbookBtc") + localStorage.removeItem("addressbookBtc") const newItems = JSON.parse((file) || "[]") - localStorage.setItem("adressbookBtc", JSON.stringify(newItems)) - this.btcBook = JSON.parse(localStorage.getItem("adressbookBtc") || "[]") + localStorage.setItem("addressbookBtc", JSON.stringify(newItems)) + this.btcBook = JSON.parse(localStorage.getItem("addressbookBtc") || "[]") this.shadowRoot.querySelector('#importBtcAddressbookDialog').close() } importLtcAddressbook(file) { - localStorage.removeItem("adressbookLtc") + localStorage.removeItem("addressbookLtc") const newItems = JSON.parse((file) || "[]") - localStorage.setItem("adressbookLtc", JSON.stringify(newItems)) - this.ltcBook = JSON.parse(localStorage.getItem("adressbookLtc") || "[]") + localStorage.setItem("addressbookLtc", JSON.stringify(newItems)) + this.ltcBook = JSON.parse(localStorage.getItem("addressbookLtc") || "[]") this.shadowRoot.querySelector('#importLtcAddressbookDialog').close() } importDogeAddressbook(file) { - localStorage.removeItem("adressbookDoge") + localStorage.removeItem("addressbookDoge") const newItems = JSON.parse((file) || "[]") - localStorage.setItem("adressbookDoge", JSON.stringify(newItems)) - this.dogeBook = JSON.parse(localStorage.getItem("adressbookDoge") || "[]") + localStorage.setItem("addressbookDoge", JSON.stringify(newItems)) + this.dogeBook = JSON.parse(localStorage.getItem("addressbookDoge") || "[]") this.shadowRoot.querySelector('#importDogeAddressbookDialog').close() } importDgbAddressbook(file) { - localStorage.removeItem("adressbookDgb") + localStorage.removeItem("addressbookDgb") const newItems = JSON.parse((file) || "[]") - localStorage.setItem("adressbookDgb", JSON.stringify(newItems)) - this.dgbBook = JSON.parse(localStorage.getItem("adressbookDgb") || "[]") + localStorage.setItem("addressbookDgb", JSON.stringify(newItems)) + this.dgbBook = JSON.parse(localStorage.getItem("addressbookDgb") || "[]") this.shadowRoot.querySelector('#importDgbAddressbookDialog').close() } importRvnAddressbook(file) { - localStorage.removeItem("adressbookRvn") + localStorage.removeItem("addressbookRvn") const newItems = JSON.parse((file) || "[]") - localStorage.setItem("adressbookRvn", JSON.stringify(newItems)) - this.rvnBook = JSON.parse(localStorage.getItem("adressbookRvn") || "[]") + localStorage.setItem("addressbookRvn", JSON.stringify(newItems)) + this.rvnBook = JSON.parse(localStorage.getItem("addressbookRvn") || "[]") this.shadowRoot.querySelector('#importRvnAddressbookDialog').close() } + importArrrAddressbook(file) { + localStorage.removeItem("addressbookArrr") + const newItems = JSON.parse((file) || "[]") + localStorage.setItem("addressbookArrr", JSON.stringify(newItems)) + this.arrrBook = JSON.parse(localStorage.getItem("addressbookArrr") || "[]") + this.shadowRoot.querySelector('#importArrrAddressbookDialog').close() + } + closeQortDialog() { this.shadowRoot.querySelector('#sendQortDialog').close() this.successMessage = '' @@ -3177,6 +3595,12 @@ class MultiWallet extends LitElement { this.errorMessage = '' } + closeArrrDialog() { + this.shadowRoot.querySelector('#sendArrrDialog').close() + this.successMessage = '' + this.errorMessage = '' + } + sendToQortAddress() { this.recipient = this.selectedTransaction.recipient this.openSendQort() @@ -3213,6 +3637,12 @@ class MultiWallet extends LitElement { this.shadowRoot.querySelector('#showRvnTransactionDetailsDialog').close() } + sendToArrrAddress() { + this.arrrRecipient = this.selectedTransaction.arrrReceiver + this.openSendArrr() + this.shadowRoot.querySelector('#showArrrTransactionDetailsDialog').close() + } + calculateQortAll() { if (this.balance < 0.00100000) { let not_enough_string = get("walletpage.wchange26") @@ -3272,6 +3702,15 @@ class MultiWallet extends LitElement { } } + calculateArrrAll() { + if (this.balance < 0.00000002) { + let not_enough_string = get("walletpage.wchange26") + parentEpml.request('showSnackBar', `${not_enough_string}`) + } else { + this.arrrAmount = (this.balance - 0.00000001).toFixed(8) + } + } + renderSQB() { let displaybutton = this.selectedTransaction.recipient if (displaybutton == null) { @@ -3706,7 +4145,7 @@ class MultiWallet extends LitElement { this.showWallet() } - async sendRvn() { + async sendRvn() { const rvnAmount = this.shadowRoot.getElementById('rvnAmountInput').value let rvnRecipient = this.shadowRoot.getElementById('rvnRecipient').value const xprv58 = this.wallets.get(this._selectedWallet).wallet.derivedMasterPrivateKey @@ -3752,6 +4191,55 @@ class MultiWallet extends LitElement { this.showWallet() } + async sendArrr() { + const arrrAmount = this.shadowRoot.getElementById('arrrAmountInput').value + let arrrRecipient = this.shadowRoot.getElementById('arrrRecipient').value + let arrrMemo = this.shadowRoot.getElementById('arrrMemo').value + const seed58 = this.wallets.get(this._selectedWallet).wallet.seed58 + + this.sendMoneyLoading = true + this.btnDisable = true + + const makeRequest = async () => { + const opts = { + entropy58: seed58, + receivingAddress: arrrRecipient, + arrrAmount: arrrAmount, + memo: arrrMemo + } + const response = await parentEpml.request('sendArrr', opts) + return response + } + + const manageResponse = (response) => { + if (response.length === 64) { + this.shadowRoot.getElementById('arrrAmountInput').value = 0 + this.shadowRoot.getElementById('arrrRecipient').value = '' + this.shadowRoot.getElementById('arrrMemo').value = '' + this.errorMessage = '' + this.arrrRecipient = '' + this.arrrMemo='' + this.arrrAmount = 0 + this.successMessage = this.renderSuccessText() + this.sendMoneyLoading = false + this.btnDisable = false + } else if (response === false) { + this.errorMessage = this.renderFailText() + this.sendMoneyLoading = false + this.btnDisable = false + throw new Error(txnResponse) + } else { + this.errorMessage = response.message + this.sendMoneyLoading = false + this.btnDisable = false + throw new Error(response) + } + } + const res = await makeRequest() + manageResponse(res) + this.showWallet() + } + async showWallet() { this.transactionsDOM.hidden = true this.loading = true @@ -3842,11 +4330,91 @@ class MultiWallet extends LitElement { this.wallets.get(this._selectedWallet).transactions = sortedTransactions } break + case 'arrr': + const arrrWalletName = `${coin}Wallet` + + const res = await parentEpml.request('apiCall', { + url: `/crosschain/${coin}/syncstatus?apiKey=${this.getApiKey()}`, + method: 'POST', + body: `${window.parent.reduxStore.getState().app.selectedAddress[arrrWalletName].seed58}`, + }) + if (coin != this._selectedWallet) { + // We've switched away from this coin + } + if (res !== null && res !== "Synchronized") { + // Not synchronized yet - display sync status instead of balance + this.balanceString = res; + + // Check again shortly after + await new Promise(resolve => setTimeout(resolve, 2000)); + this.showWallet() + + // No need to make balance or transaction list calls yet + return + } + + this.balanceString = this.renderFetchText() + + parentEpml.request('apiCall', { + url: `/crosschain/${coin}/walletbalance?apiKey=${this.getApiKey()}`, + method: 'POST', + body: `${window.parent.reduxStore.getState().app.selectedAddress[arrrWalletName].seed58}`, + }) + .then((res) => { + if (isNaN(Number(res))) { + let snack5string = get("walletpage.wchange33") + let snack6string = get("walletpage.wchange34") + parentEpml.request('showSnackBar', `${snack5string} ${coin.toLocaleUpperCase()} ${snack6string}!`) + } else { + if (this._selectedWallet == coin) { + this.wallets.get(this._selectedWallet).balance = (Number(res) / 1e8).toFixed(8) + this.balanceString = this.wallets.get(this._selectedWallet).balance + " " + this._selectedWallet.toLocaleUpperCase() + this.balance = this.wallets.get(this._selectedWallet).balance + } + } + }) + + const arrrTxs = await parentEpml.request('apiCall', { + url: `/crosschain/${coin}/wallettransactions?apiKey=${this.getApiKey()}`, + method: 'POST', + body: `${window.parent.reduxStore.getState().app.selectedAddress[arrrWalletName].seed58}`, + }) + + const arrrCompareFn = (a, b) => { + return b.timestamp - a.timestamp + } + + const arrrSortedTransactions = arrrTxs.sort(arrrCompareFn) + console.log(arrrSortedTransactions) + if (this._selectedWallet == coin) { + this.wallets.get(this._selectedWallet).transactions = arrrSortedTransactions + } + break default: break } } + async fetchWalletAddress(coin) { + switch (coin) { + case 'arrr': + const arrrWalletName = `${coin}Wallet` + let res = await parentEpml.request('apiCall', { + url: `/crosschain/${coin}/walletaddress?apiKey=${this.getApiKey()}`, + method: 'POST', + body: `${window.parent.reduxStore.getState().app.selectedAddress[arrrWalletName].seed58}`, + }) + if (res != null && res.error != 1201 && res.length === 78) { + this.arrrWalletAddress = res + } + break + + default: + // Not used for other coins yet + break + } + } + renderSendButton() { if ( this._selectedWallet === "qort" ) { return html` this.openSendQort()}> ${translate("walletpage.wchange17")} QORT` @@ -3860,6 +4428,8 @@ class MultiWallet extends LitElement { return html` this.openSendDgb()}> ${translate("walletpage.wchange17")} DGB` } else if ( this._selectedWallet === "rvn" ) { return html` this.openSendRvn()}> ${translate("walletpage.wchange17")} RVN` + } else if ( this._selectedWallet === "arrr" ) { + return html` this.openSendArrr()}> ${translate("walletpage.wchange17")} ARRR` } else { return html`` } @@ -3878,6 +4448,8 @@ class MultiWallet extends LitElement { return html` this.openDgbAddressbook()}> ${translate("walletpage.wchange47")}` } else if ( this._selectedWallet === "rvn" ) { return html` this.openRvnAddressbook()}> ${translate("walletpage.wchange47")}` + } else if ( this._selectedWallet === "arrr" ) { + return html` this.openArrrAddressbook()}> ${translate("walletpage.wchange47")}` } else { return html`` } @@ -3885,17 +4457,19 @@ class MultiWallet extends LitElement { renderExportAddressbookButton() { if ( this._selectedWallet === "qort" ) { - return html` this.exportQortAdressbook()}> ${translate("walletpage.wchange54")}` + return html` this.exportQortAddressbook()}> ${translate("walletpage.wchange54")}` } else if ( this._selectedWallet === "btc" ) { - return html` this.exportBtcAdressbook()}> ${translate("walletpage.wchange54")}` + return html` this.exportBtcAddressbook()}> ${translate("walletpage.wchange54")}` } else if ( this._selectedWallet === "ltc" ) { - return html` this.exportKLtcAdressbook()}> ${translate("walletpage.wchange54")}` + return html` this.exportKLtcAddressbook()}> ${translate("walletpage.wchange54")}` } else if ( this._selectedWallet === "doge" ) { - return html` this.exportDogeAdressbook()}> ${translate("walletpage.wchange54")}` + return html` this.exportDogeAddressbook()}> ${translate("walletpage.wchange54")}` } else if ( this._selectedWallet === "dgb" ) { - return html` this.exportDgbAdressbook()}> ${translate("walletpage.wchange54")}` + return html` this.exportDgbAddressbook()}> ${translate("walletpage.wchange54")}` } else if ( this._selectedWallet === "rvn" ) { - return html` this.exportRvnAdressbook()}> ${translate("walletpage.wchange54")}` + return html` this.exportRvnAddressbook()}> ${translate("walletpage.wchange54")}` + } else if ( this._selectedWallet === "arrr" ) { + return html` this.exportArrrAddressbook()}> ${translate("walletpage.wchange54")}` } else { return html`` } @@ -3903,17 +4477,19 @@ class MultiWallet extends LitElement { renderImportAddressbookButton() { if ( this._selectedWallet === "qort" ) { - return html` this.openImportQortAdressbook()}> ${translate("walletpage.wchange53")}` + return html` this.openImportQortAddressbook()}> ${translate("walletpage.wchange53")}` } else if ( this._selectedWallet === "btc" ) { - return html` this.openImportBtcAdressbook()}> ${translate("walletpage.wchange53")}` + return html` this.openImportBtcAddressbook()}> ${translate("walletpage.wchange53")}` } else if ( this._selectedWallet === "ltc" ) { - return html` this.openImportLtcAdressbook()}> ${translate("walletpage.wchange53")}` + return html` this.openImportLtcAddressbook()}> ${translate("walletpage.wchange53")}` } else if ( this._selectedWallet === "doge" ) { - return html` this.openImportDogeAdressbook()}> ${translate("walletpage.wchange53")}` + return html` this.openImportDogeAddressbook()}> ${translate("walletpage.wchange53")}` } else if ( this._selectedWallet === "dgb" ) { - return html` this.openImportDgbAdressbook()}> ${translate("walletpage.wchange53")}` + return html` this.openImportDgbAddressbook()}> ${translate("walletpage.wchange53")}` } else if ( this._selectedWallet === "rvn" ) { - return html` this.openImportRvnAdressbook()}> ${translate("walletpage.wchange53")}` + return html` this.openImportRvnAddressbook()}> ${translate("walletpage.wchange53")}` + } else if ( this._selectedWallet === "arrr" ) { + return html` this.openImportArrrAddressbook()}> ${translate("walletpage.wchange53")}` } else { return html`` } @@ -3939,10 +4515,14 @@ class MultiWallet extends LitElement { this.shadowRoot.querySelector("#sendDgbDialog").show(); } - openSendRvn() { + openSendRvn() { this.shadowRoot.querySelector("#sendRvnDialog").show(); } + openSendArrr() { + this.shadowRoot.querySelector("#sendArrrDialog").show(); + } + changeTheme() { const checkTheme = localStorage.getItem('qortalTheme') if (checkTheme === 'dark') { @@ -3965,9 +4545,15 @@ class MultiWallet extends LitElement { } getSelectedWalletAddress() { - return this._selectedWallet === 'qort' - ? this.wallets.get(this._selectedWallet).wallet.address - : this.wallets.get(this._selectedWallet).wallet.address + switch (this._selectedWallet) { + case "arrr": + // Use address returned by core API + return this.arrrWalletAddress + + default: + // Use locally derived address + return this.wallets.get(this._selectedWallet).wallet.address + } } async getTransactionGrid(coin) { @@ -4026,6 +4612,15 @@ class MultiWallet extends LitElement { }, { passive: true } ) + } else if (coin === 'arrr') { + this.transactionsGrid.addEventListener( + 'click', + (e) => { + let arrrItem = this.transactionsGrid.getEventContext(e).item + this.showArrrTransactionDetails(arrrItem, this.wallets.get(this._selectedWallet).transactions) + }, + { passive: true } + ) } this.pagesControl = this.shadowRoot.querySelector('#pages') @@ -4045,6 +4640,8 @@ class MultiWallet extends LitElement { render(this.renderDgbTransactions(this.wallets.get(this._selectedWallet).transactions, this._selectedWallet), this.transactionsDOM) } else if (this._selectedWallet === 'rvn') { render(this.renderRvnTransactions(this.wallets.get(this._selectedWallet).transactions, this._selectedWallet), this.transactionsDOM) + } else if (this._selectedWallet === 'arrr') { + render(this.renderArrrTransactions(this.wallets.get(this._selectedWallet).transactions, this._selectedWallet), this.transactionsDOM) } } @@ -4368,7 +4965,7 @@ class MultiWallet extends LitElement { ` } - renderRvnTransactions(transactions, coin) { + renderRvnTransactions(transactions, coin) { return html`
    ${translate("walletpage.wchange38")}
    @@ -4430,7 +5027,81 @@ class MultiWallet extends LitElement {
    - ` + ` + } + + renderArrrTransactions(transactions, coin) { + return html` +
    ${translate("walletpage.wchange38")}
    + + { + render(html`check`, root) + }} + > + + { + render(html` ${translate("walletpage.wchange40")} ${data.item.totalAmount < 0 ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} `, root) + }} + > + + + + { + const amount = (Number(data.item.totalAmount) / 1e8).toFixed(8) + render(html`${amount}`, root) + }} + > + + { + const time = new Date(data.item.timestamp) + render(html` `, root) + }} + > + + { + render(html`${data.item.memo}`, root) + }} + > + + +
    + ` } async updateItemsFromPage(page, changeWallet = false) { @@ -4619,7 +5290,7 @@ class MultiWallet extends LitElement { }) } - showRvnTransactionDetails(myTransaction, allTransactions) { + showRvnTransactionDetails(myTransaction, allTransactions) { allTransactions.forEach((transaction) => { if (myTransaction.txHash === transaction.txHash) { let rvnTxnFlow = myTransaction.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? 'OUT' : 'IN' @@ -4633,6 +5304,21 @@ class MultiWallet extends LitElement { }) } + showArrrTransactionDetails(myTransaction, allTransactions) { + allTransactions.forEach((transaction) => { + if (myTransaction.txHash === transaction.txHash) { + let arrrTxnFlow = myTransaction.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? 'OUT' : 'IN' + let arrrSender = myTransaction.inputs[0].address + let arrrReceiver = myTransaction.outputs[0].address + this.selectedTransaction = { ...transaction, arrrTxnFlow, arrrSender, arrrReceiver } + if (this.selectedTransaction.txHash.length != 0) { + this.shadowRoot.querySelector('#showArrrTransactionDetailsDialog').show() + } + } + }) + } + + isEmptyArray(arr) { if (!arr) { return true