@@ -7,14 +7,25 @@ import { dismissToast, showError, showLoading, showSuccess } from "../lib/toast"
77import { useSigningActions } from "../stores/signatureStore" ;
88import Icon from "./ui/Icon" ;
99
10+ /**
11+ * Main component for the token swap functionality.
12+ */
1013export default function SwapInterface ( ) {
14+ // --- Token Selection State ---
15+ /** The asset code of the token being sold */
1116 const [ fromToken , setFromToken ] = useState ( "XLM" ) ;
17+ /** The asset code of the token being bought */
1218 const [ toToken , setToToken ] = useState ( "USDC" ) ;
19+
20+ // --- UI Visibility State ---
1321 const [ isSettingsOpen , setIsSettingsOpen ] = useState ( false ) ;
1422 const [ isProMode , setIsProMode ] = useState ( false ) ;
1523
1624 const { deadline } = useSettings ( ) ;
1725
26+ /**
27+ * Swaps the 'from' and 'to' tokens and their amounts.
28+ */
1829 const handleSwap = ( ) => {
1930 const temp = fromToken ;
2031 setFromToken ( toToken ) ;
@@ -23,19 +34,28 @@ export default function SwapInterface() {
2334 setToAmount ( fromAmount ) ;
2435 } ;
2536
37+ /**
38+ * Updates the source amount and recalculates the destination amount and price impact.
39+ *
40+ * @param {string } value - The new input amount.
41+ */
2642 const handleFromAmountChange = ( value : string ) => {
2743 setFromAmount ( value ) ;
2844 const impact = calculatePriceImpact ( value ) ;
2945 setPriceImpact ( impact ) ;
3046
3147 if ( value && parseFloat ( value ) > 0 ) {
48+ // Mock exchange rate logic
3249 const mockRate = fromToken === "XLM" ? 0.15 : 6.67 ;
3350 setToAmount ( ( parseFloat ( value ) * mockRate * ( 1 - impact / 100 ) ) . toFixed ( 6 ) ) ;
3451 } else {
3552 setToAmount ( "" ) ;
3653 }
3754 } ;
3855
56+ /**
57+ * Initiates the swap flow, validating inputs and checking for high slippage.
58+ */
3959 const handleSwapClick = async ( ) => {
4060 if ( ! fromAmount || parseFloat ( fromAmount ) <= 0 ) {
4161 showError ( "Please enter an amount to swap" ) ;
@@ -45,41 +65,43 @@ export default function SwapInterface() {
4565 const loadingToast = showLoading ( "Processing swap..." ) ;
4666
4767 try {
68+ // Threshold check for high slippage warning
4869 if ( priceImpact > 5 ) {
4970 setIsHighSlippageWarningOpen ( true ) ;
5071 dismissToast ( loadingToast ) ;
5172 return ;
5273 }
5374
54- await new Promise ( ( resolve ) => setTimeout ( resolve , 1800 ) ) ;
75+ // Simulate network delay
76+ await new Promise ( ( resolve ) => setTimeout ( resolve , 1500 ) ) ;
5577
5678 showSuccess ( `Swapped ${ fromAmount } ${ fromToken } → ${ toAmount } ${ toToken } ` , {
5779 id : loadingToast ,
5880 } ) ;
5981
60- if ( priceImpact > 5 ) {
61- setIsHighSlippageWarningOpen ( true ) ;
62- } else {
63- setIsTradeReviewOpen ( true ) ;
64- }
82+ setIsTradeReviewOpen ( true ) ;
6583 } catch ( error ) {
6684 showError ( "Failed to process swap" , {
6785 id : loadingToast ,
6886 } ) ;
6987 }
7088 } ;
7189
90+ /**
91+ * Confirms the trade and prepares the transaction for signing.
92+ */
7293 const handleTradeConfirm = async ( ) => {
7394 setIsTradeReviewOpen ( false ) ;
7495 setIsSubmitting ( true ) ;
7596 setSubmissionStartTime ( Date . now ( ) ) ;
7697
7798 try {
99+ // Simulate transaction building time
78100 await new Promise ( resolve => setTimeout ( resolve , 2000 ) ) ;
79101
80- // Generate mock transaction XDR
102+ // Mock transaction XDR for demonstration
81103 const mockTransactionXDR = "AAAAAK/eFzA7Jf5Xf3Xf3Xf3Xf3Xf3Xf3Xf3Xf3Xf3Xf3Xf3Xf3Xf3Xf3Xf3Xf3XAAAABQAAAAAAAAAAA==" ;
82- console . log ( "Mock XDR generated:" , mockTransactionXDR ) ;
104+ console . log ( "[SwapInterface] Mock XDR generated:" , mockTransactionXDR ) ;
83105
84106 setIsTransactionSignatureOpen ( true ) ;
85107 } catch ( error ) {
@@ -89,6 +111,9 @@ export default function SwapInterface() {
89111 }
90112 } ;
91113
114+ /**
115+ * Handles confirmation from the high slippage warning modal.
116+ */
92117 const handleHighSlippageConfirm = async ( ) => {
93118 const loadingToast = showLoading ( "Processing high slippage swap..." ) ;
94119
@@ -105,9 +130,13 @@ export default function SwapInterface() {
105130 }
106131 } ;
107132
108- /* ISSUE #87: Trigger the success modal when the transaction is signed */
133+ /**
134+ * Callback for when the user successfully signs the transaction.
135+ *
136+ * @param {string } signedXDR - The base64 signed transaction XDR.
137+ */
109138 const handleTransactionSuccess = ( signedXDR : string ) => {
110- console . log ( "Transaction signed:" , signedXDR ) ;
139+ console . log ( "[SwapInterface] Transaction signed:" , signedXDR ) ;
111140
112141 showSuccess ( "Transaction signed successfully!" , {
113142 icon : "✅" ,
@@ -117,16 +146,18 @@ export default function SwapInterface() {
117146 setIsSubmitting ( false ) ;
118147 setSubmissionStartTime ( null ) ;
119148
120- // Show the Growth/Share modal
149+ // Show the post-trade share/growth modal
121150 setIsSuccessModalOpen ( true ) ;
122151
152+ // Reset form after a short delay
123153 setTimeout ( ( ) => {
124154 setFromAmount ( "" ) ;
125155 setToAmount ( "" ) ;
126156 setPriceImpact ( 0 ) ;
127157 } , 1500 ) ;
128158 } ;
129159
160+
130161 const isAnyModalOpen = isSettingsOpen || isHighSlippageWarningOpen || isTradeReviewOpen || isSuccessModalOpen ;
131162 const isSwapValid = fromAmount && parseFloat ( fromAmount ) > 0 && ! isSubmitting ;
132163
0 commit comments