11import { useAnalyticsContext , useProjectAccessKey } from '@0xsequence/connect'
2- import { Spinner , Text } from '@0xsequence/design-system'
2+ import { Button , Spinner , Text } from '@0xsequence/design-system'
33import { useConfig , useGetTokenMetadata , useGetContractInfo } from '@0xsequence/hooks'
44import { findSupportedNetwork } from '@0xsequence/network'
55import pako from 'pako'
6- import { useEffect , useRef } from 'react'
6+ import { useEffect , useRef , useState } from 'react'
77import { formatUnits } from 'viem'
8+ import { useSignMessage , usePublicClient , useAccount } from 'wagmi'
89
910import { fetchSardineOrderStatus } from '../api'
1011import { NFT_CHECKOUT_SOURCE } from '../constants'
@@ -15,7 +16,8 @@ import {
1516 useSardineClientToken ,
1617 useTransactionStatusModal ,
1718 useSkipOnCloseCallback ,
18- useForteAccessToken
19+ useForteAccessToken ,
20+ useFortePaymentIntent
1921} from '../hooks'
2022import { TRANSAK_PROXY_ADDRESS } from '../utils/transak'
2123
@@ -436,28 +438,111 @@ export const PendingCreditCardTransactionSardine = ({ skipOnCloseCallback }: Pen
436438}
437439
438440export const PendingCreditCardTransactionForte = ( { skipOnCloseCallback } : PendingCreditTransactionProps ) => {
441+ const { forteWidgetUrl } = useEnvironmentContext ( )
439442 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
440451
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 ) {
442517 return (
443518 < div className = "flex items-center justify-center" style = { { height : '770px' } } >
444519 < Spinner size = "lg" />
445520 </ div >
446521 )
447522 }
448523
449- if ( isErrorAccessToken ) {
524+ if ( isError ) {
450525 return (
451526 < div className = "flex items-center justify-center" style = { { height : '770px' } } >
452527 < Text color = "primary" > An error has occurred</ Text >
453528 </ div >
454529 )
455530 }
456531
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+
457542 return (
458543 < 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 >
461546 </ div >
462547 )
463548}
0 commit comments