import { transact } from "@solana-mobile/mobile-wallet-adapter-protocol-web3js"; import { Account, useAuthorization } from "./useAuthorization"; import { Transaction, TransactionSignature, VersionedTransaction, } from "@solana/web3.js"; import { useCallback, useMemo } from "react"; import { SignInPayload } from "@solana-mobile/mobile-wallet-adapter-protocol"; export function useMobileWallet() { const { authorizeSessionWithSignIn, authorizeSession, deauthorizeSession } = useAuthorization(); const connect = useCallback(async (): Promise => { return await transact(async (wallet) => { return await authorizeSession(wallet); }); }, [authorizeSession]); const signIn = useCallback( async (signInPayload: SignInPayload): Promise => { return await transact(async (wallet) => { return await authorizeSessionWithSignIn(wallet, signInPayload); }); }, [authorizeSession] ); const disconnect = useCallback(async (): Promise => { await transact(async (wallet) => { await deauthorizeSession(wallet); }); }, [deauthorizeSession]); const signAndSendTransaction = useCallback( async ( transaction: Transaction | VersionedTransaction, minContextSlot: number, ): Promise => { return await transact(async (wallet) => { await authorizeSession(wallet); const signatures = await wallet.signAndSendTransactions({ transactions: [transaction], minContextSlot, }); return signatures[0]; }); }, [authorizeSession] ); const signMessage = useCallback( async (message: Uint8Array): Promise => { return await transact(async (wallet) => { const authResult = await authorizeSession(wallet); const signedMessages = await wallet.signMessages({ addresses: [authResult.address], payloads: [message], }); return signedMessages[0]; }); }, [authorizeSession] ); return useMemo( () => ({ connect, signIn, disconnect, signAndSendTransaction, signMessage, }), [signAndSendTransaction, signMessage] ); }