@livechat/customer-sdk 3.1.4 → 4.0.0

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 (48) hide show
  1. package/README.md +27 -78
  2. package/dist/customer-sdk.cjs.js +208 -228
  3. package/dist/customer-sdk.cjs.native.js +208 -228
  4. package/dist/customer-sdk.esm.js +202 -227
  5. package/dist/customer-sdk.js +222 -249
  6. package/dist/customer-sdk.min.js +1 -1
  7. package/package.json +7 -7
  8. package/types/actions.d.ts +331 -0
  9. package/types/chatHistory.d.ts +19 -0
  10. package/types/clientDataParsers.d.ts +55 -0
  11. package/types/completionValues.d.ts +4 -0
  12. package/types/constants/clientErrorCodes.d.ts +11 -0
  13. package/types/constants/connectionStatuses.d.ts +6 -0
  14. package/types/constants/eventTypes.d.ts +8 -0
  15. package/types/constants/organizationIds.d.ts +2 -0
  16. package/types/constants/reduxActions.d.ts +23 -0
  17. package/types/constants/serverDisconnectionReasons.d.ts +16 -0
  18. package/types/constants/serverErrorCodes.d.ts +23 -0
  19. package/types/constants/serverPushActions.d.ts +27 -0
  20. package/types/constants/serverRequestActions.d.ts +30 -0
  21. package/types/constants/sortOrders.d.ts +3 -0
  22. package/types/constants/userTypes.d.ts +3 -0
  23. package/types/createError.d.ts +9 -0
  24. package/types/createStore.d.ts +12 -0
  25. package/types/debug.d.ts +3 -0
  26. package/types/graylog/index.d.ts +14 -0
  27. package/types/graylog/makeGrayLogRequest.d.ts +2 -0
  28. package/types/graylog/makeGrayLogRequest.native.d.ts +6 -0
  29. package/types/index.d.ts +252 -0
  30. package/types/reducer.d.ts +545 -0
  31. package/types/sendRequestAction.d.ts +4 -0
  32. package/types/sendTicketForm.d.ts +14 -0
  33. package/types/serverDataParser.d.ts +34 -0
  34. package/types/serverEventParser.d.ts +12 -0
  35. package/types/serverFrameParser.d.ts +393 -0
  36. package/types/sideEffects/checkGoals.d.ts +5 -0
  37. package/types/sideEffects/index.d.ts +13 -0
  38. package/types/sideStorage.d.ts +5 -0
  39. package/types/socketClient.d.ts +11 -0
  40. package/types/socketListener.d.ts +12 -0
  41. package/types/thunks.d.ts +4 -0
  42. package/types/types/actions.d.ts +157 -0
  43. package/types/types/clientEntities.d.ts +376 -0
  44. package/types/types/frames.d.ts +644 -0
  45. package/types/types/serverEntities.d.ts +409 -0
  46. package/types/types/state.d.ts +56 -0
  47. package/types/uploadFile.d.ts +19 -0
  48. package/types/validateFile/index.d.ts +3 -0
@@ -247,16 +247,6 @@
247
247
  return arrOrStr.indexOf(value) !== -1;
248
248
  }
249
249
 
250
- /**
251
- * returns true or false depending if the provided value is an empty object or an empty array
252
- * @example
253
- * isEmpty({})
254
- * // returns true
255
- */
256
- function isEmpty(collection) {
257
- return (isArray(collection) ? collection : Object.keys(collection)).length === 0;
258
- }
259
-
260
250
  /**
261
251
  * constructs an object from the provided array of objects, grouped by the value of the specified key
262
252
  * @example
@@ -1208,6 +1198,21 @@
1208
1198
  };
1209
1199
  };
1210
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
+
1211
1216
  /**
1212
1217
  * Creates a deferred object that can be resolved or rejected later.
1213
1218
  * @returns A deferred object with a promise and resolve and reject functions.
@@ -1245,9 +1250,26 @@
1245
1250
  var PAUSED = 'paused';
1246
1251
  var RECONNECTING = 'reconnecting';
1247
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
+
1248
1262
  var AGENT = 'agent';
1249
1263
  var CUSTOMER = 'customer';
1250
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
+
1251
1273
  var getAllRequests = function getAllRequests(state) {
1252
1274
  return state.requests;
1253
1275
  };
@@ -1271,9 +1293,9 @@
1271
1293
  return getConnectionStatus(state) === DESTROYED;
1272
1294
  };
1273
1295
  var getEnvPart = function getEnvPart(_ref) {
1274
- var licenseId = _ref.licenseId,
1296
+ var organizationId = _ref.organizationId,
1275
1297
  env = _ref.env;
1276
- if (licenseId === 1520) {
1298
+ if (organizationId === LIVECHAT_ORGANIZATION_ID) {
1277
1299
  return '.staging';
1278
1300
  }
1279
1301
  if (env === 'production') {
@@ -1287,12 +1309,12 @@
1287
1309
  return "https://api" + regionPart + getEnvPart(state) + ".livechatinc.com";
1288
1310
  };
1289
1311
  var getServerUrl = function getServerUrl(state) {
1290
- return getApiOrigin(state) + "/v3.3/customer";
1312
+ return getApiOrigin(state) + "/v3.5/customer";
1291
1313
  };
1292
1314
  var createInitialState = function createInitialState(initialStateData) {
1293
1315
  var _initialStateData$app = initialStateData.application,
1294
1316
  application = _initialStateData$app === void 0 ? {} : _initialStateData$app,
1295
- licenseId = initialStateData.licenseId,
1317
+ organizationId = initialStateData.organizationId,
1296
1318
  _initialStateData$gro = initialStateData.groupId,
1297
1319
  groupId = _initialStateData$gro === void 0 ? null : _initialStateData$gro,
1298
1320
  env = initialStateData.env,
@@ -1309,9 +1331,9 @@
1309
1331
  return {
1310
1332
  application: _extends({}, application, {
1311
1333
  name: "customer_sdk",
1312
- version: "3.1.4"
1334
+ version: "4.0.0"
1313
1335
  }),
1314
- licenseId: licenseId,
1336
+ organizationId: organizationId,
1315
1337
  env: env,
1316
1338
  groupId: groupId,
1317
1339
  chats: {},
@@ -1429,9 +1451,12 @@
1429
1451
  }
1430
1452
 
1431
1453
  var ACCESS_TOKEN_EXPIRED = 'access_token_expired';
1454
+ var CONNECTION_TIMEOUT = 'connection_timeout';
1432
1455
  var CUSTOMER_BANNED = 'customer_banned';
1433
1456
  // customer tried reconnecting too many times after they received too_many_connections error
1434
1457
  var CUSTOMER_TEMPORARILY_BLOCKED = 'customer_temporarily_blocked';
1458
+ var INACTIVITY_TIMEOUT = 'inactivity_timeout';
1459
+ var INTERNAL_ERROR = 'internal_error';
1435
1460
  var LICENSE_EXPIRED = 'license_expired';
1436
1461
  var LICENSE_NOT_FOUND = 'license_not_found';
1437
1462
  var MISDIRECTED_CONNECTION$1 = 'misdirected_connection';
@@ -1445,6 +1470,27 @@
1445
1470
  // the limit of unauthorized connections is per IP
1446
1471
  var TOO_MANY_UNAUTHORIZED_CONNECTIONS = 'too_many_unauthorized_connections';
1447
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
+ });
1448
1494
 
1449
1495
  var CHAT_DEACTIVATED = 'chat_deactivated';
1450
1496
  var CHAT_PROPERTIES_DELETED = 'chat_properties_deleted';
@@ -1460,6 +1506,7 @@
1460
1506
  var EVENTS_MARKED_AS_SEEN = 'events_marked_as_seen';
1461
1507
  var GREETING_ACCEPTED = 'greeting_accepted';
1462
1508
  var GREETING_CANCELED = 'greeting_canceled';
1509
+ var GROUPS_STATUS_UPDATED = 'groups_status_updated';
1463
1510
  var INCOMING_CHAT = 'incoming_chat';
1464
1511
  var INCOMING_EVENT = 'incoming_event';
1465
1512
  var INCOMING_GREETING = 'incoming_greeting';
@@ -1488,6 +1535,7 @@
1488
1535
  EVENTS_MARKED_AS_SEEN: EVENTS_MARKED_AS_SEEN,
1489
1536
  GREETING_ACCEPTED: GREETING_ACCEPTED,
1490
1537
  GREETING_CANCELED: GREETING_CANCELED,
1538
+ GROUPS_STATUS_UPDATED: GROUPS_STATUS_UPDATED,
1491
1539
  INCOMING_CHAT: INCOMING_CHAT,
1492
1540
  INCOMING_EVENT: INCOMING_EVENT,
1493
1541
  INCOMING_GREETING: INCOMING_GREETING,
@@ -1509,6 +1557,17 @@
1509
1557
  var SYSTEM_MESSAGE = 'system_message';
1510
1558
  var CUSTOM = 'custom';
1511
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
+
1512
1571
  var createEventBase = function createEventBase(event) {
1513
1572
  var base = {};
1514
1573
  if (typeof event.customId === 'string') {
@@ -1762,22 +1821,13 @@
1762
1821
  };
1763
1822
  };
1764
1823
 
1765
- function deferred() {
1766
- var def = {};
1767
- def.promise = new Promise(function (resolve, reject) {
1768
- def.resolve = resolve;
1769
- def.reject = reject;
1770
- });
1771
- return def;
1772
- }
1773
-
1774
1824
  // TODO: this thing is not really well typed and should be improved
1775
1825
  var sendRequestAction = function sendRequestAction(store, action) {
1776
1826
  action.payload.id = generateUniqueId(store.getState().requests);
1777
- var _deferred = deferred(),
1778
- resolve = _deferred.resolve,
1779
- reject = _deferred.reject,
1780
- promise = _deferred.promise;
1827
+ var _promiseDeferred = promiseDeferred(),
1828
+ resolve = _promiseDeferred.resolve,
1829
+ reject = _promiseDeferred.reject,
1830
+ promise = _promiseDeferred.promise;
1781
1831
  action.payload.promise = promise;
1782
1832
  action.payload.resolve = resolve;
1783
1833
  action.payload.reject = reject;
@@ -1785,35 +1835,89 @@
1785
1835
  return promise;
1786
1836
  };
1787
1837
 
1788
- var index$1 = function (fn) {
1789
- return new Promise(function (resolve) {
1790
- resolve(fn());
1791
- });
1792
- };
1793
-
1794
1838
  var AUTHENTICATION = 'AUTHENTICATION';
1839
+ var AUTHORIZATION = 'AUTHORIZATION';
1840
+ var CHAT_ALREADY_ACTIVE = 'CHAT_ALREADY_ACTIVE';
1841
+ var CHAT_LIMIT_REACHED = 'CHAT_LIMIT_REACHED';
1795
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';
1796
1858
  var USERS_LIMIT_REACHED = 'USERS_LIMIT_REACHED';
1859
+ var VALIDATION = 'VALIDATION';
1797
1860
  var WRONG_PRODUCT_VERSION = 'WRONG_PRODUCT_VERSION';
1798
1861
 
1799
- 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) {
1800
1889
  var _store$getState = store.getState(),
1801
- licenseId = _store$getState.licenseId,
1802
1890
  groupId = _store$getState.groupId,
1803
1891
  uniqueGroups = _store$getState.uniqueGroups;
1804
1892
  return "side_storage_" + licenseId + (uniqueGroups ? ":" + groupId : '');
1805
1893
  };
1806
- var getSideStorage = function getSideStorage(store) {
1807
- return storage.getItem(getSideStorageKey(store))["catch"](noop).then(function (sideStorage) {
1808
- 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
+ });
1809
1915
  })
1810
1916
  // shouldnt get triggered, just a defensive measure against malformed storage entries
1811
- ["catch"](function () {
1812
- return {};
1813
- });
1917
+ ["catch"](noop);
1814
1918
  };
1815
1919
  var saveSideStorage = function saveSideStorage(store, sideStorage) {
1816
- return storage.setItem(getSideStorageKey(store), JSON.stringify(sideStorage))["catch"](noop);
1920
+ storage.setItem(getSideStorageKeyByOrganization(store), JSON.stringify(sideStorage))["catch"](noop);
1817
1921
  };
1818
1922
 
1819
1923
  var taskChain = function taskChain(_ref, onSuccess, onError) {
@@ -1821,7 +1925,7 @@
1821
1925
  var cancelled = false;
1822
1926
  var next = function next(intermediateResult) {
1823
1927
  var step = steps.shift();
1824
- index$1(function () {
1928
+ promiseTry(function () {
1825
1929
  return step(intermediateResult);
1826
1930
  }).then(function (result) {
1827
1931
  if (cancelled) {
@@ -1854,7 +1958,7 @@
1854
1958
  setTimeout(resolve, ms);
1855
1959
  });
1856
1960
  };
1857
- function createLoginTask(auth, customerDataProvider) {
1961
+ function createLoginTask(auth, customerDataProvider, licenseId) {
1858
1962
  var store;
1859
1963
  var sentPage = null;
1860
1964
  var task;
@@ -1875,7 +1979,7 @@
1875
1979
  return store.dispatch(reconnect(currentBackoffStrategy.duration()));
1876
1980
  };
1877
1981
  var getTokenAndSideStorage = function getTokenAndSideStorage() {
1878
- return Promise.all([auth.getToken(), getSideStorage(store)]);
1982
+ return Promise.all([auth.getToken(), getSideStorage(store, licenseId)]);
1879
1983
  };
1880
1984
  var dispatchSelfId = function dispatchSelfId(_ref2) {
1881
1985
  var token = _ref2[0],
@@ -2015,7 +2119,7 @@
2015
2119
  return;
2016
2120
  }
2017
2121
  var query = buildQueryString({
2018
- license_id: state.licenseId
2122
+ organization_id: state.organizationId
2019
2123
  });
2020
2124
  var payload = {
2021
2125
  session_fields: parseCustomerSessionFields(sessionFields || {}),
@@ -2514,11 +2618,11 @@
2514
2618
  {
2515
2619
  var upgradedPushes = [];
2516
2620
  socket.emit(_extends({}, frame, {
2517
- version: '3.3',
2621
+ version: '3.5',
2518
2622
  payload: _extends({}, frame.payload, {
2519
2623
  pushes: {
2520
- // '3.4': upgradedPushes,
2521
- '3.3': values(serverPushActions).filter(function (pushAction) {
2624
+ // '3.6': upgradedPushes,
2625
+ '3.5': values(serverPushActions).filter(function (pushAction) {
2522
2626
  return (
2523
2627
  // `customer_disconnected` can be sent immediately after opening the connection, before it even received login request
2524
2628
  // therefore it's not possible to subscribe for a particular version of this push - the "connection version" is always used
@@ -2550,25 +2654,10 @@
2550
2654
  emit('user_data', user);
2551
2655
  });
2552
2656
  };
2553
- var handleMulticast = function handleMulticast(emit, _ref4) {
2554
- var type = _ref4.type,
2555
- content = _ref4.content;
2556
- if (type !== 'lc2') {
2557
- return;
2558
- }
2559
- if (content.name === 'groups_update' && 'groups' in content && !isEmpty(content.groups)) {
2560
- var _content$groups = content.groups,
2561
- group = _content$groups[0];
2562
- var availability = parseGroupStatus(group.status);
2563
- emit('availability_updated', {
2564
- availability: availability
2565
- });
2566
- }
2567
- };
2568
- var handlePush = function handlePush(_ref5, _ref6) {
2569
- var emit = _ref5.emit,
2570
- store = _ref5.store;
2571
- 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;
2572
2661
  switch (payload.action) {
2573
2662
  case THREAD_PROPERTIES_UPDATED:
2574
2663
  if (payload.payload.properties.lc2 && 'queue_pos' in payload.payload.properties.lc2) {
@@ -2608,6 +2697,7 @@
2608
2697
  case PRODUCT_VERSION_CHANGED:
2609
2698
  case TOO_MANY_CONNECTIONS:
2610
2699
  case UNSUPPORTED_VERSION:
2700
+ case LOGGED_OUT_REMOTELY:
2611
2701
  // this also emits `disconnected` event - but it's handled in response to this action by destroy handler
2612
2702
  store.dispatch(destroy(payload.payload.reason));
2613
2703
  break;
@@ -2630,6 +2720,16 @@
2630
2720
  break;
2631
2721
  }
2632
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
+ }
2633
2733
  case INCOMING_CHAT:
2634
2734
  emitUsers(emit, payload.payload.chat.users);
2635
2735
  emit(payload.action, payload.payload);
@@ -2643,11 +2743,6 @@
2643
2743
  case INCOMING_TYPING_INDICATOR:
2644
2744
  emit(payload.action, payload.payload);
2645
2745
  return;
2646
- case INCOMING_MULTICAST:
2647
- handleMulticast(emit, payload.payload);
2648
- // we passthrough this action even if it was already handled above
2649
- emit(payload.action, payload.payload);
2650
- return;
2651
2746
  case USER_ADDED_TO_CHAT:
2652
2747
  emitUsers(emit, [payload.payload.user]);
2653
2748
  emit(payload.action, payload.payload);
@@ -2657,9 +2752,9 @@
2657
2752
  return;
2658
2753
  }
2659
2754
  };
2660
- var handleResponse = function handleResponse(_ref7, _ref8) {
2661
- var emit = _ref7.emit;
2662
- var payload = _ref8.payload;
2755
+ var handleResponse = function handleResponse(_ref6, _ref7) {
2756
+ var emit = _ref6.emit;
2757
+ var payload = _ref7.payload;
2663
2758
  switch (payload.action) {
2664
2759
  case CHAT_DEACTIVATED:
2665
2760
  payload.resolve(SUCCESS);
@@ -2684,13 +2779,14 @@
2684
2779
  return;
2685
2780
  }
2686
2781
  };
2687
- var createSideEffectsHandler = (function (_ref9) {
2688
- var auth = _ref9.auth,
2689
- customerDataProvider = _ref9.customerDataProvider,
2690
- emitter = _ref9.emitter,
2691
- 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;
2692
2788
  var emit = emitter.emit;
2693
- var loginTask = createLoginTask(auth, customerDataProvider);
2789
+ var loginTask = createLoginTask(auth, customerDataProvider, licenseId);
2694
2790
 
2695
2791
  // TODO: using Store type here is a lie, middleware only provides MiddlewareAPI here
2696
2792
  return function (action, store) {
@@ -2713,6 +2809,7 @@
2713
2809
  case CUSTOMER_BANNED:
2714
2810
  case LICENSE_EXPIRED:
2715
2811
  case PRODUCT_VERSION_CHANGED:
2812
+ case LOGGED_OUT_REMOTELY:
2716
2813
  // normalize those to CONNECTION_LOST as the handling on the consumer's side should be the same
2717
2814
  failAllRequests(store, CONNECTION_LOST);
2718
2815
  emit('disconnected', payload);
@@ -2783,9 +2880,9 @@
2783
2880
  if (!hasToken) {
2784
2881
  return auth.getToken();
2785
2882
  }
2786
- return auth.getToken().then(function (_ref10) {
2787
- var creationDate = _ref10.creationDate,
2788
- expiresIn = _ref10.expiresIn;
2883
+ return auth.getToken().then(function (_ref9) {
2884
+ var creationDate = _ref9.creationDate,
2885
+ expiresIn = _ref9.expiresIn;
2789
2886
  var ONE_HOUR = 60 * 60 * 1000;
2790
2887
  // check if the token is worth reusing
2791
2888
  // we don't want to get disconnected in a moment because of expired token
@@ -3211,7 +3308,7 @@
3211
3308
  var url = (getServerUrl(state) + "/rtm/ws").replace(/^https/, 'wss');
3212
3309
  return createPlatformClient(url, {
3213
3310
  query: {
3214
- license_id: state.licenseId
3311
+ organization_id: state.organizationId
3215
3312
  },
3216
3313
  emitter: emitter
3217
3314
  });
@@ -3503,16 +3600,17 @@
3503
3600
  var lastEventSummary = last(lastEventSummariesArray.sort(function (eventSummaryA, eventSummaryB) {
3504
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);
3505
3602
  }));
3506
- if (lastEventSummary) {
3603
+ if (lastEventSummary && chatSummary.lastEventsPerType) {
3507
3604
  chatSummary.lastEvent = chatSummary.lastEventsPerType[lastEventSummary.event.type];
3508
3605
  }
3509
3606
  return chatSummary;
3510
3607
  });
3511
3608
  return {
3512
3609
  chatsSummary: numericSortBy(function (_ref4) {
3610
+ var _ref5;
3513
3611
  var lastEvent = _ref4.lastEvent,
3514
3612
  order = _ref4.order;
3515
- return -1 * (lastEvent !== undefined ? lastEvent.timestamp : order);
3613
+ return -1 * ((_ref5 = lastEvent !== undefined ? lastEvent.timestamp : order) != null ? _ref5 : 0);
3516
3614
  }, chatsSummary),
3517
3615
  totalChats: payload.total_chats,
3518
3616
  users: uniqBy(function (user) {
@@ -3632,6 +3730,11 @@
3632
3730
  // 'greeting_canceled' has the same payload as `greeting_accepted`
3633
3731
  payload: parseGreetingAcceptedPush(push.payload)
3634
3732
  };
3733
+ case GROUPS_STATUS_UPDATED:
3734
+ return {
3735
+ action: push.action,
3736
+ payload: push.payload
3737
+ };
3635
3738
  case INCOMING_CHAT:
3636
3739
  return {
3637
3740
  action: push.action,
@@ -3689,9 +3792,9 @@
3689
3792
  };
3690
3793
  }
3691
3794
  };
3692
- var parseResponse = function parseResponse(_ref5) {
3693
- var request = _ref5.request,
3694
- response = _ref5.response;
3795
+ var parseResponse = function parseResponse(_ref6) {
3796
+ var request = _ref6.request,
3797
+ response = _ref6.response;
3695
3798
  switch (response.action) {
3696
3799
  case ACCEPT_GREETING:
3697
3800
  return {
@@ -3936,150 +4039,6 @@
3936
4039
  return socket.off;
3937
4040
  });
3938
4041
 
3939
- var INCORRECT_REQUESTER_STRUCTURE = 'incorrect requester structure';
3940
- var appendString = function appendString(input, str) {
3941
- return input.length ? input + "\n" + str : str;
3942
- };
3943
- var createTicketBody = function createTicketBody(state, _ref) {
3944
- var fields = _ref.fields,
3945
- customerId = _ref.customerId,
3946
- _ref$groupId = _ref.groupId,
3947
- groupId = _ref$groupId === void 0 ? state.groupId : _ref$groupId,
3948
- timeZone = _ref.timeZone;
3949
- var ticketBody = _extends({
3950
- licence_id: state.licenseId,
3951
- ticket_message: '',
3952
- offline_message: '',
3953
- visitor_id: customerId,
3954
- requester: {}
3955
- }, typeof groupId === 'number' && {
3956
- group: groupId
3957
- }, state.page && {
3958
- source: {
3959
- url: state.page.url
3960
- }
3961
- }, timeZone && {
3962
- timezone: timeZone
3963
- });
3964
- return fields.reduce(function (body, field) {
3965
- switch (field.type) {
3966
- case 'subject':
3967
- {
3968
- var value = field.answer;
3969
- var text = value ? field.label + " " + value : field.label;
3970
- if (value) {
3971
- body.subject = value;
3972
- }
3973
- body.offline_message = appendString(body.offline_message, text);
3974
- return body;
3975
- }
3976
- case 'name':
3977
- {
3978
- var _value = field.answer;
3979
- var _text = _value ? field.label + " " + _value : field.label;
3980
- if (_value) {
3981
- body.requester.name = _value;
3982
- }
3983
- body.offline_message = appendString(body.offline_message, _text);
3984
- return body;
3985
- }
3986
- case 'email':
3987
- {
3988
- var _value2 = field.answer;
3989
- var _text2 = _value2 ? field.label + " " + _value2 : field.label;
3990
- body.requester.mail = _value2;
3991
- body.offline_message = appendString(body.offline_message, _text2);
3992
- return body;
3993
- }
3994
- case 'question':
3995
- case 'textarea':
3996
- {
3997
- var _value3 = field.answer;
3998
- var _text3 = _value3 ? field.label + " " + _value3 : field.label;
3999
- body.offline_message = appendString(body.offline_message, _text3);
4000
- body.ticket_message = appendString(body.ticket_message, _text3);
4001
- return body;
4002
- }
4003
- case 'radio':
4004
- case 'select':
4005
- {
4006
- var _value4 = field.answer && field.answer.label;
4007
- var _text4 = _value4 ? field.label + " " + _value4 : field.label;
4008
- body.offline_message = appendString(body.offline_message, _text4);
4009
- body.ticket_message = appendString(body.ticket_message, _text4);
4010
- return body;
4011
- }
4012
- case 'checkbox':
4013
- {
4014
- var _value5 = field.answers && field.answers.map(function (answer) {
4015
- return answer.label;
4016
- }).join(', ');
4017
- var _text5 = _value5 ? field.label + " " + _value5 : field.label;
4018
- body.offline_message = appendString(body.offline_message, _text5);
4019
- body.ticket_message = appendString(body.ticket_message, _text5);
4020
- return body;
4021
- }
4022
- default:
4023
- return body;
4024
- }
4025
- }, ticketBody);
4026
- };
4027
- var sendTicketForm = function sendTicketForm(store, auth, _ref2) {
4028
- var filledForm = _ref2.filledForm,
4029
- groupId = _ref2.groupId,
4030
- timeZone = _ref2.timeZone;
4031
- return auth.getToken().then(function (token) {
4032
- var state = store.getState();
4033
- if (getSelfId(state) === null) {
4034
- store.dispatch(setSelfId(token.entityId));
4035
- }
4036
- var url = getApiOrigin(state) + "/v2/tickets/new";
4037
- var body = createTicketBody(state, {
4038
- fields: filledForm.fields,
4039
- customerId: token.entityId,
4040
- groupId: groupId,
4041
- timeZone: timeZone
4042
- });
4043
- return unfetch(url, {
4044
- method: 'POST',
4045
- headers: {
4046
- 'Content-Type': 'application/json'
4047
- },
4048
- body: JSON.stringify(body)
4049
- }).then(function (response) {
4050
- if (response.ok) {
4051
- return response.json().then(function (res) {
4052
- return _extends({}, res, {
4053
- text: body.ticket_message
4054
- });
4055
- });
4056
- }
4057
-
4058
- // we actually should normalize this somehow
4059
- if (response.status === 400 || response.status === 422) {
4060
- var errHandler = function errHandler(error) {
4061
- if (!error || !error.errors) {
4062
- // TODO: I honestly don't know if this can even be reached and even if it is - What error should be thrown here
4063
- throw new Error();
4064
- }
4065
- // we receive some hardcore aggregate error here 😱
4066
- var firstError = error.errors[0];
4067
- var type = Object.keys(firstError)[0];
4068
- if (type === INCORRECT_REQUESTER_STRUCTURE) {
4069
- throw createError$1({
4070
- message: firstError[INCORRECT_REQUESTER_STRUCTURE][0],
4071
- code: 'VALIDATION'
4072
- });
4073
- }
4074
- throw new Error();
4075
- };
4076
- return response.json().then(errHandler, errHandler);
4077
- }
4078
- throw new Error();
4079
- });
4080
- });
4081
- };
4082
-
4083
4042
  var toFormData = function toFormData(object) {
4084
4043
  var formData = new FormData();
4085
4044
  Object.keys(object).forEach(function (key) {
@@ -4189,7 +4148,7 @@
4189
4148
  validateFile(file);
4190
4149
  var state = store.getState();
4191
4150
  var query = buildQueryString({
4192
- license_id: state.licenseId
4151
+ organization_id: state.organizationId
4193
4152
  });
4194
4153
  var url = getServerUrl(state) + "/action/" + UPLOAD_FILE + "?" + query;
4195
4154
  var payload = {
@@ -4255,7 +4214,7 @@
4255
4214
  */
4256
4215
  var log = function log(_ref) {
4257
4216
  var env = _ref.env,
4258
- licenseId = _ref.licenseId,
4217
+ organizationId = _ref.organizationId,
4259
4218
  eventName = _ref.eventName;
4260
4219
  if (env !== 'production' || "customer_sdk" !== 'customer_sdk') {
4261
4220
  return Promise.resolve();
@@ -4263,10 +4222,10 @@
4263
4222
  var message = {
4264
4223
  event_name: eventName,
4265
4224
  severity: 'Informational',
4266
- sdkVersion: "3.1.4"
4225
+ sdkVersion: "4.0.0"
4267
4226
  };
4268
4227
  var body = {
4269
- licence_id: licenseId,
4228
+ organizationId: organizationId,
4270
4229
  event_id: 'chat_widget_customer_sdk',
4271
4230
  message: JSON.stringify(message)
4272
4231
  };
@@ -4380,8 +4339,17 @@
4380
4339
  }));
4381
4340
  });
4382
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
+
4383
4351
  var CHATS_PAGINATION_MAX_LIMIT = 25;
4384
- var init = function init(config, env) {
4352
+ var init = function init(config, env, licenseId) {
4385
4353
  if (env === void 0) {
4386
4354
  env = 'production';
4387
4355
  }
@@ -4396,12 +4364,13 @@
4396
4364
  }));
4397
4365
  var emitter = createMitt();
4398
4366
  var socket = createSocketClient(store);
4399
- var auth = typeof identityProvider === 'function' ? identityProvider() : createAuth(instanceConfig, env);
4367
+ var auth = typeof identityProvider === 'function' ? identityProvider() : createAuth(instanceConfig, licenseId, env);
4400
4368
  store.addSideEffectsHandler(createSideEffectsHandler({
4401
4369
  emitter: emitter,
4402
4370
  socket: socket,
4403
4371
  auth: auth,
4404
- customerDataProvider: customerDataProvider
4372
+ customerDataProvider: customerDataProvider,
4373
+ licenseId: licenseId
4405
4374
  }));
4406
4375
  socketListener(store, socket);
4407
4376
  var sendRequestAction$1 = sendRequestAction.bind(null, store);
@@ -4600,7 +4569,7 @@
4600
4569
  resumeChat: function resumeChat(data) {
4601
4570
  log({
4602
4571
  env: env,
4603
- licenseId: config.licenseId,
4572
+ organizationId: config.organizationId,
4604
4573
  eventName: 'chat_started'
4605
4574
  });
4606
4575
  return sendRequestAction$1(sendRequest(RESUME_CHAT, parseResumeChatData(data)));
@@ -4616,9 +4585,6 @@
4616
4585
  }(function (params) {
4617
4586
  return sendRequestAction$1(sendEvent(params));
4618
4587
  }),
4619
- sendTicketForm: function sendTicketForm$1(options) {
4620
- return sendTicketForm(store, auth, options);
4621
- },
4622
4588
  sendRichMessagePostback: function sendRichMessagePostback(_ref15) {
4623
4589
  var chatId = _ref15.chatId,
4624
4590
  threadId = _ref15.threadId,
@@ -4655,7 +4621,7 @@
4655
4621
  }
4656
4622
  log({
4657
4623
  env: env,
4658
- licenseId: config.licenseId,
4624
+ organizationId: config.organizationId,
4659
4625
  eventName: 'chat_started'
4660
4626
  });
4661
4627
  return sendRequestAction$1(sendRequest(START_CHAT, parseStartChatData(data)));
@@ -4719,7 +4685,9 @@
4719
4685
  return api;
4720
4686
  };
4721
4687
 
4688
+ exports.connectionStatuses = connectionStatuses;
4722
4689
  exports.debug = debug;
4690
+ exports.eventTypes = eventTypes;
4723
4691
  exports.init = init;
4724
4692
  exports.parseCustomEvent = parseCustomEvent;
4725
4693
  exports.parseEvent = parseEvent$1;
@@ -4730,6 +4698,11 @@
4730
4698
  exports.parseMessage = parseMessage;
4731
4699
  exports.parseRichMessage = parseRichMessage;
4732
4700
  exports.parseSystemMessage = parseSystemMessage;
4701
+ exports.serverDisconnectionReasons = serverDisconnectionReasons;
4702
+ exports.serverErrorCodes = serverErrorCodes;
4703
+ exports.serverPushActions = serverPushActions;
4704
+ exports.sortOrders = sortOrders;
4705
+ exports.userTypes = userTypes;
4733
4706
 
4734
4707
  Object.defineProperty(exports, '__esModule', { value: true });
4735
4708