@@ -13,6 +13,7 @@ import {
1313import Animated , { FadeIn , FadeOut } from 'react-native-reanimated' ;
1414import { TransferService } from './TransferService' ;
1515import { ShareSheet } from './ShareSheet' ;
16+ import { useMobileWallet } from '../hooks/useMobileWallet' ;
1617import { CreateAccountRequest , CreateAccountResponse , SupportedAsset } from '../types/api' ;
1718
1819type Step = 'amount' | 'recipient' | 'review' | 'success' | 'error' ;
@@ -24,6 +25,8 @@ export const SenderFlow: React.FC = () => {
2425 const [ error , setError ] = useState < string | null > ( null ) ;
2526 const [ response , setResponse ] = useState < CreateAccountResponse | null > ( null ) ;
2627 const [ showShareSheet , setShowShareSheet ] = useState ( false ) ;
28+ const { session } = useMobileWallet ( ) ;
29+ const connectedPublicKey = session ?. publicKey ?? null ;
2730
2831 // Form State
2932 const [ amount , setAmount ] = useState ( '' ) ;
@@ -48,9 +51,23 @@ export const SenderFlow: React.FC = () => {
4851 setLoading ( true ) ;
4952 setError ( null ) ;
5053
54+ // `fundingSource` / `recovery_address` are required by the SDK. They must
55+ // come from a connected Stellar wallet session; surface a clear error if
56+ // no wallet is connected instead of sending a malformed request.
57+ if ( ! connectedPublicKey ) {
58+ setError ( 'Connect a Stellar wallet to send a payment.' ) ;
59+ setStep ( 'error' ) ;
60+ setLoading ( false ) ;
61+ return ;
62+ }
63+
64+ const isNative = selectedAsset . code === 'XLM' ;
5165 const request : CreateAccountRequest = {
66+ fundingSource : connectedPublicKey ,
67+ recovery_address : connectedPublicKey ,
5268 amount,
53- asset : `${ selectedAsset . code } :${ selectedAsset . issuer } ` ,
69+ asset_code : isNative ? 'XLM' : selectedAsset . code ,
70+ asset_issuer : isNative ? undefined : selectedAsset . issuer ,
5471 expiresIn : 30 * 24 * 60 * 60 , // Default 30 days
5572 metadata : {
5673 recipientName,
@@ -209,16 +226,18 @@ export const SenderFlow: React.FC = () => {
209226
210227 < View style = { styles . linkCard } >
211228 < Text style = { styles . linkText } numberOfLines = { 1 } ellipsizeMode = "middle" >
212- { response ?. claimUrl }
229+ { response ?. claimUrl ?? 'Claim link unavailable' }
213230 </ Text >
214231 </ View >
215232
216- < TouchableOpacity
217- style = { styles . shareButton }
218- onPress = { ( ) => setShowShareSheet ( true ) }
219- >
220- < Text style = { styles . shareButtonText } > 📤 Share Claim Link</ Text >
221- </ TouchableOpacity >
233+ { response ?. claimUrl && (
234+ < TouchableOpacity
235+ style = { styles . shareButton }
236+ onPress = { ( ) => setShowShareSheet ( true ) }
237+ >
238+ < Text style = { styles . shareButtonText } > 📤 Share Claim Link</ Text >
239+ </ TouchableOpacity >
240+ ) }
222241
223242 < TouchableOpacity
224243 style = { styles . primaryButton }
@@ -232,7 +251,7 @@ export const SenderFlow: React.FC = () => {
232251 < Text style = { styles . buttonText } > Create Another</ Text >
233252 </ TouchableOpacity >
234253
235- { response && (
254+ { response ?. claimUrl && (
236255 < ShareSheet
237256 visible = { showShareSheet }
238257 claimUrl = { response . claimUrl }
0 commit comments