@@ -48,6 +48,10 @@ export type WalletContextType = {
4848 handleSignMessage : ( data : Uint8Array ) => Promise < Uint8Array > ;
4949 handleSignAndSendTransaction : ( data : Uint8Array ) => Promise < Uint8Array > ;
5050 handleSignTypedData : ( data : ITypedData ) => Promise < Uint8Array > ;
51+ handleExternalWalletConnection : ( data : {
52+ chain : ChainType ;
53+ provider : IWalletProvider [ "name" ] ;
54+ } ) => Promise < void > ;
5155
5256 config : PushWalletProviderProps [ 'config' ] ;
5357 app ?: PushWalletProviderProps [ 'app' ] ;
@@ -63,6 +67,10 @@ export type WalletContextType = {
6367
6468 toggleButtonRef : React . RefObject < HTMLButtonElement > ;
6569 setProgress : React . Dispatch < React . SetStateAction < ProgressEvent | null > > ;
70+
71+ isReadOnly : boolean ;
72+ setIsReadOnly : React . Dispatch < React . SetStateAction < boolean > > ;
73+ requestPushWalletConnection : ( ) => Promise < { chain : ChainType ; provider : IWalletProvider [ "name" ] } > ;
6674} ;
6775
6876export const WalletContext = createContext < WalletContextType | null > ( null ) ;
@@ -84,6 +92,8 @@ export const WalletContextProvider: FC<PushWalletProviderProps> = ({
8492
8593 const [ isIframeLoading , setIframeLoading ] = useState ( true ) ;
8694
95+ const [ isReadOnly , setIsReadOnly ] = useState ( false ) ;
96+
8797 const [ connectionStatus , setConnectionStatus ] = useState <
8898 WalletContextType [ 'connectionStatus' ]
8999 > ( ConnectionStatus . NOT_CONNECTED ) ;
@@ -163,6 +173,7 @@ export const WalletContextProvider: FC<PushWalletProviderProps> = ({
163173 setMinimiseWallet ( false ) ;
164174 setWalletVisibility ( false ) ;
165175 setIframeLoading ( true ) ;
176+ localStorage . removeItem ( "walletInfo" ) ;
166177 } ;
167178
168179 // sending events to wallet from dapp
@@ -196,9 +207,14 @@ export const WalletContextProvider: FC<PushWalletProviderProps> = ({
196207 const handleAppConnectionSuccess = ( response : WalletEventRespoonse ) => {
197208 setConnectionStatus ( ConnectionStatus . CONNECTED ) ;
198209 setMinimiseWallet ( true ) ;
210+ // setIsReadOnly(false);
199211 if ( response . account ) {
200212 setUniversalAccount ( response . account ) ;
201213 }
214+ localStorage . setItem (
215+ "walletInfo" ,
216+ JSON . stringify ( response . account )
217+ ) ;
202218 } ;
203219
204220 const handleAppConnectionRejection = ( ) => {
@@ -239,6 +255,11 @@ export const WalletContextProvider: FC<PushWalletProviderProps> = ({
239255 chainType : data . chain ,
240256 } ;
241257
258+ localStorage . setItem (
259+ "walletInfo" ,
260+ JSON . stringify ( connectedWallet )
261+ ) ;
262+
242263 setExternalWallet ( connectedWallet ) ;
243264
244265 sendMessageToPushWallet ( {
@@ -457,8 +478,97 @@ export const WalletContextProvider: FC<PushWalletProviderProps> = ({
457478 return signature ;
458479 } ;
459480
460- // eslint-disable-next-line @typescript-eslint/no-empty-function
461- const handleCloseIFrame = useCallback ( ( ) => { } , [ universalAccount ] ) ;
481+ const getAuthWindowConfig = ( ) => {
482+ // Calculate the screen width and height
483+ const screenWidth = window . screen . width ;
484+ const screenHeight = window . screen . height ;
485+
486+ const width = 500 ;
487+ const height = 600 ;
488+
489+ // Calculate the position to center the window
490+ const left = ( screenWidth - width ) / 2 ;
491+ const top = ( screenHeight - height ) / 2 ;
492+
493+ // Open a new window with the calculated position
494+ const windowFeatures = `width=${ width } ,height=${ height } ,left=${ left } ,top=${ top } ,resizable,scrollbars` ;
495+
496+ return windowFeatures ;
497+ } ;
498+
499+ const requestPushWalletConnection = ( ) => {
500+ setMinimiseWallet ( false ) ;
501+ sendMessageToPushWallet ( {
502+ type : APP_TO_WALLET_ACTION . RECONNECT_WALLET ,
503+ } ) ;
504+
505+ // Wait for a response from the Push Wallet iframe
506+ return new Promise < { chain : ChainType ; provider : IWalletProvider [ "name" ] } > ( ( resolve , reject ) => {
507+ const handleMessage = ( event : MessageEvent ) => {
508+ if ( event . data . type === WALLET_TO_APP_ACTION . APP_CONNECTION_SUCCESS ) {
509+ window . removeEventListener ( 'message' , handleMessage ) ;
510+ if ( event . data . error ) {
511+ reject ( new Error ( event . data . error ) ) ;
512+ } else {
513+ resolve ( event . data ) ;
514+ }
515+ }
516+ if ( event . data . type === WALLET_TO_APP_ACTION . APP_CONNECTION_CANCELLED ) {
517+ window . removeEventListener ( 'message' , handleMessage ) ;
518+ reject ( new Error ( 'Push Wallet connection failed' ) ) ;
519+ setMinimiseWallet ( true ) ;
520+ }
521+ } ;
522+
523+ window . addEventListener ( 'message' , handleMessage ) ;
524+
525+ setTimeout ( ( ) => {
526+ window . removeEventListener ( 'message' , handleMessage ) ;
527+ reject ( new Error ( 'Push Wallet connection timed out' ) ) ;
528+ setMinimiseWallet ( true ) ;
529+ } , 100000 ) ;
530+ } ) ;
531+ }
532+
533+ useEffect ( ( ) => {
534+ const walletInfo = localStorage . getItem ( "walletInfo" ) ;
535+ const walletData = walletInfo ? JSON . parse ( walletInfo ) : null ;
536+ if ( ! walletData ) return ;
537+ if ( walletData . providerName ) {
538+ setUniversalAccount ( PushChain . utils . account . fromChainAgnostic (
539+ walletData . address
540+ ) ) ;
541+ setExternalWallet ( walletData ) ;
542+ } else {
543+ setUniversalAccount ( walletData ) ;
544+ }
545+ setIsReadOnly ( true ) ;
546+ setMinimiseWallet ( true ) ;
547+ setWalletVisibility ( true ) ;
548+ setConnectionStatus ( ConnectionStatus . CONNECTED ) ;
549+ } , [ ] ) ;
550+
551+ useEffect ( ( ) => {
552+ if ( isIframeLoading ) return ;
553+ if ( ! isReadOnly ) return ;
554+ if ( externalWallet ) {
555+ sendMessageToPushWallet ( {
556+ type : APP_TO_WALLET_ACTION . READ_ONLY_CONNECTION_STATUS ,
557+ data : {
558+ status : 'successful' ,
559+ ...externalWallet ,
560+ } ,
561+ } ) ;
562+ } else if ( universalAccount ) {
563+ sendMessageToPushWallet ( {
564+ type : APP_TO_WALLET_ACTION . READ_ONLY_CONNECTION_STATUS ,
565+ data : {
566+ status : 'successful' ,
567+ ...universalAccount ,
568+ } ,
569+ } ) ;
570+ }
571+ } , [ isIframeLoading ] )
462572
463573 useEffect ( ( ) => {
464574 const messageHandler = ( event : MessageEvent ) => {
@@ -516,15 +626,6 @@ export const WalletContextProvider: FC<PushWalletProviderProps> = ({
516626
517627 const WalletContext = getWalletContext ( config ?. uid || 'default' ) ;
518628
519- const dummyProgress : ProgressEvent = {
520- id : PROGRESS_HOOK . SEND_TX_99_01 ,
521- title : 'Push Chain Tx Success' ,
522- message : '' ,
523- level : 'SUCCESS' ,
524- response : null ,
525- timestamp : '' ,
526- } ;
527-
528629 return (
529630 < WalletContext . Provider
530631 value = { {
@@ -547,6 +648,10 @@ export const WalletContextProvider: FC<PushWalletProviderProps> = ({
547648 handleSignTypedData,
548649 toggleButtonRef,
549650 setProgress,
651+ isReadOnly,
652+ setIsReadOnly,
653+ handleExternalWalletConnection,
654+ requestPushWalletConnection,
550655 } }
551656 >
552657 < LoginModal
@@ -564,6 +669,7 @@ export const WalletContextProvider: FC<PushWalletProviderProps> = ({
564669 handleUserLogOutEvent = { handleUserLogOutEvent }
565670 toggleButtonRef = { toggleButtonRef }
566671 sendMessageToPushWallet = { sendMessageToPushWallet }
672+ isReadOnly = { isReadOnly }
567673 />
568674 { progress && (
569675 < PushWalletToast progress = { progress } setProgress = { setProgress } />
0 commit comments