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 = () => {