@wagmi/vue
Version:
Vue Composables for Ethereum
162 lines (149 loc) • 4.26 kB
text/typescript
import {
type DefaultError,
type MutationObserverOptions,
type QueryKey,
type UseMutationReturnType as tanstack_UseMutationReturnType,
type UseQueryReturnType as tanstack_UseQueryReturnType,
useQuery as tanstack_useQuery,
type UseQueryOptions,
useMutation,
} from '@tanstack/vue-query'
import type {
Compute,
ExactPartial,
Omit,
UnionStrictOmit,
} from '@wagmi/core/internal'
import { hashFn } from '@wagmi/core/query'
import { computed, type MaybeRef, unref } from 'vue'
import type { DeepMaybeRef, DeepUnwrapRef } from '../types/ref.js'
export type UseMutationParameters<
data = unknown,
error = Error,
variables = void,
context = unknown,
> = Compute<
DeepMaybeRef<
Omit<
DeepUnwrapRef<
MutationObserverOptions<data, error, Compute<variables>, context>
>,
'mutationFn' | 'mutationKey' | 'throwOnError'
>
>
>
export type UseMutationReturnType<
data = unknown,
error = Error,
variables = void,
context = unknown,
> = Compute<
UnionStrictOmit<
tanstack_UseMutationReturnType<data, error, variables, context>,
'mutate' | 'mutateAsync'
>
>
export { useMutation }
////////////////////////////////////////////////////////////////////////////////
export type UseQueryParameters<
queryFnData = unknown,
error = DefaultError,
data = queryFnData,
queryKey extends QueryKey = QueryKey,
> = Compute<
DeepMaybeRef<
ExactPartial<
Omit<
DeepUnwrapRef<
UseQueryOptions<queryFnData, error, data, queryFnData, queryKey>
>,
'initialData'
>
> & {
// Fix `initialData` type
initialData?:
| DeepUnwrapRef<
UseQueryOptions<queryFnData, error, data, queryFnData, queryKey>
>['initialData']
| undefined
}
>
>
export type UseQueryReturnType<data = unknown, error = DefaultError> = Compute<
tanstack_UseQueryReturnType<data, error> & {
queryKey: QueryKey
}
>
// Adding some basic customization.
// Ideally we don't have this function, but `import('@tanstack/vue-query').useQuery` currently has some quirks where it is super hard to
// pass down the inferred `initialData` type because of it's discriminated overload in the on `useQuery`.
export function useQuery<queryFnData, error, data, queryKey extends QueryKey>(
parameters: MaybeRef<
UseQueryParameters<queryFnData, error, data, queryKey> & {
queryKey: QueryKey
}
>,
): UseQueryReturnType<data, error> {
const options = computed(() => ({
...(unref(parameters) as any),
queryKeyHashFn: hashFn,
}))
const result = tanstack_useQuery(options) as UseQueryReturnType<data, error>
result.queryKey = unref(options).queryKey as QueryKey
return result
}
////////////////////////////////////////////////////////////////////////////////
// export type UseInfiniteQueryParameters<
// queryFnData = unknown,
// error = DefaultError,
// data = queryFnData,
// queryData = queryFnData,
// queryKey extends QueryKey = QueryKey,
// pageParam = unknown,
// > = Compute<
// Omit<
// UseInfiniteQueryOptions<
// queryFnData,
// error,
// data,
// queryData,
// queryKey,
// pageParam
// >,
// 'initialData'
// > & {
// // Fix `initialData` type
// initialData?:
// | UseInfiniteQueryOptions<
// queryFnData,
// error,
// data,
// queryKey
// >['initialData']
// | undefined
// }
// >
// export type UseInfiniteQueryReturnType<
// data = unknown,
// error = DefaultError,
// > = import('@tanstack/vue-query').UseInfiniteQueryReturnType<data, error> & {
// queryKey: QueryKey
// }
// // Adding some basic customization.
// export function useInfiniteQuery<
// queryFnData,
// error,
// data,
// queryKey extends QueryKey,
// >(
// parameters: UseInfiniteQueryParameters<queryFnData, error, data, queryKey> & {
// queryKey: QueryKey
// },
// ): UseInfiniteQueryReturnType<data, error> {
// const result = tanstack_useInfiniteQuery({
// ...(parameters as any),
// queryKeyHashFn: hashFn, // for bigint support
// }) as UseInfiniteQueryReturnType<data, error>
// result.queryKey = parameters.queryKey
// return result
// }