1
1
import { useAnalyticsContext , useProjectAccessKey } from '@0xsequence/connect'
2
- import { Spinner , Text } from '@0xsequence/design-system'
2
+ import { Button , Spinner , Text } from '@0xsequence/design-system'
3
3
import { useConfig , useGetTokenMetadata , useGetContractInfo } from '@0xsequence/hooks'
4
4
import { findSupportedNetwork } from '@0xsequence/network'
5
5
import pako from 'pako'
6
- import { useEffect , useRef } from 'react'
6
+ import { useEffect , useRef , useState } from 'react'
7
7
import { formatUnits } from 'viem'
8
+ import { useSignMessage , usePublicClient , useAccount } from 'wagmi'
8
9
9
10
import { fetchSardineOrderStatus } from '../api'
10
11
import { NFT_CHECKOUT_SOURCE } from '../constants'
@@ -15,7 +16,8 @@ import {
15
16
useSardineClientToken ,
16
17
useTransactionStatusModal ,
17
18
useSkipOnCloseCallback ,
18
- useForteAccessToken
19
+ useForteAccessToken ,
20
+ useFortePaymentIntent
19
21
} from '../hooks'
20
22
import { TRANSAK_PROXY_ADDRESS } from '../utils/transak'
21
23
@@ -436,28 +438,111 @@ export const PendingCreditCardTransactionSardine = ({ skipOnCloseCallback }: Pen
436
438
}
437
439
438
440
export const PendingCreditCardTransactionForte = ( { skipOnCloseCallback } : PendingCreditTransactionProps ) => {
441
+ const { forteWidgetUrl } = useEnvironmentContext ( )
439
442
const { data : accessTokenData , isLoading : isLoadingAccessToken , isError : isErrorAccessToken } = useForteAccessToken ( )
443
+ const { data : signatureData , signMessage } = useSignMessage ( )
444
+ const { address } = useAccount ( )
445
+ const nav = useNavigation ( )
446
+ const {
447
+ params : { creditCardCheckout }
448
+ } = nav . navigation as TransactionPendingNavigation
449
+ const publicClient = usePublicClient ( { chainId : creditCardCheckout . chainId } )
450
+ const isMessageSigned = signatureData !== undefined
440
451
441
- if ( isLoadingAccessToken ) {
452
+ const {
453
+ data : tokenMetadatas ,
454
+ isLoading : isLoadingTokenMetadata ,
455
+ isError : isErrorTokenMetadata
456
+ } = useGetTokenMetadata ( {
457
+ chainID : String ( creditCardCheckout . chainId ) ,
458
+ contractAddress : creditCardCheckout . nftAddress ,
459
+ tokenIDs : [ creditCardCheckout . nftId ]
460
+ } )
461
+
462
+ const tokenMetadata = tokenMetadatas ? tokenMetadatas [ 0 ] : undefined
463
+
464
+ const nftQuantity = formatUnits ( BigInt ( creditCardCheckout . nftQuantity ) , Number ( creditCardCheckout . nftDecimals || 0 ) )
465
+
466
+ const {
467
+ data : paymentIntentData ,
468
+ isLoading : isLoadingPaymentIntent ,
469
+ isError : isErrorPaymentIntent
470
+ } = useFortePaymentIntent (
471
+ {
472
+ accessToken : accessTokenData ?. accessToken || '' ,
473
+ tokenType : accessTokenData ?. tokenType || '' ,
474
+ nonce : `${ address || '' } -${ Date . now ( ) } ` ,
475
+ nftQuantity,
476
+ recipientAddress : creditCardCheckout . recipientAddress ,
477
+ chainId : creditCardCheckout . chainId . toString ( ) ,
478
+ signature : signatureData || '' ,
479
+ tokenAddress : creditCardCheckout . nftAddress ,
480
+ protocolAddress : creditCardCheckout . contractAddress ,
481
+ nftName : tokenMetadata ?. name || '' ,
482
+ imageUrl : tokenMetadata ?. image || '' ,
483
+ tokenId : creditCardCheckout . nftId
484
+ } ,
485
+ {
486
+ disabled : ! isMessageSigned || isLoadingTokenMetadata
487
+ }
488
+ )
489
+
490
+ const isLoading = isLoadingTokenMetadata || isLoadingAccessToken || isLoadingPaymentIntent
491
+ const isError = isErrorTokenMetadata || isErrorAccessToken || isErrorPaymentIntent
492
+
493
+ const onClickSignMessage = async ( ) => {
494
+ if ( ! publicClient || ! address ) {
495
+ console . error ( 'No public client or address' )
496
+ return
497
+ }
498
+
499
+ try {
500
+ await signMessage ( { message : creditCardCheckout . calldata } )
501
+ } catch ( e ) {
502
+ console . error ( 'An error occurred while signing the message' )
503
+ }
504
+ }
505
+
506
+ if ( ! isMessageSigned ) {
507
+ return (
508
+ < div className = "flex items-center justify-center" style = { { height : '770px' } } >
509
+ < Button variant = "primary" onClick = { onClickSignMessage } >
510
+ Approve and purchase
511
+ </ Button >
512
+ </ div >
513
+ )
514
+ }
515
+
516
+ if ( isLoading ) {
442
517
return (
443
518
< div className = "flex items-center justify-center" style = { { height : '770px' } } >
444
519
< Spinner size = "lg" />
445
520
</ div >
446
521
)
447
522
}
448
523
449
- if ( isErrorAccessToken ) {
524
+ if ( isError ) {
450
525
return (
451
526
< div className = "flex items-center justify-center" style = { { height : '770px' } } >
452
527
< Text color = "primary" > An error has occurred</ Text >
453
528
</ div >
454
529
)
455
530
}
456
531
532
+ const initializeFortePayment = ( ) => {
533
+ // @ts -ignore-next-line
534
+ window . initFortePaymentsWidget ( {
535
+ containerId : 'forte-payments-widget-container' ,
536
+ data : {
537
+ ...paymentIntentData
538
+ }
539
+ } )
540
+ }
541
+
457
542
return (
458
543
< div className = "flex items-center justify-center" style = { { height : '770px' } } >
459
- < Text color = "primary" > Forte </ Text >
460
- < Text color = "primary" > { accessTokenData ?. accessToken } </ Text >
544
+ < div id = "forte-payments-widget-container" > </ div >
545
+ < script onLoad = { initializeFortePayment } type = "module" async src = { forteWidgetUrl } > </ script >
461
546
</ div >
462
547
)
463
548
}
0 commit comments