"use client";
import { useCallback, useState } from "react";
import type { Wallet } from "../../../../wallets/interfaces/wallet.js";
import type { ConnectManagerOptions } from "../../../../wallets/manager/index.js";
import { useConnectionManagerCtx } from "../../providers/connection-manager.js";
import { useSetActiveWalletConnectionStatus } from "./useSetActiveWalletConnectionStatus.js";
/**
* A hook to set a wallet as active wallet
* @returns A function that lets you connect a wallet.
* @example
* ```jsx
* import { createThirdwebClient } from "thirdweb";
* import { useConnect } from "thirdweb/react";
* import { createWallet } from "thirdweb/wallets";
*
* const client = createThirdwebClient({
* clientId: "YOUR_CLIENT_ID",
* });
*
* function Example() {
* const { connect, isConnecting, error } = useConnect();
* return (
*
* );
* }
* ```
* @walletConnection
*/
export function useConnect(options?: ConnectManagerOptions) {
const manager = useConnectionManagerCtx("useConnect");
const { connect } = manager;
const setConnectionStatus = useSetActiveWalletConnectionStatus();
const [isConnecting, setIsConnecting] = useState(false);
const [error, setError] = useState(null);
const handleConnection = useCallback(
async (walletOrFn: Wallet | (() => Promise)) => {
// reset error state
setError(null);
setConnectionStatus("connecting");
if (typeof walletOrFn !== "function") {
const account = await connect(walletOrFn, options);
setConnectionStatus("connected");
return account;
}
setIsConnecting(true);
try {
const w = await walletOrFn();
const account = await connect(w, options);
setConnectionStatus("connected");
return account;
} catch (e) {
console.error(e);
setError(e as Error);
setConnectionStatus("disconnected");
} finally {
setIsConnecting(false);
}
return null;
},
[connect, options, setConnectionStatus],
);
const cancelConnection = useCallback(() => {
setIsConnecting(false);
setConnectionStatus("disconnected");
}, [setConnectionStatus]);
return {
connect: handleConnection,
error,
isConnecting,
cancelConnection,
} as const;
}