@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
@@ -7,9 +7,8 @@ var mitt = require('@livechat/mitt');
7
7
  var dataUtils = require('@livechat/data-utils');
8
8
  var redux = require('redux');
9
9
  var createSideEffectsMiddleware = require('@livechat/side-effects-middleware');
10
+ var promiseUtils = require('@livechat/promise-utils');
10
11
  var createBackoff = require('@livechat/backoff');
11
- var deferred = require('@livechat/deferred');
12
- var promiseTry = require('@livechat/promise-try');
13
12
  var storage = require('@livechat/isomorphic-storage');
14
13
  var unfetch = require('unfetch');
15
14
  var urlUtils = require('@livechat/url-utils');
@@ -22,8 +21,6 @@ var createAuth__default = /*#__PURE__*/_interopDefaultLegacy(createAuth);
22
21
  var mitt__default = /*#__PURE__*/_interopDefaultLegacy(mitt);
23
22
  var createSideEffectsMiddleware__default = /*#__PURE__*/_interopDefaultLegacy(createSideEffectsMiddleware);
24
23
  var createBackoff__default = /*#__PURE__*/_interopDefaultLegacy(createBackoff);
25
- var deferred__default = /*#__PURE__*/_interopDefaultLegacy(deferred);
26
- var promiseTry__default = /*#__PURE__*/_interopDefaultLegacy(promiseTry);
27
24
  var storage__default = /*#__PURE__*/_interopDefaultLegacy(storage);
28
25
  var unfetch__default = /*#__PURE__*/_interopDefaultLegacy(unfetch);
29
26
  var createPlatformClient__default = /*#__PURE__*/_interopDefaultLegacy(createPlatformClient);
@@ -154,9 +151,26 @@ var DISCONNECTED = 'disconnected';
154
151
  var PAUSED = 'paused';
155
152
  var RECONNECTING = 'reconnecting';
156
153
 
154
+ var connectionStatuses = /*#__PURE__*/Object.freeze({
155
+ __proto__: null,
156
+ CONNECTED: CONNECTED,
157
+ DESTROYED: DESTROYED,
158
+ DISCONNECTED: DISCONNECTED,
159
+ PAUSED: PAUSED,
160
+ RECONNECTING: RECONNECTING
161
+ });
162
+
157
163
  var AGENT = 'agent';
158
164
  var CUSTOMER = 'customer';
159
165
 
166
+ var userTypes = /*#__PURE__*/Object.freeze({
167
+ __proto__: null,
168
+ AGENT: AGENT,
169
+ CUSTOMER: CUSTOMER
170
+ });
171
+
172
+ var LIVECHAT_ORGANIZATION_ID = 'feaf6c0e-9f43-48ff-9ad0-8e24e0350932';
173
+
160
174
  var getAllRequests = function getAllRequests(state) {
161
175
  return state.requests;
162
176
  };
@@ -180,9 +194,9 @@ var isDestroyed = function isDestroyed(state) {
180
194
  return getConnectionStatus(state) === DESTROYED;
181
195
  };
182
196
  var getEnvPart = function getEnvPart(_ref) {
183
- var licenseId = _ref.licenseId,
197
+ var organizationId = _ref.organizationId,
184
198
  env = _ref.env;
185
- if (licenseId === 1520) {
199
+ if (organizationId === LIVECHAT_ORGANIZATION_ID) {
186
200
  return '.staging';
187
201
  }
188
202
  if (env === 'production') {
@@ -196,12 +210,12 @@ var getApiOrigin = function getApiOrigin(state) {
196
210
  return "https://api" + regionPart + getEnvPart(state) + ".livechatinc.com";
197
211
  };
198
212
  var getServerUrl = function getServerUrl(state) {
199
- return getApiOrigin(state) + "/v3.3/customer";
213
+ return getApiOrigin(state) + "/v3.5/customer";
200
214
  };
201
215
  var createInitialState = function createInitialState(initialStateData) {
202
216
  var _initialStateData$app = initialStateData.application,
203
217
  application = _initialStateData$app === void 0 ? {} : _initialStateData$app,
204
- licenseId = initialStateData.licenseId,
218
+ organizationId = initialStateData.organizationId,
205
219
  _initialStateData$gro = initialStateData.groupId,
206
220
  groupId = _initialStateData$gro === void 0 ? null : _initialStateData$gro,
207
221
  env = initialStateData.env,
@@ -218,9 +232,9 @@ var createInitialState = function createInitialState(initialStateData) {
218
232
  return {
219
233
  application: _extends({}, application, {
220
234
  name: "customer_sdk",
221
- version: "3.1.4"
235
+ version: "4.0.0"
222
236
  }),
223
- licenseId: licenseId,
237
+ organizationId: organizationId,
224
238
  env: env,
225
239
  groupId: groupId,
226
240
  chats: {},
@@ -338,9 +352,12 @@ function createError(_ref) {
338
352
  }
339
353
 
340
354
  var ACCESS_TOKEN_EXPIRED = 'access_token_expired';
355
+ var CONNECTION_TIMEOUT = 'connection_timeout';
341
356
  var CUSTOMER_BANNED = 'customer_banned';
342
357
  // customer tried reconnecting too many times after they received too_many_connections error
343
358
  var CUSTOMER_TEMPORARILY_BLOCKED = 'customer_temporarily_blocked';
359
+ var INACTIVITY_TIMEOUT = 'inactivity_timeout';
360
+ var INTERNAL_ERROR = 'internal_error';
344
361
  var LICENSE_EXPIRED = 'license_expired';
345
362
  var LICENSE_NOT_FOUND = 'license_not_found';
346
363
  var MISDIRECTED_CONNECTION$1 = 'misdirected_connection';
@@ -354,6 +371,27 @@ var TOO_MANY_CONNECTIONS = 'too_many_connections';
354
371
  // the limit of unauthorized connections is per IP
355
372
  var TOO_MANY_UNAUTHORIZED_CONNECTIONS = 'too_many_unauthorized_connections';
356
373
  var UNSUPPORTED_VERSION = 'unsupported_version';
374
+ // introduced in 3.5 meaning the customer was logged out by the server
375
+ var LOGGED_OUT_REMOTELY = 'logged_out_remotely';
376
+
377
+ var serverDisconnectionReasons = /*#__PURE__*/Object.freeze({
378
+ __proto__: null,
379
+ ACCESS_TOKEN_EXPIRED: ACCESS_TOKEN_EXPIRED,
380
+ CONNECTION_TIMEOUT: CONNECTION_TIMEOUT,
381
+ CUSTOMER_BANNED: CUSTOMER_BANNED,
382
+ CUSTOMER_TEMPORARILY_BLOCKED: CUSTOMER_TEMPORARILY_BLOCKED,
383
+ INACTIVITY_TIMEOUT: INACTIVITY_TIMEOUT,
384
+ INTERNAL_ERROR: INTERNAL_ERROR,
385
+ LICENSE_EXPIRED: LICENSE_EXPIRED,
386
+ LICENSE_NOT_FOUND: LICENSE_NOT_FOUND,
387
+ MISDIRECTED_CONNECTION: MISDIRECTED_CONNECTION$1,
388
+ PRODUCT_VERSION_CHANGED: PRODUCT_VERSION_CHANGED,
389
+ SERVICE_TEMPORARILY_UNAVAILABLE: SERVICE_TEMPORARILY_UNAVAILABLE$1,
390
+ TOO_MANY_CONNECTIONS: TOO_MANY_CONNECTIONS,
391
+ TOO_MANY_UNAUTHORIZED_CONNECTIONS: TOO_MANY_UNAUTHORIZED_CONNECTIONS,
392
+ UNSUPPORTED_VERSION: UNSUPPORTED_VERSION,
393
+ LOGGED_OUT_REMOTELY: LOGGED_OUT_REMOTELY
394
+ });
357
395
 
358
396
  var CHAT_DEACTIVATED = 'chat_deactivated';
359
397
  var CHAT_PROPERTIES_DELETED = 'chat_properties_deleted';
@@ -369,6 +407,7 @@ var EVENT_UPDATED = 'event_updated';
369
407
  var EVENTS_MARKED_AS_SEEN = 'events_marked_as_seen';
370
408
  var GREETING_ACCEPTED = 'greeting_accepted';
371
409
  var GREETING_CANCELED = 'greeting_canceled';
410
+ var GROUPS_STATUS_UPDATED = 'groups_status_updated';
372
411
  var INCOMING_CHAT = 'incoming_chat';
373
412
  var INCOMING_EVENT = 'incoming_event';
374
413
  var INCOMING_GREETING = 'incoming_greeting';
@@ -397,6 +436,7 @@ var serverPushActions = /*#__PURE__*/Object.freeze({
397
436
  EVENTS_MARKED_AS_SEEN: EVENTS_MARKED_AS_SEEN,
398
437
  GREETING_ACCEPTED: GREETING_ACCEPTED,
399
438
  GREETING_CANCELED: GREETING_CANCELED,
439
+ GROUPS_STATUS_UPDATED: GROUPS_STATUS_UPDATED,
400
440
  INCOMING_CHAT: INCOMING_CHAT,
401
441
  INCOMING_EVENT: INCOMING_EVENT,
402
442
  INCOMING_GREETING: INCOMING_GREETING,
@@ -418,6 +458,17 @@ var RICH_MESSAGE = 'rich_message';
418
458
  var SYSTEM_MESSAGE = 'system_message';
419
459
  var CUSTOM = 'custom';
420
460
 
461
+ var eventTypes = /*#__PURE__*/Object.freeze({
462
+ __proto__: null,
463
+ FILE: FILE,
464
+ FORM: FORM,
465
+ FILLED_FORM: FILLED_FORM,
466
+ MESSAGE: MESSAGE,
467
+ RICH_MESSAGE: RICH_MESSAGE,
468
+ SYSTEM_MESSAGE: SYSTEM_MESSAGE,
469
+ CUSTOM: CUSTOM
470
+ });
471
+
421
472
  var createEventBase = function createEventBase(event) {
422
473
  var base = {};
423
474
  if (typeof event.customId === 'string') {
@@ -674,10 +725,10 @@ var socketDisconnected = function socketDisconnected() {
674
725
  // TODO: this thing is not really well typed and should be improved
675
726
  var sendRequestAction = function sendRequestAction(store, action) {
676
727
  action.payload.id = dataUtils.generateUniqueId(store.getState().requests);
677
- var _deferred = deferred__default['default'](),
678
- resolve = _deferred.resolve,
679
- reject = _deferred.reject,
680
- promise = _deferred.promise;
728
+ var _promiseDeferred = promiseUtils.promiseDeferred(),
729
+ resolve = _promiseDeferred.resolve,
730
+ reject = _promiseDeferred.reject,
731
+ promise = _promiseDeferred.promise;
681
732
  action.payload.promise = promise;
682
733
  action.payload.resolve = resolve;
683
734
  action.payload.reject = reject;
@@ -686,28 +737,88 @@ var sendRequestAction = function sendRequestAction(store, action) {
686
737
  };
687
738
 
688
739
  var AUTHENTICATION = 'AUTHENTICATION';
740
+ var AUTHORIZATION = 'AUTHORIZATION';
741
+ var CHAT_ALREADY_ACTIVE = 'CHAT_ALREADY_ACTIVE';
742
+ var CHAT_LIMIT_REACHED = 'CHAT_LIMIT_REACHED';
689
743
  var CUSTOMER_BANNED$1 = 'CUSTOMER_BANNED';
744
+ var CUSTOMER_SESSION_FIELDS_LIMIT_REACHED = 'CUSTOMER_SESSION_FIELDS_LIMIT_REACHED';
745
+ var ENTITY_TOO_LARGE = 'ENTITY_TOO_LARGE';
746
+ var GREETING_NOT_FOUND = 'GREETING_NOT_FOUND';
747
+ var GROUP_OFFLINE = 'GROUP_OFFLINE';
748
+ var GROUPS_OFFLINE = 'GROUPS_OFFLINE';
749
+ var GROUP_NOT_FOUND = 'GROUP_NOT_FOUND';
750
+ var GROUP_UNAVAILABLE = 'GROUP_UNAVAILABLE';
751
+ var INTERNAL = 'INTERNAL';
752
+ var LICENSE_EXPIRED$1 = 'LICENSE_EXPIRED';
753
+ // actually this can happen only when using REST
754
+ var MISDIRECTED_REQUEST = 'MISDIRECTED_REQUEST';
755
+ var PENDING_REQUESTS_LIMIT_REACHED = 'PENDING_REQUESTS_LIMIT_REACHED';
756
+ var REQUEST_TIMEOUT$1 = 'REQUEST_TIMEOUT';
757
+ var SERVICE_UNAVAILABLE = 'SERVICE_UNAVAILABLE';
758
+ var UNSUPPORTED_VERSION$1 = 'UNSUPPORTED_VERSION';
690
759
  var USERS_LIMIT_REACHED = 'USERS_LIMIT_REACHED';
760
+ var VALIDATION = 'VALIDATION';
691
761
  var WRONG_PRODUCT_VERSION = 'WRONG_PRODUCT_VERSION';
692
762
 
693
- var getSideStorageKey = function getSideStorageKey(store) {
763
+ var serverErrorCodes = /*#__PURE__*/Object.freeze({
764
+ __proto__: null,
765
+ AUTHENTICATION: AUTHENTICATION,
766
+ AUTHORIZATION: AUTHORIZATION,
767
+ CHAT_ALREADY_ACTIVE: CHAT_ALREADY_ACTIVE,
768
+ CHAT_LIMIT_REACHED: CHAT_LIMIT_REACHED,
769
+ CUSTOMER_BANNED: CUSTOMER_BANNED$1,
770
+ CUSTOMER_SESSION_FIELDS_LIMIT_REACHED: CUSTOMER_SESSION_FIELDS_LIMIT_REACHED,
771
+ ENTITY_TOO_LARGE: ENTITY_TOO_LARGE,
772
+ GREETING_NOT_FOUND: GREETING_NOT_FOUND,
773
+ GROUP_OFFLINE: GROUP_OFFLINE,
774
+ GROUPS_OFFLINE: GROUPS_OFFLINE,
775
+ GROUP_NOT_FOUND: GROUP_NOT_FOUND,
776
+ GROUP_UNAVAILABLE: GROUP_UNAVAILABLE,
777
+ INTERNAL: INTERNAL,
778
+ LICENSE_EXPIRED: LICENSE_EXPIRED$1,
779
+ MISDIRECTED_REQUEST: MISDIRECTED_REQUEST,
780
+ PENDING_REQUESTS_LIMIT_REACHED: PENDING_REQUESTS_LIMIT_REACHED,
781
+ REQUEST_TIMEOUT: REQUEST_TIMEOUT$1,
782
+ SERVICE_UNAVAILABLE: SERVICE_UNAVAILABLE,
783
+ UNSUPPORTED_VERSION: UNSUPPORTED_VERSION$1,
784
+ USERS_LIMIT_REACHED: USERS_LIMIT_REACHED,
785
+ VALIDATION: VALIDATION,
786
+ WRONG_PRODUCT_VERSION: WRONG_PRODUCT_VERSION
787
+ });
788
+
789
+ var getSideStorageKeyByLicense = function getSideStorageKeyByLicense(store, licenseId) {
694
790
  var _store$getState = store.getState(),
695
- licenseId = _store$getState.licenseId,
696
791
  groupId = _store$getState.groupId,
697
792
  uniqueGroups = _store$getState.uniqueGroups;
698
793
  return "side_storage_" + licenseId + (uniqueGroups ? ":" + groupId : '');
699
794
  };
700
- var getSideStorage = function getSideStorage(store) {
701
- return storage__default['default'].getItem(getSideStorageKey(store))["catch"](dataUtils.noop).then(function (sideStorage) {
702
- return JSON.parse(sideStorage || '{}');
795
+ var getSideStorageKeyByOrganization = function getSideStorageKeyByOrganization(store) {
796
+ var _store$getState2 = store.getState(),
797
+ organizationId = _store$getState2.organizationId,
798
+ groupId = _store$getState2.groupId,
799
+ uniqueGroups = _store$getState2.uniqueGroups;
800
+ return "side_storage_" + organizationId + (uniqueGroups ? ":" + groupId : '');
801
+ };
802
+ var getSideStorage = function getSideStorage(store, licenseId) {
803
+ var sideStorageLicenseKey = getSideStorageKeyByLicense(store, licenseId);
804
+ var sideStorageOrganizationKey = getSideStorageKeyByOrganization(store);
805
+ return storage__default['default'].getItem(sideStorageLicenseKey)["catch"](dataUtils.noop).then(function (sideStorage) {
806
+ if (!sideStorage) {
807
+ return storage__default['default'].getItem(sideStorageOrganizationKey)["catch"](dataUtils.noop).then(function (organizationSideStorage) {
808
+ return JSON.parse(organizationSideStorage || '{}');
809
+ })["catch"](dataUtils.noop);
810
+ }
811
+ return storage__default['default'].setItem(sideStorageOrganizationKey, sideStorage)["catch"](dataUtils.noop).then(function () {
812
+ return storage__default['default'].removeItem(sideStorageLicenseKey)["catch"](dataUtils.noop).then(function () {
813
+ return JSON.parse(sideStorage);
814
+ })["catch"](dataUtils.noop);
815
+ });
703
816
  })
704
817
  // shouldnt get triggered, just a defensive measure against malformed storage entries
705
- ["catch"](function () {
706
- return {};
707
- });
818
+ ["catch"](dataUtils.noop);
708
819
  };
709
820
  var saveSideStorage = function saveSideStorage(store, sideStorage) {
710
- return storage__default['default'].setItem(getSideStorageKey(store), JSON.stringify(sideStorage))["catch"](dataUtils.noop);
821
+ storage__default['default'].setItem(getSideStorageKeyByOrganization(store), JSON.stringify(sideStorage))["catch"](dataUtils.noop);
711
822
  };
712
823
 
713
824
  var taskChain = function taskChain(_ref, onSuccess, onError) {
@@ -715,7 +826,7 @@ var taskChain = function taskChain(_ref, onSuccess, onError) {
715
826
  var cancelled = false;
716
827
  var next = function next(intermediateResult) {
717
828
  var step = steps.shift();
718
- promiseTry__default['default'](function () {
829
+ promiseUtils.promiseTry(function () {
719
830
  return step(intermediateResult);
720
831
  }).then(function (result) {
721
832
  if (cancelled) {
@@ -748,7 +859,7 @@ var delay = function delay(ms) {
748
859
  setTimeout(resolve, ms);
749
860
  });
750
861
  };
751
- function createLoginTask(auth, customerDataProvider) {
862
+ function createLoginTask(auth, customerDataProvider, licenseId) {
752
863
  var store;
753
864
  var sentPage = null;
754
865
  var task;
@@ -769,7 +880,7 @@ function createLoginTask(auth, customerDataProvider) {
769
880
  return store.dispatch(reconnect(currentBackoffStrategy.duration()));
770
881
  };
771
882
  var getTokenAndSideStorage = function getTokenAndSideStorage() {
772
- return Promise.all([auth.getToken(), getSideStorage(store)]);
883
+ return Promise.all([auth.getToken(), getSideStorage(store, licenseId)]);
773
884
  };
774
885
  var dispatchSelfId = function dispatchSelfId(_ref2) {
775
886
  var token = _ref2[0],
@@ -909,7 +1020,7 @@ var checkGoals = function checkGoals(store, auth, sessionFields) {
909
1020
  return;
910
1021
  }
911
1022
  var query = urlUtils.buildQueryString({
912
- license_id: state.licenseId
1023
+ organization_id: state.organizationId
913
1024
  });
914
1025
  var payload = {
915
1026
  session_fields: parseCustomerSessionFields(sessionFields || {}),
@@ -1408,11 +1519,11 @@ var sendRequest$1 = function sendRequest(socket, _ref3) {
1408
1519
  {
1409
1520
  var upgradedPushes = [];
1410
1521
  socket.emit(_extends({}, frame, {
1411
- version: '3.3',
1522
+ version: '3.5',
1412
1523
  payload: _extends({}, frame.payload, {
1413
1524
  pushes: {
1414
- // '3.4': upgradedPushes,
1415
- '3.3': dataUtils.values(serverPushActions).filter(function (pushAction) {
1525
+ // '3.6': upgradedPushes,
1526
+ '3.5': dataUtils.values(serverPushActions).filter(function (pushAction) {
1416
1527
  return (
1417
1528
  // `customer_disconnected` can be sent immediately after opening the connection, before it even received login request
1418
1529
  // therefore it's not possible to subscribe for a particular version of this push - the "connection version" is always used
@@ -1444,25 +1555,10 @@ var emitUsers = function emitUsers(emit, users) {
1444
1555
  emit('user_data', user);
1445
1556
  });
1446
1557
  };
1447
- var handleMulticast = function handleMulticast(emit, _ref4) {
1448
- var type = _ref4.type,
1449
- content = _ref4.content;
1450
- if (type !== 'lc2') {
1451
- return;
1452
- }
1453
- if (content.name === 'groups_update' && 'groups' in content && !dataUtils.isEmpty(content.groups)) {
1454
- var _content$groups = content.groups,
1455
- group = _content$groups[0];
1456
- var availability = parseGroupStatus(group.status);
1457
- emit('availability_updated', {
1458
- availability: availability
1459
- });
1460
- }
1461
- };
1462
- var handlePush = function handlePush(_ref5, _ref6) {
1463
- var emit = _ref5.emit,
1464
- store = _ref5.store;
1465
- var payload = _ref6.payload;
1558
+ var handlePush = function handlePush(_ref4, _ref5) {
1559
+ var emit = _ref4.emit,
1560
+ store = _ref4.store;
1561
+ var payload = _ref5.payload;
1466
1562
  switch (payload.action) {
1467
1563
  case THREAD_PROPERTIES_UPDATED:
1468
1564
  if (payload.payload.properties.lc2 && 'queue_pos' in payload.payload.properties.lc2) {
@@ -1502,6 +1598,7 @@ var handlePush = function handlePush(_ref5, _ref6) {
1502
1598
  case PRODUCT_VERSION_CHANGED:
1503
1599
  case TOO_MANY_CONNECTIONS:
1504
1600
  case UNSUPPORTED_VERSION:
1601
+ case LOGGED_OUT_REMOTELY:
1505
1602
  // this also emits `disconnected` event - but it's handled in response to this action by destroy handler
1506
1603
  store.dispatch(destroy(payload.payload.reason));
1507
1604
  break;
@@ -1524,6 +1621,16 @@ var handlePush = function handlePush(_ref5, _ref6) {
1524
1621
  break;
1525
1622
  }
1526
1623
  return;
1624
+ case GROUPS_STATUS_UPDATED:
1625
+ {
1626
+ var _payload$payload$grou = payload.payload.groups,
1627
+ group = _payload$payload$grou[0];
1628
+ var availability = parseGroupStatus(group.status);
1629
+ emit('availability_updated', {
1630
+ availability: availability
1631
+ });
1632
+ return;
1633
+ }
1527
1634
  case INCOMING_CHAT:
1528
1635
  emitUsers(emit, payload.payload.chat.users);
1529
1636
  emit(payload.action, payload.payload);
@@ -1537,11 +1644,6 @@ var handlePush = function handlePush(_ref5, _ref6) {
1537
1644
  case INCOMING_TYPING_INDICATOR:
1538
1645
  emit(payload.action, payload.payload);
1539
1646
  return;
1540
- case INCOMING_MULTICAST:
1541
- handleMulticast(emit, payload.payload);
1542
- // we passthrough this action even if it was already handled above
1543
- emit(payload.action, payload.payload);
1544
- return;
1545
1647
  case USER_ADDED_TO_CHAT:
1546
1648
  emitUsers(emit, [payload.payload.user]);
1547
1649
  emit(payload.action, payload.payload);
@@ -1551,9 +1653,9 @@ var handlePush = function handlePush(_ref5, _ref6) {
1551
1653
  return;
1552
1654
  }
1553
1655
  };
1554
- var handleResponse = function handleResponse(_ref7, _ref8) {
1555
- var emit = _ref7.emit;
1556
- var payload = _ref8.payload;
1656
+ var handleResponse = function handleResponse(_ref6, _ref7) {
1657
+ var emit = _ref6.emit;
1658
+ var payload = _ref7.payload;
1557
1659
  switch (payload.action) {
1558
1660
  case CHAT_DEACTIVATED:
1559
1661
  payload.resolve(SUCCESS);
@@ -1578,13 +1680,14 @@ var handleResponse = function handleResponse(_ref7, _ref8) {
1578
1680
  return;
1579
1681
  }
1580
1682
  };
1581
- var createSideEffectsHandler = (function (_ref9) {
1582
- var auth = _ref9.auth,
1583
- customerDataProvider = _ref9.customerDataProvider,
1584
- emitter = _ref9.emitter,
1585
- socket = _ref9.socket;
1683
+ var createSideEffectsHandler = (function (_ref8) {
1684
+ var auth = _ref8.auth,
1685
+ customerDataProvider = _ref8.customerDataProvider,
1686
+ emitter = _ref8.emitter,
1687
+ socket = _ref8.socket,
1688
+ licenseId = _ref8.licenseId;
1586
1689
  var emit = emitter.emit;
1587
- var loginTask = createLoginTask(auth, customerDataProvider);
1690
+ var loginTask = createLoginTask(auth, customerDataProvider, licenseId);
1588
1691
 
1589
1692
  // TODO: using Store type here is a lie, middleware only provides MiddlewareAPI here
1590
1693
  return function (action, store) {
@@ -1607,6 +1710,7 @@ var createSideEffectsHandler = (function (_ref9) {
1607
1710
  case CUSTOMER_BANNED:
1608
1711
  case LICENSE_EXPIRED:
1609
1712
  case PRODUCT_VERSION_CHANGED:
1713
+ case LOGGED_OUT_REMOTELY:
1610
1714
  // normalize those to CONNECTION_LOST as the handling on the consumer's side should be the same
1611
1715
  failAllRequests(store, CONNECTION_LOST);
1612
1716
  emit('disconnected', payload);
@@ -1677,9 +1781,9 @@ var createSideEffectsHandler = (function (_ref9) {
1677
1781
  if (!hasToken) {
1678
1782
  return auth.getToken();
1679
1783
  }
1680
- return auth.getToken().then(function (_ref10) {
1681
- var creationDate = _ref10.creationDate,
1682
- expiresIn = _ref10.expiresIn;
1784
+ return auth.getToken().then(function (_ref9) {
1785
+ var creationDate = _ref9.creationDate,
1786
+ expiresIn = _ref9.expiresIn;
1683
1787
  var ONE_HOUR = 60 * 60 * 1000;
1684
1788
  // check if the token is worth reusing
1685
1789
  // we don't want to get disconnected in a moment because of expired token
@@ -1881,7 +1985,7 @@ var initialize = function initialize(store, emitter) {
1881
1985
  var url = (getServerUrl(state) + "/rtm/ws").replace(/^https/, 'wss');
1882
1986
  return createPlatformClient__default['default'](url, {
1883
1987
  query: {
1884
- license_id: state.licenseId
1988
+ organization_id: state.organizationId
1885
1989
  },
1886
1990
  emitter: emitter
1887
1991
  });
@@ -2173,16 +2277,17 @@ var parseListChatsResponse = function parseListChatsResponse(payload) {
2173
2277
  var lastEventSummary = dataUtils.last(lastEventSummariesArray.sort(function (eventSummaryA, eventSummaryB) {
2174
2278
  return eventSummaryA.thread_id === eventSummaryB.thread_id ? dataUtils.stringCompare(eventSummaryA.event.created_at, eventSummaryB.event.created_at) : dataUtils.stringCompare(eventSummaryA.thread_created_at, eventSummaryB.thread_created_at);
2175
2279
  }));
2176
- if (lastEventSummary) {
2280
+ if (lastEventSummary && chatSummary.lastEventsPerType) {
2177
2281
  chatSummary.lastEvent = chatSummary.lastEventsPerType[lastEventSummary.event.type];
2178
2282
  }
2179
2283
  return chatSummary;
2180
2284
  });
2181
2285
  return {
2182
2286
  chatsSummary: dataUtils.numericSortBy(function (_ref4) {
2287
+ var _ref5;
2183
2288
  var lastEvent = _ref4.lastEvent,
2184
2289
  order = _ref4.order;
2185
- return -1 * (lastEvent !== undefined ? lastEvent.timestamp : order);
2290
+ return -1 * ((_ref5 = lastEvent !== undefined ? lastEvent.timestamp : order) != null ? _ref5 : 0);
2186
2291
  }, chatsSummary),
2187
2292
  totalChats: payload.total_chats,
2188
2293
  users: dataUtils.uniqBy(function (user) {
@@ -2302,6 +2407,11 @@ var parsePush = function parsePush(push) {
2302
2407
  // 'greeting_canceled' has the same payload as `greeting_accepted`
2303
2408
  payload: parseGreetingAcceptedPush(push.payload)
2304
2409
  };
2410
+ case GROUPS_STATUS_UPDATED:
2411
+ return {
2412
+ action: push.action,
2413
+ payload: push.payload
2414
+ };
2305
2415
  case INCOMING_CHAT:
2306
2416
  return {
2307
2417
  action: push.action,
@@ -2359,9 +2469,9 @@ var parsePush = function parsePush(push) {
2359
2469
  };
2360
2470
  }
2361
2471
  };
2362
- var parseResponse = function parseResponse(_ref5) {
2363
- var request = _ref5.request,
2364
- response = _ref5.response;
2472
+ var parseResponse = function parseResponse(_ref6) {
2473
+ var request = _ref6.request,
2474
+ response = _ref6.response;
2365
2475
  switch (response.action) {
2366
2476
  case ACCEPT_GREETING:
2367
2477
  return {
@@ -2606,150 +2716,6 @@ var socketListener = (function (store, socket) {
2606
2716
  return socket.off;
2607
2717
  });
2608
2718
 
2609
- var INCORRECT_REQUESTER_STRUCTURE = 'incorrect requester structure';
2610
- var appendString = function appendString(input, str) {
2611
- return input.length ? input + "\n" + str : str;
2612
- };
2613
- var createTicketBody = function createTicketBody(state, _ref) {
2614
- var fields = _ref.fields,
2615
- customerId = _ref.customerId,
2616
- _ref$groupId = _ref.groupId,
2617
- groupId = _ref$groupId === void 0 ? state.groupId : _ref$groupId,
2618
- timeZone = _ref.timeZone;
2619
- var ticketBody = _extends({
2620
- licence_id: state.licenseId,
2621
- ticket_message: '',
2622
- offline_message: '',
2623
- visitor_id: customerId,
2624
- requester: {}
2625
- }, typeof groupId === 'number' && {
2626
- group: groupId
2627
- }, state.page && {
2628
- source: {
2629
- url: state.page.url
2630
- }
2631
- }, timeZone && {
2632
- timezone: timeZone
2633
- });
2634
- return fields.reduce(function (body, field) {
2635
- switch (field.type) {
2636
- case 'subject':
2637
- {
2638
- var value = field.answer;
2639
- var text = value ? field.label + " " + value : field.label;
2640
- if (value) {
2641
- body.subject = value;
2642
- }
2643
- body.offline_message = appendString(body.offline_message, text);
2644
- return body;
2645
- }
2646
- case 'name':
2647
- {
2648
- var _value = field.answer;
2649
- var _text = _value ? field.label + " " + _value : field.label;
2650
- if (_value) {
2651
- body.requester.name = _value;
2652
- }
2653
- body.offline_message = appendString(body.offline_message, _text);
2654
- return body;
2655
- }
2656
- case 'email':
2657
- {
2658
- var _value2 = field.answer;
2659
- var _text2 = _value2 ? field.label + " " + _value2 : field.label;
2660
- body.requester.mail = _value2;
2661
- body.offline_message = appendString(body.offline_message, _text2);
2662
- return body;
2663
- }
2664
- case 'question':
2665
- case 'textarea':
2666
- {
2667
- var _value3 = field.answer;
2668
- var _text3 = _value3 ? field.label + " " + _value3 : field.label;
2669
- body.offline_message = appendString(body.offline_message, _text3);
2670
- body.ticket_message = appendString(body.ticket_message, _text3);
2671
- return body;
2672
- }
2673
- case 'radio':
2674
- case 'select':
2675
- {
2676
- var _value4 = field.answer && field.answer.label;
2677
- var _text4 = _value4 ? field.label + " " + _value4 : field.label;
2678
- body.offline_message = appendString(body.offline_message, _text4);
2679
- body.ticket_message = appendString(body.ticket_message, _text4);
2680
- return body;
2681
- }
2682
- case 'checkbox':
2683
- {
2684
- var _value5 = field.answers && field.answers.map(function (answer) {
2685
- return answer.label;
2686
- }).join(', ');
2687
- var _text5 = _value5 ? field.label + " " + _value5 : field.label;
2688
- body.offline_message = appendString(body.offline_message, _text5);
2689
- body.ticket_message = appendString(body.ticket_message, _text5);
2690
- return body;
2691
- }
2692
- default:
2693
- return body;
2694
- }
2695
- }, ticketBody);
2696
- };
2697
- var sendTicketForm = function sendTicketForm(store, auth, _ref2) {
2698
- var filledForm = _ref2.filledForm,
2699
- groupId = _ref2.groupId,
2700
- timeZone = _ref2.timeZone;
2701
- return auth.getToken().then(function (token) {
2702
- var state = store.getState();
2703
- if (getSelfId(state) === null) {
2704
- store.dispatch(setSelfId(token.entityId));
2705
- }
2706
- var url = getApiOrigin(state) + "/v2/tickets/new";
2707
- var body = createTicketBody(state, {
2708
- fields: filledForm.fields,
2709
- customerId: token.entityId,
2710
- groupId: groupId,
2711
- timeZone: timeZone
2712
- });
2713
- return unfetch__default['default'](url, {
2714
- method: 'POST',
2715
- headers: {
2716
- 'Content-Type': 'application/json'
2717
- },
2718
- body: JSON.stringify(body)
2719
- }).then(function (response) {
2720
- if (response.ok) {
2721
- return response.json().then(function (res) {
2722
- return _extends({}, res, {
2723
- text: body.ticket_message
2724
- });
2725
- });
2726
- }
2727
-
2728
- // we actually should normalize this somehow
2729
- if (response.status === 400 || response.status === 422) {
2730
- var errHandler = function errHandler(error) {
2731
- if (!error || !error.errors) {
2732
- // TODO: I honestly don't know if this can even be reached and even if it is - What error should be thrown here
2733
- throw new Error();
2734
- }
2735
- // we receive some hardcore aggregate error here 😱
2736
- var firstError = error.errors[0];
2737
- var type = Object.keys(firstError)[0];
2738
- if (type === INCORRECT_REQUESTER_STRUCTURE) {
2739
- throw createError({
2740
- message: firstError[INCORRECT_REQUESTER_STRUCTURE][0],
2741
- code: 'VALIDATION'
2742
- });
2743
- }
2744
- throw new Error();
2745
- };
2746
- return response.json().then(errHandler, errHandler);
2747
- }
2748
- throw new Error();
2749
- });
2750
- });
2751
- };
2752
-
2753
2719
  var KILOBYTE = 1024;
2754
2720
  var MEGABYTE = 1024 * KILOBYTE;
2755
2721
  var GIGABYTE = 1024 * MEGABYTE;
@@ -2792,7 +2758,7 @@ var uploadFile = function uploadFile(_ref, _ref2) {
2792
2758
  validateFile(file);
2793
2759
  var state = store.getState();
2794
2760
  var query = urlUtils.buildQueryString({
2795
- license_id: state.licenseId
2761
+ organization_id: state.organizationId
2796
2762
  });
2797
2763
  var url = getServerUrl(state) + "/action/" + UPLOAD_FILE + "?" + query;
2798
2764
  var payload = {
@@ -2858,7 +2824,7 @@ var makeGraylogRequest = function makeGraylogRequest(url, body) {
2858
2824
  */
2859
2825
  var log = function log(_ref) {
2860
2826
  var env = _ref.env,
2861
- licenseId = _ref.licenseId,
2827
+ organizationId = _ref.organizationId,
2862
2828
  eventName = _ref.eventName;
2863
2829
  if (env !== 'production' || "customer_sdk" !== 'customer_sdk') {
2864
2830
  return Promise.resolve();
@@ -2866,10 +2832,10 @@ var log = function log(_ref) {
2866
2832
  var message = {
2867
2833
  event_name: eventName,
2868
2834
  severity: 'Informational',
2869
- sdkVersion: "3.1.4"
2835
+ sdkVersion: "4.0.0"
2870
2836
  };
2871
2837
  var body = {
2872
- licence_id: licenseId,
2838
+ organizationId: organizationId,
2873
2839
  event_id: 'chat_widget_customer_sdk',
2874
2840
  message: JSON.stringify(message)
2875
2841
  };
@@ -2986,8 +2952,17 @@ var debug = (function (_sdk) {
2986
2952
  }));
2987
2953
  });
2988
2954
 
2955
+ var ASC = 'asc';
2956
+ var DESC = 'desc';
2957
+
2958
+ var sortOrders = /*#__PURE__*/Object.freeze({
2959
+ __proto__: null,
2960
+ ASC: ASC,
2961
+ DESC: DESC
2962
+ });
2963
+
2989
2964
  var CHATS_PAGINATION_MAX_LIMIT = 25;
2990
- var init = function init(config, env) {
2965
+ var init = function init(config, env, licenseId) {
2991
2966
  if (env === void 0) {
2992
2967
  env = 'production';
2993
2968
  }
@@ -3002,12 +2977,13 @@ var init = function init(config, env) {
3002
2977
  }));
3003
2978
  var emitter = mitt__default['default']();
3004
2979
  var socket = createSocketClient(store);
3005
- var auth = typeof identityProvider === 'function' ? identityProvider() : createAuth__default['default'](instanceConfig, env);
2980
+ var auth = typeof identityProvider === 'function' ? identityProvider() : createAuth__default['default'](instanceConfig, licenseId, env);
3006
2981
  store.addSideEffectsHandler(createSideEffectsHandler({
3007
2982
  emitter: emitter,
3008
2983
  socket: socket,
3009
2984
  auth: auth,
3010
- customerDataProvider: customerDataProvider
2985
+ customerDataProvider: customerDataProvider,
2986
+ licenseId: licenseId
3011
2987
  }));
3012
2988
  socketListener(store, socket);
3013
2989
  var sendRequestAction$1 = sendRequestAction.bind(null, store);
@@ -3206,7 +3182,7 @@ var init = function init(config, env) {
3206
3182
  resumeChat: function resumeChat(data) {
3207
3183
  log({
3208
3184
  env: env,
3209
- licenseId: config.licenseId,
3185
+ organizationId: config.organizationId,
3210
3186
  eventName: 'chat_started'
3211
3187
  });
3212
3188
  return sendRequestAction$1(sendRequest(RESUME_CHAT, parseResumeChatData(data)));
@@ -3222,9 +3198,6 @@ var init = function init(config, env) {
3222
3198
  }(function (params) {
3223
3199
  return sendRequestAction$1(sendEvent(params));
3224
3200
  }),
3225
- sendTicketForm: function sendTicketForm$1(options) {
3226
- return sendTicketForm(store, auth, options);
3227
- },
3228
3201
  sendRichMessagePostback: function sendRichMessagePostback(_ref15) {
3229
3202
  var chatId = _ref15.chatId,
3230
3203
  threadId = _ref15.threadId,
@@ -3261,7 +3234,7 @@ var init = function init(config, env) {
3261
3234
  }
3262
3235
  log({
3263
3236
  env: env,
3264
- licenseId: config.licenseId,
3237
+ organizationId: config.organizationId,
3265
3238
  eventName: 'chat_started'
3266
3239
  });
3267
3240
  return sendRequestAction$1(sendRequest(START_CHAT, parseStartChatData(data)));
@@ -3325,7 +3298,9 @@ var init = function init(config, env) {
3325
3298
  return api;
3326
3299
  };
3327
3300
 
3301
+ exports.connectionStatuses = connectionStatuses;
3328
3302
  exports.debug = debug;
3303
+ exports.eventTypes = eventTypes;
3329
3304
  exports.init = init;
3330
3305
  exports.parseCustomEvent = parseCustomEvent;
3331
3306
  exports.parseEvent = parseEvent$1;
@@ -3336,3 +3311,8 @@ exports.parseGreeting = parseGreeting;
3336
3311
  exports.parseMessage = parseMessage;
3337
3312
  exports.parseRichMessage = parseRichMessage;
3338
3313
  exports.parseSystemMessage = parseSystemMessage;
3314
+ exports.serverDisconnectionReasons = serverDisconnectionReasons;
3315
+ exports.serverErrorCodes = serverErrorCodes;
3316
+ exports.serverPushActions = serverPushActions;
3317
+ exports.sortOrders = sortOrders;
3318
+ exports.userTypes = userTypes;