From b04374d5e0af206bcc39ce52b9e62311db9bc6f6 Mon Sep 17 00:00:00 2001 From: Denys Mishunov <dmishunov@gitlab.com> Date: Wed, 4 Aug 2021 10:44:23 +0000 Subject: [PATCH] Refactor Snippets application to update Apollo cache in immutable way --- .../snippets/components/snippet_blob_view.vue | 9 --------- app/assets/javascripts/snippets/index.js | 8 +++++++- .../javascripts/snippets/mixins/snippets.js | 15 ++++++++------- spec/frontend/snippets/components/show_spec.js | 4 +++- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/app/assets/javascripts/snippets/components/snippet_blob_view.vue b/app/assets/javascripts/snippets/components/snippet_blob_view.vue index 27b3a30b40a9f..8481ac2b9c916 100644 --- a/app/assets/javascripts/snippets/components/snippet_blob_view.vue +++ b/app/assets/javascripts/snippets/components/snippet_blob_view.vue @@ -29,15 +29,6 @@ export default { update(data) { return this.onContentUpdate(data); }, - result() { - if (this.activeViewerType === RICH_BLOB_VIEWER) { - // eslint-disable-next-line vue/no-mutating-props - this.blob.richViewer.renderError = null; - } else { - // eslint-disable-next-line vue/no-mutating-props - this.blob.simpleViewer.renderError = null; - } - }, skip() { return this.viewer.renderError; }, diff --git a/app/assets/javascripts/snippets/index.js b/app/assets/javascripts/snippets/index.js index 789332ce5b772..576bfe8756112 100644 --- a/app/assets/javascripts/snippets/index.js +++ b/app/assets/javascripts/snippets/index.js @@ -14,7 +14,13 @@ export default function appFactory(el, Component) { } const apolloProvider = new VueApollo({ - defaultClient: createDefaultClient({}, { batchMax: 1 }), + defaultClient: createDefaultClient( + {}, + { + batchMax: 1, + assumeImmutableResults: true, + }, + ), }); const { diff --git a/app/assets/javascripts/snippets/mixins/snippets.js b/app/assets/javascripts/snippets/mixins/snippets.js index 7552eae97fcce..b72befef56b65 100644 --- a/app/assets/javascripts/snippets/mixins/snippets.js +++ b/app/assets/javascripts/snippets/mixins/snippets.js @@ -1,3 +1,4 @@ +import { isEmpty } from 'lodash'; import GetSnippetQuery from 'shared_queries/snippet/snippet.query.graphql'; const blobsDefault = []; @@ -12,20 +13,18 @@ export const getSnippetMixin = { }; }, update(data) { - const res = data.snippets.nodes[0]; + const res = { ...data.snippets.nodes[0] }; // Set `snippet.blobs` since some child components are coupled to this. - if (res) { + if (!isEmpty(res)) { // It's possible for us to not get any blobs in a response. // In this case, we should default to current blobs. - res.blobs = res.blobs ? res.blobs.nodes : this.blobs; + res.blobs = res.blobs ? res.blobs.nodes : blobsDefault; + res.description = res.description || ''; } return res; }, - result(res) { - this.blobs = res.data.snippets.nodes[0]?.blobs || blobsDefault; - }, skip() { return this.newSnippet; }, @@ -41,12 +40,14 @@ export const getSnippetMixin = { return { snippet: {}, newSnippet: !this.snippetGid, - blobs: blobsDefault, }; }, computed: { isLoading() { return this.$apollo.queries.snippet.loading; }, + blobs() { + return this.snippet?.blobs || []; + }, }, }; diff --git a/spec/frontend/snippets/components/show_spec.js b/spec/frontend/snippets/components/show_spec.js index e6162c6aad2c8..b7b638b5137f6 100644 --- a/spec/frontend/snippets/components/show_spec.js +++ b/spec/frontend/snippets/components/show_spec.js @@ -71,7 +71,9 @@ describe('Snippet view app', () => { it('renders correct snippet-blob components', () => { createComponent({ data: { - blobs: [Blob, BinaryBlob], + snippet: { + blobs: [Blob, BinaryBlob], + }, }, }); const blobs = wrapper.findAll(SnippetBlob); -- GitLab