diff --git a/locale/da/texts.po b/locale/da/texts.po index 030b0ada1..0185c609d 100644 --- a/locale/da/texts.po +++ b/locale/da/texts.po @@ -73,7 +73,7 @@ msgstr "" msgid "CREATE FEE TOKEN" msgstr "" -#: src/screens/CreateTokenAmount.js:36 src/screens/CreateTokenConfirm.js:84 +#: src/screens/CreateTokenAmount.js:36 src/screens/CreateTokenConfirm.js:87 #: src/screens/CreateTokenDepositNotice.js:42 #: src/screens/CreateTokenTypeNotice.js:94 src/utils.js:654 msgid "CREATE TOKEN" @@ -359,63 +359,67 @@ msgstr "" msgid "Next" msgstr "Næste" -#: src/screens/CreateTokenConfirm.js:34 +#: src/screens/CreateTokenConfirm.js:31 msgid "" "You chose to create a **Deposit-Based Token**, which requires a 1% HTR " "deposit." msgstr "" -#: src/screens/CreateTokenConfirm.js:36 +#: src/screens/CreateTokenConfirm.js:33 msgid "" "You chose to create a **Fee-Based Token**, so a small fee will be applied to " "each future transaction of this token." msgstr "" -#: src/screens/CreateTokenConfirm.js:140 +#: src/screens/CreateTokenConfirm.js:145 msgid "Creating token" msgstr "Opretter token" -#: src/screens/CreateTokenConfirm.js:155 +#: src/screens/CreateTokenConfirm.js:151 +msgid "Building the transaction" +msgstr "" + +#: src/screens/CreateTokenConfirm.js:166 msgid "Enter your 6-digit pin to create your token" msgstr "Indtast din 6-cifrede pin for at oprette din token" -#: src/screens/CreateTokenConfirm.js:156 +#: src/screens/CreateTokenConfirm.js:167 msgid "Authorize token creation" msgstr "Autoriser oprettelse af token" -#: src/screens/CreateTokenConfirm.js:158 src/screens/SendConfirmScreen.js:196 +#: src/screens/CreateTokenConfirm.js:169 src/screens/SendConfirmScreen.js:196 #: src/screens/TokenSwapReview.js:221 msgid "Building transaction" msgstr "" -#: src/screens/CreateTokenConfirm.js:216 +#: src/screens/CreateTokenConfirm.js:210 #, javascript-format msgid "**${ name }** created successfully" msgstr "" -#: src/screens/CreateTokenConfirm.js:229 +#: src/screens/CreateTokenConfirm.js:222 msgid "Amount of ${ name }" msgstr "" -#: src/screens/CreateTokenConfirm.js:243 +#: src/screens/CreateTokenConfirm.js:236 msgid "Token name" msgstr "Token navn" -#: src/screens/CreateTokenConfirm.js:249 src/screens/CreateTokenSymbol.js:71 +#: src/screens/CreateTokenConfirm.js:242 src/screens/CreateTokenSymbol.js:71 msgid "Token symbol" msgstr "Token symbol" #: src/components/Reown/CreateTokenRequest.js:87 #: src/components/Reown/CreateTokenRequest.js:129 -#: src/screens/CreateTokenConfirm.js:256 +#: src/screens/CreateTokenConfirm.js:249 msgid "Deposit" msgstr "Indsæt" -#: src/screens/CreateTokenConfirm.js:264 +#: src/screens/CreateTokenConfirm.js:257 msgid "Network fee" msgstr "" -#: src/screens/CreateTokenConfirm.js:273 +#: src/screens/CreateTokenConfirm.js:266 msgid "Create token" msgstr "Opret token" @@ -1787,7 +1791,7 @@ msgstr "Ny adresse" msgid "Share" msgstr "Del" -#: src/components/SendTransactionFeedbackModal.js:162 +#: src/components/SendTransactionFeedbackModal.js:214 msgid "Propagating transaction to the network." msgstr "" diff --git a/locale/pt-br/texts.po b/locale/pt-br/texts.po index a4b472a8a..f51e0ddc4 100644 --- a/locale/pt-br/texts.po +++ b/locale/pt-br/texts.po @@ -73,7 +73,7 @@ msgstr "CRIAR TOKEN DE DEPÓSITO" msgid "CREATE FEE TOKEN" msgstr "CRIAR TOKEN DE TAXA" -#: src/screens/CreateTokenAmount.js:36 src/screens/CreateTokenConfirm.js:84 +#: src/screens/CreateTokenAmount.js:36 src/screens/CreateTokenConfirm.js:87 #: src/screens/CreateTokenDepositNotice.js:42 #: src/screens/CreateTokenTypeNotice.js:94 src/utils.js:654 msgid "CREATE TOKEN" @@ -372,7 +372,7 @@ msgstr "Quantidade de ${ name } (${ symbol })" msgid "Next" msgstr "Próximo" -#: src/screens/CreateTokenConfirm.js:34 +#: src/screens/CreateTokenConfirm.js:31 msgid "" "You chose to create a **Deposit-Based Token**, which requires a 1% HTR " "deposit." @@ -380,7 +380,7 @@ msgstr "" "Você escolheu criar um **Token Baseado em Depósito**, que requer um depósito " "de 1% em HTR." -#: src/screens/CreateTokenConfirm.js:36 +#: src/screens/CreateTokenConfirm.js:33 msgid "" "You chose to create a **Fee-Based Token**, so a small fee will be applied to " "each future transaction of this token." @@ -388,51 +388,55 @@ msgstr "" "Você escolheu criar um **Token com Taxa**, então uma pequena taxa será " "aplicada a cada transação futura deste token." -#: src/screens/CreateTokenConfirm.js:140 +#: src/screens/CreateTokenConfirm.js:145 msgid "Creating token" msgstr "Criando um token" -#: src/screens/CreateTokenConfirm.js:155 +#: src/screens/CreateTokenConfirm.js:151 +msgid "Building the transaction" +msgstr "Criando a transação" + +#: src/screens/CreateTokenConfirm.js:166 msgid "Enter your 6-digit pin to create your token" msgstr "Digite seu PIN de 6 dígitos para criar o seu token" -#: src/screens/CreateTokenConfirm.js:156 +#: src/screens/CreateTokenConfirm.js:167 msgid "Authorize token creation" msgstr "Autorizar criação de token" -#: src/screens/CreateTokenConfirm.js:158 src/screens/SendConfirmScreen.js:196 +#: src/screens/CreateTokenConfirm.js:169 src/screens/SendConfirmScreen.js:196 #: src/screens/TokenSwapReview.js:221 msgid "Building transaction" msgstr "Criando transação" -#: src/screens/CreateTokenConfirm.js:216 +#: src/screens/CreateTokenConfirm.js:210 #, javascript-format msgid "**${ name }** created successfully" msgstr "**${ name }** criado com sucesso" -#: src/screens/CreateTokenConfirm.js:229 +#: src/screens/CreateTokenConfirm.js:222 msgid "Amount of ${ name }" msgstr "Quantidade de ${ name }" -#: src/screens/CreateTokenConfirm.js:243 +#: src/screens/CreateTokenConfirm.js:236 msgid "Token name" msgstr "Nome do token" -#: src/screens/CreateTokenConfirm.js:249 src/screens/CreateTokenSymbol.js:71 +#: src/screens/CreateTokenConfirm.js:242 src/screens/CreateTokenSymbol.js:71 msgid "Token symbol" msgstr "Símbolo do token" #: src/components/Reown/CreateTokenRequest.js:87 #: src/components/Reown/CreateTokenRequest.js:129 -#: src/screens/CreateTokenConfirm.js:256 +#: src/screens/CreateTokenConfirm.js:249 msgid "Deposit" msgstr "Depósito" -#: src/screens/CreateTokenConfirm.js:264 +#: src/screens/CreateTokenConfirm.js:257 msgid "Network fee" msgstr "Taxa de Rede" -#: src/screens/CreateTokenConfirm.js:273 +#: src/screens/CreateTokenConfirm.js:266 msgid "Create token" msgstr "Criar um token" @@ -1834,7 +1838,7 @@ msgstr "Novo endereço" msgid "Share" msgstr "Compartilhar" -#: src/components/SendTransactionFeedbackModal.js:162 +#: src/components/SendTransactionFeedbackModal.js:214 msgid "Propagating transaction to the network." msgstr "Propagando a transação para a rede." diff --git a/locale/ru-ru/texts.po b/locale/ru-ru/texts.po index f784f24af..b16d770ac 100644 --- a/locale/ru-ru/texts.po +++ b/locale/ru-ru/texts.po @@ -74,7 +74,7 @@ msgstr "" msgid "CREATE FEE TOKEN" msgstr "" -#: src/screens/CreateTokenAmount.js:36 src/screens/CreateTokenConfirm.js:84 +#: src/screens/CreateTokenAmount.js:36 src/screens/CreateTokenConfirm.js:87 #: src/screens/CreateTokenDepositNotice.js:42 #: src/screens/CreateTokenTypeNotice.js:94 src/utils.js:654 msgid "CREATE TOKEN" @@ -360,63 +360,67 @@ msgstr "" msgid "Next" msgstr "Далее" -#: src/screens/CreateTokenConfirm.js:34 +#: src/screens/CreateTokenConfirm.js:31 msgid "" "You chose to create a **Deposit-Based Token**, which requires a 1% HTR " "deposit." msgstr "" -#: src/screens/CreateTokenConfirm.js:36 +#: src/screens/CreateTokenConfirm.js:33 msgid "" "You chose to create a **Fee-Based Token**, so a small fee will be applied to " "each future transaction of this token." msgstr "" -#: src/screens/CreateTokenConfirm.js:140 +#: src/screens/CreateTokenConfirm.js:145 msgid "Creating token" msgstr "Создать токен" -#: src/screens/CreateTokenConfirm.js:155 +#: src/screens/CreateTokenConfirm.js:151 +msgid "Building the transaction" +msgstr "" + +#: src/screens/CreateTokenConfirm.js:166 msgid "Enter your 6-digit pin to create your token" msgstr "Введите 6-значный PIN-код для создания токена" -#: src/screens/CreateTokenConfirm.js:156 +#: src/screens/CreateTokenConfirm.js:167 msgid "Authorize token creation" msgstr "Авторизовать создание токена" -#: src/screens/CreateTokenConfirm.js:158 src/screens/SendConfirmScreen.js:196 +#: src/screens/CreateTokenConfirm.js:169 src/screens/SendConfirmScreen.js:196 #: src/screens/TokenSwapReview.js:221 msgid "Building transaction" msgstr "" -#: src/screens/CreateTokenConfirm.js:216 +#: src/screens/CreateTokenConfirm.js:210 #, javascript-format msgid "**${ name }** created successfully" msgstr "" -#: src/screens/CreateTokenConfirm.js:229 +#: src/screens/CreateTokenConfirm.js:222 msgid "Amount of ${ name }" msgstr "" -#: src/screens/CreateTokenConfirm.js:243 +#: src/screens/CreateTokenConfirm.js:236 msgid "Token name" msgstr "Имя токена" -#: src/screens/CreateTokenConfirm.js:249 src/screens/CreateTokenSymbol.js:71 +#: src/screens/CreateTokenConfirm.js:242 src/screens/CreateTokenSymbol.js:71 msgid "Token symbol" msgstr "Символ токена" #: src/components/Reown/CreateTokenRequest.js:87 #: src/components/Reown/CreateTokenRequest.js:129 -#: src/screens/CreateTokenConfirm.js:256 +#: src/screens/CreateTokenConfirm.js:249 msgid "Deposit" msgstr "Депозит" -#: src/screens/CreateTokenConfirm.js:264 +#: src/screens/CreateTokenConfirm.js:257 msgid "Network fee" msgstr "" -#: src/screens/CreateTokenConfirm.js:273 +#: src/screens/CreateTokenConfirm.js:266 msgid "Create token" msgstr "Создать токен" @@ -1778,7 +1782,7 @@ msgstr "Новый адрес" msgid "Share" msgstr "Поделиться" -#: src/components/SendTransactionFeedbackModal.js:162 +#: src/components/SendTransactionFeedbackModal.js:214 msgid "Propagating transaction to the network." msgstr "" diff --git a/locale/texts.pot b/locale/texts.pot index 16af7394d..6a59a55d0 100644 --- a/locale/texts.pot +++ b/locale/texts.pot @@ -67,7 +67,7 @@ msgid "CREATE FEE TOKEN" msgstr "" #: src/screens/CreateTokenAmount.js:36 -#: src/screens/CreateTokenConfirm.js:84 +#: src/screens/CreateTokenConfirm.js:87 #: src/screens/CreateTokenDepositNotice.js:42 #: src/screens/CreateTokenTypeNotice.js:94 #: src/utils.js:654 @@ -360,65 +360,69 @@ msgstr "" msgid "Next" msgstr "" -#: src/screens/CreateTokenConfirm.js:34 +#: src/screens/CreateTokenConfirm.js:31 msgid "" "You chose to create a **Deposit-Based Token**, which requires a 1% HTR " "deposit." msgstr "" -#: src/screens/CreateTokenConfirm.js:36 +#: src/screens/CreateTokenConfirm.js:33 msgid "" "You chose to create a **Fee-Based Token**, so a small fee will be applied " "to each future transaction of this token." msgstr "" -#: src/screens/CreateTokenConfirm.js:140 +#: src/screens/CreateTokenConfirm.js:145 msgid "Creating token" msgstr "" -#: src/screens/CreateTokenConfirm.js:155 +#: src/screens/CreateTokenConfirm.js:151 +msgid "Building the transaction" +msgstr "" + +#: src/screens/CreateTokenConfirm.js:166 msgid "Enter your 6-digit pin to create your token" msgstr "" -#: src/screens/CreateTokenConfirm.js:156 +#: src/screens/CreateTokenConfirm.js:167 msgid "Authorize token creation" msgstr "" -#: src/screens/CreateTokenConfirm.js:158 +#: src/screens/CreateTokenConfirm.js:169 #: src/screens/SendConfirmScreen.js:196 #: src/screens/TokenSwapReview.js:221 msgid "Building transaction" msgstr "" -#: src/screens/CreateTokenConfirm.js:216 +#: src/screens/CreateTokenConfirm.js:210 #, javascript-format msgid "**${ name }** created successfully" msgstr "" -#: src/screens/CreateTokenConfirm.js:229 +#: src/screens/CreateTokenConfirm.js:222 msgid "Amount of ${ name }" msgstr "" -#: src/screens/CreateTokenConfirm.js:243 +#: src/screens/CreateTokenConfirm.js:236 msgid "Token name" msgstr "" -#: src/screens/CreateTokenConfirm.js:249 +#: src/screens/CreateTokenConfirm.js:242 #: src/screens/CreateTokenSymbol.js:71 msgid "Token symbol" msgstr "" #: src/components/Reown/CreateTokenRequest.js:87 #: src/components/Reown/CreateTokenRequest.js:129 -#: src/screens/CreateTokenConfirm.js:256 +#: src/screens/CreateTokenConfirm.js:249 msgid "Deposit" msgstr "" -#: src/screens/CreateTokenConfirm.js:264 +#: src/screens/CreateTokenConfirm.js:257 msgid "Network fee" msgstr "" -#: src/screens/CreateTokenConfirm.js:273 +#: src/screens/CreateTokenConfirm.js:266 msgid "Create token" msgstr "" @@ -1788,7 +1792,7 @@ msgstr "" msgid "Share" msgstr "" -#: src/components/SendTransactionFeedbackModal.js:162 +#: src/components/SendTransactionFeedbackModal.js:214 msgid "Propagating transaction to the network." msgstr "" diff --git a/src/components/SendTransactionFeedbackModal.js b/src/components/SendTransactionFeedbackModal.js index f4db5326b..95741a771 100644 --- a/src/components/SendTransactionFeedbackModal.js +++ b/src/components/SendTransactionFeedbackModal.js @@ -34,18 +34,51 @@ class SendTransactionFeedbackModal extends React.Component { errorMessage: '', } + // sendTransaction/promise can arrive after mount (while the tx is still being + // prepared); these flags ensure each subscription runs exactly once. + promiseSubscribed = false; + + eventsSubscribed = false; + + // The promise resolves independently of the listeners, so it can settle after + // unmount; this guards its handlers from calling setState on a dead component. + unmounted = false; + componentDidMount = () => { - // Start event listeners - this.addSendTxEventHandlers(); + // Props may arrive after mount, so subscriptions are attempted here and + // again in componentDidUpdate. + this.subscribeToPromise(); + this.subscribeToSendTransaction(); + } + + componentDidUpdate = (prevProps) => { + if (prevProps.promise !== this.props.promise) { + this.subscribeToPromise(); + } + if (prevProps.sendTransaction !== this.props.sendTransaction) { + this.subscribeToSendTransaction(); + } + } + + componentWillUnmount = () => { + this.unmounted = true; + if (this.props.sendTransaction) { + this.props.sendTransaction.removeListener('job-submitted', this.updateEstimation); + this.props.sendTransaction.removeListener('estimation-updated', this.updateEstimation); + this.props.sendTransaction.removeListener('job-done', this.jobDone); + } } /** - * Create event listeners for all sendTransaction events + * Subscribe to the promise that mines and propagates the tx. It also covers + * the building phase: a failure while preparing the tx rejects this promise + * and is shown as an error in this same modal. */ - addSendTxEventHandlers = () => { - this.props.sendTransaction.on('job-submitted', this.updateEstimation); - this.props.sendTransaction.on('estimation-updated', this.updateEstimation); - this.props.sendTransaction.on('job-done', this.jobDone); + subscribeToPromise = () => { + if (this.promiseSubscribed || !this.props.promise) { + return; + } + this.promiseSubscribed = true; this.props.promise.then((tx) => { this.onSendSuccess(tx); }, (err) => { @@ -53,6 +86,19 @@ class SendTransactionFeedbackModal extends React.Component { }); } + /** + * Create event listeners for all sendTransaction mining events. + */ + subscribeToSendTransaction = () => { + if (this.eventsSubscribed || !this.props.sendTransaction) { + return; + } + this.eventsSubscribed = true; + this.props.sendTransaction.on('job-submitted', this.updateEstimation); + this.props.sendTransaction.on('estimation-updated', this.updateEstimation); + this.props.sendTransaction.on('job-done', this.jobDone); + } + /** * Executed after tx is propagated to the network with success * Update component states and call success method, if exists @@ -60,6 +106,9 @@ class SendTransactionFeedbackModal extends React.Component { * @param {Object} tx Transaction data */ onSendSuccess = (tx) => { + if (this.unmounted) { + return; + } this.setState({ sending: false, success: true, errorMessage: '' }); if (this.props.onTxSuccess) { this.props.onTxSuccess(tx); @@ -73,6 +122,9 @@ class SendTransactionFeedbackModal extends React.Component { * @param {String} message Error message */ onSendError = (message) => { + if (this.unmounted) { + return; + } this.setState({ sending: false, success: false, errorMessage: message }); if (this.props.onTxError) { this.props.onTxError(message); @@ -174,20 +226,22 @@ class SendTransactionFeedbackModal extends React.Component { SendTransactionFeedbackModal.defaultProps = { // Defaults to not hide the modal hide: false, + sendTransaction: null, + promise: null, }; SendTransactionFeedbackModal.propTypes = { // Text displayed on the first line of the modal text: PropTypes.oneOfType([PropTypes.string, PropTypes.element]).isRequired, - // lib object that handles the mining/propagation requests and emit events + // lib object that handles the mining/propagation requests and emits events sendTransaction: PropTypes.oneOfType([ PropTypes.instanceOf(hathorLib.SendTransaction), PropTypes.instanceOf(hathorLib.SendTransactionWalletService) - ]).isRequired, - // promise that is mining the transaction using the sendTransaction instance above. + ]), + // promise that mines/propagates the tx using the sendTransaction instance above promise: PropTypes.shape({ then: PropTypes.func.isRequired, - }).isRequired, + }), // optional method to be executed when the tx is mined and propagated with success onTxSuccess: PropTypes.func, // optional method to be executed when an error happens while sending the tx diff --git a/src/screens/CreateTokenConfirm.js b/src/screens/CreateTokenConfirm.js index 6ca3c6a97..28d32640c 100644 --- a/src/screens/CreateTokenConfirm.js +++ b/src/screens/CreateTokenConfirm.js @@ -7,7 +7,6 @@ import React, { useEffect, useState } from 'react'; import { - Image, View, } from 'react-native'; import { useSelector, useDispatch } from 'react-redux'; @@ -20,12 +19,10 @@ import AmountTextInput from '../components/AmountTextInput'; import InputLabel from '../components/InputLabel'; import HathorHeader from '../components/HathorHeader'; import OfflineBar from '../components/OfflineBar'; -import FeedbackModal from '../components/FeedbackModal'; import SendTransactionFeedbackModal from '../components/SendTransactionFeedbackModal'; import TextFmt from '../components/TextFmt'; import { updateSelectedToken } from '../actions'; import { registerToken } from '../utils/tokens'; -import errorIcon from '../assets/images/icErrorBig.png'; import { InfoCircleIcon } from '../components/Icons/InfoCircle'; import { useNavigation, useParams } from '../hooks/navigation'; import { getCreateTokenTitle } from '../utils'; @@ -79,8 +76,14 @@ const CreateTokenConfirm = () => { const nativeSymbol = wallet.storage.getNativeTokenData().symbol; // Component state - const [modal, setModal] = useState(null); - const [modalType, setModalType] = useState(null); + // A single modal drives the whole flow: it mounts showing a spinner while the + // tx is prepared (sendTransaction/promise still null) and then tracks + // mining/propagation once they are ready. Shape: { text, sendTransaction, promise } + const [sendTransactionModal, setSendTransactionModal] = useState(null); + // Disables the Create token button from the moment it's tapped until the screen + // is interactive again, closing the window between the PinScreen dismissal and + // the feedback modal render where the button would otherwise be tappable. + const [isSending, setIsSending] = useState(false); const [title, setTitle] = useState(t`CREATE TOKEN`); const [deposit, setDeposit] = useState(null); const [networkFee, setNetworkFee] = useState(null); @@ -102,47 +105,52 @@ const CreateTokenConfirm = () => { } }, [tokenVersion, amount]); + // Re-enable the Create token button whenever this screen regains focus. This + // covers the PinScreen being dismissed by cancel or hardware back (neither + // sets the feedback modal). + useEffect(() => { + const focusListener = navigation.addListener('focus', () => { + setIsSending(false); + }); + + return focusListener; + }, [navigation]); + /** - * Prepare data and execute create token - * If success when preparing, show feedback modal, otherwise show error + * Prepare and create the token. The promise built here covers the whole flow — + * prepare, then mine/propagate — so a failure while preparing surfaces as an + * error in the same feedback modal. * - * @param {String} pinCode User PIN + * @param {String} pin User PIN */ - const executeCreate = async (pin) => { - if (useWalletService) { - await wallet.validateAndRenewAuthToken(pin); - } - - const { address } = await wallet.getCurrentAddress({ markAsUsed: true }); - wallet.prepareCreateNewToken( - name, - symbol, - amount, - { address, pinCode: pin, tokenVersion } - ).then((tx) => { - let sendTransaction; + const executeCreate = (pin) => { + const promise = (async () => { if (useWalletService) { - sendTransaction = new hathorLib.SendTransactionWalletService( - wallet, - { transaction: tx } - ); - } else { - sendTransaction = new hathorLib.SendTransaction( - { storage: wallet.storage, transaction: tx, pin } - ); + await wallet.validateAndRenewAuthToken(pin); } - const promise = sendTransaction.runFromMining(); + const { address } = await wallet.getCurrentAddress({ markAsUsed: true }); + const tx = await wallet.prepareCreateNewToken( + name, + symbol, + amount, + { address, pinCode: pin, tokenVersion } + ); + + const sendTransaction = useWalletService + ? new hathorLib.SendTransactionWalletService(wallet, { transaction: tx }) + : new hathorLib.SendTransaction({ storage: wallet.storage, transaction: tx, pin }); + + // Hand the instance to the modal so it subscribes to mining events. + setSendTransactionModal((prev) => ({ ...prev, sendTransaction, text: t`Creating token` })); - // show loading modal - setModalType('SendTransactionFeedbackModal'); - setModal({ - text: t`Creating token`, - sendTransaction, - promise, - }); - }, (err) => { - onError(err.message); + return sendTransaction.runFromMining(); + })(); + + setSendTransactionModal({ + text: t`Building the transaction`, + sendTransaction: null, + promise, }); }; @@ -150,6 +158,9 @@ const CreateTokenConfirm = () => { * Executed when user clicks to create the token and opens the PIN screen */ const onSendPress = () => { + // Disable the button before opening the PinScreen so it can't be tapped + // again while we return from it and build the feedback modal. + setIsSending(true); const pinParams = { cb: executeCreate, screenText: t`Enter your 6-digit pin to create your token`, @@ -171,28 +182,18 @@ const CreateTokenConfirm = () => { dispatchUpdateSelectedToken(token); }; - /** - * Show error message if there is one while creating the token - * - * @param {String} message Error message - */ - const onError = (message) => { - setModalType('FeedbackModal'); - setModal({ - icon: , - text: message, - onDismiss: () => setModal(null), - }); - }; - /** * Method executed after dismiss success modal */ const exitScreen = () => { - setModal(null); + setSendTransactionModal(null); navigation.navigate('CreateTokenDetail'); }; + // Keep the button disabled from the moment it's tapped (isSending) and while + // the feedback modal (building spinner, mining progress or error) is on screen. + const isCreatingToken = isSending || sendTransactionModal !== null; + return ( { onCancel={() => navigation.getParent().goBack()} /> - {modal && ( - modalType === 'FeedbackModal' ? ( - - ) : ( - {t`**${name}** created successfully`}} - onTxSuccess={onTxSuccess} - onDismissSuccess={exitScreen} - onDismissError={() => setModal(null)} - hide={isShowingPinScreen} - /> - ) + {sendTransactionModal && ( + {t`**${name}** created successfully`}} + onTxSuccess={onTxSuccess} + onDismissSuccess={exitScreen} + onDismissError={() => setSendTransactionModal(null)} + hide={isShowingPinScreen} + /> )} @@ -272,8 +265,7 @@ const CreateTokenConfirm = () => {