Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| abe8089fdd | |||
| 773260b97e | |||
| 9830ea7607 | |||
| 7e06de77aa |
@@ -21,7 +21,6 @@ import {
|
||||
ObservableSubscription,
|
||||
TypedDocumentNode,
|
||||
ApolloError,
|
||||
NetworkStatus
|
||||
} from '@apollo/client/core'
|
||||
import { throttle, debounce } from 'throttle-debounce'
|
||||
import { useApolloClient } from './useApolloClient'
|
||||
@@ -171,20 +170,45 @@ export function useQueryImpl<
|
||||
|
||||
// SSR
|
||||
let firstResolve: (() => void) | undefined
|
||||
let firstResolveTriggered = false
|
||||
let firstReject: ((apolloError: ApolloError) => void) | undefined
|
||||
let firstRejectError: undefined | ApolloError
|
||||
|
||||
const tryFirstResolve = () => {
|
||||
firstResolveTriggered = true
|
||||
if (firstResolve) firstResolve()
|
||||
}
|
||||
|
||||
const tryFirstReject = (apolloError: ApolloError) => {
|
||||
firstRejectError = apolloError
|
||||
if (firstReject) firstReject(apolloError)
|
||||
}
|
||||
|
||||
const resetFirstResolveReject = () => {
|
||||
firstResolve = undefined
|
||||
firstReject = undefined
|
||||
firstResolveTriggered = false
|
||||
firstRejectError = undefined
|
||||
stop()
|
||||
}
|
||||
|
||||
vm && onServerPrefetch?.(() => {
|
||||
if (!isEnabled.value || (isServer && currentOptions.value?.prefetch === false)) return
|
||||
|
||||
return new Promise<void>((resolve, reject) => {
|
||||
firstResolve = () => {
|
||||
resetFirstResolveReject()
|
||||
resolve()
|
||||
firstResolve = undefined
|
||||
firstReject = undefined
|
||||
}
|
||||
firstReject = (apolloError: ApolloError) => {
|
||||
resetFirstResolveReject()
|
||||
reject(apolloError)
|
||||
firstResolve = undefined
|
||||
firstReject = undefined
|
||||
}
|
||||
|
||||
if (firstResolveTriggered) {
|
||||
firstResolve()
|
||||
} else if (firstRejectError) {
|
||||
firstReject(firstRejectError)
|
||||
}
|
||||
}).then(stop).catch(stop)
|
||||
})
|
||||
@@ -197,7 +221,6 @@ export function useQueryImpl<
|
||||
const query: Ref<ObservableQuery<TResult, TVariables> | null | undefined> = ref()
|
||||
let observer: ObservableSubscription | undefined
|
||||
let started = false
|
||||
let isFirstRun = true
|
||||
|
||||
/**
|
||||
* Starts watching the query
|
||||
@@ -207,7 +230,7 @@ export function useQueryImpl<
|
||||
started || !isEnabled.value ||
|
||||
(isServer && currentOptions.value?.prefetch === false)
|
||||
) {
|
||||
if (firstResolve) firstResolve()
|
||||
tryFirstResolve()
|
||||
return
|
||||
}
|
||||
|
||||
@@ -235,26 +258,12 @@ export function useQueryImpl<
|
||||
addSubscribeToMore(item)
|
||||
}
|
||||
}
|
||||
|
||||
isFirstRun = false
|
||||
}
|
||||
|
||||
function startQuerySubscription () {
|
||||
if (observer && !observer.closed) return
|
||||
if (!query.value) return
|
||||
|
||||
// If hydrating already finished queries, just handle result immediately
|
||||
if (!isServer && isFirstRun) {
|
||||
const currentResult = query.value.getCurrentResult()
|
||||
if (currentResult) {
|
||||
if (currentResult.networkStatus === NetworkStatus.ready) {
|
||||
onNextResult(currentResult)
|
||||
} else if (currentResult.networkStatus === NetworkStatus.error && currentResult.error) {
|
||||
onError(currentResult.error)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Create subscription
|
||||
observer = query.value.subscribe({
|
||||
next: onNextResult,
|
||||
@@ -275,10 +284,7 @@ export function useQueryImpl<
|
||||
processError(resultErrorsToApolloError(queryResult.errors))
|
||||
}
|
||||
|
||||
if (firstResolve) {
|
||||
firstResolve()
|
||||
stop()
|
||||
}
|
||||
tryFirstResolve()
|
||||
}
|
||||
|
||||
function processNextResult (queryResult: ApolloQueryResult<TResult>) {
|
||||
@@ -298,10 +304,7 @@ export function useQueryImpl<
|
||||
processNextResult((query.value as ObservableQuery<TResult, TVariables>).getCurrentResult())
|
||||
}
|
||||
processError(apolloError)
|
||||
if (firstReject) {
|
||||
firstReject(apolloError)
|
||||
stop()
|
||||
}
|
||||
tryFirstReject(apolloError)
|
||||
// The observable closes the sub if an error occurs
|
||||
resubscribeToQuery()
|
||||
}
|
||||
@@ -328,7 +331,7 @@ export function useQueryImpl<
|
||||
* Stop watching the query
|
||||
*/
|
||||
function stop () {
|
||||
if (firstResolve) firstResolve()
|
||||
tryFirstResolve()
|
||||
if (!started) return
|
||||
started = false
|
||||
loading.value = false
|
||||
|
||||
Reference in New Issue
Block a user