@livechat/customer-sdk 3.1.5 → 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.
- package/README.md +26 -77
- package/dist/customer-sdk.cjs.js +208 -228
- package/dist/customer-sdk.cjs.native.js +208 -228
- package/dist/customer-sdk.esm.js +202 -227
- package/dist/customer-sdk.js +481 -399
- package/dist/customer-sdk.min.js +1 -1
- package/package.json +5 -6
- package/types/actions.d.ts +8 -8
- package/types/constants/organizationIds.d.ts +2 -0
- package/types/constants/serverDisconnectionReasons.d.ts +1 -0
- package/types/constants/serverPushActions.d.ts +1 -0
- package/types/createStore.d.ts +1 -1
- package/types/graylog/index.d.ts +2 -2
- package/types/index.d.ts +20 -7
- package/types/reducer.d.ts +14 -15
- package/types/serverFrameParser.d.ts +10 -2
- package/types/sideEffects/index.d.ts +2 -1
- package/types/sideStorage.d.ts +2 -2
- package/types/socketListener.d.ts +6 -3
- package/types/types/clientEntities.d.ts +2 -0
- package/types/types/frames.d.ts +10 -1
- package/types/types/serverEntities.d.ts +1 -0
- package/types/types/state.d.ts +2 -2
package/dist/customer-sdk.esm.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
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,
|
|
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
|
|
7
|
-
import promiseTry from '@livechat/promise-try';
|
|
6
|
+
import { promiseDeferred, promiseTry } from '@livechat/promise-utils';
|
|
8
7
|
import createBackoff from '@livechat/backoff';
|
|
9
8
|
import storage from '@livechat/isomorphic-storage';
|
|
10
9
|
import unfetch from 'unfetch';
|
|
@@ -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
|
|
182
|
+
var organizationId = _ref.organizationId,
|
|
167
183
|
env = _ref.env;
|
|
168
|
-
if (
|
|
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.
|
|
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
|
-
|
|
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: "
|
|
220
|
+
version: "4.0.0"
|
|
205
221
|
}),
|
|
206
|
-
|
|
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
|
|
661
|
-
resolve =
|
|
662
|
-
reject =
|
|
663
|
-
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
|
|
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
|
|
684
|
-
|
|
685
|
-
|
|
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"](
|
|
689
|
-
return {};
|
|
690
|
-
});
|
|
803
|
+
["catch"](noop);
|
|
691
804
|
};
|
|
692
805
|
var saveSideStorage = function saveSideStorage(store, sideStorage) {
|
|
693
|
-
|
|
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
|
-
|
|
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.
|
|
1507
|
+
version: '3.5',
|
|
1395
1508
|
payload: _extends({}, frame.payload, {
|
|
1396
1509
|
pushes: {
|
|
1397
|
-
// '3.
|
|
1398
|
-
'3.
|
|
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
|
|
1431
|
-
var
|
|
1432
|
-
|
|
1433
|
-
|
|
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(
|
|
1538
|
-
var emit =
|
|
1539
|
-
var 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 (
|
|
1565
|
-
var auth =
|
|
1566
|
-
customerDataProvider =
|
|
1567
|
-
emitter =
|
|
1568
|
-
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 (
|
|
1664
|
-
var creationDate =
|
|
1665
|
-
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
|
-
|
|
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(
|
|
2346
|
-
var request =
|
|
2347
|
-
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
|
-
|
|
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
|
-
|
|
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: "
|
|
2820
|
+
sdkVersion: "4.0.0"
|
|
2853
2821
|
};
|
|
2854
2822
|
var body = {
|
|
2855
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 };
|