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

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 };
};