From b02c37e93b10eb773ba369d3200545e76d048a93 Mon Sep 17 00:00:00 2001 From: hwillson Date: Mon, 10 Jun 2019 14:30:47 -0400 Subject: [PATCH 1/3] Reset query store errors via `ObservableQuery.resetQueryStoreErrors` React Apollo relies on the `ObervableQuery->getCurrentResult` method to retrieve query results to show within its components. When an error occurs while fetching results, that error is stored in the query store that each `ObservableQuery` instance is configured to use. Unfortunately, `getCurrentResult` will only retrieve subsequent results if no error exists in the query store. `ObservableQuery` doesn't currently provide a way to clear out query store errors, which means when React Apollo originating requests that cause an error occur, the error is stored, and future valid requests can no longer be processed. This commit adds a `resetQueryStoreErrors` method to the `ObservableQuery` public API, that will allow React Apollo (and other consumers) to be able to clear out query store errors. Related to: https://github.com/apollographql/react-apollo/issues/3090 --- .../apollo-client/src/core/ObservableQuery.ts | 8 ++++ .../src/core/__tests__/ObservableQuery.ts | 48 +++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/packages/apollo-client/src/core/ObservableQuery.ts b/packages/apollo-client/src/core/ObservableQuery.ts index 55d70f06a02..6d57e1efa7d 100644 --- a/packages/apollo-client/src/core/ObservableQuery.ts +++ b/packages/apollo-client/src/core/ObservableQuery.ts @@ -280,6 +280,14 @@ export class ObservableQuery< this.isTornDown = false; } + public resetQueryStoreErrors() { + const queryStore = this.queryManager.queryStore.get(this.queryId); + if (queryStore) { + queryStore.networkError = null; + queryStore.graphQLErrors = []; + } + } + /** * Update the variables of this observable query, and fetch the new results. * This method should be preferred over `setVariables` in most use cases. diff --git a/packages/apollo-client/src/core/__tests__/ObservableQuery.ts b/packages/apollo-client/src/core/__tests__/ObservableQuery.ts index 506fcd1e4f2..69772de5e12 100644 --- a/packages/apollo-client/src/core/__tests__/ObservableQuery.ts +++ b/packages/apollo-client/src/core/__tests__/ObservableQuery.ts @@ -4,6 +4,7 @@ import { InMemoryCache, IntrospectionFragmentMatcher, } from 'apollo-cache-inmemory'; +import { GraphQLError } from 'graphql'; import mockQueryManager from '../../__mocks__/mockQueryManager'; import mockWatchQuery from '../../__mocks__/mockWatchQuery'; @@ -1998,4 +1999,51 @@ describe('ObservableQuery', () => { }); }); }); + + describe('resetQueryStoreErrors', () => { + it("should remove any GraphQLError's stored in the query store", (done) => { + const graphQLError = new GraphQLError('oh no!'); + + const observable: ObservableQuery = mockWatchQuery({ + request: { query, variables }, + result: { errors: [graphQLError] }, + }); + + observable.subscribe({ + error() { + const { queryManager } = (observable as any); + const queryStore = queryManager.queryStore.get(observable.queryId); + expect(queryStore.graphQLErrors).toEqual([graphQLError]); + + observable.resetQueryStoreErrors(); + expect(queryStore.graphQLErrors).toEqual([]); + + done(); + } + }); + }); + + it("should remove network error's stored in the query store", (done) => { + const networkError = new Error('oh no!'); + + const observable: ObservableQuery = mockWatchQuery({ + request: { query, variables }, + result: { data: dataOne }, + }); + + observable.subscribe({ + next() { + const { queryManager } = (observable as any); + const queryStore = queryManager.queryStore.get(observable.queryId); + queryStore.networkError = networkError; + expect(queryStore.networkError).toEqual(networkError); + + observable.resetQueryStoreErrors(); + expect(queryStore.networkError).toBeNull(); + + done(); + } + }); + }); + }); }); From b99f6571be8ce7e46238f5738703a8fc7da05316 Mon Sep 17 00:00:00 2001 From: hwillson Date: Mon, 10 Jun 2019 14:49:04 -0400 Subject: [PATCH 2/3] Changelog update --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a3c45d960b6..976e307ea5e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ **Note:** This is a cumulative changelog that outlines all of the Apollo Client project child package changes that were bundled into a specific `apollo-client` release. +## Apollo Client (vNext) + +### Apollo Client (vNext) + +- A new `ObservableQuery.resetQueryStoreErrors()` method is now available that + can be used to clear out `ObservableQuery` query store errors.
+ [@hwillson](https://github.com/hwillson) in [#4941](https://github.com/apollographql/apollo-client/pull/4941) + + ## Apollo Client (2.6.2) ### Apollo Utilities 1.3.2 From ef122656fe052bf60d0422159545ce746a627d12 Mon Sep 17 00:00:00 2001 From: hwillson Date: Mon, 17 Jun 2019 17:50:44 -0400 Subject: [PATCH 3/3] Remove unnecessary expect --- packages/apollo-client/src/core/__tests__/ObservableQuery.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/apollo-client/src/core/__tests__/ObservableQuery.ts b/packages/apollo-client/src/core/__tests__/ObservableQuery.ts index 69772de5e12..b6a70dedcd8 100644 --- a/packages/apollo-client/src/core/__tests__/ObservableQuery.ts +++ b/packages/apollo-client/src/core/__tests__/ObservableQuery.ts @@ -2036,11 +2036,8 @@ describe('ObservableQuery', () => { const { queryManager } = (observable as any); const queryStore = queryManager.queryStore.get(observable.queryId); queryStore.networkError = networkError; - expect(queryStore.networkError).toEqual(networkError); - observable.resetQueryStoreErrors(); expect(queryStore.networkError).toBeNull(); - done(); } });