summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/work_items/graphql/provider.js
blob: 09d929faae20815b82ec4dc4d61c3517182fb149 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import produce from 'immer';
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import createDefaultClient from '~/lib/graphql';
import { WIDGET_TYPE_ASSIGNEE } from '../constants';
import typeDefs from './typedefs.graphql';
import workItemQuery from './work_item.query.graphql';

export const temporaryConfig = {
  typeDefs,
  cacheConfig: {
    possibleTypes: {
      LocalWorkItemWidget: ['LocalWorkItemAssignees'],
    },
    typePolicies: {
      WorkItem: {
        fields: {
          mockWidgets: {
            read(widgets) {
              return (
                widgets || [
                  {
                    __typename: 'LocalWorkItemAssignees',
                    type: 'ASSIGNEES',
                    nodes: [
                      {
                        __typename: 'UserCore',
                        id: 'gid://gitlab/User/1',
                        avatarUrl: '',
                        webUrl: '',
                        // eslint-disable-next-line @gitlab/require-i18n-strings
                        name: 'John Doe',
                        username: 'doe_I',
                      },
                      {
                        __typename: 'UserCore',
                        id: 'gid://gitlab/User/2',
                        avatarUrl: '',
                        webUrl: '',
                        // eslint-disable-next-line @gitlab/require-i18n-strings
                        name: 'Marcus Rutherford',
                        username: 'ruthfull',
                      },
                    ],
                  },
                  {
                    __typename: 'LocalWorkItemWeight',
                    type: 'WEIGHT',
                    weight: 0,
                  },
                ]
              );
            },
          },
        },
      },
    },
  },
};

export const resolvers = {
  Mutation: {
    localUpdateWorkItem(_, { input }, { cache }) {
      const sourceData = cache.readQuery({
        query: workItemQuery,
        variables: { id: input.id },
      });

      const data = produce(sourceData, (draftData) => {
        const assigneesWidget = draftData.workItem.mockWidgets.find(
          (widget) => widget.type === WIDGET_TYPE_ASSIGNEE,
        );
        assigneesWidget.nodes = assigneesWidget.nodes.filter((assignee) =>
          input.assigneeIds.includes(assignee.id),
        );
      });

      cache.writeQuery({
        query: workItemQuery,
        variables: { id: input.id },
        data,
      });
    },
  },
};

export function createApolloProvider() {
  Vue.use(VueApollo);

  const defaultClient = createDefaultClient(resolvers, temporaryConfig);

  return new VueApollo({
    defaultClient,
  });
}