1
1
import {
2
+ Card ,
2
3
type CardProps ,
3
4
FadeCard ,
4
5
H3 ,
@@ -21,7 +22,7 @@ import {
21
22
} from 'app/utils/distributions'
22
23
import formatAmount from 'app/utils/formatAmount'
23
24
import { formatUnits } from 'viem'
24
- import type { PropsWithChildren } from 'react'
25
+ import { useMemo , type PropsWithChildren } from 'react'
25
26
import { DistributionClaimButton } from '../components/DistributionClaimButton'
26
27
import { useSendAccount } from 'app/utils/send-accounts'
27
28
import { DistributionSelect } from '../components/DistributionSelect'
@@ -30,7 +31,8 @@ import { isEqualCalendarDate } from 'app/utils/dateHelper'
30
31
import { toNiceError } from 'app/utils/toNiceError'
31
32
import { min } from 'app/utils/bigint'
32
33
import type { Json } from '@my/supabase/database.types'
33
- import { sendCoin } from 'app/data/coins'
34
+ import { sendCoin , usdcCoin } from 'app/data/coins'
35
+ import { useSendEarnBalances , useVaultConvertSharesToAssets } from 'app/features/earn/hooks'
34
36
35
37
//@todo get this from the db
36
38
const verificationTypesAndTitles = {
@@ -165,6 +167,29 @@ const DistributionRequirementsCard = ({
165
167
isLoading : isLoadingSnapshotBalance ,
166
168
error : snapshotBalanceError ,
167
169
} = useSnapshotBalance ( { distribution, sendAccount } )
170
+
171
+ const { data : sendEarnBalances , isLoading : isLoadingSendEarnBalances } = useSendEarnBalances ( )
172
+ // Extract vaults and shares from balances for conversion
173
+ const vaults =
174
+ sendEarnBalances
175
+ ?. filter ( ( balance ) => balance . shares > 0n && balance . log_addr !== null )
176
+ . map ( ( balance ) => balance . log_addr ) || [ ]
177
+
178
+ const shares =
179
+ sendEarnBalances
180
+ ?. filter ( ( balance ) => balance . shares > 0n && balance . log_addr !== null )
181
+ . map ( ( balance ) => balance . shares ) || [ ]
182
+
183
+ // Use the hook to get current asset values based on onchain rate
184
+ const earnAssets = useVaultConvertSharesToAssets ( { vaults, shares } )
185
+
186
+ const totalAssets = useMemo (
187
+ ( ) => earnAssets . data ?. reduce ( ( sum , assets ) => sum + assets , 0n ) ?? 0n ,
188
+ [ earnAssets . data ]
189
+ )
190
+
191
+ const hasMinSavings = BigInt ( distribution . earn_min_balance ) > 0n
192
+
168
193
if ( verificationsQuery . isLoading || isLoadingSendAccount ) {
169
194
return (
170
195
< FadeCard br = { 12 } $gtMd = { { gap : '$4' , p : '$7' } } p = "$5" >
@@ -223,7 +248,7 @@ const DistributionRequirementsCard = ({
223
248
</ XStack >
224
249
< XStack ai = "center" gap = "$2" >
225
250
< Paragraph >
226
- Min. Balance{ ' ' }
251
+ Balance{ ' ' }
227
252
{ formatAmount (
228
253
formatUnits (
229
254
BigInt ( distribution . hodler_min_balance ?? 0n ) ,
@@ -255,6 +280,39 @@ const DistributionRequirementsCard = ({
255
280
}
256
281
} ) ( ) }
257
282
</ XStack >
283
+ { hasMinSavings && (
284
+ < XStack ai = "center" gap = "$2" >
285
+ < Paragraph >
286
+ Savings Deposit $
287
+ { formatAmount (
288
+ formatUnits ( BigInt ( distribution . earn_min_balance ?? 0n ) , usdcCoin . decimals ) ?? 0n ,
289
+ 9 ,
290
+ 2
291
+ ) } { ' ' }
292
+ </ Paragraph >
293
+ { ( ( ) => {
294
+ switch ( true ) {
295
+ case isLoadingSendEarnBalances :
296
+ return < Spinner size = "small" />
297
+ case distribution . earn_min_balance === undefined ||
298
+ BigInt ( distribution . earn_min_balance ) > ( totalAssets ?? 0n ) :
299
+ return (
300
+ < Theme name = "red" >
301
+ < IconInfoCircle color = { '$color8' } size = { '$2' } />
302
+ </ Theme >
303
+ )
304
+ default :
305
+ return (
306
+ < CheckCircle2
307
+ $theme-light = { { color : '$color12' } }
308
+ color = "$primary"
309
+ size = { '$1.5' }
310
+ />
311
+ )
312
+ }
313
+ } ) ( ) }
314
+ </ XStack >
315
+ ) }
258
316
</ YStack >
259
317
</ Stack >
260
318
</ FadeCard >
@@ -275,11 +333,11 @@ const TaskCards = ({
275
333
< H3 fontWeight = { '600' } color = { '$color12' } >
276
334
Tasks
277
335
</ H3 >
278
- < FadeCard br = { 12 } $gtMd = { { gap : '$4' , p : '$7' } } p = "$5" >
336
+ < Card br = { 12 } $gtMd = { { gap : '$4' , p : '$7' } } p = "$5" >
279
337
< Stack ai = "center" jc = "center" p = "$4" >
280
338
< Spinner color = "$color12" size = "large" />
281
339
</ Stack >
282
- </ FadeCard >
340
+ </ Card >
283
341
</ YStack >
284
342
)
285
343
}
@@ -381,7 +439,7 @@ const TaskCard = ({
381
439
] . includes ( type )
382
440
383
441
return (
384
- < FadeCard br = { 12 } gap = "$4" p = "$6" jc = { 'space-between' } $gtSm = { { maw : 331 } } w = { '100%' } >
442
+ < Card br = { 12 } gap = "$4" p = "$6" jc = { 'space-between' } $gtSm = { { maw : 331 } } w = { '100%' } >
385
443
< XStack ai = { 'center' } jc = "space-between" >
386
444
{ status }
387
445
{ shouldShowValue && (
@@ -399,7 +457,7 @@ const TaskCard = ({
399
457
) }
400
458
</ XStack >
401
459
{ children }
402
- </ FadeCard >
460
+ </ Card >
403
461
)
404
462
}
405
463
0 commit comments