11import './MessageFlowCard.css' ;
22
3- import { evmCall } from '@zetachain/toolkit/chains/evm' ;
43import { type PrimaryWallet } from '@zetachain/wallet' ;
5- import { ZeroAddress } from 'ethers' ;
64import { useEffect , useRef , useState } from 'react' ;
75
86import { Button } from './components/Button' ;
97import { IconApprove , IconEnvelope , IconSendTitle } from './components/icons' ;
108import { ConfirmedContent } from './ConfirmedContent' ;
119import type { SupportedChain } from './constants/chains' ;
1210import { HELLO_UNIVERSAL_CONTRACT_ADDRESS } from './constants/contracts' ;
11+ import { useHandleCall } from './hooks/useHandleCall' ;
1312import type { EIP6963ProviderDetail } from './types/wallet' ;
14- import { getSignerAndProvider } from './utils/ethersHelpers' ;
1513import { formatNumberWithLocale } from './utils/formatNumber' ;
1614
1715interface MessageFlowCardProps {
1816 selectedProvider : EIP6963ProviderDetail | null ;
1917 supportedChain : SupportedChain | undefined ;
2018 primaryWallet ?: PrimaryWallet | null ; // Dynamic wallet from context
19+ account ?: string | null ; // EIP6963 account for non-dynamic route
2120}
2221
2322export function MessageFlowCard ( {
2423 selectedProvider,
2524 supportedChain,
2625 primaryWallet = null ,
26+ account = null ,
2727} : MessageFlowCardProps ) {
28-
2928 const MAX_STRING_LENGTH = 2000 ;
3029 const [ isUserSigningTx , setIsUserSigningTx ] = useState ( false ) ;
3130 const [ isTxReceiptLoading , setIsTxReceiptLoading ] = useState ( false ) ;
@@ -37,55 +36,22 @@ export function MessageFlowCard({
3736 return new TextEncoder ( ) . encode ( string ) . length ;
3837 } ;
3938
40- const handleEvmCall = async ( ) => {
41- try {
42- const signerAndProvider = await getSignerAndProvider ( {
43- selectedProvider,
44- primaryWallet,
45- } ) ;
46-
47- if ( ! signerAndProvider ) {
48- throw new Error ( 'Failed to get signer' ) ;
49- }
50-
51- const { signer } = signerAndProvider ;
52-
53- const evmCallParams = {
54- receiver : HELLO_UNIVERSAL_CONTRACT_ADDRESS ,
55- types : [ 'string' ] ,
56- values : [ stringValue ] ,
57- revertOptions : {
58- callOnRevert : false ,
59- revertAddress : ZeroAddress ,
60- revertMessage : '' ,
61- abortAddress : ZeroAddress ,
62- onRevertGasLimit : 1000000 ,
63- } ,
64- } ;
65-
66- const evmCallOptions = {
67- signer,
68- txOptions : {
69- gasLimit : 1000000 ,
70- } ,
71- } ;
72-
73- setIsUserSigningTx ( true ) ;
74-
75- const result = await evmCall ( evmCallParams , evmCallOptions ) ;
76-
77- setIsTxReceiptLoading ( true ) ;
78-
79- await result . wait ( ) ;
80-
81- setConnectedChainTxHash ( result . hash ) ;
82- } catch ( error ) {
83- console . error ( error ) ;
84- } finally {
39+ const { handleCall } = useHandleCall ( {
40+ primaryWallet,
41+ selectedProvider,
42+ supportedChain,
43+ receiver : HELLO_UNIVERSAL_CONTRACT_ADDRESS ,
44+ message : stringValue ,
45+ account,
46+ onSigningStart : ( ) => setIsUserSigningTx ( true ) ,
47+ onTransactionSubmitted : ( ) => setIsTxReceiptLoading ( true ) ,
48+ onTransactionConfirmed : ( txHash : string ) => setConnectedChainTxHash ( txHash ) ,
49+ onError : ( error : Error ) => console . error ( 'Transaction error:' , error ) ,
50+ onComplete : ( ) => {
8551 setIsUserSigningTx ( false ) ;
8652 setIsTxReceiptLoading ( false ) ;
87- }
88- } ;
53+ } ,
54+ } ) ;
8955
9056 // Auto-resize textarea based on content
9157 useEffect ( ( ) => {
@@ -168,7 +134,7 @@ export function MessageFlowCard({
168134 < div >
169135 < Button
170136 type = "button"
171- onClick = { handleEvmCall }
137+ onClick = { handleCall }
172138 disabled = {
173139 ! stringValue . length ||
174140 ! supportedChain ||
0 commit comments