11"use client" ;
22
3- import { useMemo , useState } from "react" ;
3+ import { useState } from "react" ;
44import type { Buy , Sell } from "../../../../../bridge/index.js" ;
55import type { TokenWithPrices } from "../../../../../bridge/types/Token.js" ;
66import type { ThirdwebClient } from "../../../../../client/client.js" ;
@@ -12,18 +12,14 @@ import type {
1212 BridgePrepareRequest ,
1313 BridgePrepareResult ,
1414} from "../../../../core/hooks/useBridgePrepare.js" ;
15- import { useActiveAccount } from "../../../../core/hooks/wallets/useActiveAccount.js" ;
16- import { useActiveWallet } from "../../../../core/hooks/wallets/useActiveWallet.js" ;
17- import { useActiveWalletChain } from "../../../../core/hooks/wallets/useActiveWalletChain.js" ;
1815import { webWindowAdapter } from "../../../adapters/WindowAdapter.js" ;
19- import { useConnectLocale } from "../../ConnectWallet/locale/getConnectLocale.js" ;
2016import { EmbedContainer } from "../../ConnectWallet/Modal/ConnectEmbed.js" ;
2117import { DynamicHeight } from "../../components/DynamicHeight.js" ;
22- import { Spinner } from "../../components/Spinner.js" ;
2318import type { LocaleId } from "../../types.js" ;
2419import { PaymentDetails } from "../payment-details/PaymentDetails.js" ;
2520import { QuoteLoader } from "../QuoteLoader.js" ;
2621import { StepRunner } from "../StepRunner.js" ;
22+ import { useActiveWalletInfo } from "./hooks.js" ;
2723import { SwapUI } from "./swap-ui.js" ;
2824import type { SwapWidgetConnectOptions } from "./types.js" ;
2925import { useBridgeChains } from "./use-bridge-chains.js" ;
@@ -85,117 +81,96 @@ export function SwapWidgetContainer(props: {
8581
8682type SwapWidgetScreen =
8783 | { id : "1:swap-ui" }
88- | { id : "2:loading-quote" ; quote : Buy . quote . Result | Sell . quote . Result }
84+ | {
85+ id : "2:loading-quote" ;
86+ quote : Buy . quote . Result | Sell . quote . Result ;
87+ buyToken : TokenWithPrices ;
88+ sellToken : TokenWithPrices ;
89+ }
8990 | {
9091 id : "3:preview" ;
9192 preparedQuote : BridgePrepareResult ;
9293 request : BridgePrepareRequest ;
9394 quote : Buy . quote . Result | Sell . quote . Result ;
95+ buyToken : TokenWithPrices ;
96+ sellToken : TokenWithPrices ;
9497 }
9598 | {
9699 id : "4:execute" ;
97100 request : BridgePrepareRequest ;
98101 quote : Buy . quote . Result | Sell . quote . Result ;
99102 preparedQuote : BridgePrepareResult ;
103+ buyToken : TokenWithPrices ;
104+ sellToken : TokenWithPrices ;
100105 } ;
101106
102107function SwapWidgetContent ( props : SwapWidgetProps ) {
103108 const [ screen , setScreen ] = useState < SwapWidgetScreen > ( { id : "1:swap-ui" } ) ;
104- const connectLocaleQuery = useConnectLocale ( props . locale || "en_US" ) ;
105109 const activeWalletInfo = useActiveWalletInfo ( ) ;
106- const [ buyToken , setBuyToken ] = useState < TokenWithPrices | undefined > (
107- undefined ,
108- ) ;
109- const [ sellToken , setSellToken ] = useState < TokenWithPrices | undefined > (
110- undefined ,
111- ) ;
112110
113111 // preload requests
114112 useBridgeChains ( props . client ) ;
115113
116- if ( ! connectLocaleQuery . data ) {
117- return (
118- < div
119- style = { {
120- alignItems : "center" ,
121- display : "flex" ,
122- justifyContent : "center" ,
123- minHeight : "350px" ,
124- } }
125- >
126- < Spinner color = "secondaryText" size = "xl" />
127- </ div >
128- ) ;
129- }
130-
131- if ( screen . id === "1:swap-ui" ) {
114+ // if wallet suddenly disconnects, show screen 1
115+ if ( screen . id === "1:swap-ui" || ! activeWalletInfo ) {
132116 return (
133117 < SwapUI
134118 client = { props . client }
135119 theme = { props . theme || "dark" }
136- buyToken = { buyToken }
137- sellToken = { sellToken }
138- setBuyToken = { setBuyToken }
139- setSellToken = { setSellToken }
140120 connectOptions = { props . connectOptions }
141121 currency = { props . currency || "USD" }
142122 activeWalletInfo = { activeWalletInfo }
143- onSwap = { ( quote ) => {
144- setScreen ( { quote, id : "2:loading-quote" } ) ;
123+ onSwap = { ( quote , selection ) => {
124+ setScreen ( {
125+ quote,
126+ id : "2:loading-quote" ,
127+ ...selection ,
128+ } ) ;
145129 } }
146130 />
147131 ) ;
148132 }
149133
150- if (
151- screen . id === "2:loading-quote" &&
152- // TODO - cleanup
153- activeWalletInfo &&
154- sellToken &&
155- buyToken
156- ) {
134+ if ( screen . id === "2:loading-quote" ) {
157135 return (
158136 < QuoteLoader
159- amount = { toTokens ( screen . quote . destinationAmount , buyToken . decimals ) }
137+ amount = { toTokens (
138+ screen . quote . destinationAmount ,
139+ screen . buyToken . decimals ,
140+ ) }
160141 onError = { ( ) => {
161142 // TODO
162143 } }
163144 onQuoteReceived = { ( preparedQuote , request ) => {
164145 setScreen ( {
146+ ...screen ,
165147 id : "3:preview" ,
166148 preparedQuote,
167149 request,
168- quote : screen . quote ,
169150 } ) ;
170151 // TODO
171152 } }
172153 receiver = { activeWalletInfo . activeAccount . address }
173154 onBack = { ( ) => setScreen ( { id : "1:swap-ui" } ) }
174155 uiOptions = { {
175- destinationToken : buyToken ,
156+ destinationToken : screen . buyToken ,
176157 mode : "fund_wallet" ,
177158 currency : props . currency ,
178159 } }
179160 client = { props . client }
180- destinationToken = { buyToken }
161+ destinationToken = { screen . buyToken }
181162 paymentMethod = { {
182163 quote : screen . quote ,
183164 type : "wallet" ,
184165 payerWallet : activeWalletInfo . activeWallet ,
185166 balance : 0n , // TODO - what is this?
186- originToken : sellToken ,
167+ originToken : screen . sellToken ,
187168 } }
188169 />
189170 ) ;
190171 }
191172
192- if (
193- screen . id === "3:preview" &&
194- // TODO - cleanup
195- activeWalletInfo &&
196- sellToken &&
197- buyToken
198- ) {
173+ if ( screen . id === "3:preview" ) {
199174 return (
200175 < PaymentDetails
201176 client = { props . client }
@@ -204,10 +179,8 @@ function SwapWidgetContent(props: SwapWidgetProps) {
204179 } }
205180 onConfirm = { ( ) => {
206181 setScreen ( {
182+ ...screen ,
207183 id : "4:execute" ,
208- preparedQuote : screen . preparedQuote ,
209- request : screen . request ,
210- quote : screen . quote ,
211184 } ) ;
212185 } }
213186 onError = { ( _error ) => {
@@ -218,33 +191,27 @@ function SwapWidgetContent(props: SwapWidgetProps) {
218191 type : "wallet" ,
219192 payerWallet : activeWalletInfo . activeWallet ,
220193 balance : 0n , // TODO - what is this?
221- originToken : sellToken ,
194+ originToken : screen . sellToken ,
222195 } }
223196 preparedQuote = { screen . preparedQuote }
224197 uiOptions = { {
225- destinationToken : buyToken ,
198+ destinationToken : screen . buyToken ,
226199 mode : "fund_wallet" ,
227200 currency : props . currency ,
228201 } }
229202 />
230203 ) ;
231204 }
232205
233- if (
234- screen . id === "4:execute" &&
235- // TODO - cleanup
236- activeWalletInfo
237- ) {
206+ if ( screen . id === "4:execute" ) {
238207 return (
239208 < StepRunner
240209 autoStart = { true }
241210 client = { props . client }
242211 onBack = { ( ) => {
243212 setScreen ( {
213+ ...screen ,
244214 id : "3:preview" ,
245- preparedQuote : screen . preparedQuote ,
246- request : screen . request ,
247- quote : screen . quote ,
248215 } ) ;
249216 } }
250217 onCancel = { ( ) => {
@@ -262,19 +229,3 @@ function SwapWidgetContent(props: SwapWidgetProps) {
262229
263230 return null ;
264231}
265-
266- function useActiveWalletInfo ( ) {
267- const activeAccount = useActiveAccount ( ) ;
268- const activeWallet = useActiveWallet ( ) ;
269- const activeChain = useActiveWalletChain ( ) ;
270-
271- return useMemo ( ( ) => {
272- return activeAccount && activeWallet && activeChain
273- ? {
274- activeChain,
275- activeWallet,
276- activeAccount,
277- }
278- : undefined ;
279- } , [ activeAccount , activeWallet , activeChain ] ) ;
280- }
0 commit comments