1
- import {
2
- Modal ,
3
- ModalOverlay ,
4
- ModalContent ,
5
- ModalFooter ,
6
- ModalBody ,
7
- } from "@chakra-ui/react" ;
1
+ import { Modal , ModalOverlay , ModalContent } from "@chakra-ui/react" ;
8
2
import { useCallback , useEffect , useState } from "react" ;
9
- import { useIntl , defineMessages } from "react-intl " ;
3
+ import { useFormContext } from "react-hook-form " ;
10
4
11
5
import { AssetOptionType } from "@/components/AssetAmountInput/utils" ;
12
6
import { trpcReact , TRPCRouterOutputs } from "@/providers/TRPCProvider" ;
13
- import { PillButton } from "@/ui/PillButton/PillButton " ;
7
+ import { normalizeTransactionData } from "@/utils/transactionUtils " ;
14
8
15
9
import { StepConfirm } from "./Steps/StepConfirm" ;
16
10
import { StepConnect } from "./Steps/StepConnect" ;
17
11
import { TransactionRejected } from "./Steps/TransactionRejected" ;
18
12
import { ReviewTransaction } from "../SharedConfirmSteps/ReviewTransaction" ;
19
13
import { SubmissionError } from "../SharedConfirmSteps/SubmissionError" ;
20
14
import { TransactionSubmitted } from "../SharedConfirmSteps/TransactionSubmitted" ;
21
- import { TransactionData } from "../transactionSchema" ;
22
-
23
- const messages = defineMessages ( {
24
- cancel : {
25
- defaultMessage : "Cancel" ,
26
- } ,
27
- continue : {
28
- defaultMessage : "Continue" ,
29
- } ,
30
- } ) ;
15
+ import { TransactionFormData } from "../transactionSchema" ;
31
16
32
17
type LedgerStatus = {
33
18
isLedgerConnected : boolean ;
@@ -39,20 +24,21 @@ type LedgerStatus = {
39
24
40
25
type Props = {
41
26
isOpen : boolean ;
42
- transactionData : TransactionData ;
43
27
selectedAccount : TRPCRouterOutputs [ "getAccounts" ] [ number ] ;
44
- selectedAsset ? : AssetOptionType ;
28
+ selectedAsset : AssetOptionType ;
45
29
onCancel : ( ) => void ;
30
+ estimatedFeesData : TRPCRouterOutputs [ "getEstimatedFees" ] ;
46
31
} ;
47
32
48
33
export function ConfirmLedgerModal ( {
49
34
isOpen,
50
35
onCancel,
51
- transactionData,
52
36
selectedAccount,
53
37
selectedAsset,
38
+ estimatedFeesData,
54
39
} : Props ) {
55
- const { formatMessage } = useIntl ( ) ;
40
+ const { watch } = useFormContext < TransactionFormData > ( ) ;
41
+ const transactionFormData = watch ( ) ;
56
42
57
43
const [
58
44
{ isLedgerConnected, isLedgerUnlocked, isIronfishAppOpen } ,
@@ -66,6 +52,7 @@ export function ConfirmLedgerModal({
66
52
} ) ) ;
67
53
68
54
const [ _statusError , setStatusError ] = useState ( "" ) ;
55
+ const { setError } = useFormContext ( ) ;
69
56
70
57
const [ step , setStep ] = useState <
71
58
| "IDLE"
@@ -86,7 +73,7 @@ export function ConfirmLedgerModal({
86
73
87
74
useEffect ( ( ) => {
88
75
if (
89
- ! [ "CONNECT_LEDGER" , "ERROR" ] . includes ( step ) &&
76
+ ! [ "CONNECT_LEDGER" , "ERROR" , "IDLE" ] . includes ( step ) &&
90
77
( ! isLedgerConnected || ! isLedgerUnlocked || ! isIronfishAppOpen )
91
78
) {
92
79
setStep ( "CONNECT_LEDGER" ) ;
@@ -120,6 +107,29 @@ export function ConfirmLedgerModal({
120
107
}
121
108
} , [ isLedgerConnected , isLedgerUnlocked , isIronfishAppOpen , step ] ) ;
122
109
110
+ const handleSubmitTransaction = useCallback ( ( ) => {
111
+ const { normalizedTransactionData, error } = normalizeTransactionData ( {
112
+ transactionFormData,
113
+ estimatedFeesData,
114
+ selectedAsset,
115
+ } ) ;
116
+ if ( error !== null ) {
117
+ setError ( "root.serverError" , {
118
+ message : error ,
119
+ } ) ;
120
+ setStep ( "IDLE" ) ;
121
+ } else {
122
+ submitTransaction ( normalizedTransactionData ) ;
123
+ setStep ( "CONFIRM_TRANSACTION" ) ;
124
+ }
125
+ } , [
126
+ transactionFormData ,
127
+ estimatedFeesData ,
128
+ selectedAsset ,
129
+ submitTransaction ,
130
+ setError ,
131
+ ] ) ;
132
+
123
133
const handleClose = useCallback ( ( ) => {
124
134
if ( step === "CONFIRM_TRANSACTION" ) {
125
135
cancelTransaction ( ) ;
@@ -128,106 +138,58 @@ export function ConfirmLedgerModal({
128
138
onCancel ( ) ;
129
139
} , [ onCancel , reset , step , cancelTransaction ] ) ;
130
140
141
+ const stepMap = {
142
+ IDLE : (
143
+ < ReviewTransaction
144
+ selectedAccount = { selectedAccount }
145
+ selectedAsset = { selectedAsset }
146
+ estimatedFeesData = { estimatedFeesData }
147
+ onClose = { handleClose }
148
+ onSubmit = { ( ) => {
149
+ setStep ( "CONNECT_LEDGER" ) ;
150
+ } }
151
+ />
152
+ ) ,
153
+ CONNECT_LEDGER : (
154
+ < StepConnect
155
+ isLedgerConnected = { isLedgerConnected }
156
+ isLedgerUnlocked = { isLedgerUnlocked }
157
+ isIronfishAppOpen = { isIronfishAppOpen }
158
+ onCancel = { handleClose }
159
+ onContinue = { handleSubmitTransaction }
160
+ isLoading = { isLoading }
161
+ />
162
+ ) ,
163
+ CONFIRM_TRANSACTION : < StepConfirm onCancel = { handleClose } /> ,
164
+ TRANSACTION_SUBMITTED : (
165
+ < TransactionSubmitted
166
+ fromAccount = { selectedAccount . name }
167
+ transactionHash = { submittedTransactionData ?. hash ?? "" }
168
+ handleClose = { handleClose }
169
+ />
170
+ ) ,
171
+ SUBMISSION_ERROR :
172
+ error ?. message === "TRANSACTION_REJECTED" ? (
173
+ < TransactionRejected
174
+ isLoading = { isLoading }
175
+ handleClose = { handleClose }
176
+ handleSubmit = { handleSubmitTransaction }
177
+ />
178
+ ) : (
179
+ < SubmissionError
180
+ errorMessage = { error ?. message ?? "" }
181
+ isLoading = { isLoading }
182
+ handleClose = { handleClose }
183
+ handleSubmit = { handleSubmitTransaction }
184
+ />
185
+ ) ,
186
+ } ;
187
+
131
188
return (
132
189
< Modal isOpen = { isOpen } onClose = { handleClose } >
133
190
< ModalOverlay />
134
191
< ModalContent maxW = "100%" width = "600px" >
135
- { step === "IDLE" && (
136
- < ReviewTransaction
137
- transactionData = { transactionData }
138
- selectedAccount = { selectedAccount }
139
- selectedAsset = { selectedAsset }
140
- onClose = { handleClose }
141
- onSubmit = { ( ) => {
142
- setStep ( "CONNECT_LEDGER" ) ;
143
- } }
144
- />
145
- ) }
146
- { step === "CONNECT_LEDGER" && (
147
- < >
148
- < ModalBody px = { 16 } pt = { 16 } >
149
- < StepConnect
150
- isLedgerConnected = { isLedgerConnected }
151
- isLedgerUnlocked = { isLedgerUnlocked }
152
- isIronfishAppOpen = { isIronfishAppOpen }
153
- />
154
- </ ModalBody >
155
- < ModalFooter display = "flex" gap = { 2 } px = { 16 } py = { 8 } >
156
- < PillButton
157
- size = "sm"
158
- onClick = { handleClose }
159
- variant = "inverted"
160
- border = { 0 }
161
- >
162
- { formatMessage ( messages . cancel ) }
163
- </ PillButton >
164
- < PillButton
165
- size = "sm"
166
- isDisabled = {
167
- isLoading ||
168
- ! isLedgerConnected ||
169
- ! isLedgerUnlocked ||
170
- ! isIronfishAppOpen
171
- }
172
- onClick = { ( ) => {
173
- submitTransaction ( transactionData ) ;
174
- setStep ( "CONFIRM_TRANSACTION" ) ;
175
- } }
176
- >
177
- { formatMessage ( messages . continue ) }
178
- </ PillButton >
179
- </ ModalFooter >
180
- </ >
181
- ) }
182
- { step === "CONFIRM_TRANSACTION" && (
183
- < >
184
- < ModalBody px = { 16 } pt = { 16 } >
185
- < StepConfirm />
186
- </ ModalBody >
187
- < ModalFooter display = "flex" gap = { 2 } px = { 16 } py = { 8 } >
188
- < PillButton
189
- size = "sm"
190
- onClick = { handleClose }
191
- variant = "inverted"
192
- border = { 0 }
193
- >
194
- { formatMessage ( messages . cancel ) }
195
- </ PillButton >
196
- </ ModalFooter >
197
- </ >
198
- ) }
199
- { step === "TRANSACTION_SUBMITTED" && (
200
- < TransactionSubmitted
201
- fromAccount = { selectedAccount . name }
202
- transactionHash = { submittedTransactionData ?. hash ?? "" }
203
- handleClose = { handleClose }
204
- />
205
- ) }
206
-
207
- { step === "SUBMISSION_ERROR" &&
208
- error ?. message === "TRANSACTION_REJECTED" && (
209
- < TransactionRejected
210
- isLoading = { isLoading }
211
- handleClose = { handleClose }
212
- handleSubmit = { ( ) => {
213
- submitTransaction ( transactionData ) ;
214
- setStep ( "CONFIRM_TRANSACTION" ) ;
215
- } }
216
- />
217
- ) }
218
-
219
- { step === "SUBMISSION_ERROR" &&
220
- error ?. message !== "TRANSACTION_REJECTED" && (
221
- < SubmissionError
222
- errorMessage = { error ?. message ?? "" }
223
- isLoading = { isLoading }
224
- handleClose = { handleClose }
225
- handleSubmit = { ( ) => {
226
- submitTransaction ( transactionData ) ;
227
- setStep ( "CONFIRM_TRANSACTION" ) ;
228
- } }
229
- />
230
- ) }
192
+ { stepMap [ step ] }
231
193
</ ModalContent >
232
194
</ Modal >
233
195
) ;
0 commit comments