160 lines
4.1 KiB
TypeScript
160 lines
4.1 KiB
TypeScript
import CONTENT_BLOCK_QUERY from '@/graphql/gql/queries/contentBlockQuery.gql';
|
|
import INSTRUMENT_FRAGMENT from '@/graphql/gql/fragments/instrumentParts.gql';
|
|
import { pushToArray, removeAtIndex } from '@/graphql/immutable-operations';
|
|
import { graphql } from '@/__generated__';
|
|
|
|
const compareUuid = (uuid: string) => (element) => element.uuid === uuid;
|
|
type UpdateCurry = (newBookmarkedValue: boolean) => (store) => void;
|
|
type GetVariables = (newBookmarkedValue: boolean) => any;
|
|
|
|
interface Mutation {
|
|
mutation: any;
|
|
optimisticResponse: any;
|
|
updateCurry: UpdateCurry;
|
|
getVariables: GetVariables;
|
|
}
|
|
|
|
export const constructContentComponentBookmarkMutation: (uuid: string, parent: any, root: any) => Mutation = (
|
|
uuid,
|
|
parent,
|
|
root
|
|
) => {
|
|
let mutation: any;
|
|
let updateCurry: UpdateCurry;
|
|
let getVariables: GetVariables;
|
|
let optimisticResponse: any;
|
|
|
|
if (parent.__typename === 'InstrumentNode') {
|
|
updateCurry = (newBookmarkedValue: boolean) => (store) => {
|
|
const fragment = INSTRUMENT_FRAGMENT;
|
|
const id = store.identify({
|
|
__typename: 'InstrumentNode',
|
|
slug: root,
|
|
});
|
|
const instrument = store.readFragment({
|
|
fragment,
|
|
id,
|
|
});
|
|
|
|
let bookmarks: any[];
|
|
console.log(newBookmarkedValue);
|
|
|
|
if (newBookmarkedValue) {
|
|
const element = {
|
|
note: null,
|
|
uuid,
|
|
__typename: 'InstrumentBookmarkNode',
|
|
};
|
|
bookmarks = pushToArray(instrument.bookmarks, element);
|
|
} else {
|
|
const index = instrument.bookmarks.findIndex(compareUuid(uuid));
|
|
if (index > -1) {
|
|
bookmarks = removeAtIndex(instrument.bookmarks, index);
|
|
} else {
|
|
bookmarks = [...instrument.bookmarks];
|
|
}
|
|
}
|
|
|
|
const data = {
|
|
...instrument,
|
|
bookmarks,
|
|
};
|
|
console.log(data);
|
|
|
|
store.writeFragment({
|
|
data,
|
|
fragment,
|
|
id,
|
|
});
|
|
};
|
|
getVariables = (newBookmarkedValue: boolean) => {
|
|
return {
|
|
input: {
|
|
uuid,
|
|
instrument: root,
|
|
bookmarked: newBookmarkedValue,
|
|
},
|
|
};
|
|
};
|
|
mutation = graphql(`
|
|
mutation UpdateInstrumentBookmark($input: UpdateInstrumentBookmarkInput!) {
|
|
updateInstrumentBookmark(input: $input) {
|
|
success
|
|
}
|
|
}
|
|
`);
|
|
optimisticResponse = {
|
|
__typename: 'Mutation',
|
|
updateInstrumentBookmark: {
|
|
__typename: 'UpdateInstrumentBookmarkPayload',
|
|
success: true,
|
|
},
|
|
};
|
|
} else {
|
|
updateCurry = (newBookmarkedValue: boolean) => (store) => {
|
|
const query = CONTENT_BLOCK_QUERY;
|
|
const variables = { id: root };
|
|
const { contentBlock } = store.readQuery({
|
|
query,
|
|
variables,
|
|
});
|
|
|
|
// const bookmarks = data.contentBlock.bookmarks;
|
|
let bookmarks: any[];
|
|
|
|
if (newBookmarkedValue) {
|
|
const element = {
|
|
note: null,
|
|
uuid,
|
|
__typename: 'ContentBlockBookmarkNode',
|
|
};
|
|
bookmarks = pushToArray(contentBlock.bookmarks, element);
|
|
} else {
|
|
const index = contentBlock.bookmarks.findIndex(compareUuid(uuid));
|
|
if (index > -1) {
|
|
bookmarks = removeAtIndex(contentBlock.bookmarks, index);
|
|
} else {
|
|
bookmarks = [...contentBlock.bookmarks];
|
|
}
|
|
}
|
|
|
|
const data = {
|
|
contentBlock: {
|
|
...contentBlock,
|
|
bookmarks,
|
|
},
|
|
};
|
|
|
|
store.writeQuery({
|
|
data,
|
|
query,
|
|
variables,
|
|
});
|
|
};
|
|
getVariables = (newBookmarkedValue: boolean) => {
|
|
return {
|
|
input: {
|
|
uuid,
|
|
contentBlock: root,
|
|
bookmarked: newBookmarkedValue,
|
|
},
|
|
};
|
|
};
|
|
mutation = graphql(`
|
|
mutation UpdateContentBookmark($input: UpdateContentBookmarkInput!) {
|
|
updateContentBookmark(input: $input) {
|
|
success
|
|
}
|
|
}
|
|
`);
|
|
optimisticResponse = {
|
|
__typename: 'Mutation',
|
|
updateContentBookmark: {
|
|
__typename: 'UpdateContentBookmarkPayload',
|
|
success: true,
|
|
},
|
|
};
|
|
}
|
|
return { mutation, updateCurry, getVariables, optimisticResponse };
|
|
};
|