@@ -54,6 +54,7 @@ export const PaymentModal = ({
54
54
const [ price , setPrice ] = useState < TweetPrice | null > ( null )
55
55
const [ error , setError ] = useState < string | null > ( null )
56
56
const [ existingAttempts , setExistingAttempts ] = useState < bigint > ( 0n )
57
+ const [ tweetText , setTweetText ] = useState < string | null > ( null )
57
58
const [ txStatus , setTxStatus ] = useState < TransactionStatus > ( {
58
59
approve : 'idle' ,
59
60
payment : 'idle' ,
@@ -122,7 +123,32 @@ export const PaymentModal = ({
122
123
setError ( null )
123
124
setPrice ( null )
124
125
setExistingAttempts ( 0n )
126
+ setTweetText ( null )
125
127
setTxStatus ( { approve : 'idle' , payment : 'idle' } )
128
+
129
+ // Function to get tweet text with retries
130
+ const getTweetText = async ( retries = 3 , delayMs = 1000 ) : Promise < string > => {
131
+ for ( let attempt = 0 ; attempt < retries ; attempt ++ ) {
132
+ const tweetElement = document . querySelector ( `article[data-testid="tweet"] a[href*="/${ tweetId } "]` ) ?. closest ( 'article[data-testid="tweet"]' )
133
+ const tweetTextElement = tweetElement ?. querySelector ( SELECTORS . TWEET_TEXT )
134
+ const rawTweetText = tweetTextElement ?. textContent || ''
135
+ const cleanedTweetText = cleanPromptText ( rawTweetText )
136
+
137
+ if ( cleanedTweetText . trim ( ) ) {
138
+ return cleanedTweetText
139
+ }
140
+
141
+ // If not the last attempt, wait before retrying
142
+ if ( attempt < retries - 1 ) {
143
+ debug . log ( 'PaymentModal' , `Attempt ${ attempt + 1 } : Tweet text empty, retrying in ${ delayMs } ms` )
144
+ await new Promise ( resolve => setTimeout ( resolve , delayMs ) )
145
+ }
146
+ }
147
+ throw new Error ( 'Cannot process empty tweet. Please ensure the tweet contains text.' )
148
+ }
149
+
150
+ const cleanedTweetText = await getTweetText ( )
151
+ setTweetText ( cleanedTweetText )
126
152
127
153
// Get agent address
128
154
const address = await getAgentAddressByName ( agentName )
@@ -209,7 +235,10 @@ export const PaymentModal = ({
209
235
}
210
236
211
237
const handleConfirm = async ( ) => {
212
- if ( ! account || ! tokenContract || ! agentContract || ! price ) return
238
+ if ( ! account || ! tokenContract || ! agentContract || ! price || ! tweetText ?. trim ( ) ) {
239
+ setError ( 'Cannot process empty tweet. Please ensure the tweet contains text.' )
240
+ return
241
+ }
213
242
214
243
try {
215
244
setTxStatus ( ( prev ) => ( { ...prev , approve : 'loading' } ) )
@@ -305,6 +334,15 @@ export const PaymentModal = ({
305
334
</ div >
306
335
) : (
307
336
< div className = "space-y-4" >
337
+ { /* Tweet Content Preview */ }
338
+ { tweetText && (
339
+ < div className = "bg-white/5 p-4 rounded-lg space-y-2" >
340
+ < div className = "text-sm text-muted-foreground" > Tweet Content</ div >
341
+ < div className = "text-sm text-white break-all whitespace-pre-wrap border border-white/10 rounded p-3 max-h-[200px] overflow-y-auto" style = { { wordBreak : 'break-word' , overflowWrap : 'anywhere' } } >
342
+ { tweetText }
343
+ </ div >
344
+ </ div >
345
+ ) }
308
346
{ existingAttempts > 0n && (
309
347
< div className = "flex items-center gap-2 p-4 bg-yellow-500/10 rounded-lg text-yellow-500" >
310
348
< AlertTriangle className = "w-5 h-5" />
0 commit comments