Files
apollo/packages/vue-apollo-composable/src/util/loadingTracking.ts
T
Hajime Mugishima e8e8f542d2 fix: Update @vue/composition-api to v0.6.1 (#1000)
* chore: update deps

* fix(useMutation,useSubscription): use "immediate" option

* fix(type): paramToRef and paramToReactive

* fix: remove unused import

Co-authored-by: Guillaume Chau <guillaume.b.chau@gmail.com>
2020-07-27 17:12:27 +02:00

93 lines
2.1 KiB
TypeScript

import { Ref, watch, onUnmounted, ref, getCurrentInstance, onBeforeUnmount } from '@vue/composition-api'
export interface LoadingTracking {
queries: Ref<number>
mutations: Ref<number>
subscriptions: Ref<number>
}
export interface AppLoadingTracking extends LoadingTracking {
components: Map<any, LoadingTracking>
}
export function getAppTracking () {
const root: any = getCurrentInstance().$root
let appTracking: AppLoadingTracking
if (!root._apolloAppTracking) {
// Add per Vue tracking
appTracking = root._apolloAppTracking = {
queries: ref(0),
mutations: ref(0),
subscriptions: ref(0),
components: new Map(),
}
} else {
appTracking = root._apolloAppTracking
}
return {
appTracking
}
}
export function getCurrentTracking () {
const { appTracking } = getAppTracking()
const currentInstance = getCurrentInstance()
let tracking: LoadingTracking
if (!appTracking.components.has(currentInstance)) {
// Add per-component tracking
appTracking.components.set(currentInstance, tracking = {
queries: ref(0),
mutations: ref(0),
subscriptions: ref(0),
})
// Cleanup
onUnmounted(() => {
appTracking.components.delete(currentInstance)
})
} else {
tracking = appTracking.components.get(currentInstance)
}
return {
appTracking,
tracking
}
}
function track (loading: Ref<boolean>, type: keyof LoadingTracking) {
const { appTracking, tracking } = getCurrentTracking()
watch(loading, (value, oldValue) => {
if (oldValue != null && value !== oldValue) {
const mod = value ? 1 : -1
tracking[type].value += mod
appTracking[type].value += mod
}
}, {
immediate: true
})
onBeforeUnmount(() => {
if (loading.value) {
tracking[type].value--
appTracking[type].value--
}
})
}
export function trackQuery (loading: Ref<boolean>) {
track(loading, 'queries')
}
export function trackMutation (loading: Ref<boolean>) {
track(loading, 'mutations')
}
export function trackSubscription (loading: Ref<boolean>) {
track(loading, 'subscriptions')
}