@webitel/ui-sdk 24.4.19 → 24.4.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/img/sprite/custom-chat-gateway.svg +5 -0
  2. package/dist/img/sprite/index.js +1 -0
  3. package/dist/ui-sdk.mjs +1069 -1069
  4. package/dist/ui-sdk.umd.js +9 -9
  5. package/package.json +3 -2
  6. package/src/api/clients/agents/agents.js +292 -0
  7. package/src/api/clients/buckets/buckets.js +138 -0
  8. package/src/api/clients/calendars/calendars.js +248 -0
  9. package/src/api/clients/chatGateways/chatGateways.js +309 -0
  10. package/src/api/clients/chatGateways/defaults/defaultChatGateway.js +18 -0
  11. package/src/api/clients/chatGateways/defaults/webChatGateway.js +73 -0
  12. package/src/api/clients/chatGateways/enums/WebchatAlternativeChannel.enum.js +14 -0
  13. package/src/api/clients/chatGateways/scripts/generateUri.js +9 -0
  14. package/src/api/clients/communications/communications.js +162 -0
  15. package/src/api/clients/flows/flow.js +256 -0
  16. package/src/api/clients/gateways/defaults/defaultGateway.js +9 -0
  17. package/src/api/clients/gateways/defaults/registerGateway.js +12 -0
  18. package/src/api/clients/gateways/defaults/trunkingGateway.js +16 -0
  19. package/src/api/clients/gateways/gateways.js +204 -0
  20. package/src/api/clients/index.js +27 -0
  21. package/src/api/clients/lists/blacklists.js +144 -0
  22. package/src/api/clients/media/media.js +136 -0
  23. package/src/api/clients/queues/defaults/processing.js +10 -0
  24. package/src/api/clients/queues/queues.js +275 -0
  25. package/src/api/clients/roles/roles.js +213 -0
  26. package/src/api/clients/users/__tests__/users.spec.js +200 -0
  27. package/src/api/clients/users/users.js +254 -0
  28. package/src/api/defaults/getDefaultInstance/getDefaultInstance.js +14 -0
  29. package/src/api/defaults/getDefaultOpenAPIConfig/getDefaultOpenAPIConfig.js +9 -0
  30. package/src/api/defaults/index.js +4 -0
  31. package/src/enums/ChatGatewayProvider/ChatGatewayProvider.enum.js +1 -0
@@ -0,0 +1,200 @@
1
+ import axios from 'axios';
2
+ import UsersAPI from '../users';
3
+
4
+ // axios mock should be copy-pasted :(
5
+ // https://stackoverflow.com/questions/65554910/jest-referenceerror-cannot-access-before-initialization
6
+ vi.mock('axios', () => {
7
+ return {
8
+ default: {
9
+ post: vi.fn(),
10
+ get: vi.fn(),
11
+ delete: vi.fn(),
12
+ put: vi.fn(),
13
+ patch: vi.fn(),
14
+ create: vi.fn().mockReturnThis(),
15
+ interceptors: {
16
+ request: {
17
+ use: vi.fn(), eject: vi.fn(),
18
+ }, response: {
19
+ use: vi.fn(), eject: vi.fn(),
20
+ },
21
+ },
22
+ },
23
+ };
24
+ });
25
+
26
+ describe('UsersAPI', () => {
27
+ it('correctly computes "getList" method api call', async () => {
28
+ const inputParams = {
29
+ fields: ['id', 'name', 'vitest'],
30
+ };
31
+ const url = '/users?fields=id&fields=name&fields=vitest&page=1&size=10';
32
+ const mock = axios.get.mockImplementationOnce(() => Promise.resolve({
33
+ data: {},
34
+ }));
35
+ await UsersAPI.getList(inputParams);
36
+ expect(mock).toHaveBeenCalledWith(url);
37
+ });
38
+
39
+ it('correctly computes "getList" method output', async () => {
40
+ const output = {
41
+ items: [
42
+ {
43
+ dnd: false,
44
+ id: 1,
45
+ name: '',
46
+ state: true,
47
+ status: '',
48
+ shouldCaseConvert: '',
49
+ },
50
+ ], next: true,
51
+ };
52
+
53
+ const response = {
54
+ data: {
55
+ items: [
56
+ { id: 1, should_case_convert: '' },
57
+ ], next: true,
58
+ },
59
+ };
60
+ axios.get.mockImplementationOnce(() => Promise.resolve(response));
61
+ expect(await UsersAPI.getList({})).toEqual(output);
62
+ });
63
+
64
+ it('correctly computes "get" method api call', async () => {
65
+ const inputParams = {
66
+ itemId: 1,
67
+ };
68
+ const url = '/users/1';
69
+ const mock = axios.get.mockImplementationOnce(() => Promise.resolve({
70
+ data: {},
71
+ }));
72
+ await UsersAPI.get(inputParams);
73
+ expect(mock).toHaveBeenCalledWith(url);
74
+ });
75
+
76
+ it('correctly computes "get" method output', async () => {
77
+ const output = {
78
+ id: 1, device: {}, devices: [], license: [], roles: [], variables: [
79
+ {
80
+ key: '', value: '',
81
+ },
82
+ ],
83
+ };
84
+
85
+ const response = {
86
+ data: {
87
+ id: 1,
88
+ },
89
+ };
90
+ axios.get.mockImplementationOnce(() => Promise.resolve(response));
91
+ expect(await UsersAPI.get({})).toEqual(output);
92
+ });
93
+
94
+ it('correctly computes "add" method api call', async () => {
95
+ const input = {
96
+ itemInstance: {
97
+ name: 'test',
98
+ },
99
+ };
100
+
101
+ const body = {
102
+ name: 'test',
103
+ profile: {}, // variables field (?)
104
+ };
105
+
106
+ const url = '/users';
107
+ const mock = axios.post.mockImplementationOnce(() => Promise.resolve({
108
+ data: {},
109
+ }));
110
+ await UsersAPI.add(input);
111
+ expect(mock).toHaveBeenCalledWith(url, body);
112
+ });
113
+
114
+ it('correctly computes "add" method output', async () => {
115
+ const output = {
116
+ id: 1,
117
+ checkCase: '',
118
+ };
119
+
120
+ const response = {
121
+ data: {
122
+ id: 1,
123
+ check_case: '',
124
+ },
125
+ };
126
+ axios.post.mockImplementationOnce(() => Promise.resolve(response));
127
+ expect(await UsersAPI.add({ itemInstance: {} })).toEqual(output);
128
+ });
129
+
130
+ it('correctly computes "update" method api call', async () => {
131
+ const input = {
132
+ itemInstance: {
133
+ name: 'test',
134
+ },
135
+ itemId: 1,
136
+ };
137
+
138
+ const body = {
139
+ name: 'test',
140
+ profile: {}, // variables field (?)
141
+ };
142
+
143
+ const url = '/users/1';
144
+ const mock = axios.put.mockImplementationOnce(() => Promise.resolve({
145
+ data: {},
146
+ }));
147
+ await UsersAPI.update(input);
148
+ expect(mock).toHaveBeenCalledWith(url, body);
149
+ });
150
+
151
+ it('correctly computes "update" method output', async () => {
152
+ const output = {
153
+ id: 1,
154
+ checkCase: '',
155
+ };
156
+
157
+ const response = {
158
+ data: {
159
+ id: 1,
160
+ check_case: '',
161
+ },
162
+ };
163
+ axios.put.mockImplementationOnce(() => Promise.resolve(response));
164
+ expect(await UsersAPI.update({ itemInstance: {}, itemId: 1 }))
165
+ .toEqual(output);
166
+ });
167
+
168
+ it('correctly computes "patch" method api call', async () => {
169
+ const input = {
170
+ changes: {
171
+ name: 'test',
172
+ },
173
+ id: 1,
174
+ };
175
+
176
+ const body = {
177
+ name: 'test',
178
+ };
179
+
180
+ const url = '/users/1';
181
+ const mock = axios.patch.mockImplementationOnce(() => Promise.resolve({
182
+ data: {},
183
+ }));
184
+ await UsersAPI.patch(input);
185
+ expect(mock).toHaveBeenCalledWith(url, body);
186
+ });
187
+
188
+ it('correctly computes "delete" method api call', async () => {
189
+ const input = {
190
+ id: 1,
191
+ };
192
+
193
+ const url = '/users/1?permanent=true';
194
+ const mock = axios.delete.mockImplementationOnce(() => Promise.resolve({
195
+ data: {},
196
+ }));
197
+ await UsersAPI.delete(input);
198
+ expect(mock).toHaveBeenCalledWith(url);
199
+ });
200
+ });
@@ -0,0 +1,254 @@
1
+ import deepCopy from 'deep-copy';
2
+ import {
3
+ getDefaultGetListResponse,
4
+ getDefaultGetParams, getDefaultInstance,
5
+ } from '../../defaults';
6
+ import applyTransform, {
7
+ camelToSnake,
8
+ generateUrl,
9
+ merge,
10
+ mergeEach,
11
+ notify,
12
+ sanitize,
13
+ snakeToCamel,
14
+ starToSearch,
15
+ } from '../../transformers';
16
+
17
+ const instance = getDefaultInstance();
18
+
19
+ const baseUrl = '/users';
20
+ const fieldsToSend = [
21
+ 'name',
22
+ 'username',
23
+ 'password',
24
+ 'extension',
25
+ 'status',
26
+ 'note',
27
+ 'roles',
28
+ 'license',
29
+ 'devices',
30
+ 'device',
31
+ 'profile',
32
+ 'email',
33
+ ];
34
+
35
+ const getUsersList = async (params) => {
36
+ const fieldsToSend = ['page', 'size', 'q', 'sort', 'fields', 'id'];
37
+
38
+ const defaultObject = {
39
+ name: '',
40
+ status: '',
41
+ state: true,
42
+ dnd: false,
43
+ };
44
+
45
+ const url = applyTransform(params, [
46
+ merge(getDefaultGetParams()),
47
+ starToSearch('search'),
48
+ (params) => ({ ...params, q: params.search }),
49
+ sanitize(fieldsToSend),
50
+ camelToSnake(),
51
+ generateUrl(baseUrl),
52
+ ]);
53
+ try {
54
+ const response = await instance.get(url);
55
+ const { items, next } = applyTransform(response.data, [
56
+ snakeToCamel(['profile']),
57
+ merge(getDefaultGetListResponse()),
58
+ ]);
59
+ return {
60
+ items: applyTransform(items, [
61
+ mergeEach(defaultObject),
62
+ ]),
63
+ next,
64
+ };
65
+ } catch (err) {
66
+ throw applyTransform(err, [
67
+ notify,
68
+ ]);
69
+ }
70
+ };
71
+
72
+ const getUser = async ({ itemId: id }) => {
73
+ const defaultObject = {
74
+ roles: [],
75
+ license: [],
76
+ devices: [],
77
+ device: {},
78
+ variables: [
79
+ { key: '', value: '' },
80
+ ],
81
+ };
82
+
83
+ const itemResponseHandler = (item) => {
84
+ const copy = deepCopy(item);
85
+ if (copy.license) {
86
+ copy.license.forEach((item) => {
87
+ // eslint-disable-next-line no-param-reassign
88
+ item.name = item.prod;
89
+ });
90
+ }
91
+ if (copy.profile) {
92
+ copy.variables = Object.keys(copy.profile).map((key) => ({
93
+ key,
94
+ value: copy.profile[key],
95
+ }));
96
+ } else {
97
+ copy.variables = [{ key: '', value: '' }];
98
+ }
99
+ return copy;
100
+ };
101
+
102
+ const url = `${baseUrl}/${id}`;
103
+
104
+ try {
105
+ const response = await instance.get(url);
106
+ return applyTransform(response.data, [
107
+ snakeToCamel(['profile']),
108
+ merge(defaultObject),
109
+ itemResponseHandler,
110
+ ]);
111
+ } catch (err) {
112
+ throw applyTransform(err, [
113
+ notify,
114
+ ]);
115
+ }
116
+ };
117
+
118
+ const preRequestHandler = (item) => {
119
+ const copy = deepCopy(item);
120
+ if (item.device && !item.device.id) delete copy.device;
121
+ // eslint-disable-next-line no-param-reassign
122
+ if (copy.roles) copy.roles.forEach((copy) => delete copy.text);
123
+ // eslint-disable-next-line no-param-reassign
124
+ if (copy.devices) copy.devices.forEach((copy) => delete copy.text);
125
+ if (copy.license) {
126
+ copy.license = copy.license.map((copy) => ({ id: copy.id }));
127
+ }
128
+ copy.profile = {};
129
+ if (copy.variables) {
130
+ copy.variables.forEach((variable) => {
131
+ copy.profile[variable.key] = variable.value;
132
+ });
133
+ }
134
+ return copy;
135
+ };
136
+
137
+ const addUser = async ({ itemInstance }) => {
138
+ const item = applyTransform(itemInstance, [
139
+ preRequestHandler,
140
+ sanitize(fieldsToSend),
141
+ camelToSnake(['profile']),
142
+ ]);
143
+ try {
144
+ const response = await instance.post(baseUrl, item);
145
+ return applyTransform(response.data, [
146
+ snakeToCamel(['profile']),
147
+ ]);
148
+ } catch (err) {
149
+ throw applyTransform(err, [
150
+ notify,
151
+ ]);
152
+ }
153
+ };
154
+
155
+ const updateUser = async ({ itemInstance, itemId: id }) => {
156
+ const item = applyTransform(itemInstance, [
157
+ preRequestHandler,
158
+ sanitize(fieldsToSend),
159
+ camelToSnake(['profile']),
160
+ ]);
161
+
162
+ const url = `${baseUrl}/${id}`;
163
+ try {
164
+ const response = await instance.put(url, item);
165
+ return applyTransform(response.data, [
166
+ snakeToCamel(['profile']),
167
+ ]);
168
+ } catch (err) {
169
+ throw applyTransform(err, [
170
+ notify,
171
+ ]);
172
+ }
173
+ };
174
+
175
+ const patchUser = async ({ changes, id }) => {
176
+ const body = applyTransform(changes, [
177
+ sanitize(fieldsToSend),
178
+ camelToSnake(['profile']),
179
+ ]);
180
+ const url = `${baseUrl}/${id}`;
181
+ try {
182
+ const response = await instance.patch(url, body);
183
+ return applyTransform(response.data, [
184
+ snakeToCamel(['profile']),
185
+ ]);
186
+ } catch (err) {
187
+ throw applyTransform(err, [
188
+ notify,
189
+ ]);
190
+ }
191
+ };
192
+
193
+ const patchUserPresence = async ({ changes, id }) => {
194
+ const body = applyTransform(changes, [
195
+ sanitize(fieldsToSend),
196
+ camelToSnake(['profile']),
197
+ ]);
198
+ const url = `${baseUrl}/${id}/presence`;
199
+ try {
200
+ const response = await instance.patch(url, body);
201
+ return applyTransform(response.data, [
202
+ snakeToCamel(['profile']),
203
+ ]);
204
+ } catch (err) {
205
+ throw applyTransform(err, [
206
+ notify,
207
+ ]);
208
+ }
209
+ };
210
+
211
+ const deleteUser = async ({ id }) => {
212
+ const url = `${baseUrl}/${id}?permanent=true`;
213
+ // permanent=true for complete deletion
214
+ try {
215
+ const response = await instance.delete(url);
216
+ return applyTransform(response.data, []);
217
+ } catch (err) {
218
+ throw applyTransform(err, [
219
+ notify,
220
+ ]);
221
+ }
222
+ };
223
+
224
+ const getUsersLookup = (params) => getUsersList({
225
+ ...params,
226
+ fields: params.fields || ['id', 'name'],
227
+ });
228
+
229
+ const logoutUser = async ({ id }) => {
230
+ const url = `${baseUrl}/${id}/logout`;
231
+ try {
232
+ const response = await instance.post(url, {});
233
+ return applyTransform(response.data, []);
234
+ } catch (err) {
235
+ throw applyTransform(err, [
236
+
237
+ notify,
238
+ ]);
239
+ }
240
+ };
241
+
242
+ const UsersAPI = {
243
+ getList: getUsersList,
244
+ get: getUser,
245
+ add: addUser,
246
+ patch: patchUser,
247
+ update: updateUser,
248
+ delete: deleteUser,
249
+ getLookup: getUsersLookup,
250
+ patchUserPresence,
251
+ logoutUser,
252
+ };
253
+
254
+ export default UsersAPI;
@@ -0,0 +1,14 @@
1
+ import generateInstance from '../../axios/generateInstance';
2
+ import updateTokenInterceptor
3
+ from '../../interceptors/request/updateToken.interceptor';
4
+ import handleUnauthorizedInterceptor
5
+ from '../../interceptors/response/handleUnauthorized.interceptor';
6
+
7
+ const getDefaultInstance = () => generateInstance({
8
+ interceptors: {
9
+ request: [updateTokenInterceptor],
10
+ response: [handleUnauthorizedInterceptor],
11
+ },
12
+ });
13
+
14
+ export default getDefaultInstance;
@@ -0,0 +1,9 @@
1
+ import { Configuration } from 'webitel-sdk';
2
+
3
+ const getDefaultOpenAPIConfig = () => new Configuration({
4
+ basePath: import.meta.env.VITE_API_URL,
5
+ apiKey: localStorage.getItem('access-key') || '',
6
+ accessToken: localStorage.getItem('access-key') || '',
7
+ });
8
+
9
+ export default getDefaultOpenAPIConfig;
@@ -1,7 +1,11 @@
1
1
  import getDefaultGetParams from './getDefaultGetParams/getDefaultGetParams';
2
2
  import getDefaultGetListResponse from './getDefaultGetListResponse/getDefaultGetListResponse';
3
+ import getDefaultInstance from './getDefaultInstance/getDefaultInstance';
4
+ import getDefaultOpenAPIConfig from './getDefaultOpenAPIConfig/getDefaultOpenAPIConfig';
3
5
 
4
6
  export {
5
7
  getDefaultGetParams,
6
8
  getDefaultGetListResponse,
9
+ getDefaultInstance,
10
+ getDefaultOpenAPIConfig,
7
11
  };
@@ -5,6 +5,7 @@ const ChatGatewayProvider = Object.freeze({
5
5
  VIBER: 'viber',
6
6
  WEBCHAT: 'webchat',
7
7
  INFOBIP: 'infobip_whatsapp',
8
+ CUSTOM: 'custom',
8
9
  });
9
10
 
10
11
  export default ChatGatewayProvider;