@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
@@ -1,11 +1,10 @@
1
1
  import createAuth, { validateConfig } from '@livechat/customer-auth';
2
2
  import mitt from '@livechat/mitt';
3
- import { hasOwn, identity, toPairs, pickOwn, isObject, generateUniqueId, noop, pick, mapValues, keyBy, values, includes, isEmpty, numericSortBy, uniqBy, flatMap, last, stringCompare } from '@livechat/data-utils';
3
+ import { hasOwn, identity, toPairs, pickOwn, isObject, generateUniqueId, noop, pick, mapValues, keyBy, values, includes, numericSortBy, uniqBy, flatMap, last, stringCompare } from '@livechat/data-utils';
4
4
  import { createStore, applyMiddleware } from 'redux';
5
5
  import createSideEffectsMiddleware from '@livechat/side-effects-middleware';
6
+ import { promiseDeferred, promiseTry } from '@livechat/promise-utils';
6
7
  import createBackoff from '@livechat/backoff';
7
- import deferred from '@livechat/deferred';
8
- import promiseTry from '@livechat/promise-try';
9
8
  import storage from '@livechat/isomorphic-storage';
10
9
  import unfetch from 'unfetch';
11
10
  import { buildQueryString, removeProtocol } from '@livechat/url-utils';
@@ -137,9 +136,26 @@ var DISCONNECTED = 'disconnected';
137
136
  var PAUSED = 'paused';
138
137
  var RECONNECTING = 'reconnecting';
139
138
 
139
+ var connectionStatuses = /*#__PURE__*/Object.freeze({
140
+ __proto__: null,
141
+ CONNECTED: CONNECTED,
142
+ DESTROYED: DESTROYED,
143
+ DISCONNECTED: DISCONNECTED,
144
+ PAUSED: PAUSED,
145
+ RECONNECTING: RECONNECTING
146
+ });
147
+
140
148
  var AGENT = 'agent';
141
149
  var CUSTOMER = 'customer';
142
150
 
151
+ var userTypes = /*#__PURE__*/Object.freeze({
152
+ __proto__: null,
153
+ AGENT: AGENT,
154
+ CUSTOMER: CUSTOMER
155
+ });
156
+
157
+ var LIVECHAT_ORGANIZATION_ID = 'feaf6c0e-9f43-48ff-9ad0-8e24e0350932';
158
+
143
159
  var getAllRequests = function getAllRequests(state) {
144
160
  return state.requests;
145
161
  };
@@ -163,9 +179,9 @@ var isDestroyed = function isDestroyed(state) {
163
179
  return getConnectionStatus(state) === DESTROYED;
164
180
  };
165
181
  var getEnvPart = function getEnvPart(_ref) {
166
- var licenseId = _ref.licenseId,
182
+ var organizationId = _ref.organizationId,
167
183
  env = _ref.env;
168
- if (licenseId === 1520) {
184
+ if (organizationId === LIVECHAT_ORGANIZATION_ID) {
169
185
  return '.staging';
170
186
  }
171
187
  if (env === 'production') {
@@ -179,12 +195,12 @@ var getApiOrigin = function getApiOrigin(state) {
179
195
  return "https://api" + regionPart + getEnvPart(state) + ".livechatinc.com";
180
196
  };
181
197
  var getServerUrl = function getServerUrl(state) {
182
- return getApiOrigin(state) + "/v3.3/customer";
198
+ return getApiOrigin(state) + "/v3.5/customer";
183
199
  };
184
200
  var createInitialState = function createInitialState(initialStateData) {
185
201
  var _initialStateData$app = initialStateData.application,
186
202
  application = _initialStateData$app === void 0 ? {} : _initialStateData$app,
187
- licenseId = initialStateData.licenseId,
203
+ organizationId = initialStateData.organizationId,
188
204
  _initialStateData$gro = initialStateData.groupId,
189
205
  groupId = _initialStateData$gro === void 0 ? null : _initialStateData$gro,
190
206
  env = initialStateData.env,
@@ -201,9 +217,9 @@ var createInitialState = function createInitialState(initialStateData) {
201
217
  return {
202
218
  application: _extends({}, application, {
203
219
  name: "customer_sdk",
204
- version: "3.1.4"
220
+ version: "4.0.0"
205
221
  }),
206
- licenseId: licenseId,
222
+ organizationId: organizationId,
207
223
  env: env,
208
224
  groupId: groupId,
209
225
  chats: {},
@@ -321,9 +337,12 @@ function createError(_ref) {
321
337
  }
322
338
 
323
339
  var ACCESS_TOKEN_EXPIRED = 'access_token_expired';
340
+ var CONNECTION_TIMEOUT = 'connection_timeout';
324
341
  var CUSTOMER_BANNED = 'customer_banned';
325
342
  // customer tried reconnecting too many times after they received too_many_connections error
326
343
  var CUSTOMER_TEMPORARILY_BLOCKED = 'customer_temporarily_blocked';
344
+ var INACTIVITY_TIMEOUT = 'inactivity_timeout';
345
+ var INTERNAL_ERROR = 'internal_error';
327
346
  var LICENSE_EXPIRED = 'license_expired';
328
347
  var LICENSE_NOT_FOUND = 'license_not_found';
329
348
  var MISDIRECTED_CONNECTION$1 = 'misdirected_connection';
@@ -337,6 +356,27 @@ var TOO_MANY_CONNECTIONS = 'too_many_connections';
337
356
  // the limit of unauthorized connections is per IP
338
357
  var TOO_MANY_UNAUTHORIZED_CONNECTIONS = 'too_many_unauthorized_connections';
339
358
  var UNSUPPORTED_VERSION = 'unsupported_version';
359
+ // introduced in 3.5 meaning the customer was logged out by the server
360
+ var LOGGED_OUT_REMOTELY = 'logged_out_remotely';
361
+
362
+ var serverDisconnectionReasons = /*#__PURE__*/Object.freeze({
363
+ __proto__: null,
364
+ ACCESS_TOKEN_EXPIRED: ACCESS_TOKEN_EXPIRED,
365
+ CONNECTION_TIMEOUT: CONNECTION_TIMEOUT,
366
+ CUSTOMER_BANNED: CUSTOMER_BANNED,
367
+ CUSTOMER_TEMPORARILY_BLOCKED: CUSTOMER_TEMPORARILY_BLOCKED,
368
+ INACTIVITY_TIMEOUT: INACTIVITY_TIMEOUT,
369
+ INTERNAL_ERROR: INTERNAL_ERROR,
370
+ LICENSE_EXPIRED: LICENSE_EXPIRED,
371
+ LICENSE_NOT_FOUND: LICENSE_NOT_FOUND,
372
+ MISDIRECTED_CONNECTION: MISDIRECTED_CONNECTION$1,
373
+ PRODUCT_VERSION_CHANGED: PRODUCT_VERSION_CHANGED,
374
+ SERVICE_TEMPORARILY_UNAVAILABLE: SERVICE_TEMPORARILY_UNAVAILABLE$1,
375
+ TOO_MANY_CONNECTIONS: TOO_MANY_CONNECTIONS,
376
+ TOO_MANY_UNAUTHORIZED_CONNECTIONS: TOO_MANY_UNAUTHORIZED_CONNECTIONS,
377
+ UNSUPPORTED_VERSION: UNSUPPORTED_VERSION,
378
+ LOGGED_OUT_REMOTELY: LOGGED_OUT_REMOTELY
379
+ });
340
380
 
341
381
  var CHAT_DEACTIVATED = 'chat_deactivated';
342
382
  var CHAT_PROPERTIES_DELETED = 'chat_properties_deleted';
@@ -352,6 +392,7 @@ var EVENT_UPDATED = 'event_updated';
352
392
  var EVENTS_MARKED_AS_SEEN = 'events_marked_as_seen';
353
393
  var GREETING_ACCEPTED = 'greeting_accepted';
354
394
  var GREETING_CANCELED = 'greeting_canceled';
395
+ var GROUPS_STATUS_UPDATED = 'groups_status_updated';
355
396
  var INCOMING_CHAT = 'incoming_chat';
356
397
  var INCOMING_EVENT = 'incoming_event';
357
398
  var INCOMING_GREETING = 'incoming_greeting';
@@ -380,6 +421,7 @@ var serverPushActions = /*#__PURE__*/Object.freeze({
380
421
  EVENTS_MARKED_AS_SEEN: EVENTS_MARKED_AS_SEEN,
381
422
  GREETING_ACCEPTED: GREETING_ACCEPTED,
382
423
  GREETING_CANCELED: GREETING_CANCELED,
424
+ GROUPS_STATUS_UPDATED: GROUPS_STATUS_UPDATED,
383
425
  INCOMING_CHAT: INCOMING_CHAT,
384
426
  INCOMING_EVENT: INCOMING_EVENT,
385
427
  INCOMING_GREETING: INCOMING_GREETING,
@@ -401,6 +443,17 @@ var RICH_MESSAGE = 'rich_message';
401
443
  var SYSTEM_MESSAGE = 'system_message';
402
444
  var CUSTOM = 'custom';
403
445
 
446
+ var eventTypes = /*#__PURE__*/Object.freeze({
447
+ __proto__: null,
448
+ FILE: FILE,
449
+ FORM: FORM,
450
+ FILLED_FORM: FILLED_FORM,
451
+ MESSAGE: MESSAGE,
452
+ RICH_MESSAGE: RICH_MESSAGE,
453
+ SYSTEM_MESSAGE: SYSTEM_MESSAGE,
454
+ CUSTOM: CUSTOM
455
+ });
456
+
404
457
  var createEventBase = function createEventBase(event) {
405
458
  var base = {};
406
459
  if (typeof event.customId === 'string') {
@@ -657,10 +710,10 @@ var socketDisconnected = function socketDisconnected() {
657
710
  // TODO: this thing is not really well typed and should be improved
658
711
  var sendRequestAction = function sendRequestAction(store, action) {
659
712
  action.payload.id = generateUniqueId(store.getState().requests);
660
- var _deferred = deferred(),
661
- resolve = _deferred.resolve,
662
- reject = _deferred.reject,
663
- promise = _deferred.promise;
713
+ var _promiseDeferred = promiseDeferred(),
714
+ resolve = _promiseDeferred.resolve,
715
+ reject = _promiseDeferred.reject,
716
+ promise = _promiseDeferred.promise;
664
717
  action.payload.promise = promise;
665
718
  action.payload.resolve = resolve;
666
719
  action.payload.reject = reject;
@@ -669,28 +722,88 @@ var sendRequestAction = function sendRequestAction(store, action) {
669
722
  };
670
723
 
671
724
  var AUTHENTICATION = 'AUTHENTICATION';
725
+ var AUTHORIZATION = 'AUTHORIZATION';
726
+ var CHAT_ALREADY_ACTIVE = 'CHAT_ALREADY_ACTIVE';
727
+ var CHAT_LIMIT_REACHED = 'CHAT_LIMIT_REACHED';
672
728
  var CUSTOMER_BANNED$1 = 'CUSTOMER_BANNED';
729
+ var CUSTOMER_SESSION_FIELDS_LIMIT_REACHED = 'CUSTOMER_SESSION_FIELDS_LIMIT_REACHED';
730
+ var ENTITY_TOO_LARGE = 'ENTITY_TOO_LARGE';
731
+ var GREETING_NOT_FOUND = 'GREETING_NOT_FOUND';
732
+ var GROUP_OFFLINE = 'GROUP_OFFLINE';
733
+ var GROUPS_OFFLINE = 'GROUPS_OFFLINE';
734
+ var GROUP_NOT_FOUND = 'GROUP_NOT_FOUND';
735
+ var GROUP_UNAVAILABLE = 'GROUP_UNAVAILABLE';
736
+ var INTERNAL = 'INTERNAL';
737
+ var LICENSE_EXPIRED$1 = 'LICENSE_EXPIRED';
738
+ // actually this can happen only when using REST
739
+ var MISDIRECTED_REQUEST = 'MISDIRECTED_REQUEST';
740
+ var PENDING_REQUESTS_LIMIT_REACHED = 'PENDING_REQUESTS_LIMIT_REACHED';
741
+ var REQUEST_TIMEOUT$1 = 'REQUEST_TIMEOUT';
742
+ var SERVICE_UNAVAILABLE = 'SERVICE_UNAVAILABLE';
743
+ var UNSUPPORTED_VERSION$1 = 'UNSUPPORTED_VERSION';
673
744
  var USERS_LIMIT_REACHED = 'USERS_LIMIT_REACHED';
745
+ var VALIDATION = 'VALIDATION';
674
746
  var WRONG_PRODUCT_VERSION = 'WRONG_PRODUCT_VERSION';
675
747
 
676
- var getSideStorageKey = function getSideStorageKey(store) {
748
+ var serverErrorCodes = /*#__PURE__*/Object.freeze({
749
+ __proto__: null,
750
+ AUTHENTICATION: AUTHENTICATION,
751
+ AUTHORIZATION: AUTHORIZATION,
752
+ CHAT_ALREADY_ACTIVE: CHAT_ALREADY_ACTIVE,
753
+ CHAT_LIMIT_REACHED: CHAT_LIMIT_REACHED,
754
+ CUSTOMER_BANNED: CUSTOMER_BANNED$1,
755
+ CUSTOMER_SESSION_FIELDS_LIMIT_REACHED: CUSTOMER_SESSION_FIELDS_LIMIT_REACHED,
756
+ ENTITY_TOO_LARGE: ENTITY_TOO_LARGE,
757
+ GREETING_NOT_FOUND: GREETING_NOT_FOUND,
758
+ GROUP_OFFLINE: GROUP_OFFLINE,
759
+ GROUPS_OFFLINE: GROUPS_OFFLINE,
760
+ GROUP_NOT_FOUND: GROUP_NOT_FOUND,
761
+ GROUP_UNAVAILABLE: GROUP_UNAVAILABLE,
762
+ INTERNAL: INTERNAL,
763
+ LICENSE_EXPIRED: LICENSE_EXPIRED$1,
764
+ MISDIRECTED_REQUEST: MISDIRECTED_REQUEST,
765
+ PENDING_REQUESTS_LIMIT_REACHED: PENDING_REQUESTS_LIMIT_REACHED,
766
+ REQUEST_TIMEOUT: REQUEST_TIMEOUT$1,
767
+ SERVICE_UNAVAILABLE: SERVICE_UNAVAILABLE,
768
+ UNSUPPORTED_VERSION: UNSUPPORTED_VERSION$1,
769
+ USERS_LIMIT_REACHED: USERS_LIMIT_REACHED,
770
+ VALIDATION: VALIDATION,
771
+ WRONG_PRODUCT_VERSION: WRONG_PRODUCT_VERSION
772
+ });
773
+
774
+ var getSideStorageKeyByLicense = function getSideStorageKeyByLicense(store, licenseId) {
677
775
  var _store$getState = store.getState(),
678
- licenseId = _store$getState.licenseId,
679
776
  groupId = _store$getState.groupId,
680
777
  uniqueGroups = _store$getState.uniqueGroups;
681
778
  return "side_storage_" + licenseId + (uniqueGroups ? ":" + groupId : '');
682
779
  };
683
- var getSideStorage = function getSideStorage(store) {
684
- return storage.getItem(getSideStorageKey(store))["catch"](noop).then(function (sideStorage) {
685
- return JSON.parse(sideStorage || '{}');
780
+ var getSideStorageKeyByOrganization = function getSideStorageKeyByOrganization(store) {
781
+ var _store$getState2 = store.getState(),
782
+ organizationId = _store$getState2.organizationId,
783
+ groupId = _store$getState2.groupId,
784
+ uniqueGroups = _store$getState2.uniqueGroups;
785
+ return "side_storage_" + organizationId + (uniqueGroups ? ":" + groupId : '');
786
+ };
787
+ var getSideStorage = function getSideStorage(store, licenseId) {
788
+ var sideStorageLicenseKey = getSideStorageKeyByLicense(store, licenseId);
789
+ var sideStorageOrganizationKey = getSideStorageKeyByOrganization(store);
790
+ return storage.getItem(sideStorageLicenseKey)["catch"](noop).then(function (sideStorage) {
791
+ if (!sideStorage) {
792
+ return storage.getItem(sideStorageOrganizationKey)["catch"](noop).then(function (organizationSideStorage) {
793
+ return JSON.parse(organizationSideStorage || '{}');
794
+ })["catch"](noop);
795
+ }
796
+ return storage.setItem(sideStorageOrganizationKey, sideStorage)["catch"](noop).then(function () {
797
+ return storage.removeItem(sideStorageLicenseKey)["catch"](noop).then(function () {
798
+ return JSON.parse(sideStorage);
799
+ })["catch"](noop);
800
+ });
686
801
  })
687
802
  // shouldnt get triggered, just a defensive measure against malformed storage entries
688
- ["catch"](function () {
689
- return {};
690
- });
803
+ ["catch"](noop);
691
804
  };
692
805
  var saveSideStorage = function saveSideStorage(store, sideStorage) {
693
- return storage.setItem(getSideStorageKey(store), JSON.stringify(sideStorage))["catch"](noop);
806
+ storage.setItem(getSideStorageKeyByOrganization(store), JSON.stringify(sideStorage))["catch"](noop);
694
807
  };
695
808
 
696
809
  var taskChain = function taskChain(_ref, onSuccess, onError) {
@@ -731,7 +844,7 @@ var delay = function delay(ms) {
731
844
  setTimeout(resolve, ms);
732
845
  });
733
846
  };
734
- function createLoginTask(auth, customerDataProvider) {
847
+ function createLoginTask(auth, customerDataProvider, licenseId) {
735
848
  var store;
736
849
  var sentPage = null;
737
850
  var task;
@@ -752,7 +865,7 @@ function createLoginTask(auth, customerDataProvider) {
752
865
  return store.dispatch(reconnect(currentBackoffStrategy.duration()));
753
866
  };
754
867
  var getTokenAndSideStorage = function getTokenAndSideStorage() {
755
- return Promise.all([auth.getToken(), getSideStorage(store)]);
868
+ return Promise.all([auth.getToken(), getSideStorage(store, licenseId)]);
756
869
  };
757
870
  var dispatchSelfId = function dispatchSelfId(_ref2) {
758
871
  var token = _ref2[0],
@@ -892,7 +1005,7 @@ var checkGoals = function checkGoals(store, auth, sessionFields) {
892
1005
  return;
893
1006
  }
894
1007
  var query = buildQueryString({
895
- license_id: state.licenseId
1008
+ organization_id: state.organizationId
896
1009
  });
897
1010
  var payload = {
898
1011
  session_fields: parseCustomerSessionFields(sessionFields || {}),
@@ -1391,11 +1504,11 @@ var sendRequest$1 = function sendRequest(socket, _ref3) {
1391
1504
  {
1392
1505
  var upgradedPushes = [];
1393
1506
  socket.emit(_extends({}, frame, {
1394
- version: '3.3',
1507
+ version: '3.5',
1395
1508
  payload: _extends({}, frame.payload, {
1396
1509
  pushes: {
1397
- // '3.4': upgradedPushes,
1398
- '3.3': values(serverPushActions).filter(function (pushAction) {
1510
+ // '3.6': upgradedPushes,
1511
+ '3.5': values(serverPushActions).filter(function (pushAction) {
1399
1512
  return (
1400
1513
  // `customer_disconnected` can be sent immediately after opening the connection, before it even received login request
1401
1514
  // therefore it's not possible to subscribe for a particular version of this push - the "connection version" is always used
@@ -1427,25 +1540,10 @@ var emitUsers = function emitUsers(emit, users) {
1427
1540
  emit('user_data', user);
1428
1541
  });
1429
1542
  };
1430
- var handleMulticast = function handleMulticast(emit, _ref4) {
1431
- var type = _ref4.type,
1432
- content = _ref4.content;
1433
- if (type !== 'lc2') {
1434
- return;
1435
- }
1436
- if (content.name === 'groups_update' && 'groups' in content && !isEmpty(content.groups)) {
1437
- var _content$groups = content.groups,
1438
- group = _content$groups[0];
1439
- var availability = parseGroupStatus(group.status);
1440
- emit('availability_updated', {
1441
- availability: availability
1442
- });
1443
- }
1444
- };
1445
- var handlePush = function handlePush(_ref5, _ref6) {
1446
- var emit = _ref5.emit,
1447
- store = _ref5.store;
1448
- var payload = _ref6.payload;
1543
+ var handlePush = function handlePush(_ref4, _ref5) {
1544
+ var emit = _ref4.emit,
1545
+ store = _ref4.store;
1546
+ var payload = _ref5.payload;
1449
1547
  switch (payload.action) {
1450
1548
  case THREAD_PROPERTIES_UPDATED:
1451
1549
  if (payload.payload.properties.lc2 && 'queue_pos' in payload.payload.properties.lc2) {
@@ -1485,6 +1583,7 @@ var handlePush = function handlePush(_ref5, _ref6) {
1485
1583
  case PRODUCT_VERSION_CHANGED:
1486
1584
  case TOO_MANY_CONNECTIONS:
1487
1585
  case UNSUPPORTED_VERSION:
1586
+ case LOGGED_OUT_REMOTELY:
1488
1587
  // this also emits `disconnected` event - but it's handled in response to this action by destroy handler
1489
1588
  store.dispatch(destroy(payload.payload.reason));
1490
1589
  break;
@@ -1507,6 +1606,16 @@ var handlePush = function handlePush(_ref5, _ref6) {
1507
1606
  break;
1508
1607
  }
1509
1608
  return;
1609
+ case GROUPS_STATUS_UPDATED:
1610
+ {
1611
+ var _payload$payload$grou = payload.payload.groups,
1612
+ group = _payload$payload$grou[0];
1613
+ var availability = parseGroupStatus(group.status);
1614
+ emit('availability_updated', {
1615
+ availability: availability
1616
+ });
1617
+ return;
1618
+ }
1510
1619
  case INCOMING_CHAT:
1511
1620
  emitUsers(emit, payload.payload.chat.users);
1512
1621
  emit(payload.action, payload.payload);
@@ -1520,11 +1629,6 @@ var handlePush = function handlePush(_ref5, _ref6) {
1520
1629
  case INCOMING_TYPING_INDICATOR:
1521
1630
  emit(payload.action, payload.payload);
1522
1631
  return;
1523
- case INCOMING_MULTICAST:
1524
- handleMulticast(emit, payload.payload);
1525
- // we passthrough this action even if it was already handled above
1526
- emit(payload.action, payload.payload);
1527
- return;
1528
1632
  case USER_ADDED_TO_CHAT:
1529
1633
  emitUsers(emit, [payload.payload.user]);
1530
1634
  emit(payload.action, payload.payload);
@@ -1534,9 +1638,9 @@ var handlePush = function handlePush(_ref5, _ref6) {
1534
1638
  return;
1535
1639
  }
1536
1640
  };
1537
- var handleResponse = function handleResponse(_ref7, _ref8) {
1538
- var emit = _ref7.emit;
1539
- var payload = _ref8.payload;
1641
+ var handleResponse = function handleResponse(_ref6, _ref7) {
1642
+ var emit = _ref6.emit;
1643
+ var payload = _ref7.payload;
1540
1644
  switch (payload.action) {
1541
1645
  case CHAT_DEACTIVATED:
1542
1646
  payload.resolve(SUCCESS);
@@ -1561,13 +1665,14 @@ var handleResponse = function handleResponse(_ref7, _ref8) {
1561
1665
  return;
1562
1666
  }
1563
1667
  };
1564
- var createSideEffectsHandler = (function (_ref9) {
1565
- var auth = _ref9.auth,
1566
- customerDataProvider = _ref9.customerDataProvider,
1567
- emitter = _ref9.emitter,
1568
- socket = _ref9.socket;
1668
+ var createSideEffectsHandler = (function (_ref8) {
1669
+ var auth = _ref8.auth,
1670
+ customerDataProvider = _ref8.customerDataProvider,
1671
+ emitter = _ref8.emitter,
1672
+ socket = _ref8.socket,
1673
+ licenseId = _ref8.licenseId;
1569
1674
  var emit = emitter.emit;
1570
- var loginTask = createLoginTask(auth, customerDataProvider);
1675
+ var loginTask = createLoginTask(auth, customerDataProvider, licenseId);
1571
1676
 
1572
1677
  // TODO: using Store type here is a lie, middleware only provides MiddlewareAPI here
1573
1678
  return function (action, store) {
@@ -1590,6 +1695,7 @@ var createSideEffectsHandler = (function (_ref9) {
1590
1695
  case CUSTOMER_BANNED:
1591
1696
  case LICENSE_EXPIRED:
1592
1697
  case PRODUCT_VERSION_CHANGED:
1698
+ case LOGGED_OUT_REMOTELY:
1593
1699
  // normalize those to CONNECTION_LOST as the handling on the consumer's side should be the same
1594
1700
  failAllRequests(store, CONNECTION_LOST);
1595
1701
  emit('disconnected', payload);
@@ -1660,9 +1766,9 @@ var createSideEffectsHandler = (function (_ref9) {
1660
1766
  if (!hasToken) {
1661
1767
  return auth.getToken();
1662
1768
  }
1663
- return auth.getToken().then(function (_ref10) {
1664
- var creationDate = _ref10.creationDate,
1665
- expiresIn = _ref10.expiresIn;
1769
+ return auth.getToken().then(function (_ref9) {
1770
+ var creationDate = _ref9.creationDate,
1771
+ expiresIn = _ref9.expiresIn;
1666
1772
  var ONE_HOUR = 60 * 60 * 1000;
1667
1773
  // check if the token is worth reusing
1668
1774
  // we don't want to get disconnected in a moment because of expired token
@@ -1864,7 +1970,7 @@ var initialize = function initialize(store, emitter) {
1864
1970
  var url = (getServerUrl(state) + "/rtm/ws").replace(/^https/, 'wss');
1865
1971
  return createPlatformClient(url, {
1866
1972
  query: {
1867
- license_id: state.licenseId
1973
+ organization_id: state.organizationId
1868
1974
  },
1869
1975
  emitter: emitter
1870
1976
  });
@@ -2156,16 +2262,17 @@ var parseListChatsResponse = function parseListChatsResponse(payload) {
2156
2262
  var lastEventSummary = last(lastEventSummariesArray.sort(function (eventSummaryA, eventSummaryB) {
2157
2263
  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);
2158
2264
  }));
2159
- if (lastEventSummary) {
2265
+ if (lastEventSummary && chatSummary.lastEventsPerType) {
2160
2266
  chatSummary.lastEvent = chatSummary.lastEventsPerType[lastEventSummary.event.type];
2161
2267
  }
2162
2268
  return chatSummary;
2163
2269
  });
2164
2270
  return {
2165
2271
  chatsSummary: numericSortBy(function (_ref4) {
2272
+ var _ref5;
2166
2273
  var lastEvent = _ref4.lastEvent,
2167
2274
  order = _ref4.order;
2168
- return -1 * (lastEvent !== undefined ? lastEvent.timestamp : order);
2275
+ return -1 * ((_ref5 = lastEvent !== undefined ? lastEvent.timestamp : order) != null ? _ref5 : 0);
2169
2276
  }, chatsSummary),
2170
2277
  totalChats: payload.total_chats,
2171
2278
  users: uniqBy(function (user) {
@@ -2285,6 +2392,11 @@ var parsePush = function parsePush(push) {
2285
2392
  // 'greeting_canceled' has the same payload as `greeting_accepted`
2286
2393
  payload: parseGreetingAcceptedPush(push.payload)
2287
2394
  };
2395
+ case GROUPS_STATUS_UPDATED:
2396
+ return {
2397
+ action: push.action,
2398
+ payload: push.payload
2399
+ };
2288
2400
  case INCOMING_CHAT:
2289
2401
  return {
2290
2402
  action: push.action,
@@ -2342,9 +2454,9 @@ var parsePush = function parsePush(push) {
2342
2454
  };
2343
2455
  }
2344
2456
  };
2345
- var parseResponse = function parseResponse(_ref5) {
2346
- var request = _ref5.request,
2347
- response = _ref5.response;
2457
+ var parseResponse = function parseResponse(_ref6) {
2458
+ var request = _ref6.request,
2459
+ response = _ref6.response;
2348
2460
  switch (response.action) {
2349
2461
  case ACCEPT_GREETING:
2350
2462
  return {
@@ -2589,150 +2701,6 @@ var socketListener = (function (store, socket) {
2589
2701
  return socket.off;
2590
2702
  });
2591
2703
 
2592
- var INCORRECT_REQUESTER_STRUCTURE = 'incorrect requester structure';
2593
- var appendString = function appendString(input, str) {
2594
- return input.length ? input + "\n" + str : str;
2595
- };
2596
- var createTicketBody = function createTicketBody(state, _ref) {
2597
- var fields = _ref.fields,
2598
- customerId = _ref.customerId,
2599
- _ref$groupId = _ref.groupId,
2600
- groupId = _ref$groupId === void 0 ? state.groupId : _ref$groupId,
2601
- timeZone = _ref.timeZone;
2602
- var ticketBody = _extends({
2603
- licence_id: state.licenseId,
2604
- ticket_message: '',
2605
- offline_message: '',
2606
- visitor_id: customerId,
2607
- requester: {}
2608
- }, typeof groupId === 'number' && {
2609
- group: groupId
2610
- }, state.page && {
2611
- source: {
2612
- url: state.page.url
2613
- }
2614
- }, timeZone && {
2615
- timezone: timeZone
2616
- });
2617
- return fields.reduce(function (body, field) {
2618
- switch (field.type) {
2619
- case 'subject':
2620
- {
2621
- var value = field.answer;
2622
- var text = value ? field.label + " " + value : field.label;
2623
- if (value) {
2624
- body.subject = value;
2625
- }
2626
- body.offline_message = appendString(body.offline_message, text);
2627
- return body;
2628
- }
2629
- case 'name':
2630
- {
2631
- var _value = field.answer;
2632
- var _text = _value ? field.label + " " + _value : field.label;
2633
- if (_value) {
2634
- body.requester.name = _value;
2635
- }
2636
- body.offline_message = appendString(body.offline_message, _text);
2637
- return body;
2638
- }
2639
- case 'email':
2640
- {
2641
- var _value2 = field.answer;
2642
- var _text2 = _value2 ? field.label + " " + _value2 : field.label;
2643
- body.requester.mail = _value2;
2644
- body.offline_message = appendString(body.offline_message, _text2);
2645
- return body;
2646
- }
2647
- case 'question':
2648
- case 'textarea':
2649
- {
2650
- var _value3 = field.answer;
2651
- var _text3 = _value3 ? field.label + " " + _value3 : field.label;
2652
- body.offline_message = appendString(body.offline_message, _text3);
2653
- body.ticket_message = appendString(body.ticket_message, _text3);
2654
- return body;
2655
- }
2656
- case 'radio':
2657
- case 'select':
2658
- {
2659
- var _value4 = field.answer && field.answer.label;
2660
- var _text4 = _value4 ? field.label + " " + _value4 : field.label;
2661
- body.offline_message = appendString(body.offline_message, _text4);
2662
- body.ticket_message = appendString(body.ticket_message, _text4);
2663
- return body;
2664
- }
2665
- case 'checkbox':
2666
- {
2667
- var _value5 = field.answers && field.answers.map(function (answer) {
2668
- return answer.label;
2669
- }).join(', ');
2670
- var _text5 = _value5 ? field.label + " " + _value5 : field.label;
2671
- body.offline_message = appendString(body.offline_message, _text5);
2672
- body.ticket_message = appendString(body.ticket_message, _text5);
2673
- return body;
2674
- }
2675
- default:
2676
- return body;
2677
- }
2678
- }, ticketBody);
2679
- };
2680
- var sendTicketForm = function sendTicketForm(store, auth, _ref2) {
2681
- var filledForm = _ref2.filledForm,
2682
- groupId = _ref2.groupId,
2683
- timeZone = _ref2.timeZone;
2684
- return auth.getToken().then(function (token) {
2685
- var state = store.getState();
2686
- if (getSelfId(state) === null) {
2687
- store.dispatch(setSelfId(token.entityId));
2688
- }
2689
- var url = getApiOrigin(state) + "/v2/tickets/new";
2690
- var body = createTicketBody(state, {
2691
- fields: filledForm.fields,
2692
- customerId: token.entityId,
2693
- groupId: groupId,
2694
- timeZone: timeZone
2695
- });
2696
- return unfetch(url, {
2697
- method: 'POST',
2698
- headers: {
2699
- 'Content-Type': 'application/json'
2700
- },
2701
- body: JSON.stringify(body)
2702
- }).then(function (response) {
2703
- if (response.ok) {
2704
- return response.json().then(function (res) {
2705
- return _extends({}, res, {
2706
- text: body.ticket_message
2707
- });
2708
- });
2709
- }
2710
-
2711
- // we actually should normalize this somehow
2712
- if (response.status === 400 || response.status === 422) {
2713
- var errHandler = function errHandler(error) {
2714
- if (!error || !error.errors) {
2715
- // TODO: I honestly don't know if this can even be reached and even if it is - What error should be thrown here
2716
- throw new Error();
2717
- }
2718
- // we receive some hardcore aggregate error here 😱
2719
- var firstError = error.errors[0];
2720
- var type = Object.keys(firstError)[0];
2721
- if (type === INCORRECT_REQUESTER_STRUCTURE) {
2722
- throw createError({
2723
- message: firstError[INCORRECT_REQUESTER_STRUCTURE][0],
2724
- code: 'VALIDATION'
2725
- });
2726
- }
2727
- throw new Error();
2728
- };
2729
- return response.json().then(errHandler, errHandler);
2730
- }
2731
- throw new Error();
2732
- });
2733
- });
2734
- };
2735
-
2736
2704
  var KILOBYTE = 1024;
2737
2705
  var MEGABYTE = 1024 * KILOBYTE;
2738
2706
  var GIGABYTE = 1024 * MEGABYTE;
@@ -2775,7 +2743,7 @@ var uploadFile = function uploadFile(_ref, _ref2) {
2775
2743
  validateFile(file);
2776
2744
  var state = store.getState();
2777
2745
  var query = buildQueryString({
2778
- license_id: state.licenseId
2746
+ organization_id: state.organizationId
2779
2747
  });
2780
2748
  var url = getServerUrl(state) + "/action/" + UPLOAD_FILE + "?" + query;
2781
2749
  var payload = {
@@ -2841,7 +2809,7 @@ var makeGraylogRequest = function makeGraylogRequest(url, body) {
2841
2809
  */
2842
2810
  var log = function log(_ref) {
2843
2811
  var env = _ref.env,
2844
- licenseId = _ref.licenseId,
2812
+ organizationId = _ref.organizationId,
2845
2813
  eventName = _ref.eventName;
2846
2814
  if (env !== 'production' || "customer_sdk" !== 'customer_sdk') {
2847
2815
  return Promise.resolve();
@@ -2849,10 +2817,10 @@ var log = function log(_ref) {
2849
2817
  var message = {
2850
2818
  event_name: eventName,
2851
2819
  severity: 'Informational',
2852
- sdkVersion: "3.1.4"
2820
+ sdkVersion: "4.0.0"
2853
2821
  };
2854
2822
  var body = {
2855
- licence_id: licenseId,
2823
+ organizationId: organizationId,
2856
2824
  event_id: 'chat_widget_customer_sdk',
2857
2825
  message: JSON.stringify(message)
2858
2826
  };
@@ -2969,8 +2937,17 @@ var debug = (function (_sdk) {
2969
2937
  }));
2970
2938
  });
2971
2939
 
2940
+ var ASC = 'asc';
2941
+ var DESC = 'desc';
2942
+
2943
+ var sortOrders = /*#__PURE__*/Object.freeze({
2944
+ __proto__: null,
2945
+ ASC: ASC,
2946
+ DESC: DESC
2947
+ });
2948
+
2972
2949
  var CHATS_PAGINATION_MAX_LIMIT = 25;
2973
- var init = function init(config, env) {
2950
+ var init = function init(config, env, licenseId) {
2974
2951
  if (env === void 0) {
2975
2952
  env = 'production';
2976
2953
  }
@@ -2985,12 +2962,13 @@ var init = function init(config, env) {
2985
2962
  }));
2986
2963
  var emitter = mitt();
2987
2964
  var socket = createSocketClient(store);
2988
- var auth = typeof identityProvider === 'function' ? identityProvider() : createAuth(instanceConfig, env);
2965
+ var auth = typeof identityProvider === 'function' ? identityProvider() : createAuth(instanceConfig, licenseId, env);
2989
2966
  store.addSideEffectsHandler(createSideEffectsHandler({
2990
2967
  emitter: emitter,
2991
2968
  socket: socket,
2992
2969
  auth: auth,
2993
- customerDataProvider: customerDataProvider
2970
+ customerDataProvider: customerDataProvider,
2971
+ licenseId: licenseId
2994
2972
  }));
2995
2973
  socketListener(store, socket);
2996
2974
  var sendRequestAction$1 = sendRequestAction.bind(null, store);
@@ -3189,7 +3167,7 @@ var init = function init(config, env) {
3189
3167
  resumeChat: function resumeChat(data) {
3190
3168
  log({
3191
3169
  env: env,
3192
- licenseId: config.licenseId,
3170
+ organizationId: config.organizationId,
3193
3171
  eventName: 'chat_started'
3194
3172
  });
3195
3173
  return sendRequestAction$1(sendRequest(RESUME_CHAT, parseResumeChatData(data)));
@@ -3205,9 +3183,6 @@ var init = function init(config, env) {
3205
3183
  }(function (params) {
3206
3184
  return sendRequestAction$1(sendEvent(params));
3207
3185
  }),
3208
- sendTicketForm: function sendTicketForm$1(options) {
3209
- return sendTicketForm(store, auth, options);
3210
- },
3211
3186
  sendRichMessagePostback: function sendRichMessagePostback(_ref15) {
3212
3187
  var chatId = _ref15.chatId,
3213
3188
  threadId = _ref15.threadId,
@@ -3244,7 +3219,7 @@ var init = function init(config, env) {
3244
3219
  }
3245
3220
  log({
3246
3221
  env: env,
3247
- licenseId: config.licenseId,
3222
+ organizationId: config.organizationId,
3248
3223
  eventName: 'chat_started'
3249
3224
  });
3250
3225
  return sendRequestAction$1(sendRequest(START_CHAT, parseStartChatData(data)));
@@ -3308,4 +3283,4 @@ var init = function init(config, env) {
3308
3283
  return api;
3309
3284
  };
3310
3285
 
3311
- export { debug, init, parseCustomEvent, parseEvent$1 as parseEvent, parseFile, parseFilledForm, parseForm$1 as parseForm, parseGreeting, parseMessage, parseRichMessage, parseSystemMessage };
3286
+ export { connectionStatuses, debug, eventTypes, init, parseCustomEvent, parseEvent$1 as parseEvent, parseFile, parseFilledForm, parseForm$1 as parseForm, parseGreeting, parseMessage, parseRichMessage, parseSystemMessage, serverDisconnectionReasons, serverErrorCodes, serverPushActions, sortOrders, userTypes };