266 lines
6.3 KiB
JavaScript
266 lines
6.3 KiB
JavaScript
/* eslint-disable @gitlab/require-i18n-strings */
|
|
|
|
import createFlash from '~/flash';
|
|
import { extractCurrentDiscussion, extractDesign } from './design_management_utils';
|
|
import {
|
|
ADD_IMAGE_DIFF_NOTE_ERROR,
|
|
UPDATE_IMAGE_DIFF_NOTE_ERROR,
|
|
ADD_DISCUSSION_COMMENT_ERROR,
|
|
designDeletionError,
|
|
} from './error_messages';
|
|
|
|
const deleteDesignsFromStore = (store, query, selectedDesigns) => {
|
|
const data = store.readQuery(query);
|
|
|
|
const changedDesigns = data.project.issue.designCollection.designs.nodes.filter(
|
|
node => !selectedDesigns.includes(node.filename),
|
|
);
|
|
data.project.issue.designCollection.designs.nodes = [...changedDesigns];
|
|
|
|
store.writeQuery({
|
|
...query,
|
|
data,
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Adds a new version of designs to store
|
|
*
|
|
* @param {Object} store
|
|
* @param {Object} query
|
|
* @param {Object} version
|
|
*/
|
|
const addNewVersionToStore = (store, query, version) => {
|
|
if (!version) return;
|
|
|
|
const data = store.readQuery(query);
|
|
|
|
data.project.issue.designCollection.versions.nodes = [
|
|
version,
|
|
...data.project.issue.designCollection.versions.nodes,
|
|
];
|
|
|
|
store.writeQuery({
|
|
...query,
|
|
data,
|
|
});
|
|
};
|
|
|
|
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({
|
|
query,
|
|
variables,
|
|
});
|
|
const newDiscussion = {
|
|
__typename: 'Discussion',
|
|
id: createImageDiffNote.note.discussion.id,
|
|
replyId: createImageDiffNote.note.discussion.replyId,
|
|
resolvable: true,
|
|
resolved: false,
|
|
resolvedAt: null,
|
|
resolvedBy: null,
|
|
notes: {
|
|
__typename: 'NoteConnection',
|
|
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,
|
|
},
|
|
];
|
|
}
|
|
store.writeQuery({
|
|
query,
|
|
variables,
|
|
data: {
|
|
...data,
|
|
design: {
|
|
...design,
|
|
notesCount,
|
|
},
|
|
},
|
|
});
|
|
};
|
|
|
|
const updateImageDiffNoteInStore = (store, updateImageDiffNote, query, variables) => {
|
|
const data = 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)],
|
|
};
|
|
|
|
store.writeQuery({
|
|
query,
|
|
variables,
|
|
data: {
|
|
...data,
|
|
design,
|
|
},
|
|
});
|
|
};
|
|
|
|
const addNewDesignToStore = (store, designManagementUpload, query) => {
|
|
const data = store.readQuery(query);
|
|
|
|
const newDesigns = data.project.issue.designCollection.designs.nodes.reduce((acc, design) => {
|
|
if (!acc.find(d => d.filename === design.filename)) {
|
|
acc.push(design);
|
|
}
|
|
|
|
return acc;
|
|
}, designManagementUpload.designs);
|
|
|
|
let newVersionNode;
|
|
const findNewVersions = designManagementUpload.designs.find(design => design.versions);
|
|
|
|
if (findNewVersions) {
|
|
const findNewVersionsNodes = findNewVersions.versions.nodes;
|
|
|
|
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,
|
|
},
|
|
};
|
|
|
|
data.project.issue.designCollection = updatedDesigns;
|
|
|
|
store.writeQuery({
|
|
...query,
|
|
data,
|
|
});
|
|
};
|
|
|
|
const onError = (data, message) => {
|
|
createFlash(message);
|
|
throw new Error(data.errors);
|
|
};
|
|
|
|
export const hasErrors = ({ errors = [] }) => errors?.length;
|
|
|
|
/**
|
|
* Updates a store after design deletion
|
|
*
|
|
* @param {Object} store
|
|
* @param {Object} data
|
|
* @param {Object} query
|
|
* @param {Array} designs
|
|
*/
|
|
export const updateStoreAfterDesignsDelete = (store, data, query, designs) => {
|
|
if (hasErrors(data)) {
|
|
onError(data, designDeletionError({ singular: designs.length === 1 }));
|
|
} else {
|
|
deleteDesignsFromStore(store, query, designs);
|
|
addNewVersionToStore(store, query, data.version);
|
|
}
|
|
};
|
|
|
|
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);
|
|
} else {
|
|
addImageDiffNoteToStore(store, data, query, queryVariables);
|
|
}
|
|
};
|
|
|
|
export const updateStoreAfterUpdateImageDiffNote = (store, data, query, queryVariables) => {
|
|
if (hasErrors(data)) {
|
|
onError(data, UPDATE_IMAGE_DIFF_NOTE_ERROR);
|
|
} else {
|
|
updateImageDiffNoteInStore(store, data, query, queryVariables);
|
|
}
|
|
};
|
|
|
|
export const updateStoreAfterUploadDesign = (store, data, query) => {
|
|
if (hasErrors(data)) {
|
|
onError(data, data.errors[0]);
|
|
} else {
|
|
addNewDesignToStore(store, data, query);
|
|
}
|
|
};
|