UNPKG

@tanstack/vue-query

Version:

Hooks for managing, caching and syncing asynchronous and remote data in Vue

97 lines (85 loc) 2.69 kB
import { computed, getCurrentScope, onScopeDispose, shallowReadonly, shallowRef, watch, } from 'vue-demi' import { useQueryClient } from './useQueryClient' import { cloneDeepUnref } from './utils' import type { Ref } from 'vue-demi' import type { MutationFilters as MF, Mutation, MutationState, } from '@tanstack/query-core' import type { QueryClient } from './queryClient' import type { MaybeRefDeep } from './types' import type { MutationCache } from './mutationCache' export type MutationFilters = MaybeRefDeep<MF> export function useIsMutating( filters: MutationFilters | (() => MutationFilters) = {}, queryClient?: QueryClient, ): Ref<number> { if (process.env.NODE_ENV === 'development') { if (!getCurrentScope()) { console.warn( 'vue-query composable like "useQuery()" should only be used inside a "setup()" function or a running effect scope. They might otherwise lead to memory leaks.', ) } } const client = queryClient || useQueryClient() const mutationState = useMutationState( { filters: computed(() => ({ ...cloneDeepUnref(typeof filters === 'function' ? filters() : filters), status: 'pending' as const, })), }, client, ) const length = computed(() => mutationState.value.length) return length } export type MutationStateOptions<TResult = MutationState> = { filters?: MutationFilters select?: (mutation: Mutation) => TResult } function getResult<TResult = MutationState>( mutationCache: MutationCache, options: MutationStateOptions<TResult>, ): Array<TResult> { return mutationCache .findAll(options.filters) .map( (mutation): TResult => (options.select ? options.select(mutation) : mutation.state) as TResult, ) } export function useMutationState<TResult = MutationState>( options: | MutationStateOptions<TResult> | (() => MutationStateOptions<TResult>) = {}, queryClient?: QueryClient, ): Readonly<Ref<Array<TResult>>> { const resolvedOptions = computed(() => { const newOptions = typeof options === 'function' ? options() : options return { filters: cloneDeepUnref(newOptions.filters), select: newOptions.select, } }) const mutationCache = (queryClient || useQueryClient()).getMutationCache() const state = shallowRef(getResult(mutationCache, resolvedOptions.value)) const unsubscribe = mutationCache.subscribe(() => { state.value = getResult(mutationCache, resolvedOptions.value) }) watch(resolvedOptions, () => { state.value = getResult(mutationCache, resolvedOptions.value) }) onScopeDispose(() => { unsubscribe() }) return shallowReadonly(state) }