forked from Qortal/qortal-ui
CalDescent
2 years ago
39 changed files with 12458 additions and 10848 deletions
@ -16,6 +16,7 @@
|
||||
"author": "QORTAL <[email protected]>", |
||||
"license": "GPL-3.0", |
||||
"scripts": { |
||||
"install_link:all": "(cd qortal-ui-core && yarn install && yarn link) && (cd qortal-ui-plugins && yarn install && yarn link) && (cd qortal-ui-crypto && yarn install && yarn link) && (yarn link qortal-ui-core && yarn link qortal-ui-plugins && yarn link qortal-ui-crypto)", |
||||
"dev": "node server.js", |
||||
"prebuild": "node -p \"'export const UI_VERSION = ' + JSON.stringify(require('./package.json').version) + ';'\" > qortal-ui-core/src/redux/app/version.js", |
||||
"build-dev": "node build.js", |
||||
@ -31,12 +32,12 @@
|
||||
"publish": "electron-builder -p always" |
||||
}, |
||||
"dependencies": { |
||||
"electron-updater": "5.0.5", |
||||
"electron-updater": "5.2.1", |
||||
"electron-log": "4.4.8" |
||||
}, |
||||
"devDependencies": { |
||||
"electron": "19.0.9", |
||||
"electron-builder": "23.1.0", |
||||
"electron": "19.0.11", |
||||
"electron-builder": "23.3.3", |
||||
"electron-notarize": "1.2.1", |
||||
"electron-packager": "15.5.1", |
||||
"shelljs": "0.8.5" |
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,159 +1,248 @@
|
||||
import { LitElement, html, css } from 'lit' |
||||
import { connect } from 'pwa-helpers' |
||||
import { store } from '../store.js' |
||||
import { translate, translateUnsafeHTML } from 'lit-translate' |
||||
import { LitElement, html, css } from 'lit'; |
||||
import { connect } from 'pwa-helpers'; |
||||
import { store } from '../store.js'; |
||||
import { translate, translateUnsafeHTML } from 'lit-translate'; |
||||
|
||||
import '@polymer/paper-ripple' |
||||
import '@vaadin/icon' |
||||
import '@vaadin/icons' |
||||
import '@polymer/paper-ripple'; |
||||
import '@vaadin/icon'; |
||||
import '@vaadin/icons'; |
||||
|
||||
import '../functional-components/side-menu.js' |
||||
import '../functional-components/side-menu-item.js' |
||||
import '../functional-components/side-menu.js'; |
||||
import '../functional-components/side-menu-item.js'; |
||||
|
||||
class SidenavMenu extends connect(store)(LitElement) { |
||||
static get properties() { |
||||
return { |
||||
config: { type: Object }, |
||||
urls: { type: Object }, |
||||
nodeType: { type: String, reflect: true }, |
||||
theme: { type: String, reflect: true } |
||||
} |
||||
} |
||||
static get properties() { |
||||
return { |
||||
config: { type: Object }, |
||||
urls: { type: Object }, |
||||
nodeType: { type: String, reflect: true }, |
||||
theme: { type: String, reflect: true }, |
||||
addressInfo: { type: Object }, |
||||
}; |
||||
} |
||||
|
||||
static get styles() { |
||||
return [ |
||||
css` |
||||
* { |
||||
--item-selected-color: var(--nav-selected-color); |
||||
--item-selected-color-text: var(--nav-selected-color-text); |
||||
--item-color-active: var(--nav-color-active); |
||||
--item-color-hover: var(--nav-color-hover); |
||||
--item-text-color: var(--nav-text-color); |
||||
--item-icon-color: var(--nav-icon-color); |
||||
--item-border-color: var(--nav-border-color); |
||||
--item-border-selected-color: var(--nav-border-selected-color); |
||||
} |
||||
static get styles() { |
||||
return [ |
||||
css` |
||||
* { |
||||
--item-selected-color: var(--nav-selected-color); |
||||
--item-selected-color-text: var(--nav-selected-color-text); |
||||
--item-color-active: var(--nav-color-active); |
||||
--item-color-hover: var(--nav-color-hover); |
||||
--item-text-color: var(--nav-text-color); |
||||
--item-icon-color: var(--nav-icon-color); |
||||
--item-border-color: var(--nav-border-color); |
||||
--item-border-selected-color: var(--nav-border-selected-color); |
||||
} |
||||
|
||||
.s-menu { |
||||
list-style: none; |
||||
padding: 0px 0px; |
||||
background: var(--sidetopbar); |
||||
border-radius: 2px; |
||||
width: 100%; |
||||
border-top: 1px solid var(--border); |
||||
outline: none; |
||||
} |
||||
` |
||||
] |
||||
} |
||||
.s-menu { |
||||
list-style: none; |
||||
padding: 0px 0px; |
||||
background: var(--sidetopbar); |
||||
border-radius: 2px; |
||||
width: 100%; |
||||
border-top: 1px solid var(--border); |
||||
outline: none; |
||||
} |
||||
|
||||
constructor() { |
||||
super() |
||||
this.urls = [] |
||||
this.nodeType = '' |
||||
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light' |
||||
} |
||||
.start-minting-wrapper { |
||||
position: absolute; |
||||
bottom: 130px; |
||||
left: 50%; |
||||
transform: translateX(calc(-50% - 10px)); |
||||
} |
||||
`,
|
||||
]; |
||||
} |
||||
|
||||
render() { |
||||
return html` |
||||
<div class="s-menu"> |
||||
<side-menu> |
||||
${this.renderNodeTypeMenu()} |
||||
${this.renderNodeManagement()} |
||||
</side-menu> |
||||
</div> |
||||
` |
||||
} |
||||
constructor() { |
||||
super(); |
||||
this.urls = []; |
||||
this.nodeType = ''; |
||||
this.theme = localStorage.getItem('qortalTheme') |
||||
? localStorage.getItem('qortalTheme') |
||||
: 'light'; |
||||
this.addressInfo = {}; |
||||
} |
||||
|
||||
firstUpdated() { |
||||
this.getNodeType() |
||||
} |
||||
render() { |
||||
return html` |
||||
<div class="s-menu"> |
||||
<side-menu> |
||||
${this.renderNodeTypeMenu()} |
||||
</side-menu> |
||||
</div> |
||||
`;
|
||||
} |
||||
|
||||
async getNodeType() { |
||||
const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] |
||||
const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port |
||||
const url = `${nodeUrl}/admin/info` |
||||
await fetch(url) |
||||
.then(response => { |
||||
return response.json() |
||||
}) |
||||
.then(data => { |
||||
this.nodeType = data.type |
||||
}) |
||||
.catch(err => { |
||||
console.error('Request failed', err); |
||||
}) |
||||
} |
||||
firstUpdated() { |
||||
this.getNodeType(); |
||||
} |
||||
|
||||
renderNodeTypeMenu() { |
||||
if (this.nodeType === 'lite') { |
||||
return html` |
||||
<side-menu-item label="${translate("sidemenu.wallets")}" href="/app/wallet" selected> |
||||
<vaadin-icon icon="vaadin:wallet" slot="icon"></vaadin-icon> |
||||
</side-menu-item> |
||||
<side-menu-item label="${translate("sidemenu.nameregistration")}" href="/app/name-registration"> |
||||
<vaadin-icon icon="vaadin:user-check" slot="icon"></vaadin-icon> |
||||
</side-menu-item> |
||||
<side-menu-item label="${translate("sidemenu.datamanagement")}" href="/app/data-management"> |
||||
<vaadin-icon icon="vaadin:database" slot="icon"></vaadin-icon> |
||||
</side-menu-item> |
||||
<side-menu-item label="${translate("sidemenu.qchat")}" href="/app/q-chat"> |
||||
<vaadin-icon icon="vaadin:chat" slot="icon"></vaadin-icon> |
||||
</side-menu-item> |
||||
` |
||||
} else { |
||||
return html` |
||||
<side-menu-item label="${translate("sidemenu.mintingdetails")}" href="/app/minting"> |
||||
<vaadin-icon icon="vaadin:info-circle" slot="icon"></vaadin-icon> |
||||
</side-menu-item> |
||||
<side-menu-item label="${translate("sidemenu.wallets")}" href="/app/wallet" selected> |
||||
<vaadin-icon icon="vaadin:wallet" slot="icon"></vaadin-icon> |
||||
</side-menu-item> |
||||
<side-menu-item label="${translate("sidemenu.tradeportal")}" href="/app/trade-portal"> |
||||
<vaadin-icon icon="vaadin:bullets" slot="icon"></vaadin-icon> |
||||
</side-menu-item> |
||||
<side-menu-item label="${translate("sidemenu.rewardshare")}" href="/app/reward-share"> |
||||
<vaadin-icon icon="vaadin:share-square" slot="icon"></vaadin-icon> |
||||
</side-menu-item> |
||||
<side-menu-item label="${translate("sidemenu.nameregistration")}" href="/app/name-registration"> |
||||
<vaadin-icon icon="vaadin:user-check" slot="icon"></vaadin-icon> |
||||
</side-menu-item> |
||||
<side-menu-item label="${translate("sidemenu.websites")}" href="/app/websites"> |
||||
<vaadin-icon icon="vaadin:desktop" slot="icon"></vaadin-icon> |
||||
</side-menu-item> |
||||
<side-menu-item label="${translate("sidemenu.datamanagement")}" href="/app/data-management"> |
||||
<vaadin-icon icon="vaadin:database" slot="icon"></vaadin-icon> |
||||
</side-menu-item> |
||||
<side-menu-item label="${translate("sidemenu.qchat")}" href="/app/q-chat"> |
||||
<vaadin-icon icon="vaadin:chat" slot="icon"></vaadin-icon> |
||||
</side-menu-item> |
||||
<side-menu-item label="${translate("sidemenu.groupmanagement")}" href="/app/group-management"> |
||||
<vaadin-icon icon="vaadin:group" slot="icon"></vaadin-icon> |
||||
</side-menu-item> |
||||
<side-menu-item label="${translate("sidemenu.puzzles")}" href="/app/puzzles"> |
||||
<vaadin-icon icon="vaadin:puzzle-piece" slot="icon"></vaadin-icon> |
||||
</side-menu-item> |
||||
` |
||||
} |
||||
} |
||||
async getNodeType() { |
||||
const myNode = |
||||
store.getState().app.nodeConfig.knownNodes[ |
||||
store.getState().app.nodeConfig.node |
||||
]; |
||||
const nodeUrl = |
||||
myNode.protocol + '://' + myNode.domain + ':' + myNode.port; |
||||
const url = `${nodeUrl}/admin/info`; |
||||
await fetch(url) |
||||
.then((response) => { |
||||
return response.json(); |
||||
}) |
||||
.then((data) => { |
||||
this.nodeType = data.type; |
||||
}) |
||||
.catch((err) => { |
||||
console.error('Request failed', err); |
||||
}); |
||||
} |
||||
|
||||
renderNodeManagement() { |
||||
const checkNodeManagement = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] |
||||
if (checkNodeManagement.enableManagement = true) { |
||||
return html` |
||||
<side-menu-item label="${translate("sidemenu.nodemanagement")}" href="/app/node-management"> |
||||
<vaadin-icon icon="vaadin:cloud" slot="icon"></vaadin-icon> |
||||
</side-menu-item> |
||||
` |
||||
} else { |
||||
return html`` |
||||
} |
||||
} |
||||
renderNodeTypeMenu() { |
||||
const addressInfo = this.addressInfo; |
||||
const isMinter = addressInfo?.error !== 124 && +addressInfo?.level > 0; |
||||
|
||||
stateChanged(state) { |
||||
this.config = state.config |
||||
this.urls = state.app.registeredUrls |
||||
} |
||||
if (this.nodeType === 'lite') { |
||||
return html` |
||||
<side-menu-item |
||||
label="${translate('sidemenu.wallets')}" |
||||
href="/app/wallet" |
||||
selected |
||||
> |
||||
<vaadin-icon icon="vaadin:wallet" slot="icon"></vaadin-icon> |
||||
</side-menu-item> |
||||
<side-menu-item |
||||
label="${translate('sidemenu.nameregistration')}" |
||||
href="/app/name-registration" |
||||
> |
||||
<vaadin-icon icon="vaadin:user-check" slot="icon"></vaadin-icon> |
||||
</side-menu-item> |
||||
<side-menu-item |
||||
label="${translate('sidemenu.datamanagement')}" |
||||
href="/app/data-management" |
||||
> |
||||
<vaadin-icon icon="vaadin:database" slot="icon"></vaadin-icon> |
||||
</side-menu-item> |
||||
<side-menu-item |
||||
label="${translate('sidemenu.qchat')}" |
||||
href="/app/q-chat" |
||||
> |
||||
<vaadin-icon icon="vaadin:chat" slot="icon"></vaadin-icon> |
||||
</side-menu-item> |
||||
${this.renderNodeManagement()} |
||||
`;
|
||||
} else { |
||||
return html` |
||||
<side-menu-item |
||||
label="${translate('sidemenu.minting')}" |
||||
expanded |
||||
> |
||||
<vaadin-icon icon="vaadin:info-circle" slot="icon"></vaadin-icon> |
||||
${isMinter |
||||
? html`<side-menu-item
|
||||
label="${translate('sidemenu.mintingdetails')}" |
||||
href="/app/minting" |
||||
> |
||||
<vaadin-icon icon="vaadin:info-circle" slot="icon"></vaadin-icon> |
||||
</side-menu-item>` |
||||
: html`<side-menu-item
|
||||
label="${translate('sidemenu.becomeAMinter')}" |
||||
href="/app/become-minter" |
||||
> |
||||
<vaadin-icon icon="vaadin:thumbs-up" slot="icon"></vaadin-icon> |
||||
</side-menu-item>`} |
||||
</side-menu-item> |
||||
<side-menu-item |
||||
label="${translate('sidemenu.wallets')}" |
||||
href="/app/wallet" |
||||
selected |
||||
> |
||||
<vaadin-icon icon="vaadin:wallet" slot="icon"></vaadin-icon> |
||||
</side-menu-item> |
||||
<side-menu-item |
||||
label="${translate('sidemenu.tradeportal')}" |
||||
href="/app/trade-portal" |
||||
> |
||||
<vaadin-icon icon="vaadin:bullets" slot="icon"></vaadin-icon> |
||||
</side-menu-item> |
||||
<side-menu-item |
||||
label="${translate('sidemenu.rewardshare')}" |
||||
href="/app/reward-share" |
||||
> |
||||
<vaadin-icon icon="vaadin:share-square" slot="icon"></vaadin-icon> |
||||
</side-menu-item> |
||||
<side-menu-item |
||||
label="${translate('sidemenu.qchat')}" |
||||
href="/app/q-chat" |
||||
> |
||||
<vaadin-icon icon="vaadin:chat" slot="icon"></vaadin-icon> |
||||
</side-menu-item> |
||||
<side-menu-item |
||||
label="${translate('sidemenu.nameregistration')}" |
||||
href="/app/name-registration" |
||||
> |
||||
<vaadin-icon icon="vaadin:user-check" slot="icon"></vaadin-icon> |
||||
</side-menu-item> |
||||
<side-menu-item |
||||
label="${translate('sidemenu.websites')}" |
||||
href="/app/websites" |
||||
> |
||||
<vaadin-icon icon="vaadin:desktop" slot="icon" ></vaadin-icon> |
||||
</side-menu-item> |
||||
<side-menu-item |
||||
label="${translate('sidemenu.management')}" |
||||
expanded |
||||
> |
||||
<vaadin-icon icon="vaadin:cogs" slot="icon"></vaadin-icon> |
||||
<side-menu-item |
||||
label="${translate('sidemenu.datamanagement')}" |
||||
href="/app/data-management" |
||||
> |
||||
<vaadin-icon icon="vaadin:database" slot="icon"></vaadin-icon> |
||||
</side-menu-item> |
||||
<side-menu-item |
||||
label="${translate('sidemenu.groupmanagement')}" |
||||
href="/app/group-management" |
||||
> |
||||
<vaadin-icon icon="vaadin:group" slot="icon"></vaadin-icon> |
||||
</side-menu-item> |
||||
${this.renderNodeManagement()} |
||||
</side-menu-item> |
||||
<side-menu-item |
||||
label="${translate('sidemenu.puzzles')}" |
||||
href="/app/puzzles" |
||||
> |
||||
<vaadin-icon icon="vaadin:puzzle-piece" slot="icon"></vaadin-icon> |
||||
</side-menu-item> |
||||
`;
|
||||
} |
||||
} |
||||
|
||||
renderNodeManagement() { |
||||
const checkNodeManagement = |
||||
store.getState().app.nodeConfig.knownNodes[ |
||||
store.getState().app.nodeConfig.node |
||||
]; |
||||
if ((checkNodeManagement.enableManagement = true)) { |
||||
return html` |
||||
<side-menu-item |
||||
label="${translate('sidemenu.nodemanagement')}" |
||||
href="/app/node-management" |
||||
> |
||||
<vaadin-icon icon="vaadin:cloud" slot="icon"></vaadin-icon> |
||||
</side-menu-item> |
||||
`;
|
||||
} else { |
||||
return html``; |
||||
} |
||||
} |
||||
|
||||
stateChanged(state) { |
||||
this.config = state.config; |
||||
this.urls = state.app.registeredUrls; |
||||
this.addressInfo = state.app.accountInfo.addressInfo; |
||||
} |
||||
} |
||||
|
||||
window.customElements.define('sidenav-menu', SidenavMenu) |
||||
window.customElements.define('sidenav-menu', SidenavMenu); |
||||
|
@ -0,0 +1,259 @@
|
||||
import { LitElement, html, css } from 'lit'; |
||||
import { connect } from 'pwa-helpers'; |
||||
import { store } from '../store.js'; |
||||
import { translate, get } from 'lit-translate'; |
||||
|
||||
import '../functional-components/my-button.js'; |
||||
import { routes } from '../plugins/routes.js'; |
||||
|
||||
class StartMinting extends connect(store)(LitElement) { |
||||
static get properties() { |
||||
return { |
||||
addressInfo: { type: Object }, |
||||
mintingAccountData: { type: Array }, |
||||
errorMsg: { type: String }, |
||||
}; |
||||
} |
||||
|
||||
static get styles() { |
||||
return [ |
||||
css` |
||||
.start-minting-wrapper { |
||||
position: absolute; |
||||
left: 50%; |
||||
transform: translateX(calc(-50% - 10px)); |
||||
} |
||||
`,
|
||||
]; |
||||
} |
||||
|
||||
constructor() { |
||||
super(); |
||||
this.addressInfo = {}; |
||||
this.mintingAccountData = []; |
||||
this.errorMsg = ''; |
||||
} |
||||
|
||||
render() { |
||||
return html` ${this.renderStartMintingButton()} `; |
||||
} |
||||
|
||||
firstUpdated() { |
||||
this.getMintingAcccounts(); |
||||
} |
||||
|
||||
async getMintingAcccounts() { |
||||
const myNode = |
||||
store.getState().app.nodeConfig.knownNodes[ |
||||
store.getState().app.nodeConfig.node |
||||
]; |
||||
const nodeUrl = |
||||
myNode.protocol + '://' + myNode.domain + ':' + myNode.port; |
||||
const url = `${nodeUrl}/admin/mintingaccounts`; |
||||
try { |
||||
const res = await fetch(url); |
||||
const mintingAccountData = await res.json(); |
||||
|
||||
this.mintingAccountData = mintingAccountData; |
||||
} catch (error) { |
||||
this.errorMsg = 'Cannot fetch minting accounts'; |
||||
} |
||||
} |
||||
|
||||
renderStartMintingButton() { |
||||
const myNode = |
||||
store.getState().app.nodeConfig.knownNodes[ |
||||
store.getState().app.nodeConfig.node |
||||
]; |
||||
const nodeUrl = |
||||
myNode.protocol + '://' + myNode.domain + ':' + myNode.port; |
||||
const mintingAccountData = this.mintingAccountData; |
||||
|
||||
const addressInfo = this.addressInfo; |
||||
const rewardShares = async (minterAddr) => { |
||||
const url = `${nodeUrl}/addresses/rewardshares?minters=${minterAddr}&recipients=${minterAddr}`; |
||||
const res = await fetch(url); |
||||
const data = await res.json(); |
||||
return data; |
||||
}; |
||||
const address = |
||||
window.parent.reduxStore.getState().app?.selectedAddress?.address; |
||||
const nonce = |
||||
window.parent.reduxStore.getState().app?.selectedAddress?.nonce; |
||||
const publicAddress = |
||||
window.parent.reduxStore.getState().app?.selectedAddress |
||||
?.base58PublicKey; |
||||
|
||||
const findMintingAccount = mintingAccountData.find((ma) => |
||||
ma.publicKey.includes(publicAddress) |
||||
); |
||||
const isMinterButKeyMintingKeyNotAssigned = |
||||
addressInfo?.error !== 124 && |
||||
addressInfo?.level === 1 && |
||||
!findMintingAccount; |
||||
|
||||
const removeMintingAccount = async (publicKey) => { |
||||
const url = `${nodeUrl}/admin/mintingaccounts?apiKey=${myNode.apiKey}`; |
||||
|
||||
return await fetch(url, { |
||||
method: 'DELETE', |
||||
body: publicKey, |
||||
}); |
||||
}; |
||||
|
||||
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 routes.transaction({ |
||||
data: { |
||||
type: 38, |
||||
nonce: nonce, |
||||
params: { |
||||
recipientPublicKey: publicAddress, |
||||
percentageShare: 0, |
||||
lastReference: mylastRef, |
||||
rewarddialog1: rewarddialog1, |
||||
rewarddialog2: rewarddialog2, |
||||
rewarddialog3: rewarddialog3, |
||||
rewarddialog4: rewarddialog4, |
||||
}, |
||||
}, |
||||
disableModal: true, |
||||
}); |
||||
return myTxnrequest; |
||||
}; |
||||
|
||||
const getTxnRequestResponse = (txnResponse) => { |
||||
if (txnResponse.success === false && txnResponse.message) { |
||||
throw new Error(txnResponse); |
||||
} else if ( |
||||
txnResponse.success === true && |
||||
!txnResponse.data.error |
||||
) { |
||||
let err6string = get('rewardsharepage.rchange21'); |
||||
return err6string; |
||||
} else { |
||||
throw new Error(txnResponse); |
||||
} |
||||
}; |
||||
|
||||
const createSponsorshipKey = async () => { |
||||
let lastRef = await getLastRef(); |
||||
|
||||
let myTransaction = await makeTransactionRequest(lastRef); |
||||
|
||||
getTxnRequestResponse(myTransaction); |
||||
return myTransaction.data; |
||||
}; |
||||
const addMintingAccount = async (sponsorshipKeyValue) => { |
||||
const url = `${nodeUrl}/admin/mintingaccounts?apiKey=${myNode.apiKey}`; |
||||
|
||||
return await fetch(url, { |
||||
method: 'POST', |
||||
body: sponsorshipKeyValue, |
||||
}); |
||||
}; |
||||
|
||||
const getLastRef = async () => { |
||||
const url = `${nodeUrl}/addresses/lastreference/${address}`; |
||||
|
||||
const res = await fetch(url); |
||||
|
||||
const data = await res.text(); |
||||
|
||||
return data; |
||||
}; |
||||
const startMinting = async () => { |
||||
this.errorMsg = ''; |
||||
let rewardSharesList; |
||||
try { |
||||
rewardSharesList = await rewardShares(address); |
||||
} catch (error) { |
||||
this.errorMsg = 'Cannot fetch reward shares'; |
||||
return; |
||||
} |
||||
// check to see if self-share exists
|
||||
|
||||
const findRewardShareData = rewardSharesList.find( |
||||
(rs) => |
||||
rs?.mintingAccount === address && rs?.recipient === address |
||||
); |
||||
let sponsorshipKeyValue = null; |
||||
try { |
||||
if (!findRewardShareData) { |
||||
// if no self-share exits, create one.
|
||||
sponsorshipKeyValue = await createSponsorshipKey(); |
||||
} else { |
||||
sponsorshipKeyValue = |
||||
findRewardShareData.rewardSharePublicKey; |
||||
} |
||||
} catch (error) { |
||||
this.errorMsg = 'Cannot create sponsorship key'; |
||||
return; |
||||
} |
||||
|
||||
// Check to see if a sponsorship key on a newly-level 1 minter exists. If it does, remove it.
|
||||
const findMintingAccountFromOtherUser = mintingAccountData.find( |
||||
(ma) => !ma.publicKey.includes(publicAddress) |
||||
); |
||||
|
||||
try { |
||||
if ( |
||||
findMintingAccountFromOtherUser && |
||||
findMintingAccountFromOtherUser?.publicKey[0] |
||||
) { |
||||
await removeMintingAccount( |
||||
findMintingAccountFromOtherUser?.publicKey[0] |
||||
); |
||||
} |
||||
} catch (error) { |
||||
this.errorMsg = 'Failed to remove key'; |
||||
return; |
||||
} |
||||
|
||||
try { |
||||
await addMintingAccount(sponsorshipKeyValue); |
||||
routes.showSnackBar({ |
||||
data: translate('becomeMinterPage.bchange19'), |
||||
}); |
||||
this.getMintingAcccounts(); |
||||
} catch (error) { |
||||
this.errorMsg = 'Failed to add minting key'; |
||||
return; |
||||
} |
||||
}; |
||||
|
||||
return html` |
||||
${isMinterButKeyMintingKeyNotAssigned |
||||
? html` |
||||
<div class="start-minting-wrapper"> |
||||
<my-button |
||||
label="${translate( |
||||
'becomeMinterPage.bchange18' |
||||
)}" |
||||
?isLoading=${false} |
||||
.onClick=${async () => { |
||||
await startMinting(); |
||||
if (this.errorMsg) { |
||||
routes.showSnackBar({ |
||||
data: this.errorMsg, |
||||
}); |
||||
} |
||||
}} |
||||
></my-button> |
||||
</div> |
||||
` |
||||
: ''} |
||||
`;
|
||||
} |
||||
|
||||
stateChanged(state) { |
||||
this.addressInfo = state.app.accountInfo.addressInfo; |
||||
} |
||||
} |
||||
|
||||
window.customElements.define('start-minting', StartMinting); |
@ -0,0 +1,47 @@
|
||||
import { LitElement, html, css } from 'lit'; |
||||
import '@vaadin/button'; |
||||
import '@polymer/paper-spinner/paper-spinner-lite.js'; |
||||
|
||||
export class MyButton extends LitElement { |
||||
static properties = { |
||||
onClick: { type: Function }, |
||||
isLoading: { type: Boolean }, |
||||
label: { type: String }, |
||||
}; |
||||
|
||||
static styles = css` |
||||
vaadin-button { |
||||
height: 100%; |
||||
margin: 0; |
||||
cursor: pointer; |
||||
min-width: 80px; |
||||
background-color: #03a9f4; |
||||
color: white; |
||||
} |
||||
|
||||
vaadin-button:hover { |
||||
opacity: 0.8; |
||||
} |
||||
`;
|
||||
|
||||
constructor() { |
||||
super(); |
||||
this.onClick = () => {}; |
||||
this.isLoading = false; |
||||
this.label = ''; |
||||
} |
||||
|
||||
render() { |
||||
return html` |
||||
<vaadin-button |
||||
?disabled="${this.isLoading}" |
||||
@click="${this.onClick}" |
||||
> |
||||
${this.isLoading === false |
||||
? html`${this.label}` |
||||
: html`<paper-spinner-lite active></paper-spinner-lite>`} |
||||
</vaadin-button> |
||||
`;
|
||||
} |
||||
} |
||||
customElements.define('my-button', MyButton); |
@ -1,137 +1,141 @@
|
||||
require('events').EventEmitter.defaultMaxListeners = 0 |
||||
const path = require("path"); |
||||
const { nodeResolve } = require("@rollup/plugin-node-resolve"); |
||||
const progress = require("rollup-plugin-progress"); |
||||
require('events').EventEmitter.defaultMaxListeners = 0; |
||||
const path = require('path'); |
||||
const { nodeResolve } = require('@rollup/plugin-node-resolve'); |
||||
const progress = require('rollup-plugin-progress'); |
||||
const replace = require('@rollup/plugin-replace'); |
||||
const globals = require("rollup-plugin-node-globals"); |
||||
const commonjs = require("@rollup/plugin-commonjs"); |
||||
const alias = require("@rollup/plugin-alias"); |
||||
const globals = require('rollup-plugin-node-globals'); |
||||
const commonjs = require('@rollup/plugin-commonjs'); |
||||
const alias = require('@rollup/plugin-alias'); |
||||
const { terser } = require('rollup-plugin-terser'); |
||||
const babel = require("@rollup/plugin-babel"); |
||||
const babel = require('@rollup/plugin-babel'); |
||||
|
||||
const aliases = {}; |
||||
|
||||
const generateRollupConfig = (inputFile, outputFile) => { |
||||
return { |
||||
inputOptions: { |
||||
onwarn: (warning, rollupWarn) => { |
||||
if (warning.code !== 'CIRCULAR_DEPENDENCY') { |
||||
rollupWarn(warning) |
||||
} |
||||
}, |
||||
input: inputFile, |
||||
plugins: [ |
||||
alias({ |
||||
entries: Object.keys(aliases).map((find) => { |
||||
return { |
||||
find, |
||||
replacement: aliases[find], |
||||
}; |
||||
}), |
||||
}), |
||||
nodeResolve({ |
||||
preferBuiltins: false, |
||||
mainFields: ['module', 'browser'] |
||||
}), |
||||
replace({ |
||||
preventAssignment: true, |
||||
"process.env.NODE_ENV": JSON.stringify("production"), |
||||
}), |
||||
commonjs(), |
||||
globals(), |
||||
progress(), |
||||
babel.babel({ |
||||
babelHelpers: 'bundled', |
||||
exclude: "node_modules/**", |
||||
}), |
||||
terser({ |
||||
compress: true, |
||||
output: { |
||||
comments: false, |
||||
}, |
||||
}) |
||||
], |
||||
}, |
||||
outputOptions: { |
||||
file: outputFile, |
||||
format: "umd", |
||||
}, |
||||
}; |
||||
return { |
||||
inputOptions: { |
||||
onwarn: (warning, rollupWarn) => { |
||||
if (warning.code !== 'CIRCULAR_DEPENDENCY') { |
||||
rollupWarn(warning); |
||||
} |
||||
}, |
||||
input: inputFile, |
||||
plugins: [ |
||||
alias({ |
||||
entries: Object.keys(aliases).map((find) => { |
||||
return { |
||||
find, |
||||
replacement: aliases[find], |
||||
}; |
||||
}), |
||||
}), |
||||
nodeResolve({ |
||||
preferBuiltins: false, |
||||
mainFields: ['module', 'browser'], |
||||
}), |
||||
replace({ |
||||
preventAssignment: true, |
||||
'process.env.NODE_ENV': JSON.stringify('production'), |
||||
}), |
||||
commonjs(), |
||||
globals(), |
||||
progress(), |
||||
babel.babel({ |
||||
babelHelpers: 'bundled', |
||||
exclude: 'node_modules/**', |
||||
}), |
||||
terser({ |
||||
compress: true, |
||||
output: { |
||||
comments: false, |
||||
}, |
||||
}), |
||||
], |
||||
}, |
||||
outputOptions: { |
||||
file: outputFile, |
||||
format: 'umd', |
||||
}, |
||||
}; |
||||
}; |
||||
|
||||
const generateForPlugins = () => { |
||||
const configs = [ |
||||
{ |
||||
in: "plugins/core/main.src.js", |
||||
out: "plugins/core/main.js", |
||||
}, |
||||
{ |
||||
in: "plugins/core/trade-portal/trade-portal.src.js", |
||||
out: "plugins/core/trade-portal/trade-portal.js", |
||||
}, |
||||
{ |
||||
in: "plugins/core/wallet/wallet-app.src.js", |
||||
out: "plugins/core/wallet/wallet-app.js", |
||||
}, |
||||
{ |
||||
in: "plugins/core/reward-share/reward-share.src.js", |
||||
out: "plugins/core/reward-share/reward-share.js", |
||||
}, |
||||
{ |
||||
in: "plugins/core/node-management/node-management.src.js", |
||||
out: "plugins/core/node-management/node-management.js", |
||||
}, |
||||
{ |
||||
in: "plugins/core/group-management/group-management.src.js", |
||||
out: "plugins/core/group-management/group-management.js", |
||||
}, |
||||
{ |
||||
in: "plugins/core/name-registration/name-registration.src.js", |
||||
out: "plugins/core/name-registration/name-registration.js", |
||||
}, |
||||
{ |
||||
in: "plugins/core/qdn/websites.src.js", |
||||
out: "plugins/core/qdn/websites.js", |
||||
}, |
||||
{ |
||||
in: "plugins/core/qdn/publish/publish.src.js", |
||||
out: "plugins/core/qdn/publish/publish.js", |
||||
}, |
||||
{ |
||||
in: "plugins/core/qdn/browser/browser.src.js", |
||||
out: "plugins/core/qdn/browser/browser.js", |
||||
}, |
||||
{ |
||||
in: "plugins/core/qdn/data-management/data-management.src.js", |
||||
out: "plugins/core/qdn/data-management/data-management.js", |
||||
}, |
||||
{ |
||||
in: "plugins/core/messaging/messaging.src.js", |
||||
out: "plugins/core/messaging/messaging.js", |
||||
}, |
||||
{ |
||||
in: "plugins/core/messaging/chain-messaging/chain-messaging.src.js", |
||||
out: "plugins/core/messaging/chain-messaging/chain-messaging.js", |
||||
}, |
||||
{ |
||||
in: "plugins/core/messaging/q-chat/q-chat.src.js", |
||||
out: "plugins/core/messaging/q-chat/q-chat.js", |
||||
}, |
||||
{ |
||||
in: "plugins/core/minting/minting-info.src.js", |
||||
out: "plugins/core/minting/minting-info.js", |
||||
}, |
||||
{ |
||||
in: "plugins/core/puzzles/puzzles.src.js", |
||||
out: "plugins/core/puzzles/puzzles.js", |
||||
} |
||||
].map((file) => { |
||||
return generateRollupConfig( |
||||
path.join(__dirname, file.in), |
||||
path.join(__dirname, file.out) |
||||
); |
||||
}); |
||||
return configs; |
||||
const configs = [ |
||||
{ |
||||
in: 'plugins/core/main.src.js', |
||||
out: 'plugins/core/main.js', |
||||
}, |
||||
{ |
||||
in: 'plugins/core/trade-portal/trade-portal.src.js', |
||||
out: 'plugins/core/trade-portal/trade-portal.js', |
||||
}, |
||||
{ |
||||
in: 'plugins/core/wallet/wallet-app.src.js', |
||||
out: 'plugins/core/wallet/wallet-app.js', |
||||
}, |
||||
{ |
||||
in: 'plugins/core/reward-share/reward-share.src.js', |
||||
out: 'plugins/core/reward-share/reward-share.js', |
||||
}, |
||||
{ |
||||
in: 'plugins/core/node-management/node-management.src.js', |
||||
out: 'plugins/core/node-management/node-management.js', |
||||
}, |
||||
{ |
||||
in: 'plugins/core/group-management/group-management.src.js', |
||||
out: 'plugins/core/group-management/group-management.js', |
||||
}, |
||||
{ |
||||
in: 'plugins/core/name-registration/name-registration.src.js', |
||||
out: 'plugins/core/name-registration/name-registration.js', |
||||
}, |
||||
{ |
||||
in: 'plugins/core/qdn/websites.src.js', |
||||
out: 'plugins/core/qdn/websites.js', |
||||
}, |
||||
{ |
||||
in: 'plugins/core/qdn/publish/publish.src.js', |
||||
out: 'plugins/core/qdn/publish/publish.js', |
||||
}, |
||||
{ |
||||
in: 'plugins/core/qdn/browser/browser.src.js', |
||||
out: 'plugins/core/qdn/browser/browser.js', |
||||
}, |
||||
{ |
||||
in: 'plugins/core/qdn/data-management/data-management.src.js', |
||||
out: 'plugins/core/qdn/data-management/data-management.js', |
||||
}, |
||||
{ |
||||
in: 'plugins/core/messaging/messaging.src.js', |
||||
out: 'plugins/core/messaging/messaging.js', |
||||
}, |
||||
{ |
||||
in: 'plugins/core/messaging/chain-messaging/chain-messaging.src.js', |
||||
out: 'plugins/core/messaging/chain-messaging/chain-messaging.js', |
||||
}, |
||||
{ |
||||
in: 'plugins/core/messaging/q-chat/q-chat.src.js', |
||||
out: 'plugins/core/messaging/q-chat/q-chat.js', |
||||
}, |
||||
{ |
||||
in: 'plugins/core/minting/minting-info.src.js', |
||||
out: 'plugins/core/minting/minting-info.js', |
||||
}, |
||||
{ |
||||
in: 'plugins/core/become-minter/become-minter.src.js', |
||||
out: 'plugins/core/become-minter/become-minter.js', |
||||
}, |
||||
{ |
||||
in: 'plugins/core/puzzles/puzzles.src.js', |
||||
out: 'plugins/core/puzzles/puzzles.js', |
||||
}, |
||||
].map((file) => { |
||||
return generateRollupConfig( |
||||
path.join(__dirname, file.in), |
||||
path.join(__dirname, file.out) |
||||
); |
||||
}); |
||||
return configs; |
||||
}; |
||||
|
||||
module.exports = generateForPlugins; |
||||
|
@ -0,0 +1,229 @@
|
||||
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; |
||||
width: 100%; |
||||
} |
||||
.inner-container { |
||||
display: flex; |
||||
align-items: center; |
||||
flex-direction: column; |
||||
width: 100%; |
||||
} |
||||
|
||||
.description { |
||||
color: var(--black); |
||||
} |
||||
|
||||
.message { |
||||
color: var(--gray); |
||||
} |
||||
|
||||
.sub-main { |
||||
width: 95%; |
||||
display: flex; |
||||
|
||||
flex-direction: column; |
||||
max-width: 800px; |
||||
} |
||||
|
||||
.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%; |
||||
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); |
||||
} |
||||
} |
||||
`;
|
@ -0,0 +1,199 @@
|
||||
import { LitElement, html } from 'lit'; |
||||
import { Epml } from '../../../epml.js'; |
||||
import '../components/ButtonIconCopy.js'; |
||||
import { use, translate, registerTranslateConfig } from 'lit-translate'; |
||||
import { blocksNeed } from '../../utils/blocks-needed.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 { pageStyles } from './become-minter-css.src.js'; |
||||
import './components/not-sponsored.src'; |
||||
import './components/yes-sponsored.src'; |
||||
const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }); |
||||
|
||||
class BecomeMinter 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 }, |
||||
}; |
||||
} |
||||
|
||||
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; |
||||
} |
||||
|
||||
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 getMintingAcccounts() { |
||||
const mintingAccountData = await parentEpml.request('apiCall', { |
||||
url: `/admin/mintingaccounts`, |
||||
}); |
||||
return mintingAccountData; |
||||
} |
||||
|
||||
async atMount() { |
||||
this.changeLanguage(); |
||||
|
||||
this.addressInfo = |
||||
window.parent.reduxStore.getState().app.accountInfo.addressInfo; |
||||
this.isPageLoading = true; |
||||
try { |
||||
const [nodeInfo, myRewardShareArray, mintingaccounts] = |
||||
await Promise.all([ |
||||
this.getNodeInfo(), |
||||
this.getRewardShareRelationship( |
||||
window.parent.reduxStore.getState().app?.selectedAddress |
||||
?.address |
||||
), |
||||
this.getMintingAcccounts(), |
||||
]); |
||||
|
||||
this.nodeInfo = nodeInfo; |
||||
this.rewardSharePublicKey = |
||||
myRewardShareArray[0]?.rewardSharePublicKey; |
||||
this.isPageLoading = false; |
||||
this.mintingAccountData = mintingaccounts; |
||||
} 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?recipients=${recipientAddress}`, |
||||
}); |
||||
|
||||
return myRewardShareArray; |
||||
} |
||||
|
||||
_levelUpBlocks() { |
||||
let countBlocksString = ( |
||||
blocksNeed(0) - |
||||
(this.addressInfo?.blocksMinted + |
||||
this.addressInfo?.blocksMintedAdjustment) |
||||
).toString(); |
||||
return countBlocksString; |
||||
} |
||||
|
||||
render() { |
||||
console.log({ mintingAccountData: this.mintingAccountData }); |
||||
const findMintingAccount = this.mintingAccountData?.find( |
||||
(ma) => !!ma.publicKey |
||||
); |
||||
|
||||
const isAlreadySponsored = |
||||
this.addressInfo?.error !== 124 && |
||||
this.addressInfo?.level === 0 && |
||||
findMintingAccount; |
||||
|
||||
return html` |
||||
${this.isPageLoading |
||||
? html` |
||||
<div class="loadingContainer"> |
||||
<div class="loading"></div> |
||||
</div> |
||||
<div class="backdrop"></div> |
||||
` |
||||
: ''} |
||||
|
||||
<div class="page-container"> |
||||
<h1 class="header-title"> |
||||
${translate('mintingpage.mchange32')} |
||||
</h1> |
||||
<div class="fullWidth"> |
||||
<hr class="divider" /> |
||||
</div> |
||||
|
||||
${isAlreadySponsored |
||||
? '' |
||||
: html` |
||||
<not-sponsored |
||||
.atMount="${() => this.atMount()}" |
||||
></not-sponsored> |
||||
`}
|
||||
${!isAlreadySponsored |
||||
? '' |
||||
: html` |
||||
<yes-sponsored |
||||
.rewardSharePublicKey=${this |
||||
.rewardSharePublicKey} |
||||
.addressInfo=${this.addressInfo} |
||||
></yes-sponsored> |
||||
`}
|
||||
</div> |
||||
`;
|
||||
} |
||||
} |
||||
|
||||
window.customElements.define('become-minter', BecomeMinter); |
@ -0,0 +1,141 @@
|
||||
import { LitElement, html } from 'lit'; |
||||
import { Epml } from '../../../../epml.js'; |
||||
import '../../components/ButtonIconCopy.js'; |
||||
import { use, translate, registerTranslateConfig } from 'lit-translate'; |
||||
|
||||
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 { pageStyles } from '../become-minter-css.src.js'; |
||||
|
||||
const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }); |
||||
|
||||
class NotSponsored extends LitElement { |
||||
static properties = { |
||||
atMount: { type: Function }, |
||||
isLoadingSponsorshipKeySubmit: { type: Boolean }, |
||||
sponsorshipKeyValue: { type: String }, |
||||
addMintingAccountMessage: { type: String }, |
||||
}; |
||||
|
||||
static styles = [pageStyles]; |
||||
|
||||
constructor() { |
||||
super(); |
||||
this.isLoadingSponsorshipKeySubmit = false; |
||||
this.sponsorshipKeyValue = ''; |
||||
this.addMintingAccountMessage = ''; |
||||
this.atMount = () => {}; |
||||
} |
||||
|
||||
renderErr1Text() { |
||||
return html`${translate('nodepage.nchange27')}`; |
||||
} |
||||
|
||||
renderErr2Text() { |
||||
return html`${translate('nodepage.nchange28')}`; |
||||
} |
||||
|
||||
getApiKey() { |
||||
const myNode = |
||||
window.parent.reduxStore.getState().app.nodeConfig.knownNodes[ |
||||
window.parent.reduxStore.getState().app.nodeConfig.node |
||||
]; |
||||
let apiKey = myNode.apiKey; |
||||
return apiKey; |
||||
} |
||||
|
||||
addMintingAccount(e) { |
||||
this.isLoadingSponsorshipKeySubmit = true; |
||||
this.addMintingAccountMessage = 'Loading...'; |
||||
|
||||
parentEpml |
||||
.request('apiCall', { |
||||
url: `/admin/mintingaccounts?apiKey=${this.getApiKey()}`, |
||||
method: 'POST', |
||||
body: this.sponsorshipKeyValue, |
||||
}) |
||||
.then((res) => { |
||||
if (res === true) { |
||||
// refetch data
|
||||
this.atMount(); |
||||
this.sponsorshipKeyValue = ''; |
||||
this.addMintingAccountMessage = this.renderErr1Text(); |
||||
this.isLoadingSponsorshipKeySubmit = false; |
||||
} else { |
||||
this.sponsorshipKeyValue = ''; |
||||
this.addMintingAccountMessage = this.renderErr2Text(); |
||||
this.isLoadingSponsorshipKeySubmit = false; |
||||
} |
||||
}); |
||||
} |
||||
|
||||
inputHandler(e) { |
||||
this.sponsorshipKeyValue = e.target.value; |
||||
} |
||||
|
||||
render() { |
||||
return html` |
||||
<div class="inner-container"> |
||||
<div class="sub-main"> |
||||
<h2 class="level-black"> |
||||
${translate('mintingpage.mchange33')} |
||||
</h2> |
||||
<p class="description"> |
||||
${translate('mintingpage.mchange34')} |
||||
</p> |
||||
<h2 class="level-black"> |
||||
${translate('mintingpage.mchange35')} |
||||
</h2> |
||||
<p class="description"> |
||||
${translate('mintingpage.mchange36')} |
||||
</p> |
||||
<p class="description"> |
||||
${translate('mintingpage.mchange37')} |
||||
</p> |
||||
|
||||
<p class="message">${this.addMintingAccountMessage}</p> |
||||
<div class="form-wrapper"> |
||||
<div class="form-item form-item--input"> |
||||
<mwc-textfield |
||||
?disabled="${this |
||||
.isLoadingSponsorshipKeySubmit}" |
||||
label="${translate( |
||||
'becomeMinterPage.bchange8' |
||||
)}" |
||||
id="addSponsorshipKey" |
||||
@input="${this.inputHandler}" |
||||
.value="${this.sponsorshipKeyValue || ''}" |
||||
fullWidth |
||||
> |
||||
</mwc-textfield> |
||||
</div> |
||||
|
||||
<div class="form-item form-item--button"> |
||||
<vaadin-button |
||||
?disabled="${this |
||||
.isLoadingSponsorshipKeySubmit}" |
||||
@click="${this.addMintingAccount}" |
||||
> |
||||
${this.isLoadingSponsorshipKeySubmit === false |
||||
? html`${translate( |
||||
'puzzlepage.pchange15' |
||||
)}` |
||||
: html`<paper-spinner-lite
|
||||
active |
||||
></paper-spinner-lite>`} |
||||
</vaadin-button> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
`;
|
||||
} |
||||
} |
||||
|
||||
window.customElements.define('not-sponsored', NotSponsored); |
@ -0,0 +1,123 @@
|
||||
import { LitElement, html } from 'lit'; |
||||
import { Epml } from '../../../../epml.js'; |
||||
import '../../components/ButtonIconCopy.js'; |
||||
import { use, translate, registerTranslateConfig } from 'lit-translate'; |
||||
|
||||
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 { blocksNeed } from '../../../utils/blocks-needed.js'; |
||||
import { pageStyles } from '../become-minter-css.src.js'; |
||||
|
||||
class YesSponsored extends LitElement { |
||||
static get properties() { |
||||
return { |
||||
addressInfo: { type: Object }, |
||||
rewardSharePublicKey: { type: String }, |
||||
}; |
||||
} |
||||
|
||||
constructor() { |
||||
super(); |
||||
|
||||
this.addressInfo = {}; |
||||
this.rewardSharePublicKey = ''; |
||||
} |
||||
|
||||
static styles = [pageStyles]; |
||||
|
||||
_levelUpBlocks() { |
||||
let countBlocksString = ( |
||||
blocksNeed(0) - |
||||
(this.addressInfo?.blocksMinted + |
||||
this.addressInfo?.blocksMintedAdjustment) |
||||
).toString(); |
||||
return countBlocksString; |
||||
} |
||||
|
||||
render() { |
||||
return html` |
||||
<div class="inner-container"> |
||||
<div class="column column-center"> |
||||
<div class="column column-center"> |
||||
<span class="level-black" |
||||
>${translate('becomeMinterPage.bchange10')}</span |
||||
> |
||||
<hr |
||||
style="width: 50%; color: #eee; border-radius: 80%; margin-bottom: 2rem;" |
||||
/> |
||||
</div> |
||||
<br /> |
||||
<div class="row row-center gap"> |
||||
<div class="content-box"> |
||||
<span class="title" |
||||
>${translate( |
||||
'walletpage.wchange41' |
||||
)}</span |
||||
> |
||||
<hr |
||||
style="color: #eee; border-radius: 90%; margin-bottom: 1rem;" |
||||
/> |
||||
<h4>${translate('becomeMinterPage.bchange12')}</h4> |
||||
</div> |
||||
<div class="content-box"> |
||||
<span class="title" |
||||
>${translate( |
||||
'becomeMinterPage.bchange13' |
||||
)}</span |
||||
> |
||||
<hr |
||||
style="color: #eee; border-radius: 90%; margin-bottom: 1rem;" |
||||
/> |
||||
<h4> |
||||
${this._levelUpBlocks()} |
||||
${translate('mintingpage.mchange26')} |
||||
</h4> |
||||
</div> |
||||
<div class="content-box"> |
||||
<span class="title" |
||||
>${translate( |
||||
'becomeMinterPage.bchange15' |
||||
)}</span |
||||
> |
||||
<hr |
||||
style="color: #eee; border-radius: 90%; margin-bottom: 1rem;" |
||||
/> |
||||
<h4 class="no-margin"> |
||||
${translate('becomeMinterPage.bchange16')} |
||||
</h4> |
||||
<div class="row row-center column-center no-wrap"> |
||||
<p class="address"> |
||||
${this.rewardSharePublicKey} |
||||
</p> |
||||
<button-icon-copy |
||||
title="${translate('walletpage.wchange3')}" |
||||
onSuccessMessage="${translate( |
||||
'walletpage.wchange4' |
||||
)}" |
||||
onErrorMessage="${translate( |
||||
'walletpage.wchange39' |
||||
)}" |
||||
textToCopy=${this.rewardSharePublicKey} |
||||
buttonSize="28px" |
||||
iconSize="16px" |
||||
color="var(--copybutton)" |
||||
offsetLeft="4px" |
||||
> |
||||
</button-icon-copy> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<br /> |
||||
</div> |
||||
</div> |
||||
`;
|
||||
} |
||||
} |
||||
|
||||
window.customElements.define('yes-sponsored', YesSponsored); |
@ -0,0 +1,53 @@
|
||||
<!DOCTYPE html> |
||||
<html> |
||||
<head> |
||||
<link rel="stylesheet" href="/font/material-icons.css" /> |
||||
<link rel="stylesheet" href="/font/switch-theme.css" /> |
||||
<script> |
||||
const checkBack = localStorage.getItem('qortalTheme'); |
||||
if (checkBack === 'dark') { |
||||
newtheme = 'dark'; |
||||
} else { |
||||
newtheme = 'light'; |
||||
} |
||||
document.querySelector('html').setAttribute('theme', newtheme); |
||||
</script> |
||||
<style> |
||||
html { |
||||
--scrollbarBG: #a1a1a1; |
||||
--thumbBG: #6a6c75; |
||||
} |
||||
|
||||
*::-webkit-scrollbar { |
||||
width: 11px; |
||||
} |
||||
|
||||
* { |
||||
scrollbar-width: thin; |
||||
scrollbar-color: var(--thumbBG) var(--scrollbarBG); |
||||
} |
||||
|
||||
*::-webkit-scrollbar-track { |
||||
background: var(--scrollbarBG); |
||||
} |
||||
|
||||
*::-webkit-scrollbar-thumb { |
||||
background-color: var(--thumbBG); |
||||
border-radius: 6px; |
||||
border: 3px solid var(--scrollbarBG); |
||||
} |
||||
|
||||
html, |
||||
body { |
||||
margin: 0; |
||||
font-family: 'Roboto', sans-serif; |
||||
background: var(--plugback); |
||||
} |
||||
</style> |
||||
</head> |
||||
|
||||
<body> |
||||
<become-minter></become-minter> |
||||
<script src="become-minter.js"></script> |
||||
</body> |
||||
</html> |
@ -1,132 +1,143 @@
|
||||
import { parentEpml } from './connect.js' |
||||
import './streams/streams.js' |
||||
|
||||
let config = {} |
||||
let haveRegisteredNodeManagement = false |
||||
import { parentEpml } from './connect.js'; |
||||
import './streams/streams.js'; |
||||
|
||||
let config = {}; |
||||
let haveRegisteredNodeManagement = false; |
||||
|
||||
parentEpml.ready().then(() => { |
||||
// pluginUrlsConf
|
||||
let pluginUrlsConf = [ |
||||
{ |
||||
url: 'minting', |
||||
domain: 'core', |
||||
page: 'minting/index.html', |
||||
title: 'Minting Details', |
||||
icon: 'vaadin:info-circle', |
||||
menus: [], |
||||
parent: false |
||||
}, |
||||
{ |
||||
url: 'wallet', |
||||
domain: 'core', |
||||
page: 'wallet/index.html', |
||||
title: 'Wallet', |
||||
icon: 'vaadin:wallet', |
||||
menus: [], |
||||
parent: false |
||||
}, |
||||
{ |
||||
url: 'trade-portal', |
||||
domain: 'core', |
||||
page: 'trade-portal/index.html', |
||||
title: 'Trade Portal', |
||||
icon: 'vaadin:bullets', |
||||
menus: [], |
||||
parent: false |
||||
}, |
||||
{ |
||||
url: 'reward-share', |
||||
domain: 'core', |
||||
page: 'reward-share/index.html', |
||||
title: 'Reward Share', |
||||
icon: 'vaadin:share-square', |
||||
menus: [], |
||||
parent: false |
||||
}, |
||||
{ |
||||
url: 'name-registration', |
||||
domain: 'core', |
||||
page: 'name-registration/index.html', |
||||
title: 'Name Registration', |
||||
icon: 'vaadin:user-check', |
||||
menus: [], |
||||
parent: false |
||||
}, |
||||
{ |
||||
url: 'websites', |
||||
domain: 'core', |
||||
page: 'qdn/index.html', |
||||
title: 'Websites', |
||||
icon: 'vaadin:desktop', |
||||
menus: [], |
||||
parent: false |
||||
}, |
||||
{ |
||||
url: 'data-management', |
||||
domain: 'core', |
||||
page: 'qdn/data-management/index.html', |
||||
title: 'Data Management', |
||||
icon: 'vaadin:database', |
||||
menus: [], |
||||
parent: false |
||||
}, |
||||
{ |
||||
url: 'q-chat', |
||||
domain: 'core', |
||||
page: 'messaging/q-chat/index.html', |
||||
title: 'Q-Chat', |
||||
icon: 'vaadin:chat', |
||||
menus: [], |
||||
parent: false |
||||
}, |
||||
{ |
||||
url: 'group-management', |
||||
domain: 'core', |
||||
page: 'group-management/index.html', |
||||
title: 'Group Management', |
||||
icon: 'vaadin:group', |
||||
menus: [], |
||||
parent: false |
||||
}, |
||||
{ |
||||
url: 'puzzles', |
||||
domain: 'core', |
||||
page: 'puzzles/index.html', |
||||
title: 'Puzzles', |
||||
icon: 'vaadin:puzzle-piece', |
||||
menus: [], |
||||
parent: false |
||||
} |
||||
] |
||||
// pluginUrlsConf
|
||||
let pluginUrlsConf = [ |
||||
{ |
||||
url: 'minting', |
||||
domain: 'core', |
||||
page: 'minting/index.html', |
||||
title: 'Minting Details', |
||||
icon: 'vaadin:info-circle', |
||||
menus: [], |
||||
parent: false, |
||||
}, |
||||
{ |
||||
url: 'become-minter', |
||||
domain: 'core', |
||||
page: 'become-minter/index.html', |
||||
title: 'Become a Minter', |
||||
icon: 'vaadin:info-circle', |
||||
menus: [], |
||||
parent: false, |
||||
}, |
||||
{ |
||||
url: 'wallet', |
||||
domain: 'core', |
||||
page: 'wallet/index.html', |
||||
title: 'Wallet', |
||||
icon: 'vaadin:wallet', |
||||
menus: [], |
||||
parent: false, |
||||
}, |
||||
{ |
||||
url: 'trade-portal', |
||||
domain: 'core', |
||||
page: 'trade-portal/index.html', |
||||
title: 'Trade Portal', |
||||
icon: 'vaadin:bullets', |
||||
menus: [], |
||||
parent: false, |
||||
}, |
||||
{ |
||||
url: 'reward-share', |
||||
domain: 'core', |
||||
page: 'reward-share/index.html', |
||||
title: 'Reward Share', |
||||
icon: 'vaadin:share-square', |
||||
menus: [], |
||||
parent: false, |
||||
}, |
||||
{ |
||||
url: 'name-registration', |
||||
domain: 'core', |
||||
page: 'name-registration/index.html', |
||||
title: 'Name Registration', |
||||
icon: 'vaadin:user-check', |
||||
menus: [], |
||||
parent: false, |
||||
}, |
||||
{ |
||||
url: 'websites', |
||||
domain: 'core', |
||||
page: 'qdn/index.html', |
||||
title: 'Websites', |
||||
icon: 'vaadin:desktop', |
||||
menus: [], |
||||
parent: false, |
||||
}, |
||||
{ |
||||
url: 'data-management', |
||||
domain: 'core', |
||||
page: 'qdn/data-management/index.html', |
||||
title: 'Data Management', |
||||
icon: 'vaadin:database', |
||||
menus: [], |
||||
parent: false, |
||||
}, |
||||
{ |
||||
url: 'q-chat', |
||||
domain: 'core', |
||||
page: 'messaging/q-chat/index.html', |
||||
title: 'Q-Chat', |
||||
icon: 'vaadin:chat', |
||||
menus: [], |
||||
parent: false, |
||||
}, |
||||
{ |
||||
url: 'group-management', |
||||
domain: 'core', |
||||
page: 'group-management/index.html', |
||||
title: 'Group Management', |
||||
icon: 'vaadin:group', |
||||
menus: [], |
||||
parent: false, |
||||
}, |
||||
{ |
||||
url: 'puzzles', |
||||
domain: 'core', |
||||
page: 'puzzles/index.html', |
||||
title: 'Puzzles', |
||||
icon: 'vaadin:puzzle-piece', |
||||
menus: [], |
||||
parent: false, |
||||
}, |
||||
]; |
||||
|
||||
const registerPlugins = (pluginInfo) => { |
||||
parentEpml.request('registerUrl', pluginInfo) |
||||
} |
||||
const registerPlugins = (pluginInfo) => { |
||||
parentEpml.request('registerUrl', pluginInfo); |
||||
}; |
||||
|
||||
const checkNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] |
||||
const checkNode = |
||||
window.parent.reduxStore.getState().app.nodeConfig.knownNodes[ |
||||
window.parent.reduxStore.getState().app.nodeConfig.node |
||||
]; |
||||
|
||||
parentEpml.subscribe('config', c => { |
||||
config = JSON.parse(c) |
||||
parentEpml.subscribe('config', (c) => { |
||||
config = JSON.parse(c); |
||||
|
||||
// Only register node management if node management is enabled and it hasn't already been registered
|
||||
if (!haveRegisteredNodeManagement && checkNode.enableManagement) { |
||||
haveRegisteredNodeManagement = true |
||||
// Only register node management if node management is enabled and it hasn't already been registered
|
||||
if (!haveRegisteredNodeManagement && checkNode.enableManagement) { |
||||
haveRegisteredNodeManagement = true; |
||||
|
||||
let nodeManagementConf = { |
||||
url: 'node-management', |
||||
domain: 'core', |
||||
page: 'node-management/index.html', |
||||
title: 'Node Management', |
||||
icon: 'vaadin:cloud', |
||||
menus: [], |
||||
parent: false |
||||
} |
||||
let nodeManagementConf = { |
||||
url: 'node-management', |
||||
domain: 'core', |
||||
page: 'node-management/index.html', |
||||
title: 'Node Management', |
||||
icon: 'vaadin:cloud', |
||||
menus: [], |
||||
parent: false, |
||||
}; |
||||
|
||||
let _pluginUrlsConf = [...pluginUrlsConf, nodeManagementConf] |
||||
registerPlugins(_pluginUrlsConf) |
||||
} else { |
||||
registerPlugins(pluginUrlsConf) |
||||
} |
||||
}) |
||||
}) |
||||
let _pluginUrlsConf = [...pluginUrlsConf, nodeManagementConf]; |
||||
registerPlugins(_pluginUrlsConf); |
||||
} else { |
||||
registerPlugins(pluginUrlsConf); |
||||
} |
||||
}); |
||||
}); |
||||
|
@ -0,0 +1,55 @@
|
||||
<!DOCTYPE html> |
||||
<html> |
||||
|
||||
<head> |
||||
<link rel="stylesheet" href="/font/material-icons.css"> |
||||
<link rel="stylesheet" href="/font/switch-theme.css"> |
||||
<script> |
||||
const checkBack = localStorage.getItem('qortalTheme') |
||||
if (checkBack === 'dark') { |
||||
newtheme = 'dark'; |
||||
} else { |
||||
newtheme = 'light'; |
||||
} |
||||
document.querySelector('html').setAttribute('theme', newtheme); |
||||
</script> |
||||
<style> |
||||
html { |
||||
--scrollbarBG: #a1a1a1; |
||||
--thumbBG: #6a6c75; |
||||
} |
||||
|
||||
*::-webkit-scrollbar { |
||||
width: 11px; |
||||
} |
||||
|
||||
* { |
||||
scrollbar-width: thin; |
||||
scrollbar-color: var(--thumbBG) var(--scrollbarBG); |
||||
} |
||||
|
||||
*::-webkit-scrollbar-track { |
||||
background: var(--scrollbarBG); |
||||
} |
||||
|
||||
*::-webkit-scrollbar-thumb { |
||||
background-color: var(--thumbBG); |
||||
border-radius: 6px; |
||||
border: 3px solid var(--scrollbarBG); |
||||
} |
||||
|
||||
html, |
||||
body { |
||||
margin: 0; |
||||
font-family: "Roboto", sans-serif; |
||||
background: var(--plugback); |
||||
} |
||||
</style> |
||||
</head> |
||||
|
||||
<body> |
||||
<trade-bot></trade-bot> |
||||
<script src="trade-bot.js"></script> |
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,23 @@
|
||||
export const blocksNeed = (level) => { |
||||
if (level === 0) { |
||||
return '7200'; |
||||
} else if (level === 1) { |
||||
return '72000'; |
||||
} else if (level === 2) { |
||||
return '201600'; |
||||
} else if (level === 3) { |
||||
return '374400'; |
||||
} else if (level === 4) { |
||||
return '618400'; |
||||
} else if (level === 5) { |
||||
return '964000'; |
||||
} else if (level === 6) { |
||||
return '1482400'; |
||||
} else if (level === 7) { |
||||
return '2173600'; |
||||
} else if (level === 8) { |
||||
return '3037600'; |
||||
} else if (level === 9) { |
||||
return '4074400'; |
||||
} |
||||
}; |
Loading…
Reference in new issue