11import { useDispatch , useSelector } from "react-redux" ;
2- import { useContext , useEffect , useState } from "react" ;
2+ import { ReactNode , useContext , useEffect , useState } from "react" ;
33import { CustomizeContext } from "../../providers/CustomizeProvider" ;
44import { BRIDGE_DISPLAY_NAMES } from "../../consts/" ;
55
@@ -15,6 +15,14 @@ import { setSelectedRoute } from "../../state/selectedRouteSlice";
1515import { TxStepDetails } from "../TxModal/TxStepDetails" ;
1616import { TokenDetailsRow } from "../common/TokenDetailsRow" ;
1717
18+ import {
19+ formatCurrencyAmount ,
20+ timeInMinutes ,
21+ truncateDecimalValue ,
22+ } from "../../utils/" ;
23+ import { useGetFees } from "../../hooks/useGetFees" ;
24+ import { useGetGasLimitFromUserTxs } from "../../hooks/useGetGasLimitFromUserTxs" ;
25+
1826export const ReviewModal = ( {
1927 closeModal,
2028 style,
@@ -48,29 +56,80 @@ export const ReviewModal = ({
4856
4957 const refuelSourceToken = {
5058 amount : selectedRoute ?. refuel ?. fromAmount ,
51- asset : selectedRoute ?. refuel ?. fromAsset
52- }
59+ asset : selectedRoute ?. refuel ?. fromAsset ,
60+ } ;
5361 const refuelDestToken = {
5462 amount : selectedRoute ?. refuel ?. toAmount ,
55- asset : selectedRoute ?. refuel ?. toAsset
56- }
63+ asset : selectedRoute ?. refuel ?. toAsset ,
64+ } ;
5765
58- function formattedGasFees ( ) {
59- const feesInUsd = selectedRoute ?. route ?. totalGasFeesInUsd ?. toFixed ( 3 ) ;
60- return `${ feesInUsd } USD` ;
61- }
66+ // Source Gas Fees
67+ const sourceGasLimit = useGetGasLimitFromUserTxs (
68+ selectedRoute ?. route ,
69+ selectedRoute ?. path ?. fromToken ?. chainId
70+ ) ;
71+ const sourceNativeToken = selectedRoute ?. route ?. userTxs . filter (
72+ ( tx ) => tx . chainId === selectedRoute ?. path ?. fromToken ?. chainId
73+ ) [ 0 ] ?. gasFees ?. asset ;
74+ const { feesInToken : sourceFeesInToken , feesInUsd : sourceFeesInUSD } =
75+ useGetFees (
76+ sourceGasLimit ,
77+ sourceNativeToken ?. chainId ,
78+ sourceNativeToken ?. decimals ,
79+ selectedRoute ?. route
80+ ) ;
81+
82+ // Dest Gas Fees
83+ const destGasLimit = useGetGasLimitFromUserTxs (
84+ selectedRoute ?. route ,
85+ selectedRoute ?. path ?. fromToken ?. chainId
86+ ) ;
87+ const destNativeToken = selectedRoute ?. route ?. userTxs . filter (
88+ ( tx ) => tx . chainId === selectedRoute ?. path ?. toToken ?. chainId
89+ ) [ 0 ] ?. gasFees ?. asset ;
90+ const { feesInToken : destFeesInToken , feesInUsd : destFeesInUSD } = useGetFees (
91+ destGasLimit ,
92+ destNativeToken ?. chainId ,
93+ destNativeToken ?. decimals ,
94+ selectedRoute ?. route
95+ ) ;
96+
97+ // Extracting Bridge Step from fundMove userTx
98+ const fundMovrData = selectedRoute ?. route ?. userTxs . filter (
99+ ( item ) => item . userTxType === "fund-movr"
100+ ) [ 0 ] ;
101+ const bridgeData =
102+ fundMovrData ?. steps &&
103+ fundMovrData ?. steps . filter ( ( step ) => step . type === "bridge" ) [ 0 ] ;
104+
105+ // Bridge Fee
106+ const bridgeFee = bridgeData ?. protocolFees . feesInUsd ;
107+ const bridgeFeeInToken = formatCurrencyAmount (
108+ bridgeData ?. protocolFees . amount ,
109+ bridgeData ?. protocolFees . asset . decimals ,
110+ 5
111+ ) ;
112+ const bridgeFeeTokenSymbol = bridgeData ?. protocolFees . asset . symbol ;
62113
63114 return (
64115 < Modal
65116 title = "Review Quote"
66- closeModal = { showTxDetails ? ( ) => setShowTxDetails ( ! showTxDetails ) : closeModal }
117+ closeModal = {
118+ showTxDetails ? ( ) => setShowTxDetails ( ! showTxDetails ) : closeModal
119+ }
67120 style = { style }
68121 >
69122 < div className = "skt-w flex flex-col justify-between flex-1 relative" >
70123 < div className = "skt-w w-full" >
71- < TokenDetailsRow
72- srcDetails = { { token : selectedRoute ?. path ?. fromToken , amount : selectedRoute ?. amount } }
73- destDetails = { { token : selectedRoute ?. path ?. toToken , amount : selectedRoute ?. route ?. toAmount } }
124+ < TokenDetailsRow
125+ srcDetails = { {
126+ token : selectedRoute ?. path ?. fromToken ,
127+ amount : selectedRoute ?. amount ,
128+ } }
129+ destDetails = { {
130+ token : selectedRoute ?. path ?. toToken ,
131+ amount : selectedRoute ?. route ?. toAmount ,
132+ } }
74133 srcRefuel = { refuelSourceToken }
75134 destRefuel = { refuelDestToken }
76135 />
@@ -85,9 +144,32 @@ export const ReviewModal = ({
85144 }
86145 />
87146 < RouteDetailRow
88- label = "Total Gas Fee "
89- value = { formattedGasFees ( ) }
147+ label = "Estimated Bridging Time "
148+ value = { timeInMinutes ( selectedRoute ?. route ?. serviceTime ) }
90149 />
150+ < RouteDetailRow label = "Source Gas Fee" >
151+ < FeeDisplay
152+ feeInToken = { sourceFeesInToken }
153+ feeInUsd = { sourceFeesInUSD }
154+ tokenSymbol = { sourceNativeToken ?. symbol }
155+ />
156+ </ RouteDetailRow >
157+ { ! ! destFeesInToken && (
158+ < RouteDetailRow label = "Dest Gas Fee" >
159+ < FeeDisplay
160+ feeInToken = { destFeesInToken }
161+ feeInUsd = { destFeesInUSD }
162+ tokenSymbol = { destNativeToken ?. symbol }
163+ />
164+ </ RouteDetailRow >
165+ ) }
166+ < RouteDetailRow label = "Bridge Fee" >
167+ < FeeDisplay
168+ feeInToken = { bridgeFeeInToken }
169+ feeInUsd = { bridgeFee }
170+ tokenSymbol = { bridgeFeeTokenSymbol }
171+ />
172+ </ RouteDetailRow >
91173 < RouteDetailRow
92174 label = "Number of transactions"
93175 value = { selectedRoute ?. route ?. totalUserTx }
@@ -115,7 +197,11 @@ export const ReviewModal = ({
115197
116198 { showTxDetails && (
117199 < div className = "skt-w mb-3 flex-1 overflow-y-auto" >
118- < TxStepDetails activeRoute = { selectedRoute ?. route } forReview refuel = { selectedRoute ?. refuel } />
200+ < TxStepDetails
201+ activeRoute = { selectedRoute ?. route }
202+ forReview
203+ refuel = { selectedRoute ?. refuel }
204+ />
119205 </ div >
120206 ) }
121207 </ div >
@@ -147,11 +233,49 @@ export const ReviewModal = ({
147233 ) ;
148234} ;
149235
150- const RouteDetailRow = ( { label, value } : { label : string ; value : string } ) => {
236+ const RouteDetailRow = ( {
237+ label,
238+ value,
239+ children,
240+ } : {
241+ label : string ;
242+ value ?: string ;
243+ children ?: ReactNode ;
244+ } ) => {
151245 return (
152246 < div className = "skt-w w-full flex justify-between text-sm text-widget-secondary" >
153247 < span > { label } </ span >
154248 < span > { value } </ span >
249+ { children }
155250 </ div >
156251 ) ;
157252} ;
253+
254+ interface FeeDisplayProps {
255+ feeInToken : string ;
256+ tokenSymbol : string | undefined ;
257+ feeInUsd : number ;
258+ }
259+
260+ const FeeDisplay = ( props : FeeDisplayProps ) => {
261+ const { feeInToken, tokenSymbol, feeInUsd } = props ;
262+ if ( ! ! feeInToken ) {
263+ return (
264+ < span >
265+ { ! ! feeInToken && feeInToken !== "0" ? (
266+ < span >
267+ { truncateDecimalValue ( feeInToken , 5 ) } { " " }
268+ < span className = "font-medium" > { tokenSymbol } </ span > { " " }
269+ </ span >
270+ ) : (
271+ 0
272+ ) }
273+ { feeInUsd !== 0 && (
274+ < span className = "opacity-80 font-normal" >
275+ (${ feeInUsd . toFixed ( 4 ) } )
276+ </ span >
277+ ) }
278+ </ span >
279+ ) ;
280+ } else return null ;
281+ } ;
0 commit comments