@@ -3,6 +3,10 @@ import { StyleSheet, View, Text, Button, TextInput } from "react-native";
3
3
import { useFacade } from "../../data/facades" ;
4
4
import { useState } from "react" ;
5
5
import { IRON_ASSET_ID_HEX } from "../../data/constants" ;
6
+ import { CurrencyUtils } from "@ironfish/sdk" ;
7
+ import { useQueries } from "@tanstack/react-query" ;
8
+ import { Asset } from "@/data/facades/chain/types" ;
9
+ import { AccountBalance } from "@/data/facades/wallet/types" ;
6
10
7
11
const isValidBigInt = ( num : string ) => {
8
12
if ( num . length === 0 ) return false ;
@@ -22,9 +26,9 @@ export default function Send() {
22
26
const [ selectedRecipient , setSelectedRecipient ] = useState < string > ( "" ) ;
23
27
const [ amount , setAmount ] = useState < string > ( "" ) ;
24
28
const [ customFee , setCustomFee ] = useState < string > ( "" ) ;
25
- const [ selectedFee , setSelectedFee ] = useState <
26
- "slow" | "average" | "fast" | "custom"
27
- > ( "average" ) ;
29
+ const [ selectedFee , setSelectedFee ] = useState < "default" | "custom" > (
30
+ "default" ,
31
+ ) ;
28
32
29
33
const getAccountResult = facade . getAccount . useQuery (
30
34
{ } ,
@@ -42,38 +46,44 @@ export default function Send() {
42
46
} ,
43
47
) ;
44
48
45
- const estimatedFees = facade . getEstimatedFees . useQuery (
46
- {
47
- accountName : getAccountResult . data ?. name ?? "" ,
48
- outputs : [ { amount, assetId : selectedAssetId } ] ,
49
- } ,
50
- {
51
- enabled : ( ) => {
52
- return ! ! getAccountResult . data && isValidBigInt ( amount ) ;
53
- } ,
54
- } ,
55
- ) ;
49
+ const getCustomAssets = useQueries ( {
50
+ queries :
51
+ getAccountResult . data ?. balances . custom . map ( ( b : AccountBalance ) => {
52
+ return {
53
+ refetchInterval : 1000 ,
54
+ queryFn : ( ) => facade . getAsset . resolver ( { assetId : b . assetId } ) ,
55
+ queryKey : facade . getAsset . buildQueryKey ( { assetId : b . assetId } ) ,
56
+ } ;
57
+ } ) ?? [ ] ,
58
+ } ) ;
59
+
60
+ const assetMap = new Map < string , Asset > ( ) ;
61
+ for ( const asset of getCustomAssets ) {
62
+ if ( asset . data ) {
63
+ assetMap . set ( asset . data . id , asset . data ) ;
64
+ }
65
+ }
56
66
57
67
const sendTransaction = facade . sendTransaction . useMutation ( ) ;
58
68
59
69
return (
60
70
< View style = { styles . container } >
61
71
{ isValidPublicAddress . data === false && < Text > Invalid recipient</ Text > }
62
- { estimatedFees . isError && (
63
- < Text > Error: { estimatedFees . error . message } </ Text >
64
- ) }
65
72
< Text > Select asset</ Text >
66
73
< Button
67
- title = { `IRON (${ getAccountResult . data ?. balances . iron . available ?? 0 } ) ${ selectedAssetId === IRON_ASSET_ID_HEX ? "(selected)" : "" } ` }
74
+ title = { `IRON (${ CurrencyUtils . render ( getAccountResult . data ?. balances . iron . available ?? "0" ) } ) ${ selectedAssetId === IRON_ASSET_ID_HEX ? "(selected)" : "" } ` }
68
75
onPress = { ( ) => setSelectedAssetId ( IRON_ASSET_ID_HEX ) }
69
76
/>
70
- { getAccountResult . data ?. balances . custom . map ( ( b ) => (
71
- < Button
72
- key = { b . assetId }
73
- title = { `${ b . assetId } (${ b . confirmed ?? 0 } ) ${ selectedAssetId === b . assetId ? "(selected)" : "" } ` }
74
- onPress = { ( ) => setSelectedAssetId ( b . assetId ) }
75
- />
76
- ) ) }
77
+ { getAccountResult . data ?. balances . custom . map ( ( b ) => {
78
+ const asset = assetMap . get ( b . assetId ) ;
79
+ return (
80
+ < Button
81
+ key = { b . assetId }
82
+ title = { `${ asset ?. name } (${ CurrencyUtils . render ( b . available , false , b . assetId , asset ?. verification . status === "verified" ? asset . verification : undefined ) } ) ${ selectedAssetId === b . assetId ? "(selected)" : "" } ` }
83
+ onPress = { ( ) => setSelectedAssetId ( b . assetId ) }
84
+ />
85
+ ) ;
86
+ } ) }
77
87
< TextInput
78
88
placeholder = "Recipient"
79
89
value = { selectedRecipient }
@@ -82,16 +92,8 @@ export default function Send() {
82
92
< TextInput placeholder = "Amount" value = { amount } onChangeText = { setAmount } />
83
93
< Text style = { { fontSize : 20 } } > Fees</ Text >
84
94
< Button
85
- title = { `Slow: ${ estimatedFees . data ?. slow ?? "" } ${ selectedFee === "slow" ? " (selected)" : "" } ` }
86
- onPress = { ( ) => setSelectedFee ( "slow" ) }
87
- />
88
- < Button
89
- title = { `Average: ${ estimatedFees . data ?. average ?? "" } ${ selectedFee === "average" ? " (selected)" : "" } ` }
90
- onPress = { ( ) => setSelectedFee ( "average" ) }
91
- />
92
- < Button
93
- title = { `Fast: ${ estimatedFees . data ?. fast ?? "" } ${ selectedFee === "fast" ? " (selected)" : "" } ` }
94
- onPress = { ( ) => setSelectedFee ( "fast" ) }
95
+ title = { `Default${ selectedFee === "default" ? " (selected)" : "" } ` }
96
+ onPress = { ( ) => setSelectedFee ( "default" ) }
95
97
/>
96
98
< TextInput
97
99
placeholder = "Custom fee"
@@ -107,7 +109,6 @@ export default function Send() {
107
109
title = "Send"
108
110
disabled = {
109
111
isValidPublicAddress . data !== true ||
110
- ! estimatedFees . isSuccess ||
111
112
( selectedFee === "custom" && ! isValidBigInt ( customFee ) )
112
113
}
113
114
onPress = { ( ) => {
@@ -121,7 +122,7 @@ export default function Send() {
121
122
assetId : selectedAssetId ,
122
123
} ,
123
124
] ,
124
- fee : "1" ,
125
+ fee : selectedFee === "default" ? undefined : customFee ,
125
126
} ) ;
126
127
} }
127
128
/>
0 commit comments