1
- import { TextInput , TokenBadge , _AutoComplete as AutoComplete , Tag } from '@1hive/1hive-ui' ;
1
+ import {
2
+ TextInput ,
3
+ TokenBadge ,
4
+ _AutoComplete as AutoComplete ,
5
+ Tag ,
6
+ IconEdit ,
7
+ } from '@1hive/1hive-ui' ;
2
8
import { parseUnits } from 'ethers/lib/utils' ;
3
9
import { connect } from 'formik' ;
4
10
import { noop } from 'lodash-es' ;
@@ -53,6 +59,11 @@ const AmountTokenWrapperStyled = styled.div`
53
59
${ ( props : any ) => ( props . wide ? 'width:100%;' : '' ) }
54
60
` ;
55
61
62
+ const IconEditStyled = styled ( IconEdit ) `
63
+ cursor: pointer;
64
+ padding-left: ${ GUpx ( ) } ;
65
+ ` ;
66
+
56
67
// #endregion
57
68
58
69
type Props = {
@@ -70,6 +81,7 @@ type Props = {
70
81
maxDecimals ?: number ;
71
82
disabled ?: boolean ;
72
83
wide ?: boolean ;
84
+ tokenEditable ?: boolean ;
73
85
} ;
74
86
75
87
function AmountFieldInput ( {
@@ -87,35 +99,29 @@ function AmountFieldInput({
87
99
maxDecimals,
88
100
disabled = false ,
89
101
wide = false ,
102
+ tokenEditable = false ,
90
103
} : Props ) {
91
- const { defaultToken , type } = getNetwork ( ) ;
104
+ const { type } = getNetwork ( ) ;
92
105
const [ decimalsCount , setDecimalsCount ] = useState ( maxDecimals ) ;
93
106
const [ tokens , setTokens ] = useState < TokenModel [ ] > ( [ ] ) ;
94
107
const [ searchTerm , setSearchTerm ] = useState < string > ( ) ;
95
108
const [ amount , setAmount ] = useState < number | undefined > ( value ?. parsedAmount ?? 0 ) ;
96
- const [ token , setToken ] = useState < TokenModel > ( value ?. token ?? defaultToken ) ;
109
+ const [ token , setToken ] = useState < TokenModel | undefined > ( value ?. token ) ;
97
110
const [ availableTokens , setAvailableTokens ] = useState < TokenModel [ ] > ( [ ] ) ;
98
111
const { walletAddress } = useWallet ( ) ;
99
112
100
113
const autoCompleteRef : React . Ref < any > = useRef ( null ) ;
101
114
102
115
useEffect ( ( ) => {
103
- const fetchAvailableTokens = async ( ) => {
104
- const networkDefaultTokens = ( NETWORK_TOKENS [ type ] as TokenModel [ ] ) ?? [ ] ;
105
- const questsUsedTokens = await fetchRewardTokens ( ) ;
106
- setAvailableTokens (
107
- arrayDistinctBy ( [ ...networkDefaultTokens , ...questsUsedTokens ] , ( x ) => x . token ) ,
116
+ if ( ! token )
117
+ document . addEventListener (
118
+ 'focusin' ,
119
+ ( ) => {
120
+ if ( walletAddress && isEdit && tokenEditable ) fetchAvailableTokens ( ) ;
121
+ } ,
122
+ true ,
108
123
) ;
109
- } ;
110
-
111
- document . addEventListener (
112
- 'focusin' ,
113
- ( ) => {
114
- if ( walletAddress && isEdit && ! value ?. token ) fetchAvailableTokens ( ) ;
115
- } ,
116
- true ,
117
- ) ;
118
- } , [ walletAddress , document . activeElement ] ) ;
124
+ } , [ walletAddress , isEdit , tokenEditable , token ] ) ;
119
125
120
126
useEffect ( ( ) => {
121
127
if ( availableTokens . length ) {
@@ -146,31 +152,46 @@ function AmountFieldInput({
146
152
147
153
useEffect ( ( ) => {
148
154
setAmount ( value ?. parsedAmount ?? 0 ) ;
149
- setToken ( value ?. token ?? defaultToken ) ;
155
+ setToken ( value ?. token ) ;
150
156
} , [ value ] ) ;
151
157
158
+ const fetchAvailableTokens = async ( ) => {
159
+ const networkDefaultTokens = ( NETWORK_TOKENS [ type ] as TokenModel [ ] ) ?? [ ] ;
160
+ const questsUsedTokens = await fetchRewardTokens ( ) ;
161
+ setAvailableTokens (
162
+ arrayDistinctBy ( [ ...networkDefaultTokens , ...questsUsedTokens ] , ( x ) => x . token ) ,
163
+ ) ;
164
+ } ;
165
+
152
166
const onAmountChange = ( e : any ) => {
153
167
const newAmount = e . target . value ;
154
168
setAmount ( newAmount ) ;
155
169
if ( token && e . target . value !== '' ) {
156
- const nextValue = {
170
+ applyChanges ( {
157
171
token : {
158
172
...token ,
159
173
amount : parseUnits ( newAmount . toString ( ) , token . decimals ) . toString ( ) ,
160
174
} ,
161
175
parsedAmount : + newAmount ,
162
- } ;
163
- if ( formik ) formik . setFieldValue ( id , nextValue ) ;
164
- else onChange ( nextValue ) ;
176
+ } ) ;
165
177
}
166
178
} ;
167
179
168
180
const onTokenChange = ( i : number ) => {
169
181
const newToken = tokens [ i ] ;
170
182
autoCompleteRef . current . value = newToken . symbol ;
171
183
setSearchTerm ( undefined ) ;
172
- setToken ( newToken ) ;
173
- const nextValue = { token : newToken , parsedAmount : amount } ;
184
+ applyChanges ( { token : newToken , parsedAmount : amount } ) ;
185
+ } ;
186
+
187
+ const onTokenEditClick = ( ) => {
188
+ fetchAvailableTokens ( ) ;
189
+ applyChanges ( { token : undefined , parsedAmount : amount } ) ;
190
+ } ;
191
+
192
+ const applyChanges = ( nextValue : Partial < TokenAmountModel > ) => {
193
+ setToken ( nextValue . token ) ;
194
+ setAmount ( nextValue . parsedAmount ) ;
174
195
if ( formik ) formik . setFieldValue ( id , nextValue ) ;
175
196
else onChange ( nextValue ) ;
176
197
} ;
@@ -205,12 +226,8 @@ function AmountFieldInput({
205
226
) }
206
227
</ Outset >
207
228
) }
208
- { value ?. token . token ? (
209
- < TokenBadgeStyled
210
- symbol = { value . token . symbol }
211
- address = { value . token . token }
212
- networkType = "private"
213
- />
229
+ { token ?. token ? (
230
+ < TokenBadgeStyled symbol = { token ?. symbol } address = { token ?. token } networkType = "private" />
214
231
) : (
215
232
< AutoCompleteWrapperStyled >
216
233
< AutoComplete
@@ -232,6 +249,9 @@ function AmountFieldInput({
232
249
/>
233
250
</ AutoCompleteWrapperStyled >
234
251
) }
252
+ { tokenEditable && isEdit && token && (
253
+ < IconEditStyled onClick = { onTokenEditClick } size = "medium" />
254
+ ) }
235
255
</ AmountTokenWrapperStyled >
236
256
) }
237
257
</ FieldInput >
0 commit comments