skillbox/client/src/helpers/update-content-bookmark-mut...

112 lines
2.8 KiB
JavaScript

import UPDATE_CONTENT_BOOKMARK from '@/graphql/gql/mutations/updateContentBookmark.gql';
import UPDATE_INSTRUMENT_BOOKMARK from '@/graphql/gql/mutations/updateInstrumentBookmark.gql';
import CONTENT_BLOCK_QUERY from '@/graphql/gql/contentBlockQuery.gql';
import INSTRUMENT_FRAGMENT from '@/graphql/gql/fragments/instrumentParts.gql';
const compareUuid = uuid => element => element.uuid === uuid;
export const constructContentComponentBookmarkMutation = (uuid, bookmarked, parent, root) => {
let mutation = {};
if (parent.__typename === 'ContentBlockNode') {
mutation = {
mutation: UPDATE_CONTENT_BOOKMARK,
variables: {
input: {
uuid,
contentBlock: root,
bookmarked
}
},
update: (store, response) => {
const query = CONTENT_BLOCK_QUERY;
const variables = {id: root};
const data = store.readQuery({
query,
variables
});
const bookmarks = data.contentBlock.bookmarks;
if (bookmarked) {
bookmarks.push({
note: null,
uuid,
__typename: 'ContentBlockBookmarkNode'
});
} else {
let index = bookmarks.findIndex(compareUuid(uuid));
if (index > -1) {
bookmarks.splice(index, 1);
}
}
data.contentBlock.bookmarks = bookmarks;
store.writeQuery({
data,
query,
variables
});
},
optimisticResponse: {
__typename: 'Mutation',
updateContentBookmark: {
__typename: 'UpdateContentBookmarkPayload',
success: true
}
}
};
} else {
mutation = {
mutation: UPDATE_INSTRUMENT_BOOKMARK,
variables: {
input: {
uuid,
instrument: root,
bookmarked
}
},
update: (store, response) => {
const fragment = INSTRUMENT_FRAGMENT;
const id = `InstrumentNode:${root}`;
const data = store.readFragment({
fragment,
id
});
const bookmarks = data.bookmarks;
if (bookmarked) {
bookmarks.push({
note: null,
uuid,
__typename: 'InstrumentBookmarkNode'
});
} else {
let index = bookmarks.findIndex(compareUuid(uuid));
if (index > -1) {
bookmarks.splice(index, 1);
}
}
data.bookmarks = bookmarks;
store.writeFragment({
data,
fragment,
id
});
},
optimisticResponse: {
__typename: 'Mutation',
updateInstrumentBookmark: {
__typename: 'UpdateInstrumentBookmarkPayload',
success: true
}
}
};
}
return mutation;
};