@livechat/customer-sdk 3.1.5 → 4.0.1

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.
@@ -105,43 +105,125 @@
105
105
 
106
106
  var _ref = {},
107
107
  hasOwnProperty = _ref.hasOwnProperty;
108
+ /**
109
+ * returns true or false depending if the provided property is present inside the provided object
110
+ * @example
111
+ * hasOwn('a', { a: 1, b: 2 })
112
+ * // returns true
113
+ */
108
114
  function hasOwn(prop, obj) {
109
115
  return hasOwnProperty.call(obj, prop);
110
116
  }
111
117
 
118
+ /**
119
+ * returns a new array formed by applying a given callback function to each element of the array, and then flattening the result by one level
120
+ * @example
121
+ * const arr = [{ a: [1, 2] }, { a: [3, 4] }, { a: [5, 6] }]
122
+ * flatMap(el => el.a, arr)
123
+ * // returns [1, 2, 3, 4, 5, 6]
124
+ */
112
125
  function flatMap(iteratee, arr) {
113
126
  var _ref;
114
127
  return (_ref = []).concat.apply(_ref, arr.map(iteratee));
115
128
  }
116
129
 
117
- var isArray = Array.isArray;
130
+ /**
131
+ * determines whether provided value is an array
132
+ * @example
133
+ * isArray([1, 2])
134
+ * // returns true
135
+ * isArray('hello')
136
+ * // returns false
137
+ */
138
+ function isArray(arr) {
139
+ return Array.isArray(arr);
140
+ }
118
141
 
142
+ /**
143
+ * returns true or false depending if the provided value is an object
144
+ * @example
145
+ * isObject({ a: 1 })
146
+ * // returns true
147
+ * isObject([1, 2])
148
+ * // returns false
149
+ */
119
150
  // eslint-disable-next-line @typescript-eslint/ban-types
120
151
  function isObject(obj) {
121
152
  return typeof obj === 'object' && obj !== null && !isArray(obj);
122
153
  }
123
154
 
155
+ /**
156
+ * returns an array of the provided object keys
157
+ * @example
158
+ * keys({ a: 1, b: 2, c: 3 })
159
+ * // returns ['a', 'b', 'c']
160
+ */
161
+ function keys(obj) {
162
+ if ('keys' in Object && typeof Object.keys === 'function') {
163
+ return Object.keys(obj);
164
+ }
165
+ var keysArray = [];
166
+ for (var property in obj) {
167
+ if (Object.prototype.hasOwnProperty.call(obj, property)) {
168
+ keysArray.push(property);
169
+ }
170
+ }
171
+ return keysArray;
172
+ }
173
+
174
+ /**
175
+ * maps values of the provided object
176
+ * @example
177
+ * mapValues(val => val.toUpperCase(), { a: 'foo', b: 'bar' })
178
+ * // returns { a: 'FOO', b: 'BAR' }
179
+ */
124
180
  function mapValues(mapper, obj) {
125
- return Object.keys(obj).reduce(function (acc, key) {
181
+ return keys(obj).reduce(function (acc, key) {
126
182
  acc[key] = mapper(obj[key]);
127
183
  return acc;
128
184
  }, {});
129
185
  }
130
186
 
187
+ /**
188
+ * returns the provided value
189
+ * @example
190
+ * identity('hello')
191
+ * // returns 'hello'
192
+ */
131
193
  function identity(value) {
132
194
  return value;
133
195
  }
134
196
 
197
+ /**
198
+ * generates a random id
199
+ * @example
200
+ * generateRandomId()
201
+ * // returns 'd1rjknhhch8'
202
+ */
135
203
  function generateRandomId() {
136
204
  return Math.random().toString(36).substring(2);
137
205
  }
138
206
 
207
+ /**
208
+ * generates an unique id based on the provided object keys
209
+ * @example
210
+ * generateUniqueId({ xuvarw8cao: 1, b837g2nba1d: 2 })
211
+ * // returns 'd1rjknhhch8'
212
+ */
139
213
  function generateUniqueId(map) {
140
214
  var id = generateRandomId();
141
215
  return hasOwn(id, map) ? generateUniqueId(map) : id;
142
216
  }
143
217
 
144
- // based on https://github.com/developit/dlv/blob/d7ec976d12665f1c25dec2acf955dfc2e8757a9c/index.js
218
+ /**
219
+ * returns the value from the specififed path from the provided object
220
+ * @example
221
+ * const obj = { a: { b: [1, 2, 3] } }
222
+ * get('a.b.1', obj)
223
+ * // returns 2
224
+ * get(['a', 'b', '1'], obj)
225
+ * // returns 2
226
+ */
145
227
  function get(propPath, obj) {
146
228
  var arrPath = typeof propPath === 'string' ? propPath.split('.') : propPath;
147
229
  var pathPartIndex = 0;
@@ -152,14 +234,30 @@
152
234
  return result;
153
235
  }
154
236
 
237
+ /**
238
+ * returns true or false depending if the provided value is present inside the provided array or string
239
+ * @example
240
+ * includes('a', ['a', 'b', 'c'])
241
+ * // returns true
242
+ * includes('d', 'abc')
243
+ * // returns false
244
+ */
245
+
155
246
  function includes(value, arrOrStr) {
156
247
  return arrOrStr.indexOf(value) !== -1;
157
248
  }
158
249
 
159
- function isEmpty(collection) {
160
- return (isArray(collection) ? collection : Object.keys(collection)).length === 0;
161
- }
162
-
250
+ /**
251
+ * constructs an object from the provided array of objects, grouped by the value of the specified key
252
+ * @example
253
+ * const arr = [
254
+ * { a: 'foo', b: 'bar' },
255
+ * { a: 'foo', b: 'baz' },
256
+ * { a: 'test', b: 'bab' },
257
+ * ]
258
+ * keyBy('a', arr)
259
+ * // returns { foo: { a: 'foo', b: 'baz' }, test: { a: 'test', b: 'bab' } }
260
+ */
163
261
  function keyBy(prop, arr) {
164
262
  return arr.reduce(function (acc, el) {
165
263
  acc[el[prop]] = el;
@@ -167,20 +265,47 @@
167
265
  }, {});
168
266
  }
169
267
 
170
- // TODO: this should return `T | undefined` to match native behavior
268
+ /**
269
+ * returns the last element of the provided array or undefined when array is empty
270
+ * @example
271
+ * last([1, 2, 3])
272
+ * // returns 3
273
+ */
171
274
  function last(arr) {
172
- return arr.length > 0 ? arr[arr.length - 1] : null;
275
+ return arr.length > 0 ? arr[arr.length - 1] : undefined;
173
276
  }
174
277
 
278
+ /**
279
+ * does literally nothing
280
+ * @example
281
+ * somethingAsyncAndDangerous().catch(noop)
282
+ */
175
283
  // eslint-disable-next-line @typescript-eslint/no-empty-function
176
284
  function noop() {}
177
285
 
286
+ /**
287
+ * returns an array of values of the provided object
288
+ * @example
289
+ * values({ a: 1, b: 2, c: 3 })
290
+ * // returns [1, 2, 3]
291
+ */
178
292
  function values(obj) {
179
- return Object.keys(obj).map(function (key) {
293
+ return keys(obj).map(function (key) {
180
294
  return obj[key];
181
295
  });
182
296
  }
183
297
 
298
+ /**
299
+ * sorts values of the provided object or array based on the provided mapping function or the provided prop string
300
+ * @example
301
+ * const obj = {
302
+ * a: { chats: 1 },
303
+ * b: { chats: 3 },
304
+ * c: { chats: 2 },
305
+ * }
306
+ * numericSortBy(el => el.chats * -1, obj)
307
+ * // returns [{ chats: 3 }, { chats: 2 }, { chats: 1 }]
308
+ */
184
309
  function numericSortBy(propOrMapper, collection) {
185
310
  var mapper = typeof propOrMapper === 'function' ? propOrMapper : function (element) {
186
311
  return get(propOrMapper, element);
@@ -190,13 +315,25 @@
190
315
  });
191
316
  }
192
317
 
193
- function pick(props, obj) {
194
- return props.reduce(function (acc, prop) {
318
+ /**
319
+ * picks specified properties from the object
320
+ * @example
321
+ * pick(['b'], { a: 1, b: 2 })
322
+ * // returns { b: 2 }
323
+ */
324
+ function pick(keys, obj) {
325
+ return keys.reduce(function (acc, prop) {
195
326
  acc[prop] = obj[prop];
196
327
  return acc;
197
328
  }, {});
198
329
  }
199
330
 
331
+ /**
332
+ * picks specified props only if they exist on the provided object
333
+ * @example
334
+ * pickOwn(['b'], { a: 1, b: 2 })
335
+ * // returns { b: 2 }
336
+ */
200
337
  function pickOwn(props, obj) {
201
338
  return props.reduce(function (acc, prop) {
202
339
  if (hasOwn(prop, obj)) {
@@ -206,19 +343,41 @@
206
343
  }, {});
207
344
  }
208
345
 
209
- var toPairs = function toPairs(obj) {
210
- return Object.keys(obj).map(function (key) {
346
+ /**
347
+ * returns an array of derived from the provided object key-value tuples
348
+ * @example
349
+ * toPairs({ a: 1, b: 2 })
350
+ * // returns [['a', 1], ['b', 2]]
351
+ */
352
+ function toPairs(obj) {
353
+ return keys(obj).map(function (key) {
211
354
  return [key, obj[key]];
212
355
  });
213
- };
356
+ }
214
357
 
215
- var stringCompare = function stringCompare(strA, strB) {
358
+ /**
359
+ * returns 0 for matching strings
360
+ * return -1 for string with lower char code at some position
361
+ * return 1 for string with greater char code at some position
362
+ * @example
363
+ * stringCompare('abc', 'abc')
364
+ * // returns 0
365
+ * stringCompare('abc', 'abd')
366
+ * // returns -1
367
+ */
368
+ function stringCompare(strA, strB) {
216
369
  if (strA === strB) {
217
370
  return 0;
218
371
  }
219
372
  return strA < strB ? -1 : 1;
220
- };
373
+ }
221
374
 
375
+ /**
376
+ * returns an array with all the duplicates from the provided array removed based on the iteratee function
377
+ * @example
378
+ * uniqBy(el => el.toString(), [1, '1', 2, '3', 3])
379
+ * // returns [1, 2, '3']
380
+ */
222
381
  function uniqBy(iteratee, arr) {
223
382
  // with polyfills this could be just: return Array.from(new Set(arr.map(iteratee)))
224
383
  var seen = [];
@@ -309,25 +468,18 @@
309
468
  });
310
469
  }
311
470
 
312
- function getRoot() {
313
- return new Promise(function (resolve) {
314
- var next = function next() {
315
- if (!document.body) {
316
- setTimeout(next, 100);
317
- return;
318
- }
319
- resolve(document.body);
320
- };
321
- next();
322
- });
323
- }
324
-
325
- function removeNode(node) {
326
- var parentNode = node.parentNode;
327
- if (parentNode) {
328
- parentNode.removeChild(node);
329
- }
330
- }
471
+ var ACCOUNTS_URL = "https://accounts.livechatinc.com";
472
+ var buildPath = function buildPath(_ref) {
473
+ var uniqueGroups = _ref.uniqueGroups,
474
+ organizationId = _ref.organizationId,
475
+ groupId = _ref.groupId;
476
+ return "" + (uniqueGroups ? "/v2/customer/" + organizationId + "/" + groupId + "/token" : '/v2/customer/token');
477
+ };
478
+ var buildRequestUrl = function buildRequestUrl(config, env) {
479
+ var url = env === 'production' ? ACCOUNTS_URL : ACCOUNTS_URL.replace('accounts.', "accounts." + env + ".");
480
+ var path = buildPath(config);
481
+ return "" + url + path;
482
+ };
331
483
 
332
484
  var createError = function createError(_ref) {
333
485
  var code = _ref.code,
@@ -337,7 +489,7 @@
337
489
  return err;
338
490
  };
339
491
 
340
- var parseTokenResponse = function parseTokenResponse(token, licenseId) {
492
+ var parseTokenResponse = function parseTokenResponse(token, organizationId) {
341
493
  if ('identity_exception' in token) {
342
494
  throw createError({
343
495
  code: 'SSO_IDENTITY_EXCEPTION',
@@ -356,119 +508,33 @@
356
508
  expiresIn: token.expires_in * 1000,
357
509
  tokenType: token.token_type,
358
510
  creationDate: Date.now(),
359
- licenseId: licenseId
360
- };
361
- };
362
-
363
- var ACCOUNTS_URL = "https://accounts.livechatinc.com";
364
- var buildPath = function buildPath(_ref) {
365
- var uniqueGroups = _ref.uniqueGroups,
366
- licenseId = _ref.licenseId,
367
- groupId = _ref.groupId;
368
- return (uniqueGroups ? "/licence/g" + licenseId + "_" + groupId : '') + "/customer";
369
- };
370
- var buildRequestUrl = function buildRequestUrl(config, env) {
371
- var url = env === 'production' ? ACCOUNTS_URL : ACCOUNTS_URL.replace('accounts.', "accounts." + env + ".");
372
- var path = buildPath(config);
373
- return "" + url + path;
374
- };
375
-
376
- var POST_MESSAGE_ORIGIN = 'https://accounts.livechatinc.com';
377
- var CUSTOMER_AUTH_FOOTPRINT = '@livechat/customer-auth';
378
- var getPostMessageOrigin = function getPostMessageOrigin(env) {
379
- return env === 'production' ? POST_MESSAGE_ORIGIN : POST_MESSAGE_ORIGIN.replace('accounts.', "accounts." + env + ".");
380
- };
381
- var buildParams = function buildParams(_ref, redirectUri) {
382
- var clientId = _ref.clientId,
383
- licenseId = _ref.licenseId;
384
- return {
385
- license_id: String(licenseId),
386
- flow: 'button',
387
- response_type: 'token',
388
- client_id: clientId,
389
- redirect_uri: redirectUri,
390
- post_message_uri: redirectUri,
391
- state: CUSTOMER_AUTH_FOOTPRINT
511
+ organizationId: organizationId
392
512
  };
393
513
  };
394
- var buildIframe = function buildIframe(config, env) {
395
- var redirectUri = getOrigin(String(window.location)) + window.location.pathname;
396
- var params = buildParams(config, redirectUri);
397
- var iframe = document.createElement('iframe');
398
- iframe.style.display = 'none';
399
- iframe.setAttribute('src', buildRequestUrl(config, env) + "?" + buildQueryString(params));
400
- return iframe;
401
- };
402
- var isTokenResponse = function isTokenResponse(data) {
403
- return data && data.state === CUSTOMER_AUTH_FOOTPRINT;
404
- };
405
- function fetchUsingIframe(config, env) {
406
- var licenseId = config.licenseId;
407
- var postMessageOrigin = getPostMessageOrigin(env);
408
- return new Promise(function (resolve, reject) {
409
- var iframe = buildIframe(config, env);
410
- var cleanup = function cleanup() {
411
- removeNode(iframe);
412
- // eslint-disable-next-line no-use-before-define
413
- window.removeEventListener('message', listener, false);
414
- };
415
- var timeoutId = setTimeout(function () {
416
- cleanup();
417
- reject(createError({
418
- message: 'Request timed out.',
419
- code: 'REQUEST_TIMEOUT'
420
- }));
421
- }, 15 * 1000);
422
- var listener = function listener(_ref2) {
423
- var origin = _ref2.origin,
424
- data = _ref2.data;
425
- if (origin !== postMessageOrigin) {
426
- return;
427
- }
428
- if (!isTokenResponse(data)) {
429
- return;
430
- }
431
- clearTimeout(timeoutId);
432
- cleanup();
433
- try {
434
- resolve(parseTokenResponse(data, licenseId));
435
- } catch (err) {
436
- reject(err);
437
- }
438
- };
439
- window.addEventListener('message', listener, false);
440
- getRoot().then(function (body) {
441
- body.appendChild(iframe);
442
- });
443
- });
444
- }
445
514
 
446
515
  var fetchToken = function fetchToken(config, env) {
447
- if (config.uniqueGroups) {
448
- return fetchUsingIframe(config, env);
449
- }
450
- return unfetch(buildRequestUrl(config, env) + "/token", {
516
+ return unfetch("" + buildRequestUrl(config, env), {
451
517
  method: 'POST',
452
518
  credentials: 'include',
453
519
  body: JSON.stringify({
454
520
  response_type: 'token',
455
521
  grant_type: 'cookie',
456
522
  client_id: config.clientId,
457
- license_id: config.licenseId,
523
+ organization_id: config.organizationId,
458
524
  redirect_uri: getOrigin(String(window.location)) + window.location.pathname
459
525
  })
460
526
  }).then(function (res) {
461
527
  return res.json();
462
528
  }).then(function (token) {
463
- return parseTokenResponse(token, config.licenseId);
529
+ return parseTokenResponse(token, config.organizationId);
464
530
  });
465
531
  };
466
532
 
467
533
  var validateConfig = function validateConfig(_ref) {
468
- var licenseId = _ref.licenseId,
534
+ var organizationId = _ref.organizationId,
469
535
  clientId = _ref.clientId;
470
- if (typeof licenseId !== 'number' || typeof clientId !== 'string') {
471
- throw new Error('You need to pass valid configuration object: { licenseId, clientId }.');
536
+ if (typeof organizationId !== 'string' || typeof clientId !== 'string') {
537
+ throw new Error('You need to pass valid configuration object: { organizationId, clientId }.');
472
538
  }
473
539
  };
474
540
 
@@ -477,25 +543,39 @@
477
543
  expiresIn = _ref.expiresIn;
478
544
  return Date.now() >= creationDate + expiresIn;
479
545
  };
480
- var createAuth = function createAuth(config, env) {
546
+ var createAuth = function createAuth(config, licenseId, env) {
481
547
  validateConfig(config);
482
- var cacheKey = "" + "@@lc_auth_token:" + config.licenseId + (config.uniqueGroups ? ":" + config.groupId : '');
548
+ var tokenStoragePrefix = config.tokenStoragePrefix || "@@lc_auth_token:";
549
+ var oldCacheKey = "" + tokenStoragePrefix + licenseId + (config.uniqueGroups ? ":" + config.groupId : '');
550
+ var newCacheKey = "" + tokenStoragePrefix + config.organizationId + (config.uniqueGroups ? ":" + config.groupId : '');
483
551
  var pendingTokenRequest = null;
484
552
  var cachedToken = null;
485
- var retrievingToken = storage.getItem(cacheKey).then(function (token) {
553
+ var retrievingToken = storage.getItem(oldCacheKey).then(function (token) {
486
554
  if (retrievingToken === null) {
487
555
  return;
488
556
  }
489
557
  retrievingToken = null;
490
558
  if (!token) {
559
+ storage.removeItem(oldCacheKey).then(function () {
560
+ return storage.getItem(newCacheKey).then(function (newKeyToken) {
561
+ if (!newKeyToken) {
562
+ return;
563
+ }
564
+ cachedToken = JSON.parse(newKeyToken);
565
+ });
566
+ });
491
567
  return;
492
568
  }
493
- cachedToken = JSON.parse(token);
569
+ storage.setItem(newCacheKey, token).then(function () {
570
+ storage.removeItem(oldCacheKey).then(function () {
571
+ cachedToken = JSON.parse(token);
572
+ });
573
+ });
494
574
  });
495
575
  var getFreshToken = function getFreshToken() {
496
576
  pendingTokenRequest = fetchToken(config, env).then(function (token) {
497
577
  pendingTokenRequest = null;
498
- storage.setItem(cacheKey, JSON.stringify(token));
578
+ storage.setItem(newCacheKey, JSON.stringify(token));
499
579
  cachedToken = token;
500
580
  return token;
501
581
  }, function (err) {
@@ -525,7 +605,7 @@
525
605
  var invalidate = function invalidate() {
526
606
  cachedToken = null;
527
607
  retrievingToken = null;
528
- return storage.removeItem(cacheKey);
608
+ return storage.removeItem(newCacheKey);
529
609
  };
530
610
  return {
531
611
  getFreshToken: getFreshToken,
@@ -1094,13 +1174,62 @@
1094
1174
  return sideEffectsMiddleware;
1095
1175
  };
1096
1176
 
1097
- function deferred() {
1098
- var def = {};
1099
- def.promise = new Promise(function (resolve, reject) {
1100
- def.resolve = resolve;
1101
- def.reject = reject;
1177
+ var createBackoff = function createBackoff(_ref) {
1178
+ var _ref$min = _ref.min,
1179
+ min = _ref$min === void 0 ? 1000 : _ref$min,
1180
+ _ref$max = _ref.max,
1181
+ max = _ref$max === void 0 ? 5000 : _ref$max,
1182
+ _ref$jitter = _ref.jitter,
1183
+ jitter = _ref$jitter === void 0 ? 0.5 : _ref$jitter;
1184
+ var attempts = 0;
1185
+ return {
1186
+ duration: function duration() {
1187
+ var ms = min * Math.pow(2, attempts++);
1188
+ if (jitter) {
1189
+ var rand = Math.random();
1190
+ var deviation = Math.floor(rand * jitter * ms);
1191
+ ms = (Math.floor(rand * 10) & 1) === 0 ? ms - deviation : ms + deviation;
1192
+ }
1193
+ return Math.min(ms, max) | 0;
1194
+ },
1195
+ reset: function reset() {
1196
+ attempts = 0;
1197
+ }
1198
+ };
1199
+ };
1200
+
1201
+ /**
1202
+ * promiseTry allows us to move success / error handling to be promise based so we will handle both synchronous and asynchronous execution failures and success properly.
1203
+ * @param anyFunction - function to be called
1204
+ * @returns promise that resolves to the return value of the function
1205
+ * @example
1206
+ * const promise = promiseTry(() => 1)
1207
+ * promise.then(value => console.log(value)) // 1
1208
+ */
1209
+
1210
+ function promiseTry(anyFunction) {
1211
+ return new Promise(function (resolve) {
1212
+ resolve(anyFunction());
1213
+ });
1214
+ }
1215
+
1216
+ /**
1217
+ * Creates a deferred object that can be resolved or rejected later.
1218
+ * @returns A deferred object with a promise and resolve and reject functions.
1219
+ * @example
1220
+ * const def = promiseDeferred()
1221
+ * const promise = def.promise
1222
+ * def.resolve(1)
1223
+ * return promise.then(res => console.log(res)) // 1
1224
+ */
1225
+
1226
+ function promiseDeferred() {
1227
+ var deferred = {};
1228
+ deferred.promise = new Promise(function (resolve, reject) {
1229
+ deferred.resolve = resolve;
1230
+ deferred.reject = reject;
1102
1231
  });
1103
- return def;
1232
+ return deferred;
1104
1233
  }
1105
1234
 
1106
1235
  var createReducer = function createReducer(initialState, reducersMap) {
@@ -1121,9 +1250,26 @@
1121
1250
  var PAUSED = 'paused';
1122
1251
  var RECONNECTING = 'reconnecting';
1123
1252
 
1253
+ var connectionStatuses = /*#__PURE__*/Object.freeze({
1254
+ __proto__: null,
1255
+ CONNECTED: CONNECTED,
1256
+ DESTROYED: DESTROYED,
1257
+ DISCONNECTED: DISCONNECTED,
1258
+ PAUSED: PAUSED,
1259
+ RECONNECTING: RECONNECTING
1260
+ });
1261
+
1124
1262
  var AGENT = 'agent';
1125
1263
  var CUSTOMER = 'customer';
1126
1264
 
1265
+ var userTypes = /*#__PURE__*/Object.freeze({
1266
+ __proto__: null,
1267
+ AGENT: AGENT,
1268
+ CUSTOMER: CUSTOMER
1269
+ });
1270
+
1271
+ var LIVECHAT_ORGANIZATION_ID = 'feaf6c0e-9f43-48ff-9ad0-8e24e0350932';
1272
+
1127
1273
  var getAllRequests = function getAllRequests(state) {
1128
1274
  return state.requests;
1129
1275
  };
@@ -1147,9 +1293,9 @@
1147
1293
  return getConnectionStatus(state) === DESTROYED;
1148
1294
  };
1149
1295
  var getEnvPart = function getEnvPart(_ref) {
1150
- var licenseId = _ref.licenseId,
1296
+ var organizationId = _ref.organizationId,
1151
1297
  env = _ref.env;
1152
- if (licenseId === 1520) {
1298
+ if (organizationId === LIVECHAT_ORGANIZATION_ID) {
1153
1299
  return '.staging';
1154
1300
  }
1155
1301
  if (env === 'production') {
@@ -1163,12 +1309,12 @@
1163
1309
  return "https://api" + regionPart + getEnvPart(state) + ".livechatinc.com";
1164
1310
  };
1165
1311
  var getServerUrl = function getServerUrl(state) {
1166
- return getApiOrigin(state) + "/v3.3/customer";
1312
+ return getApiOrigin(state) + "/v3.5/customer";
1167
1313
  };
1168
1314
  var createInitialState = function createInitialState(initialStateData) {
1169
1315
  var _initialStateData$app = initialStateData.application,
1170
1316
  application = _initialStateData$app === void 0 ? {} : _initialStateData$app,
1171
- licenseId = initialStateData.licenseId,
1317
+ organizationId = initialStateData.organizationId,
1172
1318
  _initialStateData$gro = initialStateData.groupId,
1173
1319
  groupId = _initialStateData$gro === void 0 ? null : _initialStateData$gro,
1174
1320
  env = initialStateData.env,
@@ -1185,9 +1331,9 @@
1185
1331
  return {
1186
1332
  application: _extends({}, application, {
1187
1333
  name: "customer_sdk",
1188
- version: "3.1.5"
1334
+ version: "4.0.1"
1189
1335
  }),
1190
- licenseId: licenseId,
1336
+ organizationId: organizationId,
1191
1337
  env: env,
1192
1338
  groupId: groupId,
1193
1339
  chats: {},
@@ -1305,9 +1451,12 @@
1305
1451
  }
1306
1452
 
1307
1453
  var ACCESS_TOKEN_EXPIRED = 'access_token_expired';
1454
+ var CONNECTION_TIMEOUT = 'connection_timeout';
1308
1455
  var CUSTOMER_BANNED = 'customer_banned';
1309
1456
  // customer tried reconnecting too many times after they received too_many_connections error
1310
1457
  var CUSTOMER_TEMPORARILY_BLOCKED = 'customer_temporarily_blocked';
1458
+ var INACTIVITY_TIMEOUT = 'inactivity_timeout';
1459
+ var INTERNAL_ERROR = 'internal_error';
1311
1460
  var LICENSE_EXPIRED = 'license_expired';
1312
1461
  var LICENSE_NOT_FOUND = 'license_not_found';
1313
1462
  var MISDIRECTED_CONNECTION$1 = 'misdirected_connection';
@@ -1321,6 +1470,27 @@
1321
1470
  // the limit of unauthorized connections is per IP
1322
1471
  var TOO_MANY_UNAUTHORIZED_CONNECTIONS = 'too_many_unauthorized_connections';
1323
1472
  var UNSUPPORTED_VERSION = 'unsupported_version';
1473
+ // introduced in 3.5 meaning the customer was logged out by the server
1474
+ var LOGGED_OUT_REMOTELY = 'logged_out_remotely';
1475
+
1476
+ var serverDisconnectionReasons = /*#__PURE__*/Object.freeze({
1477
+ __proto__: null,
1478
+ ACCESS_TOKEN_EXPIRED: ACCESS_TOKEN_EXPIRED,
1479
+ CONNECTION_TIMEOUT: CONNECTION_TIMEOUT,
1480
+ CUSTOMER_BANNED: CUSTOMER_BANNED,
1481
+ CUSTOMER_TEMPORARILY_BLOCKED: CUSTOMER_TEMPORARILY_BLOCKED,
1482
+ INACTIVITY_TIMEOUT: INACTIVITY_TIMEOUT,
1483
+ INTERNAL_ERROR: INTERNAL_ERROR,
1484
+ LICENSE_EXPIRED: LICENSE_EXPIRED,
1485
+ LICENSE_NOT_FOUND: LICENSE_NOT_FOUND,
1486
+ MISDIRECTED_CONNECTION: MISDIRECTED_CONNECTION$1,
1487
+ PRODUCT_VERSION_CHANGED: PRODUCT_VERSION_CHANGED,
1488
+ SERVICE_TEMPORARILY_UNAVAILABLE: SERVICE_TEMPORARILY_UNAVAILABLE$1,
1489
+ TOO_MANY_CONNECTIONS: TOO_MANY_CONNECTIONS,
1490
+ TOO_MANY_UNAUTHORIZED_CONNECTIONS: TOO_MANY_UNAUTHORIZED_CONNECTIONS,
1491
+ UNSUPPORTED_VERSION: UNSUPPORTED_VERSION,
1492
+ LOGGED_OUT_REMOTELY: LOGGED_OUT_REMOTELY
1493
+ });
1324
1494
 
1325
1495
  var CHAT_DEACTIVATED = 'chat_deactivated';
1326
1496
  var CHAT_PROPERTIES_DELETED = 'chat_properties_deleted';
@@ -1336,6 +1506,7 @@
1336
1506
  var EVENTS_MARKED_AS_SEEN = 'events_marked_as_seen';
1337
1507
  var GREETING_ACCEPTED = 'greeting_accepted';
1338
1508
  var GREETING_CANCELED = 'greeting_canceled';
1509
+ var GROUPS_STATUS_UPDATED = 'groups_status_updated';
1339
1510
  var INCOMING_CHAT = 'incoming_chat';
1340
1511
  var INCOMING_EVENT = 'incoming_event';
1341
1512
  var INCOMING_GREETING = 'incoming_greeting';
@@ -1364,6 +1535,7 @@
1364
1535
  EVENTS_MARKED_AS_SEEN: EVENTS_MARKED_AS_SEEN,
1365
1536
  GREETING_ACCEPTED: GREETING_ACCEPTED,
1366
1537
  GREETING_CANCELED: GREETING_CANCELED,
1538
+ GROUPS_STATUS_UPDATED: GROUPS_STATUS_UPDATED,
1367
1539
  INCOMING_CHAT: INCOMING_CHAT,
1368
1540
  INCOMING_EVENT: INCOMING_EVENT,
1369
1541
  INCOMING_GREETING: INCOMING_GREETING,
@@ -1385,6 +1557,17 @@
1385
1557
  var SYSTEM_MESSAGE = 'system_message';
1386
1558
  var CUSTOM = 'custom';
1387
1559
 
1560
+ var eventTypes = /*#__PURE__*/Object.freeze({
1561
+ __proto__: null,
1562
+ FILE: FILE,
1563
+ FORM: FORM,
1564
+ FILLED_FORM: FILLED_FORM,
1565
+ MESSAGE: MESSAGE,
1566
+ RICH_MESSAGE: RICH_MESSAGE,
1567
+ SYSTEM_MESSAGE: SYSTEM_MESSAGE,
1568
+ CUSTOM: CUSTOM
1569
+ });
1570
+
1388
1571
  var createEventBase = function createEventBase(event) {
1389
1572
  var base = {};
1390
1573
  if (typeof event.customId === 'string') {
@@ -1641,10 +1824,10 @@
1641
1824
  // TODO: this thing is not really well typed and should be improved
1642
1825
  var sendRequestAction = function sendRequestAction(store, action) {
1643
1826
  action.payload.id = generateUniqueId(store.getState().requests);
1644
- var _deferred = deferred(),
1645
- resolve = _deferred.resolve,
1646
- reject = _deferred.reject,
1647
- promise = _deferred.promise;
1827
+ var _promiseDeferred = promiseDeferred(),
1828
+ resolve = _promiseDeferred.resolve,
1829
+ reject = _promiseDeferred.reject,
1830
+ promise = _promiseDeferred.promise;
1648
1831
  action.payload.promise = promise;
1649
1832
  action.payload.resolve = resolve;
1650
1833
  action.payload.reject = reject;
@@ -1652,59 +1835,89 @@
1652
1835
  return promise;
1653
1836
  };
1654
1837
 
1655
- var promiseTry = (function (fn) {
1656
- return new Promise(function (resolve) {
1657
- resolve(fn());
1658
- });
1659
- });
1660
-
1661
- var createBackoff = function createBackoff(_ref) {
1662
- var _ref$min = _ref.min,
1663
- min = _ref$min === void 0 ? 1000 : _ref$min,
1664
- _ref$max = _ref.max,
1665
- max = _ref$max === void 0 ? 5000 : _ref$max,
1666
- _ref$jitter = _ref.jitter,
1667
- jitter = _ref$jitter === void 0 ? 0.5 : _ref$jitter;
1668
- var attempts = 0;
1669
- return {
1670
- duration: function duration() {
1671
- var ms = min * Math.pow(2, attempts++);
1672
- if (jitter) {
1673
- var rand = Math.random();
1674
- var deviation = Math.floor(rand * jitter * ms);
1675
- ms = (Math.floor(rand * 10) & 1) === 0 ? ms - deviation : ms + deviation;
1676
- }
1677
- return Math.min(ms, max) | 0;
1678
- },
1679
- reset: function reset() {
1680
- attempts = 0;
1681
- }
1682
- };
1683
- };
1684
-
1685
1838
  var AUTHENTICATION = 'AUTHENTICATION';
1839
+ var AUTHORIZATION = 'AUTHORIZATION';
1840
+ var CHAT_ALREADY_ACTIVE = 'CHAT_ALREADY_ACTIVE';
1841
+ var CHAT_LIMIT_REACHED = 'CHAT_LIMIT_REACHED';
1686
1842
  var CUSTOMER_BANNED$1 = 'CUSTOMER_BANNED';
1843
+ var CUSTOMER_SESSION_FIELDS_LIMIT_REACHED = 'CUSTOMER_SESSION_FIELDS_LIMIT_REACHED';
1844
+ var ENTITY_TOO_LARGE = 'ENTITY_TOO_LARGE';
1845
+ var GREETING_NOT_FOUND = 'GREETING_NOT_FOUND';
1846
+ var GROUP_OFFLINE = 'GROUP_OFFLINE';
1847
+ var GROUPS_OFFLINE = 'GROUPS_OFFLINE';
1848
+ var GROUP_NOT_FOUND = 'GROUP_NOT_FOUND';
1849
+ var GROUP_UNAVAILABLE = 'GROUP_UNAVAILABLE';
1850
+ var INTERNAL = 'INTERNAL';
1851
+ var LICENSE_EXPIRED$1 = 'LICENSE_EXPIRED';
1852
+ // actually this can happen only when using REST
1853
+ var MISDIRECTED_REQUEST = 'MISDIRECTED_REQUEST';
1854
+ var PENDING_REQUESTS_LIMIT_REACHED = 'PENDING_REQUESTS_LIMIT_REACHED';
1855
+ var REQUEST_TIMEOUT$1 = 'REQUEST_TIMEOUT';
1856
+ var SERVICE_UNAVAILABLE = 'SERVICE_UNAVAILABLE';
1857
+ var UNSUPPORTED_VERSION$1 = 'UNSUPPORTED_VERSION';
1687
1858
  var USERS_LIMIT_REACHED = 'USERS_LIMIT_REACHED';
1859
+ var VALIDATION = 'VALIDATION';
1688
1860
  var WRONG_PRODUCT_VERSION = 'WRONG_PRODUCT_VERSION';
1689
1861
 
1690
- var getSideStorageKey = function getSideStorageKey(store) {
1862
+ var serverErrorCodes = /*#__PURE__*/Object.freeze({
1863
+ __proto__: null,
1864
+ AUTHENTICATION: AUTHENTICATION,
1865
+ AUTHORIZATION: AUTHORIZATION,
1866
+ CHAT_ALREADY_ACTIVE: CHAT_ALREADY_ACTIVE,
1867
+ CHAT_LIMIT_REACHED: CHAT_LIMIT_REACHED,
1868
+ CUSTOMER_BANNED: CUSTOMER_BANNED$1,
1869
+ CUSTOMER_SESSION_FIELDS_LIMIT_REACHED: CUSTOMER_SESSION_FIELDS_LIMIT_REACHED,
1870
+ ENTITY_TOO_LARGE: ENTITY_TOO_LARGE,
1871
+ GREETING_NOT_FOUND: GREETING_NOT_FOUND,
1872
+ GROUP_OFFLINE: GROUP_OFFLINE,
1873
+ GROUPS_OFFLINE: GROUPS_OFFLINE,
1874
+ GROUP_NOT_FOUND: GROUP_NOT_FOUND,
1875
+ GROUP_UNAVAILABLE: GROUP_UNAVAILABLE,
1876
+ INTERNAL: INTERNAL,
1877
+ LICENSE_EXPIRED: LICENSE_EXPIRED$1,
1878
+ MISDIRECTED_REQUEST: MISDIRECTED_REQUEST,
1879
+ PENDING_REQUESTS_LIMIT_REACHED: PENDING_REQUESTS_LIMIT_REACHED,
1880
+ REQUEST_TIMEOUT: REQUEST_TIMEOUT$1,
1881
+ SERVICE_UNAVAILABLE: SERVICE_UNAVAILABLE,
1882
+ UNSUPPORTED_VERSION: UNSUPPORTED_VERSION$1,
1883
+ USERS_LIMIT_REACHED: USERS_LIMIT_REACHED,
1884
+ VALIDATION: VALIDATION,
1885
+ WRONG_PRODUCT_VERSION: WRONG_PRODUCT_VERSION
1886
+ });
1887
+
1888
+ var getSideStorageKeyByLicense = function getSideStorageKeyByLicense(store, licenseId) {
1691
1889
  var _store$getState = store.getState(),
1692
- licenseId = _store$getState.licenseId,
1693
1890
  groupId = _store$getState.groupId,
1694
1891
  uniqueGroups = _store$getState.uniqueGroups;
1695
1892
  return "side_storage_" + licenseId + (uniqueGroups ? ":" + groupId : '');
1696
1893
  };
1697
- var getSideStorage = function getSideStorage(store) {
1698
- return storage.getItem(getSideStorageKey(store))["catch"](noop).then(function (sideStorage) {
1699
- return JSON.parse(sideStorage || '{}');
1894
+ var getSideStorageKeyByOrganization = function getSideStorageKeyByOrganization(store) {
1895
+ var _store$getState2 = store.getState(),
1896
+ organizationId = _store$getState2.organizationId,
1897
+ groupId = _store$getState2.groupId,
1898
+ uniqueGroups = _store$getState2.uniqueGroups;
1899
+ return "side_storage_" + organizationId + (uniqueGroups ? ":" + groupId : '');
1900
+ };
1901
+ var getSideStorage = function getSideStorage(store, licenseId) {
1902
+ var sideStorageLicenseKey = getSideStorageKeyByLicense(store, licenseId);
1903
+ var sideStorageOrganizationKey = getSideStorageKeyByOrganization(store);
1904
+ return storage.getItem(sideStorageLicenseKey)["catch"](noop).then(function (sideStorage) {
1905
+ if (!sideStorage) {
1906
+ return storage.getItem(sideStorageOrganizationKey)["catch"](noop).then(function (organizationSideStorage) {
1907
+ return JSON.parse(organizationSideStorage || '{}');
1908
+ })["catch"](noop);
1909
+ }
1910
+ return storage.setItem(sideStorageOrganizationKey, sideStorage)["catch"](noop).then(function () {
1911
+ return storage.removeItem(sideStorageLicenseKey)["catch"](noop).then(function () {
1912
+ return JSON.parse(sideStorage);
1913
+ })["catch"](noop);
1914
+ });
1700
1915
  })
1701
1916
  // shouldnt get triggered, just a defensive measure against malformed storage entries
1702
- ["catch"](function () {
1703
- return {};
1704
- });
1917
+ ["catch"](noop);
1705
1918
  };
1706
1919
  var saveSideStorage = function saveSideStorage(store, sideStorage) {
1707
- return storage.setItem(getSideStorageKey(store), JSON.stringify(sideStorage))["catch"](noop);
1920
+ storage.setItem(getSideStorageKeyByOrganization(store), JSON.stringify(sideStorage))["catch"](noop);
1708
1921
  };
1709
1922
 
1710
1923
  var taskChain = function taskChain(_ref, onSuccess, onError) {
@@ -1745,7 +1958,7 @@
1745
1958
  setTimeout(resolve, ms);
1746
1959
  });
1747
1960
  };
1748
- function createLoginTask(auth, customerDataProvider) {
1961
+ function createLoginTask(auth, customerDataProvider, licenseId) {
1749
1962
  var store;
1750
1963
  var sentPage = null;
1751
1964
  var task;
@@ -1766,7 +1979,7 @@
1766
1979
  return store.dispatch(reconnect(currentBackoffStrategy.duration()));
1767
1980
  };
1768
1981
  var getTokenAndSideStorage = function getTokenAndSideStorage() {
1769
- return Promise.all([auth.getToken(), getSideStorage(store)]);
1982
+ return Promise.all([auth.getToken(), getSideStorage(store, licenseId)]);
1770
1983
  };
1771
1984
  var dispatchSelfId = function dispatchSelfId(_ref2) {
1772
1985
  var token = _ref2[0],
@@ -1906,7 +2119,7 @@
1906
2119
  return;
1907
2120
  }
1908
2121
  var query = buildQueryString({
1909
- license_id: state.licenseId
2122
+ organization_id: state.organizationId
1910
2123
  });
1911
2124
  var payload = {
1912
2125
  session_fields: parseCustomerSessionFields(sessionFields || {}),
@@ -2405,11 +2618,11 @@
2405
2618
  {
2406
2619
  var upgradedPushes = [];
2407
2620
  socket.emit(_extends({}, frame, {
2408
- version: '3.3',
2621
+ version: '3.5',
2409
2622
  payload: _extends({}, frame.payload, {
2410
2623
  pushes: {
2411
- // '3.4': upgradedPushes,
2412
- '3.3': values(serverPushActions).filter(function (pushAction) {
2624
+ // '3.6': upgradedPushes,
2625
+ '3.5': values(serverPushActions).filter(function (pushAction) {
2413
2626
  return (
2414
2627
  // `customer_disconnected` can be sent immediately after opening the connection, before it even received login request
2415
2628
  // therefore it's not possible to subscribe for a particular version of this push - the "connection version" is always used
@@ -2441,25 +2654,10 @@
2441
2654
  emit('user_data', user);
2442
2655
  });
2443
2656
  };
2444
- var handleMulticast = function handleMulticast(emit, _ref4) {
2445
- var type = _ref4.type,
2446
- content = _ref4.content;
2447
- if (type !== 'lc2') {
2448
- return;
2449
- }
2450
- if (content.name === 'groups_update' && 'groups' in content && !isEmpty(content.groups)) {
2451
- var _content$groups = content.groups,
2452
- group = _content$groups[0];
2453
- var availability = parseGroupStatus(group.status);
2454
- emit('availability_updated', {
2455
- availability: availability
2456
- });
2457
- }
2458
- };
2459
- var handlePush = function handlePush(_ref5, _ref6) {
2460
- var emit = _ref5.emit,
2461
- store = _ref5.store;
2462
- var payload = _ref6.payload;
2657
+ var handlePush = function handlePush(_ref4, _ref5) {
2658
+ var emit = _ref4.emit,
2659
+ store = _ref4.store;
2660
+ var payload = _ref5.payload;
2463
2661
  switch (payload.action) {
2464
2662
  case THREAD_PROPERTIES_UPDATED:
2465
2663
  if (payload.payload.properties.lc2 && 'queue_pos' in payload.payload.properties.lc2) {
@@ -2499,6 +2697,7 @@
2499
2697
  case PRODUCT_VERSION_CHANGED:
2500
2698
  case TOO_MANY_CONNECTIONS:
2501
2699
  case UNSUPPORTED_VERSION:
2700
+ case LOGGED_OUT_REMOTELY:
2502
2701
  // this also emits `disconnected` event - but it's handled in response to this action by destroy handler
2503
2702
  store.dispatch(destroy(payload.payload.reason));
2504
2703
  break;
@@ -2521,6 +2720,16 @@
2521
2720
  break;
2522
2721
  }
2523
2722
  return;
2723
+ case GROUPS_STATUS_UPDATED:
2724
+ {
2725
+ var _payload$payload$grou = payload.payload.groups,
2726
+ group = _payload$payload$grou[0];
2727
+ var availability = parseGroupStatus(group.status);
2728
+ emit('availability_updated', {
2729
+ availability: availability
2730
+ });
2731
+ return;
2732
+ }
2524
2733
  case INCOMING_CHAT:
2525
2734
  emitUsers(emit, payload.payload.chat.users);
2526
2735
  emit(payload.action, payload.payload);
@@ -2534,11 +2743,6 @@
2534
2743
  case INCOMING_TYPING_INDICATOR:
2535
2744
  emit(payload.action, payload.payload);
2536
2745
  return;
2537
- case INCOMING_MULTICAST:
2538
- handleMulticast(emit, payload.payload);
2539
- // we passthrough this action even if it was already handled above
2540
- emit(payload.action, payload.payload);
2541
- return;
2542
2746
  case USER_ADDED_TO_CHAT:
2543
2747
  emitUsers(emit, [payload.payload.user]);
2544
2748
  emit(payload.action, payload.payload);
@@ -2548,9 +2752,9 @@
2548
2752
  return;
2549
2753
  }
2550
2754
  };
2551
- var handleResponse = function handleResponse(_ref7, _ref8) {
2552
- var emit = _ref7.emit;
2553
- var payload = _ref8.payload;
2755
+ var handleResponse = function handleResponse(_ref6, _ref7) {
2756
+ var emit = _ref6.emit;
2757
+ var payload = _ref7.payload;
2554
2758
  switch (payload.action) {
2555
2759
  case CHAT_DEACTIVATED:
2556
2760
  payload.resolve(SUCCESS);
@@ -2575,13 +2779,14 @@
2575
2779
  return;
2576
2780
  }
2577
2781
  };
2578
- var createSideEffectsHandler = (function (_ref9) {
2579
- var auth = _ref9.auth,
2580
- customerDataProvider = _ref9.customerDataProvider,
2581
- emitter = _ref9.emitter,
2582
- socket = _ref9.socket;
2782
+ var createSideEffectsHandler = (function (_ref8) {
2783
+ var auth = _ref8.auth,
2784
+ customerDataProvider = _ref8.customerDataProvider,
2785
+ emitter = _ref8.emitter,
2786
+ socket = _ref8.socket,
2787
+ licenseId = _ref8.licenseId;
2583
2788
  var emit = emitter.emit;
2584
- var loginTask = createLoginTask(auth, customerDataProvider);
2789
+ var loginTask = createLoginTask(auth, customerDataProvider, licenseId);
2585
2790
 
2586
2791
  // TODO: using Store type here is a lie, middleware only provides MiddlewareAPI here
2587
2792
  return function (action, store) {
@@ -2604,6 +2809,7 @@
2604
2809
  case CUSTOMER_BANNED:
2605
2810
  case LICENSE_EXPIRED:
2606
2811
  case PRODUCT_VERSION_CHANGED:
2812
+ case LOGGED_OUT_REMOTELY:
2607
2813
  // normalize those to CONNECTION_LOST as the handling on the consumer's side should be the same
2608
2814
  failAllRequests(store, CONNECTION_LOST);
2609
2815
  emit('disconnected', payload);
@@ -2674,9 +2880,9 @@
2674
2880
  if (!hasToken) {
2675
2881
  return auth.getToken();
2676
2882
  }
2677
- return auth.getToken().then(function (_ref10) {
2678
- var creationDate = _ref10.creationDate,
2679
- expiresIn = _ref10.expiresIn;
2883
+ return auth.getToken().then(function (_ref9) {
2884
+ var creationDate = _ref9.creationDate,
2885
+ expiresIn = _ref9.expiresIn;
2680
2886
  var ONE_HOUR = 60 * 60 * 1000;
2681
2887
  // check if the token is worth reusing
2682
2888
  // we don't want to get disconnected in a moment because of expired token
@@ -2993,14 +3199,14 @@
2993
3199
  resolve = noop;
2994
3200
  },
2995
3201
  check: function check() {
2996
- var deferred$1 = deferred();
2997
- resolve = deferred$1.resolve;
3202
+ var deferred = promiseDeferred();
3203
+ resolve = deferred.resolve;
2998
3204
  timer = setTimeout(function () {
2999
3205
  var err = new Error('Timeout.');
3000
3206
  err.code = 'TIMEOUT';
3001
- deferred$1.reject(err);
3207
+ deferred.reject(err);
3002
3208
  }, 2000);
3003
- return deferred$1.promise;
3209
+ return deferred.promise;
3004
3210
  },
3005
3211
  resolve: function (_resolve) {
3006
3212
  function resolve() {
@@ -3102,7 +3308,7 @@
3102
3308
  var url = (getServerUrl(state) + "/rtm/ws").replace(/^https/, 'wss');
3103
3309
  return createPlatformClient(url, {
3104
3310
  query: {
3105
- license_id: state.licenseId
3311
+ organization_id: state.organizationId
3106
3312
  },
3107
3313
  emitter: emitter
3108
3314
  });
@@ -3394,16 +3600,17 @@
3394
3600
  var lastEventSummary = last(lastEventSummariesArray.sort(function (eventSummaryA, eventSummaryB) {
3395
3601
  return eventSummaryA.thread_id === eventSummaryB.thread_id ? stringCompare(eventSummaryA.event.created_at, eventSummaryB.event.created_at) : stringCompare(eventSummaryA.thread_created_at, eventSummaryB.thread_created_at);
3396
3602
  }));
3397
- if (lastEventSummary) {
3603
+ if (lastEventSummary && chatSummary.lastEventsPerType) {
3398
3604
  chatSummary.lastEvent = chatSummary.lastEventsPerType[lastEventSummary.event.type];
3399
3605
  }
3400
3606
  return chatSummary;
3401
3607
  });
3402
3608
  return {
3403
3609
  chatsSummary: numericSortBy(function (_ref4) {
3610
+ var _ref5;
3404
3611
  var lastEvent = _ref4.lastEvent,
3405
3612
  order = _ref4.order;
3406
- return -1 * (lastEvent !== undefined ? lastEvent.timestamp : order);
3613
+ return -1 * ((_ref5 = lastEvent !== undefined ? lastEvent.timestamp : order) != null ? _ref5 : 0);
3407
3614
  }, chatsSummary),
3408
3615
  totalChats: payload.total_chats,
3409
3616
  users: uniqBy(function (user) {
@@ -3523,6 +3730,11 @@
3523
3730
  // 'greeting_canceled' has the same payload as `greeting_accepted`
3524
3731
  payload: parseGreetingAcceptedPush(push.payload)
3525
3732
  };
3733
+ case GROUPS_STATUS_UPDATED:
3734
+ return {
3735
+ action: push.action,
3736
+ payload: push.payload
3737
+ };
3526
3738
  case INCOMING_CHAT:
3527
3739
  return {
3528
3740
  action: push.action,
@@ -3580,9 +3792,9 @@
3580
3792
  };
3581
3793
  }
3582
3794
  };
3583
- var parseResponse = function parseResponse(_ref5) {
3584
- var request = _ref5.request,
3585
- response = _ref5.response;
3795
+ var parseResponse = function parseResponse(_ref6) {
3796
+ var request = _ref6.request,
3797
+ response = _ref6.response;
3586
3798
  switch (response.action) {
3587
3799
  case ACCEPT_GREETING:
3588
3800
  return {
@@ -3827,150 +4039,6 @@
3827
4039
  return socket.off;
3828
4040
  });
3829
4041
 
3830
- var INCORRECT_REQUESTER_STRUCTURE = 'incorrect requester structure';
3831
- var appendString = function appendString(input, str) {
3832
- return input.length ? input + "\n" + str : str;
3833
- };
3834
- var createTicketBody = function createTicketBody(state, _ref) {
3835
- var fields = _ref.fields,
3836
- customerId = _ref.customerId,
3837
- _ref$groupId = _ref.groupId,
3838
- groupId = _ref$groupId === void 0 ? state.groupId : _ref$groupId,
3839
- timeZone = _ref.timeZone;
3840
- var ticketBody = _extends({
3841
- licence_id: state.licenseId,
3842
- ticket_message: '',
3843
- offline_message: '',
3844
- visitor_id: customerId,
3845
- requester: {}
3846
- }, typeof groupId === 'number' && {
3847
- group: groupId
3848
- }, state.page && {
3849
- source: {
3850
- url: state.page.url
3851
- }
3852
- }, timeZone && {
3853
- timezone: timeZone
3854
- });
3855
- return fields.reduce(function (body, field) {
3856
- switch (field.type) {
3857
- case 'subject':
3858
- {
3859
- var value = field.answer;
3860
- var text = value ? field.label + " " + value : field.label;
3861
- if (value) {
3862
- body.subject = value;
3863
- }
3864
- body.offline_message = appendString(body.offline_message, text);
3865
- return body;
3866
- }
3867
- case 'name':
3868
- {
3869
- var _value = field.answer;
3870
- var _text = _value ? field.label + " " + _value : field.label;
3871
- if (_value) {
3872
- body.requester.name = _value;
3873
- }
3874
- body.offline_message = appendString(body.offline_message, _text);
3875
- return body;
3876
- }
3877
- case 'email':
3878
- {
3879
- var _value2 = field.answer;
3880
- var _text2 = _value2 ? field.label + " " + _value2 : field.label;
3881
- body.requester.mail = _value2;
3882
- body.offline_message = appendString(body.offline_message, _text2);
3883
- return body;
3884
- }
3885
- case 'question':
3886
- case 'textarea':
3887
- {
3888
- var _value3 = field.answer;
3889
- var _text3 = _value3 ? field.label + " " + _value3 : field.label;
3890
- body.offline_message = appendString(body.offline_message, _text3);
3891
- body.ticket_message = appendString(body.ticket_message, _text3);
3892
- return body;
3893
- }
3894
- case 'radio':
3895
- case 'select':
3896
- {
3897
- var _value4 = field.answer && field.answer.label;
3898
- var _text4 = _value4 ? field.label + " " + _value4 : field.label;
3899
- body.offline_message = appendString(body.offline_message, _text4);
3900
- body.ticket_message = appendString(body.ticket_message, _text4);
3901
- return body;
3902
- }
3903
- case 'checkbox':
3904
- {
3905
- var _value5 = field.answers && field.answers.map(function (answer) {
3906
- return answer.label;
3907
- }).join(', ');
3908
- var _text5 = _value5 ? field.label + " " + _value5 : field.label;
3909
- body.offline_message = appendString(body.offline_message, _text5);
3910
- body.ticket_message = appendString(body.ticket_message, _text5);
3911
- return body;
3912
- }
3913
- default:
3914
- return body;
3915
- }
3916
- }, ticketBody);
3917
- };
3918
- var sendTicketForm = function sendTicketForm(store, auth, _ref2) {
3919
- var filledForm = _ref2.filledForm,
3920
- groupId = _ref2.groupId,
3921
- timeZone = _ref2.timeZone;
3922
- return auth.getToken().then(function (token) {
3923
- var state = store.getState();
3924
- if (getSelfId(state) === null) {
3925
- store.dispatch(setSelfId(token.entityId));
3926
- }
3927
- var url = getApiOrigin(state) + "/v2/tickets/new";
3928
- var body = createTicketBody(state, {
3929
- fields: filledForm.fields,
3930
- customerId: token.entityId,
3931
- groupId: groupId,
3932
- timeZone: timeZone
3933
- });
3934
- return unfetch(url, {
3935
- method: 'POST',
3936
- headers: {
3937
- 'Content-Type': 'application/json'
3938
- },
3939
- body: JSON.stringify(body)
3940
- }).then(function (response) {
3941
- if (response.ok) {
3942
- return response.json().then(function (res) {
3943
- return _extends({}, res, {
3944
- text: body.ticket_message
3945
- });
3946
- });
3947
- }
3948
-
3949
- // we actually should normalize this somehow
3950
- if (response.status === 400 || response.status === 422) {
3951
- var errHandler = function errHandler(error) {
3952
- if (!error || !error.errors) {
3953
- // TODO: I honestly don't know if this can even be reached and even if it is - What error should be thrown here
3954
- throw new Error();
3955
- }
3956
- // we receive some hardcore aggregate error here 😱
3957
- var firstError = error.errors[0];
3958
- var type = Object.keys(firstError)[0];
3959
- if (type === INCORRECT_REQUESTER_STRUCTURE) {
3960
- throw createError$1({
3961
- message: firstError[INCORRECT_REQUESTER_STRUCTURE][0],
3962
- code: 'VALIDATION'
3963
- });
3964
- }
3965
- throw new Error();
3966
- };
3967
- return response.json().then(errHandler, errHandler);
3968
- }
3969
- throw new Error();
3970
- });
3971
- });
3972
- };
3973
-
3974
4042
  var toFormData = function toFormData(object) {
3975
4043
  var formData = new FormData();
3976
4044
  Object.keys(object).forEach(function (key) {
@@ -4080,7 +4148,7 @@
4080
4148
  validateFile(file);
4081
4149
  var state = store.getState();
4082
4150
  var query = buildQueryString({
4083
- license_id: state.licenseId
4151
+ organization_id: state.organizationId
4084
4152
  });
4085
4153
  var url = getServerUrl(state) + "/action/" + UPLOAD_FILE + "?" + query;
4086
4154
  var payload = {
@@ -4146,7 +4214,7 @@
4146
4214
  */
4147
4215
  var log = function log(_ref) {
4148
4216
  var env = _ref.env,
4149
- licenseId = _ref.licenseId,
4217
+ organizationId = _ref.organizationId,
4150
4218
  eventName = _ref.eventName;
4151
4219
  if (env !== 'production' || "customer_sdk" !== 'customer_sdk') {
4152
4220
  return Promise.resolve();
@@ -4154,10 +4222,10 @@
4154
4222
  var message = {
4155
4223
  event_name: eventName,
4156
4224
  severity: 'Informational',
4157
- sdkVersion: "3.1.5"
4225
+ sdkVersion: "4.0.1"
4158
4226
  };
4159
4227
  var body = {
4160
- licence_id: licenseId,
4228
+ organizationId: organizationId,
4161
4229
  event_id: 'chat_widget_customer_sdk',
4162
4230
  message: JSON.stringify(message)
4163
4231
  };
@@ -4271,8 +4339,17 @@
4271
4339
  }));
4272
4340
  });
4273
4341
 
4342
+ var ASC = 'asc';
4343
+ var DESC = 'desc';
4344
+
4345
+ var sortOrders = /*#__PURE__*/Object.freeze({
4346
+ __proto__: null,
4347
+ ASC: ASC,
4348
+ DESC: DESC
4349
+ });
4350
+
4274
4351
  var CHATS_PAGINATION_MAX_LIMIT = 25;
4275
- var init = function init(config, env) {
4352
+ var init = function init(config, env, licenseId) {
4276
4353
  if (env === void 0) {
4277
4354
  env = 'production';
4278
4355
  }
@@ -4287,12 +4364,13 @@
4287
4364
  }));
4288
4365
  var emitter = createMitt();
4289
4366
  var socket = createSocketClient(store);
4290
- var auth = typeof identityProvider === 'function' ? identityProvider() : createAuth(instanceConfig, env);
4367
+ var auth = typeof identityProvider === 'function' ? identityProvider() : createAuth(instanceConfig, licenseId, env);
4291
4368
  store.addSideEffectsHandler(createSideEffectsHandler({
4292
4369
  emitter: emitter,
4293
4370
  socket: socket,
4294
4371
  auth: auth,
4295
- customerDataProvider: customerDataProvider
4372
+ customerDataProvider: customerDataProvider,
4373
+ licenseId: licenseId
4296
4374
  }));
4297
4375
  socketListener(store, socket);
4298
4376
  var sendRequestAction$1 = sendRequestAction.bind(null, store);
@@ -4491,7 +4569,7 @@
4491
4569
  resumeChat: function resumeChat(data) {
4492
4570
  log({
4493
4571
  env: env,
4494
- licenseId: config.licenseId,
4572
+ organizationId: config.organizationId,
4495
4573
  eventName: 'chat_started'
4496
4574
  });
4497
4575
  return sendRequestAction$1(sendRequest(RESUME_CHAT, parseResumeChatData(data)));
@@ -4507,9 +4585,6 @@
4507
4585
  }(function (params) {
4508
4586
  return sendRequestAction$1(sendEvent(params));
4509
4587
  }),
4510
- sendTicketForm: function sendTicketForm$1(options) {
4511
- return sendTicketForm(store, auth, options);
4512
- },
4513
4588
  sendRichMessagePostback: function sendRichMessagePostback(_ref15) {
4514
4589
  var chatId = _ref15.chatId,
4515
4590
  threadId = _ref15.threadId,
@@ -4546,7 +4621,7 @@
4546
4621
  }
4547
4622
  log({
4548
4623
  env: env,
4549
- licenseId: config.licenseId,
4624
+ organizationId: config.organizationId,
4550
4625
  eventName: 'chat_started'
4551
4626
  });
4552
4627
  return sendRequestAction$1(sendRequest(START_CHAT, parseStartChatData(data)));
@@ -4610,7 +4685,9 @@
4610
4685
  return api;
4611
4686
  };
4612
4687
 
4688
+ exports.connectionStatuses = connectionStatuses;
4613
4689
  exports.debug = debug;
4690
+ exports.eventTypes = eventTypes;
4614
4691
  exports.init = init;
4615
4692
  exports.parseCustomEvent = parseCustomEvent;
4616
4693
  exports.parseEvent = parseEvent$1;
@@ -4621,6 +4698,11 @@
4621
4698
  exports.parseMessage = parseMessage;
4622
4699
  exports.parseRichMessage = parseRichMessage;
4623
4700
  exports.parseSystemMessage = parseSystemMessage;
4701
+ exports.serverDisconnectionReasons = serverDisconnectionReasons;
4702
+ exports.serverErrorCodes = serverErrorCodes;
4703
+ exports.serverPushActions = serverPushActions;
4704
+ exports.sortOrders = sortOrders;
4705
+ exports.userTypes = userTypes;
4624
4706
 
4625
4707
  Object.defineProperty(exports, '__esModule', { value: true });
4626
4708