1
1
// Copyright (c) 2024 IOTA Stiftung
2
2
// SPDX-License-Identifier: Apache-2.0
3
3
4
- import { MigrationObjectLoading , VirtualList } from '@/components' ;
4
+ import { MigrationObjectLoading , VirtualList , MigrationObjectDetailsCard } from '@/components' ;
5
5
import { useCurrentAccount } from '@iota/dapp-kit' ;
6
6
import { IotaObjectData } from '@iota/iota-sdk/client' ;
7
7
import {
@@ -20,10 +20,10 @@ import { useGroupedMigrationObjectsByExpirationDate } from '@/hooks';
20
20
import { Loader , Warning } from '@iota/ui-icons' ;
21
21
import { Collapsible , useFormatCoin } from '@iota/core' ;
22
22
import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils' ;
23
- import { summarizeMigratableObjectValues } from '@/lib/utils' ;
24
- import { MigrationObjectDetailsCard } from '@/components/migration/migration-object-details-card' ;
23
+ import { filterMigrationObjects , summarizeMigratableObjectValues } from '@/lib/utils' ;
25
24
import { DialogLayout , DialogLayoutBody , DialogLayoutFooter } from '../../layout' ;
26
25
import { Transaction } from '@iota/iota-sdk/transactions' ;
26
+ import { StardustOutputDetailsFilter } from '@/lib/enums' ;
27
27
28
28
interface ConfirmMigrationViewProps {
29
29
basicOutputObjects : IotaObjectData [ ] | undefined ;
@@ -64,21 +64,60 @@ export function ConfirmMigrationView({
64
64
isTimelocked ,
65
65
) ;
66
66
67
- const { totalNotOwnedStorageDepositReturnAmount } = summarizeMigratableObjectValues ( {
67
+ const {
68
+ totalIotaAmount,
69
+ totalNativeTokens : migratableNativeTokens ,
70
+ totalVisualAssets : migratableVisualAssets ,
71
+ totalNotOwnedStorageDepositReturnAmount,
72
+ } = summarizeMigratableObjectValues ( {
68
73
basicOutputs : basicOutputObjects ,
69
74
nftOutputs : nftOutputObjects ,
70
75
address : account ?. address || '' ,
71
76
} ) ;
72
77
78
+ const [ timelockedIotaTokens , symbol ] = useFormatCoin ( totalIotaAmount , IOTA_TYPE_ARG ) ;
73
79
const [ gasFee , gasFeeSymbol ] = useFormatCoin ( migrateData ?. gasBudget , IOTA_TYPE_ARG ) ;
74
80
const [ totalStorageDepositReturnAmountFormatted , totalStorageDepositReturnAmountSymbol ] =
75
81
useFormatCoin ( totalNotOwnedStorageDepositReturnAmount . toString ( ) , IOTA_TYPE_ARG ) ;
76
82
83
+ const filteredIotaObjects = filterMigrationObjects (
84
+ resolvedObjects ,
85
+ StardustOutputDetailsFilter . IOTA ,
86
+ ) ;
87
+ const filteredNativeTokens = filterMigrationObjects (
88
+ resolvedObjects ,
89
+ StardustOutputDetailsFilter . NativeTokens ,
90
+ ) ;
91
+ const filteredVisualAssets = filterMigrationObjects (
92
+ resolvedObjects ,
93
+ StardustOutputDetailsFilter . VisualAssets ,
94
+ ) ;
95
+
96
+ const assetsToMigrateCategories = [
97
+ {
98
+ title : 'IOTA Tokens' ,
99
+ subtitle : `${ timelockedIotaTokens } ${ symbol } ` ,
100
+ filteredObjects : filteredIotaObjects ,
101
+ } ,
102
+ {
103
+ title : 'Native Tokens' ,
104
+ subtitle : `${ migratableNativeTokens } Types` ,
105
+ filteredObjects : filteredNativeTokens ,
106
+ } ,
107
+ {
108
+ title : 'Visual Assets' ,
109
+ subtitle : `${ migratableVisualAssets } Assets` ,
110
+ filteredObjects : filteredVisualAssets ,
111
+ } ,
112
+ ] ;
113
+ const filteredAssetsToMigrateCategories = assetsToMigrateCategories . filter (
114
+ ( { filteredObjects } ) => filteredObjects . length > 0 ,
115
+ ) ;
77
116
return (
78
117
< DialogLayout >
79
- < Header title = "Confirmation " onClose = { ( ) => setOpen ( false ) } titleCentered />
118
+ < Header title = "Migrate Your Assets " onClose = { ( ) => setOpen ( false ) } titleCentered />
80
119
< DialogLayoutBody >
81
- < div className = "flex h-full flex-col gap-y-md overflow-y-auto " >
120
+ < div className = "flex h-full flex-col gap-y-md" >
82
121
{ isGroupedMigrationError && ! isLoading && (
83
122
< InfoBox
84
123
title = "Error"
@@ -105,27 +144,37 @@ export function ConfirmMigrationView({
105
144
</ >
106
145
) : (
107
146
< >
108
- < Collapsible
109
- defaultOpen
110
- render = { ( ) => (
111
- < Title size = { TitleSize . Small } title = "Assets to Migrate" />
147
+ < div className = "flex flex-col gap-y-sm" >
148
+ { filteredAssetsToMigrateCategories . map (
149
+ ( { title, subtitle, filteredObjects } ) => (
150
+ < Collapsible
151
+ key = { title }
152
+ render = { ( ) => (
153
+ < Title
154
+ size = { TitleSize . Small }
155
+ title = { title }
156
+ subtitle = { subtitle }
157
+ />
158
+ ) }
159
+ >
160
+ < div className = "flex h-full max-h-[300px] flex-col gap-y-sm pb-sm" >
161
+ < VirtualList
162
+ heightClassName = "h-full"
163
+ overflowClassName = "overflow-y-auto"
164
+ items = { filteredObjects }
165
+ estimateSize = { ( ) => 58 }
166
+ render = { ( migrationObject ) => (
167
+ < MigrationObjectDetailsCard
168
+ migrationObject = { migrationObject }
169
+ isTimelocked = { isTimelocked }
170
+ />
171
+ ) }
172
+ />
173
+ </ div >
174
+ </ Collapsible >
175
+ ) ,
112
176
) }
113
- >
114
- < div className = "h-[500px] pb-md--rs xl:h-[600px]" >
115
- < VirtualList
116
- heightClassName = "h-full"
117
- overflowClassName = "overflow-y-auto"
118
- items = { resolvedObjects }
119
- estimateSize = { ( ) => 58 }
120
- render = { ( migrationObject ) => (
121
- < MigrationObjectDetailsCard
122
- migrationObject = { migrationObject }
123
- isTimelocked = { isTimelocked }
124
- />
125
- ) }
126
- />
127
- </ div >
128
- </ Collapsible >
177
+ </ div >
129
178
< Panel hasBorder >
130
179
< div className = "flex flex-col gap-y-sm p-md" >
131
180
< KeyValueInfo
0 commit comments