diff options
Diffstat (limited to 'app/assets/javascripts/design_management/utils/cache_update.js')
-rw-r--r-- | app/assets/javascripts/design_management/utils/cache_update.js | 283 |
1 files changed, 149 insertions, 134 deletions
diff --git a/app/assets/javascripts/design_management/utils/cache_update.js b/app/assets/javascripts/design_management/utils/cache_update.js index b79df9d01d5..ff41136fd54 100644 --- a/app/assets/javascripts/design_management/utils/cache_update.js +++ b/app/assets/javascripts/design_management/utils/cache_update.js @@ -1,22 +1,27 @@ /* eslint-disable @gitlab/require-i18n-strings */ import { groupBy } from 'lodash'; +import produce from 'immer'; import { deprecatedCreateFlash as createFlash } from '~/flash'; -import { extractCurrentDiscussion, extractDesign } from './design_management_utils'; +import { extractCurrentDiscussion, extractDesign, extractDesigns } from './design_management_utils'; import { ADD_IMAGE_DIFF_NOTE_ERROR, UPDATE_IMAGE_DIFF_NOTE_ERROR, - ADD_DISCUSSION_COMMENT_ERROR, + DELETE_DESIGN_TODO_ERROR, designDeletionError, } from './error_messages'; +const designsOf = data => data.project.issue.designCollection.designs; + const deleteDesignsFromStore = (store, query, selectedDesigns) => { - const data = store.readQuery(query); + const sourceData = store.readQuery(query); - const changedDesigns = data.project.issue.designCollection.designs.nodes.filter( - node => !selectedDesigns.includes(node.filename), - ); - data.project.issue.designCollection.designs.nodes = [...changedDesigns]; + const data = produce(sourceData, draftData => { + const changedDesigns = designsOf(sourceData).nodes.filter( + design => !selectedDesigns.includes(design.filename), + ); + designsOf(draftData).nodes = [...changedDesigns]; + }); store.writeQuery({ ...query, @@ -33,13 +38,15 @@ const deleteDesignsFromStore = (store, query, selectedDesigns) => { */ const addNewVersionToStore = (store, query, version) => { if (!version) return; + const sourceData = store.readQuery(query); - const data = store.readQuery(query); - - data.project.issue.designCollection.versions.nodes = [ - version, - ...data.project.issue.designCollection.versions.nodes, - ]; + const data = produce(sourceData, draftData => { + // eslint-disable-next-line no-param-reassign + draftData.project.issue.designCollection.versions.nodes = [ + version, + ...draftData.project.issue.designCollection.versions.nodes, + ]; + }); store.writeQuery({ ...query, @@ -47,47 +54,12 @@ const addNewVersionToStore = (store, query, version) => { }); }; -const addDiscussionCommentToStore = (store, createNote, query, queryVariables, discussionId) => { - const data = store.readQuery({ - query, - variables: queryVariables, - }); - - const design = extractDesign(data); - const currentDiscussion = extractCurrentDiscussion(design.discussions, discussionId); - currentDiscussion.notes.nodes = [...currentDiscussion.notes.nodes, createNote.note]; - - design.notesCount += 1; - if ( - !design.issue.participants.nodes.some( - participant => participant.username === createNote.note.author.username, - ) - ) { - design.issue.participants.nodes = [ - ...design.issue.participants.nodes, - { - __typename: 'User', - ...createNote.note.author, - }, - ]; - } - store.writeQuery({ - query, - variables: queryVariables, - data: { - ...data, - design: { - ...design, - }, - }, - }); -}; - const addImageDiffNoteToStore = (store, createImageDiffNote, query, variables) => { - const data = store.readQuery({ + const sourceData = store.readQuery({ query, variables, }); + const newDiscussion = { __typename: 'Discussion', id: createImageDiffNote.note.discussion.id, @@ -101,100 +73,100 @@ const addImageDiffNoteToStore = (store, createImageDiffNote, query, variables) = nodes: [createImageDiffNote.note], }, }; - const design = extractDesign(data); - const notesCount = design.notesCount + 1; - design.discussions.nodes = [...design.discussions.nodes, newDiscussion]; - if ( - !design.issue.participants.nodes.some( - participant => participant.username === createImageDiffNote.note.author.username, - ) - ) { - design.issue.participants.nodes = [ - ...design.issue.participants.nodes, - { - __typename: 'User', - ...createImageDiffNote.note.author, - }, - ]; - } + + const data = produce(sourceData, draftData => { + const design = extractDesign(draftData); + design.notesCount += 1; + design.discussions.nodes = [...design.discussions.nodes, newDiscussion]; + + if ( + !design.issue.participants.nodes.some( + participant => participant.username === createImageDiffNote.note.author.username, + ) + ) { + design.issue.participants.nodes = [ + ...design.issue.participants.nodes, + { + __typename: 'User', + ...createImageDiffNote.note.author, + }, + ]; + } + }); + store.writeQuery({ query, variables, - data: { - ...data, - design: { - ...design, - notesCount, - }, - }, + data, }); }; const updateImageDiffNoteInStore = (store, updateImageDiffNote, query, variables) => { - const data = store.readQuery({ + const sourceData = store.readQuery({ query, variables, }); - const design = extractDesign(data); - const discussion = extractCurrentDiscussion( - design.discussions, - updateImageDiffNote.note.discussion.id, - ); - - discussion.notes = { - ...discussion.notes, - nodes: [updateImageDiffNote.note, ...discussion.notes.nodes.slice(1)], - }; + const data = produce(sourceData, draftData => { + const design = extractDesign(draftData); + const discussion = extractCurrentDiscussion( + design.discussions, + updateImageDiffNote.note.discussion.id, + ); + + discussion.notes = { + ...discussion.notes, + nodes: [updateImageDiffNote.note, ...discussion.notes.nodes.slice(1)], + }; + }); store.writeQuery({ query, variables, - data: { - ...data, - design, - }, + data, }); }; const addNewDesignToStore = (store, designManagementUpload, query) => { - const data = store.readQuery(query); + const sourceData = store.readQuery(query); - const currentDesigns = data.project.issue.designCollection.designs.nodes; - const existingDesigns = groupBy(currentDesigns, 'filename'); - const newDesigns = currentDesigns.concat( - designManagementUpload.designs.filter(d => !existingDesigns[d.filename]), - ); + const data = produce(sourceData, draftData => { + const currentDesigns = extractDesigns(draftData); + const existingDesigns = groupBy(currentDesigns, 'filename'); + const newDesigns = currentDesigns.concat( + designManagementUpload.designs.filter(d => !existingDesigns[d.filename]), + ); - let newVersionNode; - const findNewVersions = designManagementUpload.designs.find(design => design.versions); + let newVersionNode; + const findNewVersions = designManagementUpload.designs.find(design => design.versions); - if (findNewVersions) { - const findNewVersionsNodes = findNewVersions.versions.nodes; + if (findNewVersions) { + const findNewVersionsNodes = findNewVersions.versions.nodes; - if (findNewVersionsNodes && findNewVersionsNodes.length) { - newVersionNode = [findNewVersionsNodes[0]]; + if (findNewVersionsNodes && findNewVersionsNodes.length) { + newVersionNode = [findNewVersionsNodes[0]]; + } } - } - - const newVersions = [ - ...(newVersionNode || []), - ...data.project.issue.designCollection.versions.nodes, - ]; - const updatedDesigns = { - __typename: 'DesignCollection', - designs: { - __typename: 'DesignConnection', - nodes: newDesigns, - }, - versions: { - __typename: 'DesignVersionConnection', - nodes: newVersions, - }, - }; + const newVersions = [ + ...(newVersionNode || []), + ...draftData.project.issue.designCollection.versions.nodes, + ]; - data.project.issue.designCollection = updatedDesigns; + const updatedDesigns = { + __typename: 'DesignCollection', + designs: { + __typename: 'DesignConnection', + nodes: newDesigns, + }, + versions: { + __typename: 'DesignVersionConnection', + nodes: newVersions, + }, + }; + // eslint-disable-next-line no-param-reassign + draftData.project.issue.designCollection = updatedDesigns; + }); store.writeQuery({ ...query, @@ -203,14 +175,63 @@ const addNewDesignToStore = (store, designManagementUpload, query) => { }; const moveDesignInStore = (store, designManagementMove, query) => { - const data = store.readQuery(query); - data.project.issue.designCollection.designs = designManagementMove.designCollection.designs; + const sourceData = store.readQuery(query); + + const data = produce(sourceData, draftData => { + // eslint-disable-next-line no-param-reassign + draftData.project.issue.designCollection.designs = + designManagementMove.designCollection.designs; + }); + store.writeQuery({ ...query, data, }); }; +export const addPendingTodoToStore = (store, pendingTodo, query, queryVariables) => { + const sourceData = store.readQuery({ + query, + variables: queryVariables, + }); + + const data = produce(sourceData, draftData => { + const design = extractDesign(draftData); + const existingTodos = design.currentUserTodos?.nodes || []; + const newTodoNodes = [...existingTodos, { ...pendingTodo, __typename: 'Todo' }]; + + if (!design.currentUserTodos) { + design.currentUserTodos = { + __typename: 'TodoConnection', + nodes: newTodoNodes, + }; + } else { + design.currentUserTodos.nodes = newTodoNodes; + } + }); + + store.writeQuery({ query, variables: queryVariables, data }); +}; + +export const deletePendingTodoFromStore = (store, todoMarkDone, query, queryVariables) => { + const sourceData = store.readQuery({ + query, + variables: queryVariables, + }); + + const { + todo: { id: todoId }, + } = todoMarkDone; + const data = produce(sourceData, draftData => { + const design = extractDesign(draftData); + const existingTodos = design.currentUserTodos?.nodes || []; + + design.currentUserTodos.nodes = existingTodos.filter(({ id }) => id !== todoId); + }); + + store.writeQuery({ query, variables: queryVariables, data }); +}; + const onError = (data, message) => { createFlash(message); throw new Error(data.errors); @@ -235,20 +256,6 @@ export const updateStoreAfterDesignsDelete = (store, data, query, designs) => { } }; -export const updateStoreAfterAddDiscussionComment = ( - store, - data, - query, - queryVariables, - discussionId, -) => { - if (hasErrors(data)) { - onError(data, ADD_DISCUSSION_COMMENT_ERROR); - } else { - addDiscussionCommentToStore(store, data, query, queryVariables, discussionId); - } -}; - export const updateStoreAfterAddImageDiffNote = (store, data, query, queryVariables) => { if (hasErrors(data)) { onError(data, ADD_IMAGE_DIFF_NOTE_ERROR); @@ -280,3 +287,11 @@ export const updateDesignsOnStoreAfterReorder = (store, data, query) => { moveDesignInStore(store, data, query); } }; + +export const updateStoreAfterDeleteDesignTodo = (store, data, query, queryVariables) => { + if (hasErrors(data)) { + onError(data, DELETE_DESIGN_TODO_ERROR); + } else { + deletePendingTodoFromStore(store, data, query, queryVariables); + } +}; |