@roochnetwork/rooch-sdk-kit
Version:
Rooch SDK Kit
93 lines (78 loc) • 2.65 kB
text/typescript
// Copyright (c) RoochNetwork
// SPDX-License-Identifier: Apache-2.0
import { useQuery } from '@tanstack/react-query'
import { useLayoutEffect, useState } from 'react'
import { useConnectWallet, useWallets, useCurrentWallet } from './index.js'
import { useWalletStore } from './useWalletStore.js'
export function useAutoConnectWallet(): 'disabled' | 'idle' | 'attempted' {
const { mutateAsync: connectWallet } = useConnectWallet()
const autoConnectEnabled = useWalletStore((state) => state.autoConnectEnabled)
const lastConnectedWalletName = useWalletStore((state) => state.lastConnectedWalletName)
const lastConnectedAddress = useWalletStore((state) => state.lastConnectedAddress)
const { isConnected } = useCurrentWallet()
const wallets = useWallets()
const [clientOnly, setClientOnly] = useState(false)
useLayoutEffect(() => {
setClientOnly(true)
}, [])
const { data, isError } = useQuery({
queryKey: [
'@rooch/sdk-kit',
'autoconnect',
{
isConnected,
autoConnectEnabled,
lastConnectedWalletName,
lastConnectedAddress,
},
],
queryFn: async () => {
if (!autoConnectEnabled) {
return 'disabled'
}
if (!lastConnectedWalletName || !lastConnectedAddress || isConnected) {
return 'attempted'
}
let wallet = wallets.find((wallet) => wallet.getName() === lastConnectedWalletName)
if (wallet) {
await connectWallet({ wallet })
// if (wallet.getChain() !== 'bitcoin' && currentAddress?.toStr() !== lastConnectedAddress) {
// wallet.switchAccount(lastConnectedAddress)
// }
}
return 'attempted'
},
enabled: autoConnectEnabled,
persister: undefined,
gcTime: 0,
staleTime: 0,
networkMode: 'always',
retry: (_) => {
// Retry only if there is a wallet to connect and we haven't exceeded 3 attempts
// if (
// wallets.find((wallet) => wallet.getName() === lastConnectedWalletName) &&
// failureCount < 3
// ) {
// return true
// }
return false
},
retryOnMount: false,
refetchInterval: 1000,
refetchIntervalInBackground: false,
refetchOnMount: false,
refetchOnReconnect: false,
refetchOnWindowFocus: false,
})
if (!autoConnectEnabled) {
return 'disabled'
}
// We always initialize with "idle" so that in SSR environments, we guarantee that the initial render states always agree:
if (!clientOnly) {
return 'idle'
}
if (!lastConnectedWalletName) {
return 'attempted'
}
return isError ? 'attempted' : (data ?? 'idle')
}