diff --git a/cashtab/package-lock.json b/cashtab/package-lock.json --- a/cashtab/package-lock.json +++ b/cashtab/package-lock.json @@ -1,12 +1,12 @@ { "name": "cashtab", - "version": "2.34.1", + "version": "2.34.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "cashtab", - "version": "2.34.1", + "version": "2.34.2", "dependencies": { "@bitgo/utxo-lib": "^9.33.0", "@zxing/browser": "^0.1.4", diff --git a/cashtab/package.json b/cashtab/package.json --- a/cashtab/package.json +++ b/cashtab/package.json @@ -1,6 +1,6 @@ { "name": "cashtab", - "version": "2.34.1", + "version": "2.34.2", "private": true, "scripts": { "start": "node scripts/start.js", diff --git a/cashtab/src/components/Airdrop/Airdrop.js b/cashtab/src/components/Airdrop/Airdrop.js --- a/cashtab/src/components/Airdrop/Airdrop.js +++ b/cashtab/src/components/Airdrop/Airdrop.js @@ -4,7 +4,6 @@ import React, { useState, useEffect } from 'react'; import { useLocation } from 'react-router-dom'; -import PropTypes from 'prop-types'; import { BN } from 'slp-mdm'; import styled from 'styled-components'; import { WalletContext } from 'wallet/context'; @@ -24,6 +23,7 @@ import { CopyPasteIcon } from 'components/Common/CustomIcons'; import { getTokenGenesisInfo } from 'chronik'; import cashaddr from 'ecashaddrjs'; +import Spinner from 'components/Common/Spinner'; const AirdropForm = styled.div` margin-top: 24px; @@ -54,13 +54,14 @@ justify-content: center; `; -const Airdrop = ({ passLoadingStatus }) => { +const Airdrop = () => { const ContextValue = React.useContext(WalletContext); const { chronik, cashtabState, updateCashtabState } = ContextValue; const { wallets, cashtabCache } = cashtabState; const wallet = wallets.length > 0 ? wallets[0] : false; const location = useLocation(); + const [calculatingAirdrop, setCalculatingAirdrop] = useState(false); const [formData, setFormData] = useState({ tokenId: '', totalAirdrop: '', @@ -230,7 +231,7 @@ const calculateXecAirdrop = async () => { // Airdrop txs are instant for most tokens, but can take some time for // tokens with a large amount of holders - passLoadingStatus(true); + setCalculatingAirdrop(true); // hide any previous airdrop outputs setShowAirdropOutputs(false); @@ -242,7 +243,7 @@ toast.error('Error retrieving airdrop recipients'); // Clear result field from earlier calc, if present, on any error setAirdropRecipients(''); - return passLoadingStatus(false); + return setCalculatingAirdrop(false); } const excludedAddresses = []; @@ -257,7 +258,7 @@ ); // Clear result field from earlier calc, if present, on any error setAirdropRecipients(''); - return passLoadingStatus(false); + return setCalculatingAirdrop(false); } excludedAddresses.push(mintAddress); } @@ -278,7 +279,7 @@ ); // Clear result field from earlier calc, if present, on any error setAirdropRecipients(''); - return passLoadingStatus(false); + return setCalculatingAirdrop(false); } undecimalizedMinTokenAmount = new BN(ignoreMinEtokenBalanceAmount) .times(10 ** tokenInfo.genesisInfo.decimals) @@ -310,7 +311,7 @@ setAirdropRecipients(''); toast.error(`${err}`); } - return passLoadingStatus(false); + return setCalculatingAirdrop(false); }; const handleIgnoreMinEtokenBalanceAmt = e => { @@ -381,201 +382,187 @@ } return ( - - - - - - - - - - - - - - - { - setEqualDistributionRatio(prev => !prev); - }} - /> - - {equalDistributionRatio - ? ` Airdrop + <> + {calculatingAirdrop && } + + + + + + + + + + + + + + + { + setEqualDistributionRatio(prev => !prev); + }} + /> + + {equalDistributionRatio + ? ` Airdrop the same for everyone` - : ` Airdrop + : ` Airdrop scaled to token balance`} - - - - - - - handleIgnoreOwnAddress(prev => !prev) - } - /> - Ignore my own address - - - - - - handleIgnoreMintAddress(prev => !prev) - } - /> - Ignore eToken minter address - - - - - - handleIgnoreMinEtokenBalanceAmt(prev => !prev) - } - /> - Minimum eToken holder balance - - {ignoreMinEtokenBalance && ( - - )} - - - - - handleIgnoreCustomAddresses(prev => !prev) - } - /> - Ignore custom addresses - - {ignoreCustomAddresses && ( -