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