diff options
Diffstat (limited to 'app/assets/javascripts/security_configuration/graphql/cache_utils.js')
-rw-r--r-- | app/assets/javascripts/security_configuration/graphql/cache_utils.js | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/app/assets/javascripts/security_configuration/graphql/cache_utils.js b/app/assets/javascripts/security_configuration/graphql/cache_utils.js new file mode 100644 index 00000000000..6d5258b01dc --- /dev/null +++ b/app/assets/javascripts/security_configuration/graphql/cache_utils.js @@ -0,0 +1,40 @@ +import produce from 'immer'; + +export const updateSecurityTrainingOptimisticResponse = (changes) => ({ + // False positive i18n lint: https://gitlab.com/gitlab-org/frontend/eslint-plugin-i18n/issues/26 + // eslint-disable-next-line @gitlab/require-i18n-strings + __typename: 'Mutation', + securityTrainingUpdate: { + __typename: 'SecurityTrainingUpdatePayload', + training: { + __typename: 'ProjectSecurityTraining', + ...changes, + }, + errors: [], + }, +}); + +export const updateSecurityTrainingCache = ({ query, variables }) => (cache, { data }) => { + const { + securityTrainingUpdate: { training: updatedProvider }, + } = data; + const { project } = cache.readQuery({ query, variables }); + if (!updatedProvider.isPrimary) { + return; + } + + // when we set a new primary provider, we need to unset the previous one(s) + const updatedProject = produce(project, (draft) => { + draft.securityTrainingProviders.forEach((provider) => { + // eslint-disable-next-line no-param-reassign + provider.isPrimary = provider.id === updatedProvider.id; + }); + }); + + // write to the cache + cache.writeQuery({ + query, + variables, + data: { project: updatedProject }, + }); +}; |