import type { RpcTypeToMessageMap } from "@starknet-io/types-js"; import { type RequestArgs, type RequestMessageTypes, type RequestResult, walletRequestMutationFn, walletRequestMutationKey, } from "@starknet-start/query"; import { useCallback } from "react"; import { useStarknet } from "../context/starknet"; import { type UseMutationProps, type UseMutationResult, useMutation } from "../query"; export type { RequestArgs, RequestResult, RequestMessageTypes }; type MutationResult = UseMutationResult< RpcTypeToMessageMap[T]["result"], Error, RequestArgs >; /** Arguments for `useWalletRequest` hook. */ export type UseWalletRequestProps = RequestArgs & UseMutationProps, Error, RequestArgs>; /** Value returned from `useWalletRequest`. */ export type UseWalletRequestResult = Omit< MutationResult, "mutate" | "mutateAsync" > & { request: (args?: RequestArgs) => void; requestAsync: (args?: RequestArgs) => Promise>; }; /** Hook to perform request calls to connected wallet */ export function useWalletRequest( props: UseWalletRequestProps, ): UseWalletRequestResult { const { connected: connector } = useStarknet(); const { type, params, ...rest } = props; const { mutate, mutateAsync, ...result } = useMutation({ mutationKey: walletRequestMutationKey({ type, params }), mutationFn: walletRequestMutationFn({ connector }), ...rest, }); const request = useCallback((args?: RequestArgs) => mutate(args ?? { type, params }), [mutate, type, params]); const requestAsync = useCallback( (args?: RequestArgs) => mutateAsync(args ?? { type, params }), [mutateAsync, type, params], ); return { request, requestAsync, ...result, }; }