import { useQueryClient, useMutation, MutationOptions, DefaultError, } from "@tanstack/react-query" import { useAuthApiClient } from "./useAuthApiClient" import type { LinkAccountResponse, SignatureData } from "../api" import { QUERY_KEYS } from "./constants" import { useWalletAccount } from "./useWalletAccount" import { getBitcoinPublicKeyFromConnector } from "../utils/wagmi" type LinkAccountMutationFnParameters = | ({ type: "wallet" } & SignatureData) | { type: "discord" } export function useLinkAccount( mutationOptions: Omit< MutationOptions< LinkAccountResponse, DefaultError, LinkAccountMutationFnParameters >, "mutationFn" | "mutationKey" > = {}, ) { const queryClient = useQueryClient() const authApiClient = useAuthApiClient() const walletAccount = useWalletAccount() const { onSuccess: customOnSuccess, ...restMutationOptions } = mutationOptions const { mutate, mutateAsync, ...rest } = useMutation({ mutationFn: async ( linkAccountMutationFnParameters: LinkAccountMutationFnParameters, ) => { if (linkAccountMutationFnParameters.type === "wallet") { if (!walletAccount?.connector) { throw new Error("Connector not defined.") } const bitcoinPublicKey = await getBitcoinPublicKeyFromConnector( walletAccount.connector, ) // Linking bitcoin account if (bitcoinPublicKey) { return authApiClient.linkAccount({ ...linkAccountMutationFnParameters, bitcoinPublicKey, }) } } // Linking any other account like wallet evm address account or discord return authApiClient.linkAccount(linkAccountMutationFnParameters) }, onSuccess: (data, variables, context) => { queryClient.resetQueries({ queryKey: [QUERY_KEYS.ACCOUNT] }) if (customOnSuccess) customOnSuccess(data, variables, context) }, ...restMutationOptions, }) return { linkAccount: mutate, linkAccountAsync: mutateAsync, ...rest } }