import produce from 'immer'; import VueApollo from 'vue-apollo'; import { defaultDataIdFromObject } from '@apollo/client/core'; import { concatPagination } from '@apollo/client/utilities'; import getIssueStateQuery from '~/issues/show/queries/get_issue_state.query.graphql'; import createDefaultClient from '~/lib/graphql'; import typeDefs from '~/work_items/graphql/typedefs.graphql'; export const config = { typeDefs, cacheConfig: { // included temporarily until Vuex is removed from boards app dataIdFromObject: (object) => { // eslint-disable-next-line no-underscore-dangle return object.__typename === 'BoardList' ? object.iid : defaultDataIdFromObject(object); }, typePolicies: { Project: { fields: { projectMembers: { keyArgs: ['fullPath', 'search', 'relations', 'first'], }, }, }, WorkItem: { fields: { widgets: { merge(existing = [], incoming) { if (existing.length === 0) { return incoming; } return existing.map((existingWidget) => { const incomingWidget = incoming.find( (w) => w.type && w.type === existingWidget.type, ); return incomingWidget || existingWidget; }); }, }, }, }, MemberInterfaceConnection: { fields: { nodes: concatPagination(), }, }, }, }, }; export const resolvers = { Mutation: { updateIssueState: (_, { issueType = undefined, isDirty = false }, { cache }) => { const sourceData = cache.readQuery({ query: getIssueStateQuery }); const data = produce(sourceData, (draftData) => { draftData.issueState = { issueType, isDirty }; }); cache.writeQuery({ query: getIssueStateQuery, data }); }, }, }; export const defaultClient = createDefaultClient(resolvers, config); export const apolloProvider = new VueApollo({ defaultClient, });