@livechat/customer-sdk 4.0.2 → 5.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,15 +3,15 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var createAuth = require('@livechat/customer-auth');
6
- var mitt = require('@livechat/mitt');
7
6
  var dataUtils = require('@livechat/data-utils');
7
+ var mitt = require('@livechat/mitt');
8
8
  var redux = require('redux');
9
9
  var createSideEffectsMiddleware = require('@livechat/side-effects-middleware');
10
10
  var promiseUtils = require('@livechat/promise-utils');
11
- var createBackoff = require('@livechat/backoff');
12
- var storage = require('@livechat/isomorphic-storage');
13
- var unfetch = require('unfetch');
14
11
  var urlUtils = require('@livechat/url-utils');
12
+ var fetch$1 = require('unfetch');
13
+ var isomorphicStorage = require('@livechat/isomorphic-storage');
14
+ var createBackoff = require('@livechat/backoff');
15
15
  var createPlatformClient = require('@livechat/platform-client');
16
16
  var rawUploadFile = require('@livechat/file-upload');
17
17
 
@@ -20,55 +20,241 @@ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'defau
20
20
  var createAuth__default = /*#__PURE__*/_interopDefaultLegacy(createAuth);
21
21
  var mitt__default = /*#__PURE__*/_interopDefaultLegacy(mitt);
22
22
  var createSideEffectsMiddleware__default = /*#__PURE__*/_interopDefaultLegacy(createSideEffectsMiddleware);
23
+ var fetch__default = /*#__PURE__*/_interopDefaultLegacy(fetch$1);
23
24
  var createBackoff__default = /*#__PURE__*/_interopDefaultLegacy(createBackoff);
24
- var storage__default = /*#__PURE__*/_interopDefaultLegacy(storage);
25
- var unfetch__default = /*#__PURE__*/_interopDefaultLegacy(unfetch);
26
25
  var createPlatformClient__default = /*#__PURE__*/_interopDefaultLegacy(createPlatformClient);
27
26
  var rawUploadFile__default = /*#__PURE__*/_interopDefaultLegacy(rawUploadFile);
28
27
 
28
+ function _arrayLikeToArray(r, a) {
29
+ (null == a || a > r.length) && (a = r.length);
30
+ for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
31
+ return n;
32
+ }
29
33
  function _extends() {
30
- _extends = Object.assign ? Object.assign.bind() : function (target) {
31
- for (var i = 1; i < arguments.length; i++) {
32
- var source = arguments[i];
33
- for (var key in source) {
34
- if (Object.prototype.hasOwnProperty.call(source, key)) {
35
- target[key] = source[key];
36
- }
37
- }
34
+ return _extends = Object.assign ? Object.assign.bind() : function (n) {
35
+ for (var e = 1; e < arguments.length; e++) {
36
+ var t = arguments[e];
37
+ for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
38
38
  }
39
- return target;
40
- };
41
- return _extends.apply(this, arguments);
39
+ return n;
40
+ }, _extends.apply(null, arguments);
42
41
  }
43
- function _objectWithoutPropertiesLoose(source, excluded) {
44
- if (source == null) return {};
45
- var target = {};
46
- var sourceKeys = Object.keys(source);
47
- var key, i;
48
- for (i = 0; i < sourceKeys.length; i++) {
49
- key = sourceKeys[i];
50
- if (excluded.indexOf(key) >= 0) continue;
51
- target[key] = source[key];
42
+ function _objectWithoutPropertiesLoose(r, e) {
43
+ if (null == r) return {};
44
+ var t = {};
45
+ for (var n in r) if ({}.hasOwnProperty.call(r, n)) {
46
+ if (-1 !== e.indexOf(n)) continue;
47
+ t[n] = r[n];
52
48
  }
53
- return target;
49
+ return t;
54
50
  }
55
- function _toPrimitive(input, hint) {
56
- if (typeof input !== "object" || input === null) return input;
57
- var prim = input[Symbol.toPrimitive];
58
- if (prim !== undefined) {
59
- var res = prim.call(input, hint || "default");
60
- if (typeof res !== "object") return res;
51
+ function _toPrimitive(t, r) {
52
+ if ("object" != typeof t || !t) return t;
53
+ var e = t[Symbol.toPrimitive];
54
+ if (void 0 !== e) {
55
+ var i = e.call(t, r || "default");
56
+ if ("object" != typeof i) return i;
61
57
  throw new TypeError("@@toPrimitive must return a primitive value.");
62
58
  }
63
- return (hint === "string" ? String : Number)(input);
59
+ return ("string" === r ? String : Number)(t);
64
60
  }
65
- function _toPropertyKey(arg) {
66
- var key = _toPrimitive(arg, "string");
67
- return typeof key === "symbol" ? key : String(key);
61
+ function _toPropertyKey(t) {
62
+ var i = _toPrimitive(t, "string");
63
+ return "symbol" == typeof i ? i : i + "";
68
64
  }
69
65
 
66
+ var FILE = 'file';
67
+ var FORM = 'form';
68
+ var FILLED_FORM = 'filled_form';
69
+ var MESSAGE = 'message';
70
+ var RICH_MESSAGE = 'rich_message';
71
+ var SYSTEM_MESSAGE = 'system_message';
72
+ var CUSTOM = 'custom';
73
+
74
+ var eventTypes = /*#__PURE__*/Object.freeze({
75
+ __proto__: null,
76
+ FILE: FILE,
77
+ FORM: FORM,
78
+ FILLED_FORM: FILLED_FORM,
79
+ MESSAGE: MESSAGE,
80
+ RICH_MESSAGE: RICH_MESSAGE,
81
+ SYSTEM_MESSAGE: SYSTEM_MESSAGE,
82
+ CUSTOM: CUSTOM
83
+ });
84
+
85
+ var _excluded$5 = ["groupId"];
86
+ var createEventBase = function createEventBase(event) {
87
+ var base = {};
88
+ if (typeof event.customId === 'string') {
89
+ base.custom_id = event.customId;
90
+ }
91
+ if (dataUtils.isObject(event.properties)) {
92
+ base.properties = event.properties;
93
+ }
94
+ return base;
95
+ };
96
+
97
+ // TODO: we could validate and throw here
98
+ // but should we? maybe only in DEV mode?
99
+ var parseEvent$1 = function parseEvent(event) {
100
+ switch (event.type) {
101
+ case MESSAGE:
102
+ {
103
+ var message = _extends({}, createEventBase(event), {
104
+ type: event.type,
105
+ text: event.text
106
+ });
107
+ if (event.postback) {
108
+ message.postback = {
109
+ id: event.postback.id,
110
+ thread_id: event.postback.threadId,
111
+ event_id: event.postback.eventId,
112
+ type: event.postback.type,
113
+ value: event.postback.value
114
+ };
115
+ }
116
+ return message;
117
+ }
118
+ case FILE:
119
+ {
120
+ var file = _extends({}, createEventBase(event), {
121
+ type: event.type,
122
+ url: event.url,
123
+ alternative_text: event.alternativeText
124
+ });
125
+ return file;
126
+ }
127
+ case FILLED_FORM:
128
+ {
129
+ var filledForm = _extends({}, createEventBase(event), {
130
+ type: event.type,
131
+ form_id: event.formId
132
+ }, event.formType && {
133
+ form_type: event.formType
134
+ }, {
135
+ fields: event.fields.map(function (field) {
136
+ switch (field.type) {
137
+ case 'group_chooser':
138
+ {
139
+ if (!field.answer) {
140
+ return field;
141
+ }
142
+ var _field$answer = field.answer,
143
+ groupId = _field$answer.groupId,
144
+ answer = _objectWithoutPropertiesLoose(_field$answer, _excluded$5);
145
+ return _extends({}, field, {
146
+ answer: _extends({}, answer, {
147
+ group_id: groupId
148
+ })
149
+ });
150
+ }
151
+ default:
152
+ return field;
153
+ }
154
+ })
155
+ });
156
+ return filledForm;
157
+ }
158
+ case SYSTEM_MESSAGE:
159
+ {
160
+ var systemMessage = _extends({}, createEventBase(event), {
161
+ type: event.type,
162
+ text: event.text,
163
+ system_message_type: event.systemMessageType
164
+ });
165
+ if (event.recipients) {
166
+ systemMessage.recipients = event.recipients;
167
+ }
168
+ return systemMessage;
169
+ }
170
+ case CUSTOM:
171
+ {
172
+ var customEvent = _extends({}, createEventBase(event), {
173
+ type: event.type
174
+ });
175
+ if (event.content) {
176
+ customEvent.content = event.content;
177
+ }
178
+ return customEvent;
179
+ }
180
+ }
181
+ };
182
+ var parseThreadData = function parseThreadData(thread) {
183
+ var data = {};
184
+ var events = thread.events,
185
+ properties = thread.properties;
186
+ if (events) {
187
+ data.events = events.map(parseEvent$1);
188
+ }
189
+ if (properties) {
190
+ data.properties = properties;
191
+ }
192
+ return data;
193
+ };
194
+ var parseStartChatData = function parseStartChatData(_ref) {
195
+ var _ref$active = _ref.active,
196
+ active = _ref$active === void 0 ? true : _ref$active,
197
+ chat = _ref.chat,
198
+ welcomeMessageId = _ref.welcomeMessageId,
199
+ continuous = _ref.continuous;
200
+ var data = {
201
+ active: active,
202
+ chat: {}
203
+ };
204
+ if (typeof continuous === 'boolean') {
205
+ data.continuous = continuous;
206
+ }
207
+ if (welcomeMessageId && typeof welcomeMessageId === 'string') {
208
+ data.welcome_message_id = welcomeMessageId;
209
+ }
210
+ if (!chat) {
211
+ return data;
212
+ }
213
+ var access = chat.access,
214
+ thread = chat.thread,
215
+ properties = chat.properties;
216
+ if (access && access.groupIds) {
217
+ data.chat.access = {
218
+ group_ids: access.groupIds
219
+ };
220
+ }
221
+ if (properties) {
222
+ data.chat.properties = properties;
223
+ }
224
+ if (thread) {
225
+ data.chat.thread = parseThreadData(thread);
226
+ }
227
+ return data;
228
+ };
229
+ var parseResumeChatData = function parseResumeChatData(requestData) {
230
+ var data = parseStartChatData(requestData);
231
+ return _extends({}, data, {
232
+ chat: _extends({}, data.chat, {
233
+ id: requestData.chat.id
234
+ })
235
+ });
236
+ };
237
+ var parseCustomerSessionFields$1 = function parseCustomerSessionFields(sessionFields) {
238
+ return dataUtils.toPairs(sessionFields).map(function (_ref2) {
239
+ var _ref3;
240
+ var key = _ref2[0],
241
+ value = _ref2[1];
242
+ return _ref3 = {}, _ref3[key] = value, _ref3;
243
+ });
244
+ };
245
+ var parseCustomerUpdate = function parseCustomerUpdate(update) {
246
+ var result = dataUtils.pickOwn(['avatar', 'name', 'email'], update);
247
+ if (update.sessionFields) {
248
+ result.session_fields = parseCustomerSessionFields$1(update.sessionFields);
249
+ }
250
+ if (typeof update.nameIsDefault === 'boolean') {
251
+ result.name_is_default = update.nameIsDefault;
252
+ }
253
+ return result;
254
+ };
255
+
70
256
  var CHANGE_REGION = 'change_region';
71
- var CHECK_GOALS = 'check_goals';
257
+ var CHECK_GOALS$1 = 'check_goals';
72
258
  var DESTROY = 'destroy';
73
259
  var FAIL_ALL_REQUESTS = 'fail_all_requests';
74
260
  var LOGIN_SUCCESS = 'login_success';
@@ -87,21 +273,13 @@ var SOCKET_DISCONNECTED = 'socket_disconnected';
87
273
  var SOCKET_RECOVERED = 'socket_recovered';
88
274
  var SOCKET_UNSTABLE = 'socket_unstable';
89
275
  var START_CONNECTION = 'start_connection';
90
- var UPDATE_CUSTOMER_PAGE = 'update_customer_page';
91
-
92
- var CONNECTION_LOST = 'CONNECTION_LOST';
93
- var IDENTITY_MISMATCH = 'IDENTITY_MISMATCH';
94
- var MISDIRECTED_CONNECTION = 'MISDIRECTED_CONNECTION';
95
- var MISSING_CHAT_THREAD = 'MISSING_CHAT_THREAD';
96
- var NO_CONNECTION = 'NO_CONNECTION';
97
- var REQUEST_TIMEOUT = 'REQUEST_TIMEOUT';
98
- var SDK_DESTROYED = 'SDK_DESTROYED';
99
- var SERVICE_TEMPORARILY_UNAVAILABLE = 'SERVICE_TEMPORARILY_UNAVAILABLE';
100
- var TOO_BIG_FILE = 'TOO_BIG_FILE';
276
+ var UPDATE_CUSTOMER_PAGE$1 = 'update_customer_page';
277
+ var CLEAR_SENSITIVE_SESSION_STATE = 'clear_sensitive_session_state';
278
+ var IDENTITY_CHANGED = 'identity_changed';
101
279
 
102
280
  var ACCEPT_GREETING = 'accept_greeting';
103
281
  var CANCEL_GREETING = 'cancel_greeting';
104
- var CHECK_GOALS$1 = 'check_goals';
282
+ var CHECK_GOALS = 'check_goals';
105
283
  var DEACTIVATE_CHAT = 'deactivate_chat';
106
284
  var DELETE_CHAT_PROPERTIES = 'delete_chat_properties';
107
285
  var DELETE_EVENT_PROPERTIES = 'delete_event_properties';
@@ -109,268 +287,176 @@ var DELETE_THREAD_PROPERTIES = 'delete_thread_properties';
109
287
  var GET_CHAT = 'get_chat';
110
288
  var GET_CUSTOMER = 'get_customer';
111
289
  var GET_FORM = 'get_form';
112
- var GET_PREDICTED_AGENT = 'get_predicted_agent';
113
290
  var GET_URL_INFO = 'get_url_info';
114
291
  var LIST_CHATS = 'list_chats';
115
292
  var LIST_GROUP_STATUSES = 'list_group_statuses';
116
293
  var LIST_THREADS = 'list_threads';
117
294
  var LOGIN = 'login';
118
295
  var MARK_EVENTS_AS_SEEN = 'mark_events_as_seen';
296
+ var REQUEST_WELCOME_MESSAGE = 'request_welcome_message';
119
297
  var RESUME_CHAT = 'resume_chat';
120
298
  var SEND_EVENT = 'send_event';
299
+ var SEND_GREETING_BUTTON_CLICKED = 'send_greeting_button_clicked';
300
+ var SEND_CUSTOMER_ACTIONS = 'send_customer_actions';
121
301
  var SEND_RICH_MESSAGE_POSTBACK = 'send_rich_message_postback';
122
302
  var SEND_SNEAK_PEEK = 'send_sneak_peek';
123
303
  var SET_CUSTOMER_SESSION_FIELDS = 'set_customer_session_fields';
124
304
  var START_CHAT = 'start_chat';
125
305
  var UPDATE_CHAT_PROPERTIES = 'update_chat_properties';
126
306
  var UPDATE_CUSTOMER = 'update_customer';
127
- var UPDATE_CUSTOMER_PAGE$1 = 'update_customer_page';
307
+ var UPDATE_CUSTOMER_PAGE = 'update_customer_page';
128
308
  var UPDATE_EVENT_PROPERTIES = 'update_event_properties';
129
309
  var UPDATE_THREAD_PROPERTIES = 'update_thread_properties';
130
310
  var UPLOAD_FILE = 'upload_file';
131
311
 
132
- var createReducer = function createReducer(initialState, reducersMap) {
133
- if (process.env.NODE_ENV !== 'development' && reducersMap[undefined]) {
134
- // eslint-disable-next-line no-console
135
- console.warn(["Reducer contains an 'undefined' action type.", 'Have you misspelled a constant?'].join('\n'));
312
+ var destroy = function destroy(reason) {
313
+ return {
314
+ type: DESTROY,
315
+ payload: {
316
+ reason: reason
317
+ }
318
+ };
319
+ };
320
+ var loginSuccess = function loginSuccess(payload) {
321
+ return {
322
+ type: LOGIN_SUCCESS,
323
+ payload: payload
324
+ };
325
+ };
326
+ var pauseConnection = function pauseConnection(reason) {
327
+ return {
328
+ type: PAUSE_CONNECTION,
329
+ payload: {
330
+ reason: reason
331
+ }
332
+ };
333
+ };
334
+ var prefetchToken = function prefetchToken(fresh) {
335
+ if (fresh === void 0) {
336
+ fresh = false;
136
337
  }
137
- return function reducer(state, action) {
138
- if (state === void 0) {
139
- state = initialState;
338
+ return {
339
+ type: PREFETCH_TOKEN,
340
+ payload: {
341
+ fresh: fresh
140
342
  }
141
- if (dataUtils.hasOwn(action.type, reducersMap)) {
142
- return reducersMap[action.type](state, action.payload);
343
+ };
344
+ };
345
+ var reconnect = function reconnect(delay) {
346
+ return {
347
+ type: RECONNECT,
348
+ payload: {
349
+ delay: delay
143
350
  }
144
- return state;
145
351
  };
146
352
  };
147
353
 
148
- var CONNECTED = 'connected';
149
- var DESTROYED = 'destroyed';
150
- var DISCONNECTED = 'disconnected';
151
- var PAUSED = 'paused';
152
- var RECONNECTING = 'reconnecting';
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
-
163
- var AGENT = 'agent';
164
- var CUSTOMER = 'customer';
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
-
174
- var getAllRequests = function getAllRequests(state) {
175
- return state.requests;
176
- };
177
- var getConnectionStatus = function getConnectionStatus(state) {
178
- return state.connection.status;
179
- };
180
- var getRequest = function getRequest(state, id) {
181
- return state.requests[id];
182
- };
183
- var getSelfId = function getSelfId(state) {
184
- return state.users.self.id;
185
- };
186
- var isChatActive = function isChatActive(state, chatId) {
187
- var chat = state.chats[chatId];
188
- return !!chat && chat.active;
189
- };
190
- var isConnected = function isConnected(state) {
191
- return getConnectionStatus(state) === CONNECTED;
192
- };
193
- var isDestroyed = function isDestroyed(state) {
194
- return getConnectionStatus(state) === DESTROYED;
354
+ // TODO: this one was currently pretty hard to type in full
355
+ // we should explore providing stricter types for this in the future
356
+ var sendRequest$1 = function sendRequest(action, payload, source) {
357
+ return {
358
+ type: SEND_REQUEST,
359
+ payload: _extends({
360
+ request: {
361
+ action: action,
362
+ payload: payload
363
+ }
364
+ }, source && {
365
+ source: source
366
+ })
367
+ };
195
368
  };
196
- var getEnvPart = function getEnvPart(_ref) {
197
- var organizationId = _ref.organizationId,
198
- env = _ref.env;
199
- if (organizationId === LIVECHAT_ORGANIZATION_ID) {
200
- return '.staging';
201
- }
202
- if (env === 'production') {
203
- return '';
369
+ var sendEvent = function sendEvent(_ref) {
370
+ var chatId = _ref.chatId,
371
+ event = _ref.event,
372
+ attachToLastThread = _ref.attachToLastThread;
373
+ var payload = {
374
+ chat_id: chatId,
375
+ event: parseEvent$1(event)
376
+ };
377
+ if (attachToLastThread) {
378
+ payload.attach_to_last_thread = true;
204
379
  }
205
- return "." + env;
380
+ return sendRequest$1(SEND_EVENT, payload);
206
381
  };
207
- var getApiOrigin = function getApiOrigin(state) {
208
- var region = state.region;
209
- var regionPart = region ? "-" + region : '';
210
- return "https://api" + regionPart + getEnvPart(state) + ".livechatinc.com";
382
+ var setChatActive = function setChatActive(id, active) {
383
+ return {
384
+ type: SET_CHAT_ACTIVE,
385
+ payload: {
386
+ id: id,
387
+ active: active
388
+ }
389
+ };
211
390
  };
212
- var getServerUrl = function getServerUrl(state) {
213
- return getApiOrigin(state) + "/v3.5/customer";
391
+ var setSelfId = function setSelfId(id) {
392
+ return {
393
+ type: SET_SELF_ID,
394
+ payload: {
395
+ id: id
396
+ }
397
+ };
214
398
  };
215
- var createInitialState = function createInitialState(initialStateData) {
216
- var _initialStateData$app = initialStateData.application,
217
- application = _initialStateData$app === void 0 ? {} : _initialStateData$app,
218
- organizationId = initialStateData.organizationId,
219
- _initialStateData$gro = initialStateData.groupId,
220
- groupId = _initialStateData$gro === void 0 ? null : _initialStateData$gro,
221
- env = initialStateData.env,
222
- _initialStateData$pag = initialStateData.page,
223
- page = _initialStateData$pag === void 0 ? null : _initialStateData$pag,
224
- _initialStateData$reg = initialStateData.region,
225
- region = _initialStateData$reg === void 0 ? null : _initialStateData$reg,
226
- _initialStateData$ref = initialStateData.referrer,
227
- referrer = _initialStateData$ref === void 0 ? null : _initialStateData$ref,
228
- _initialStateData$uni = initialStateData.uniqueGroups,
229
- uniqueGroups = _initialStateData$uni === void 0 ? false : _initialStateData$uni,
230
- _initialStateData$mob = initialStateData.mobile,
231
- mobile = _initialStateData$mob === void 0 ? false : _initialStateData$mob;
399
+ var socketDisconnected = function socketDisconnected() {
232
400
  return {
233
- application: _extends({}, application, {
234
- name: "customer_sdk",
235
- version: "4.0.2"
236
- }),
237
- organizationId: organizationId,
238
- env: env,
239
- groupId: groupId,
240
- chats: {},
241
- connection: {
242
- status: DISCONNECTED
243
- },
244
- page: page,
245
- region: region,
246
- referrer: referrer,
247
- requests: {},
248
- users: {
249
- self: {
250
- id: null,
251
- type: CUSTOMER
252
- },
253
- others: {}
254
- },
255
- uniqueGroups: uniqueGroups,
256
- mobile: mobile
401
+ type: SOCKET_DISCONNECTED
257
402
  };
258
403
  };
259
- var removeStoredRequest = function removeStoredRequest(state, _ref2) {
260
- var id = _ref2.id;
261
- var _state$requests = state.requests,
262
- requests = _objectWithoutPropertiesLoose(_state$requests, [id].map(_toPropertyKey));
263
- return _extends({}, state, {
264
- requests: requests
265
- });
404
+ var clearSensitiveSessionState = function clearSensitiveSessionState() {
405
+ return {
406
+ type: CLEAR_SENSITIVE_SESSION_STATE
407
+ };
266
408
  };
267
- var setConnectionStatus = function setConnectionStatus(status, state) {
268
- return _extends({}, state, {
269
- connection: _extends({}, state.connection, {
270
- status: status
271
- })
272
- });
409
+ var identityChanged = function identityChanged(payload) {
410
+ return {
411
+ type: IDENTITY_CHANGED,
412
+ payload: payload
413
+ };
273
414
  };
274
- var createReducer$1 = (function (state) {
275
- var _createReducer;
276
- return createReducer(state, (_createReducer = {}, _createReducer[CHANGE_REGION] = function (state, _ref3) {
277
- var region = _ref3.region;
278
- return _extends({}, state, {
279
- region: region
280
- });
281
- }, _createReducer[DESTROY] = function (state) {
282
- return setConnectionStatus(DESTROYED, state);
283
- }, _createReducer[LOGIN_SUCCESS] = function (state) {
284
- return setConnectionStatus(CONNECTED, state);
285
- }, _createReducer[PAUSE_CONNECTION] = function (state) {
286
- return setConnectionStatus(PAUSED, state);
287
- }, _createReducer[REQUEST_FAILED] = removeStoredRequest, _createReducer[RESPONSE_RECEIVED] = removeStoredRequest, _createReducer[PUSH_RESPONSE_RECEIVED] = removeStoredRequest, _createReducer[SEND_REQUEST] = function (state, _ref4) {
288
- var _extends2;
289
- var promise = _ref4.promise,
290
- resolve = _ref4.resolve,
291
- reject = _ref4.reject,
292
- id = _ref4.id,
293
- request = _ref4.request;
294
- return _extends({}, state, {
295
- requests: _extends({}, state.requests, (_extends2 = {}, _extends2[id] = {
296
- id: id,
297
- promise: promise,
298
- resolve: resolve,
299
- reject: reject,
300
- request: request
301
- }, _extends2))
302
- });
303
- }, _createReducer[SET_CHAT_ACTIVE] = function (state, _ref5) {
304
- var _extends3;
305
- var id = _ref5.id,
306
- active = _ref5.active;
307
- return _extends({}, state, {
308
- chats: _extends({}, state.chats, (_extends3 = {}, _extends3[id] = _extends({}, state.chats[id], {
309
- active: active
310
- }), _extends3))
311
- });
312
- }, _createReducer[SET_SELF_ID] = function (state, payload) {
313
- return _extends({}, state, {
314
- users: _extends({}, state.users, {
315
- self: _extends({}, state.users.self, {
316
- id: payload.id
317
- })
318
- })
319
- });
320
- }, _createReducer[SOCKET_DISCONNECTED] = function (state) {
321
- var previousStatus = getConnectionStatus(state);
322
- if (process.env.NODE_ENV !== 'production' && (previousStatus === PAUSED || previousStatus === DESTROYED)) {
323
- throw new Error("Got 'socket_disconnected' action when in " + previousStatus + " state. This should be an impossible state.");
324
- }
325
- var state1 = setConnectionStatus(previousStatus === DISCONNECTED ? DISCONNECTED : RECONNECTING, state);
326
- return _extends({}, state1, {
327
- requests: {}
328
- });
329
- }, _createReducer[UPDATE_CUSTOMER_PAGE] = function (state, page) {
330
- return _extends({}, state, {
331
- page: _extends({}, state.page, page)
332
- });
333
- }, _createReducer));
334
- });
335
415
 
336
- function finalCreateStore(initialStateData) {
337
- var compose = process.env.NODE_ENV === 'development' && typeof window !== 'undefined' && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({
338
- name: '@livechat/customer-sdk'
339
- }) : dataUtils.identity;
340
- var sideEffectsMiddleware = createSideEffectsMiddleware__default['default']();
341
- var store = redux.createStore(createReducer$1(createInitialState(initialStateData)), compose(redux.applyMiddleware(sideEffectsMiddleware)));
342
- store.addSideEffectsHandler = sideEffectsMiddleware.add;
343
- return store;
344
- }
416
+ var CONNECTION_LOST = 'CONNECTION_LOST';
417
+ var MISDIRECTED_CONNECTION$1 = 'MISDIRECTED_CONNECTION';
418
+ var MISSING_CHAT_THREAD = 'MISSING_CHAT_THREAD';
419
+ var NO_CONNECTION = 'NO_CONNECTION';
420
+ var REQUEST_TIMEOUT$1 = 'REQUEST_TIMEOUT';
421
+ var SDK_DESTROYED = 'SDK_DESTROYED';
422
+ var SERVICE_TEMPORARILY_UNAVAILABLE$1 = 'SERVICE_TEMPORARILY_UNAVAILABLE';
423
+ var TOO_BIG_FILE = 'TOO_BIG_FILE';
345
424
 
346
- function createError(_ref) {
347
- var message = _ref.message,
348
- code = _ref.code;
349
- var error = new Error(message);
350
- error.code = code;
351
- return error;
352
- }
425
+ var CONNECTED = 'connected';
426
+ var DESTROYED = 'destroyed';
427
+ var DISCONNECTED = 'disconnected';
428
+ var PAUSED = 'paused';
429
+ var RECONNECTING = 'reconnecting';
430
+
431
+ var connectionStatuses = /*#__PURE__*/Object.freeze({
432
+ __proto__: null,
433
+ CONNECTED: CONNECTED,
434
+ DESTROYED: DESTROYED,
435
+ DISCONNECTED: DISCONNECTED,
436
+ PAUSED: PAUSED,
437
+ RECONNECTING: RECONNECTING
438
+ });
353
439
 
354
440
  var ACCESS_TOKEN_EXPIRED = 'access_token_expired';
355
441
  var CONNECTION_TIMEOUT = 'connection_timeout';
356
- var CUSTOMER_BANNED = 'customer_banned';
442
+ var CUSTOMER_BANNED$1 = 'customer_banned';
357
443
  // customer tried reconnecting too many times after they received too_many_connections error
358
444
  var CUSTOMER_TEMPORARILY_BLOCKED = 'customer_temporarily_blocked';
359
445
  var INACTIVITY_TIMEOUT = 'inactivity_timeout';
360
446
  var INTERNAL_ERROR = 'internal_error';
361
- var LICENSE_EXPIRED = 'license_expired';
447
+ var LICENSE_EXPIRED$1 = 'license_expired';
362
448
  var LICENSE_NOT_FOUND = 'license_not_found';
363
- var MISDIRECTED_CONNECTION$1 = 'misdirected_connection';
449
+ var MISDIRECTED_CONNECTION = 'misdirected_connection';
364
450
  var PRODUCT_VERSION_CHANGED = 'product_version_changed';
365
451
  // the limit of connections per user host has been exceeded
366
452
  // or rate limit for new connections has been hit
367
453
  // (in 3.2 only the latter case, the first one is using `too_many_connections` to avoid breaking changes)
368
- var SERVICE_TEMPORARILY_UNAVAILABLE$1 = 'service_temporarily_unavailable';
454
+ var SERVICE_TEMPORARILY_UNAVAILABLE = 'service_temporarily_unavailable';
369
455
  // the limit of those connections is per user
370
456
  var TOO_MANY_CONNECTIONS = 'too_many_connections';
371
457
  // the limit of unauthorized connections is per IP
372
458
  var TOO_MANY_UNAUTHORIZED_CONNECTIONS = 'too_many_unauthorized_connections';
373
- var UNSUPPORTED_VERSION = 'unsupported_version';
459
+ var UNSUPPORTED_VERSION$1 = 'unsupported_version';
374
460
  // introduced in 3.5 meaning the customer was logged out by the server
375
461
  var LOGGED_OUT_REMOTELY = 'logged_out_remotely';
376
462
 
@@ -378,47 +464,99 @@ var serverDisconnectionReasons = /*#__PURE__*/Object.freeze({
378
464
  __proto__: null,
379
465
  ACCESS_TOKEN_EXPIRED: ACCESS_TOKEN_EXPIRED,
380
466
  CONNECTION_TIMEOUT: CONNECTION_TIMEOUT,
381
- CUSTOMER_BANNED: CUSTOMER_BANNED,
467
+ CUSTOMER_BANNED: CUSTOMER_BANNED$1,
382
468
  CUSTOMER_TEMPORARILY_BLOCKED: CUSTOMER_TEMPORARILY_BLOCKED,
383
469
  INACTIVITY_TIMEOUT: INACTIVITY_TIMEOUT,
384
470
  INTERNAL_ERROR: INTERNAL_ERROR,
385
- LICENSE_EXPIRED: LICENSE_EXPIRED,
471
+ LICENSE_EXPIRED: LICENSE_EXPIRED$1,
386
472
  LICENSE_NOT_FOUND: LICENSE_NOT_FOUND,
387
- MISDIRECTED_CONNECTION: MISDIRECTED_CONNECTION$1,
473
+ MISDIRECTED_CONNECTION: MISDIRECTED_CONNECTION,
388
474
  PRODUCT_VERSION_CHANGED: PRODUCT_VERSION_CHANGED,
389
- SERVICE_TEMPORARILY_UNAVAILABLE: SERVICE_TEMPORARILY_UNAVAILABLE$1,
475
+ SERVICE_TEMPORARILY_UNAVAILABLE: SERVICE_TEMPORARILY_UNAVAILABLE,
390
476
  TOO_MANY_CONNECTIONS: TOO_MANY_CONNECTIONS,
391
477
  TOO_MANY_UNAUTHORIZED_CONNECTIONS: TOO_MANY_UNAUTHORIZED_CONNECTIONS,
392
- UNSUPPORTED_VERSION: UNSUPPORTED_VERSION,
478
+ UNSUPPORTED_VERSION: UNSUPPORTED_VERSION$1,
393
479
  LOGGED_OUT_REMOTELY: LOGGED_OUT_REMOTELY
394
480
  });
395
481
 
396
- var CHAT_DEACTIVATED = 'chat_deactivated';
397
- var CHAT_PROPERTIES_DELETED = 'chat_properties_deleted';
398
- var CHAT_PROPERTIES_UPDATED = 'chat_properties_updated';
399
- var CHAT_TRANSFERRED = 'chat_transferred';
400
- var CUSTOMER_DISCONNECTED = 'customer_disconnected';
401
- var CUSTOMER_PAGE_UPDATED = 'customer_page_updated';
402
- var CUSTOMER_SIDE_STORAGE_UPDATED = 'customer_side_storage_updated';
403
- var CUSTOMER_UPDATED = 'customer_updated';
404
- var EVENT_PROPERTIES_DELETED = 'event_properties_deleted';
405
- var EVENT_PROPERTIES_UPDATED = 'event_properties_updated';
406
- var EVENT_UPDATED = 'event_updated';
407
- var EVENTS_MARKED_AS_SEEN = 'events_marked_as_seen';
408
- var GREETING_ACCEPTED = 'greeting_accepted';
409
- var GREETING_CANCELED = 'greeting_canceled';
410
- var GROUPS_STATUS_UPDATED = 'groups_status_updated';
411
- var INCOMING_CHAT = 'incoming_chat';
412
- var INCOMING_EVENT = 'incoming_event';
413
- var INCOMING_GREETING = 'incoming_greeting';
414
- var INCOMING_MULTICAST = 'incoming_multicast';
415
- var INCOMING_RICH_MESSAGE_POSTBACK = 'incoming_rich_message_postback';
416
- var INCOMING_TYPING_INDICATOR = 'incoming_typing_indicator';
482
+ var AUTHENTICATION = 'AUTHENTICATION';
483
+ var AUTHORIZATION = 'AUTHORIZATION';
484
+ var CHAT_ALREADY_ACTIVE = 'CHAT_ALREADY_ACTIVE';
485
+ var CHAT_LIMIT_REACHED = 'CHAT_LIMIT_REACHED';
486
+ var CUSTOMER_BANNED = 'CUSTOMER_BANNED';
487
+ var CUSTOMER_SESSION_FIELDS_LIMIT_REACHED = 'CUSTOMER_SESSION_FIELDS_LIMIT_REACHED';
488
+ var ENTITY_TOO_LARGE = 'ENTITY_TOO_LARGE';
489
+ var GREETING_NOT_FOUND = 'GREETING_NOT_FOUND';
490
+ var GROUP_OFFLINE = 'GROUP_OFFLINE';
491
+ var GROUPS_OFFLINE = 'GROUPS_OFFLINE';
492
+ var GROUP_NOT_FOUND = 'GROUP_NOT_FOUND';
493
+ var GROUP_UNAVAILABLE = 'GROUP_UNAVAILABLE';
494
+ var INTERNAL = 'INTERNAL';
495
+ var LICENSE_EXPIRED = 'LICENSE_EXPIRED';
496
+ // actually this can happen only when using REST
497
+ var MISDIRECTED_REQUEST = 'MISDIRECTED_REQUEST';
498
+ var PENDING_REQUESTS_LIMIT_REACHED = 'PENDING_REQUESTS_LIMIT_REACHED';
499
+ var REQUEST_TIMEOUT = 'REQUEST_TIMEOUT';
500
+ var SERVICE_UNAVAILABLE = 'SERVICE_UNAVAILABLE';
501
+ var UNSUPPORTED_VERSION = 'UNSUPPORTED_VERSION';
502
+ var USERS_LIMIT_REACHED = 'USERS_LIMIT_REACHED';
503
+ var VALIDATION = 'VALIDATION';
504
+ var WRONG_PRODUCT_VERSION = 'WRONG_PRODUCT_VERSION';
505
+
506
+ var serverErrorCodes = /*#__PURE__*/Object.freeze({
507
+ __proto__: null,
508
+ AUTHENTICATION: AUTHENTICATION,
509
+ AUTHORIZATION: AUTHORIZATION,
510
+ CHAT_ALREADY_ACTIVE: CHAT_ALREADY_ACTIVE,
511
+ CHAT_LIMIT_REACHED: CHAT_LIMIT_REACHED,
512
+ CUSTOMER_BANNED: CUSTOMER_BANNED,
513
+ CUSTOMER_SESSION_FIELDS_LIMIT_REACHED: CUSTOMER_SESSION_FIELDS_LIMIT_REACHED,
514
+ ENTITY_TOO_LARGE: ENTITY_TOO_LARGE,
515
+ GREETING_NOT_FOUND: GREETING_NOT_FOUND,
516
+ GROUP_OFFLINE: GROUP_OFFLINE,
517
+ GROUPS_OFFLINE: GROUPS_OFFLINE,
518
+ GROUP_NOT_FOUND: GROUP_NOT_FOUND,
519
+ GROUP_UNAVAILABLE: GROUP_UNAVAILABLE,
520
+ INTERNAL: INTERNAL,
521
+ LICENSE_EXPIRED: LICENSE_EXPIRED,
522
+ MISDIRECTED_REQUEST: MISDIRECTED_REQUEST,
523
+ PENDING_REQUESTS_LIMIT_REACHED: PENDING_REQUESTS_LIMIT_REACHED,
524
+ REQUEST_TIMEOUT: REQUEST_TIMEOUT,
525
+ SERVICE_UNAVAILABLE: SERVICE_UNAVAILABLE,
526
+ UNSUPPORTED_VERSION: UNSUPPORTED_VERSION,
527
+ USERS_LIMIT_REACHED: USERS_LIMIT_REACHED,
528
+ VALIDATION: VALIDATION,
529
+ WRONG_PRODUCT_VERSION: WRONG_PRODUCT_VERSION
530
+ });
531
+
532
+ var CHAT_DEACTIVATED = 'chat_deactivated';
533
+ var CHAT_PROPERTIES_DELETED = 'chat_properties_deleted';
534
+ var CHAT_PROPERTIES_UPDATED = 'chat_properties_updated';
535
+ var CHAT_TRANSFERRED = 'chat_transferred';
536
+ var CUSTOMER_DISCONNECTED = 'customer_disconnected';
537
+ var CUSTOMER_SIDE_STORAGE_UPDATED = 'customer_side_storage_updated';
538
+ var CUSTOMER_UPDATED = 'customer_updated';
539
+ var EVENT_PROPERTIES_DELETED = 'event_properties_deleted';
540
+ var EVENT_PROPERTIES_UPDATED = 'event_properties_updated';
541
+ var EVENT_UPDATED = 'event_updated';
542
+ var EVENTS_MARKED_AS_SEEN = 'events_marked_as_seen';
543
+ var GREETING_ACCEPTED = 'greeting_accepted';
544
+ var GREETING_CANCELED = 'greeting_canceled';
545
+ var GROUPS_STATUS_UPDATED = 'groups_status_updated';
546
+ var INCOMING_CHAT = 'incoming_chat';
547
+ var INCOMING_EVENT = 'incoming_event';
548
+ var INCOMING_GREETING = 'incoming_greeting';
549
+ var INCOMING_MULTICAST = 'incoming_multicast';
550
+ var INCOMING_RICH_MESSAGE_POSTBACK = 'incoming_rich_message_postback';
551
+ var INCOMING_TYPING_INDICATOR = 'incoming_typing_indicator';
552
+ var INCOMING_WELCOME_MESSAGE = 'incoming_welcome_message';
417
553
  var QUEUE_POSITION_UPDATED = 'queue_position_updated';
418
554
  var THREAD_PROPERTIES_DELETED = 'thread_properties_deleted';
419
555
  var THREAD_PROPERTIES_UPDATED = 'thread_properties_updated';
420
556
  var USER_ADDED_TO_CHAT = 'user_added_to_chat';
421
557
  var USER_REMOVED_FROM_CHAT = 'user_removed_from_chat';
558
+ var INCOMING_THINKING_INDICATOR = 'incoming_thinking_indicator';
559
+ var INCOMING_EVENT_PREVIEW = 'incoming_event_preview';
422
560
 
423
561
  var serverPushActions = /*#__PURE__*/Object.freeze({
424
562
  __proto__: null,
@@ -427,7 +565,6 @@ var serverPushActions = /*#__PURE__*/Object.freeze({
427
565
  CHAT_PROPERTIES_UPDATED: CHAT_PROPERTIES_UPDATED,
428
566
  CHAT_TRANSFERRED: CHAT_TRANSFERRED,
429
567
  CUSTOMER_DISCONNECTED: CUSTOMER_DISCONNECTED,
430
- CUSTOMER_PAGE_UPDATED: CUSTOMER_PAGE_UPDATED,
431
568
  CUSTOMER_SIDE_STORAGE_UPDATED: CUSTOMER_SIDE_STORAGE_UPDATED,
432
569
  CUSTOMER_UPDATED: CUSTOMER_UPDATED,
433
570
  EVENT_PROPERTIES_DELETED: EVENT_PROPERTIES_DELETED,
@@ -443,637 +580,449 @@ var serverPushActions = /*#__PURE__*/Object.freeze({
443
580
  INCOMING_MULTICAST: INCOMING_MULTICAST,
444
581
  INCOMING_RICH_MESSAGE_POSTBACK: INCOMING_RICH_MESSAGE_POSTBACK,
445
582
  INCOMING_TYPING_INDICATOR: INCOMING_TYPING_INDICATOR,
583
+ INCOMING_WELCOME_MESSAGE: INCOMING_WELCOME_MESSAGE,
446
584
  QUEUE_POSITION_UPDATED: QUEUE_POSITION_UPDATED,
447
585
  THREAD_PROPERTIES_DELETED: THREAD_PROPERTIES_DELETED,
448
586
  THREAD_PROPERTIES_UPDATED: THREAD_PROPERTIES_UPDATED,
449
587
  USER_ADDED_TO_CHAT: USER_ADDED_TO_CHAT,
450
- USER_REMOVED_FROM_CHAT: USER_REMOVED_FROM_CHAT
588
+ USER_REMOVED_FROM_CHAT: USER_REMOVED_FROM_CHAT,
589
+ INCOMING_THINKING_INDICATOR: INCOMING_THINKING_INDICATOR,
590
+ INCOMING_EVENT_PREVIEW: INCOMING_EVENT_PREVIEW
451
591
  });
452
592
 
453
- var FILE = 'file';
454
- var FORM = 'form';
455
- var FILLED_FORM = 'filled_form';
456
- var MESSAGE = 'message';
457
- var RICH_MESSAGE = 'rich_message';
458
- var SYSTEM_MESSAGE = 'system_message';
459
- var CUSTOM = 'custom';
593
+ var ASC = 'asc';
594
+ var DESC = 'desc';
460
595
 
461
- var eventTypes = /*#__PURE__*/Object.freeze({
596
+ var sortOrders = /*#__PURE__*/Object.freeze({
462
597
  __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
598
+ ASC: ASC,
599
+ DESC: DESC
470
600
  });
471
601
 
472
- var createEventBase = function createEventBase(event) {
473
- var base = {};
474
- if (typeof event.customId === 'string') {
475
- base.custom_id = event.customId;
476
- }
477
- if (dataUtils.isObject(event.properties)) {
478
- base.properties = event.properties;
479
- }
480
- return base;
481
- };
602
+ var AGENT = 'agent';
603
+ var CUSTOMER = 'customer';
482
604
 
483
- // TODO: we could validate and throw here
484
- // but should we? maybe only in DEV mode?
485
- var parseEvent = function parseEvent(event) {
486
- switch (event.type) {
487
- case MESSAGE:
488
- {
489
- var message = _extends({}, createEventBase(event), {
490
- type: event.type,
491
- text: event.text
492
- });
493
- if (event.postback) {
494
- message.postback = {
495
- id: event.postback.id,
496
- thread_id: event.postback.threadId,
497
- event_id: event.postback.eventId,
498
- type: event.postback.type,
499
- value: event.postback.value
500
- };
501
- }
502
- return message;
503
- }
504
- case FILE:
505
- {
506
- var file = _extends({}, createEventBase(event), {
507
- type: event.type,
508
- url: event.url,
509
- alternative_text: event.alternativeText
510
- });
511
- return file;
512
- }
513
- case FILLED_FORM:
514
- {
515
- var filledForm = _extends({}, createEventBase(event), {
516
- type: event.type,
517
- form_id: event.formId,
518
- fields: event.fields.map(function (field) {
519
- switch (field.type) {
520
- case 'group_chooser':
521
- {
522
- if (!field.answer) {
523
- return field;
524
- }
525
- var _field$answer = field.answer,
526
- groupId = _field$answer.groupId,
527
- answer = _objectWithoutPropertiesLoose(_field$answer, ["groupId"]);
528
- return _extends({}, field, {
529
- answer: _extends({}, answer, {
530
- group_id: groupId
531
- })
532
- });
533
- }
534
- default:
535
- return field;
536
- }
537
- })
605
+ var userTypes = /*#__PURE__*/Object.freeze({
606
+ __proto__: null,
607
+ AGENT: AGENT,
608
+ CUSTOMER: CUSTOMER
609
+ });
610
+
611
+ var HISTORY_EVENT_COUNT_TARGET = 25;
612
+ var createState = function createState() {
613
+ return {
614
+ status: 'idle',
615
+ queuedTasks: [],
616
+ nextPageId: null
617
+ };
618
+ };
619
+ var createChatHistoryIterator = function createChatHistoryIterator(sdk, chatId) {
620
+ var historyState = createState();
621
+ var next = function (_next) {
622
+ function next(_x, _x2) {
623
+ return _next.apply(this, arguments);
624
+ }
625
+ next.toString = function () {
626
+ return _next.toString();
627
+ };
628
+ return next;
629
+ }(function (resolve, reject) {
630
+ switch (historyState.status) {
631
+ case 'idle':
632
+ historyState.status = 'fetching';
633
+ sdk.listThreads(historyState.nextPageId ? {
634
+ chatId: chatId,
635
+ pageId: historyState.nextPageId
636
+ } : {
637
+ chatId: chatId,
638
+ minEventsCount: HISTORY_EVENT_COUNT_TARGET
639
+ }).then(function (_ref) {
640
+ var threads = _ref.threads,
641
+ nextPageId = _ref.nextPageId;
642
+ historyState.nextPageId = nextPageId;
643
+ if (!historyState.nextPageId) {
644
+ historyState.status = 'done';
645
+ resolve({
646
+ value: {
647
+ threads: [].concat(threads).reverse()
648
+ },
649
+ done: true
650
+ });
651
+ } else {
652
+ historyState.status = 'idle';
653
+ resolve({
654
+ value: {
655
+ threads: [].concat(threads).reverse()
656
+ },
657
+ done: false
658
+ });
659
+ }
660
+ var queuedTask = historyState.queuedTasks.shift();
661
+ if (!queuedTask) {
662
+ return;
663
+ }
664
+ next(queuedTask.resolve, queuedTask.reject);
665
+ }, function (err) {
666
+ var queuedTasks = historyState.queuedTasks;
667
+ historyState.status = 'idle';
668
+ historyState.queuedTasks = [];
669
+ reject(err);
670
+ queuedTasks.forEach(function (queuedTask) {
671
+ return queuedTask.reject(err);
672
+ });
538
673
  });
539
- return filledForm;
540
- }
541
- case SYSTEM_MESSAGE:
542
- {
543
- var systemMessage = _extends({}, createEventBase(event), {
544
- type: event.type,
545
- text: event.text,
546
- system_message_type: event.systemMessageType
674
+ return;
675
+ case 'fetching':
676
+ historyState.queuedTasks.push({
677
+ resolve: resolve,
678
+ reject: reject
547
679
  });
548
- if (event.recipients) {
549
- systemMessage.recipients = event.recipients;
550
- }
551
- return systemMessage;
552
- }
553
- case CUSTOM:
554
- {
555
- var customEvent = _extends({}, createEventBase(event), {
556
- type: event.type
680
+ return;
681
+ case 'done':
682
+ resolve({
683
+ value: undefined,
684
+ done: true
557
685
  });
558
- if (event.content) {
559
- customEvent.content = event.content;
560
- }
561
- return customEvent;
686
+ return;
687
+ }
688
+ });
689
+ return {
690
+ next: function (_next2) {
691
+ function next() {
692
+ return _next2.apply(this, arguments);
562
693
  }
563
- }
564
- };
565
- var parseThreadData = function parseThreadData(thread) {
566
- var data = {};
567
- var events = thread.events,
568
- properties = thread.properties;
569
- if (events) {
570
- data.events = events.map(parseEvent);
571
- }
572
- if (properties) {
573
- data.properties = properties;
574
- }
575
- return data;
576
- };
577
- var parseStartChatData = function parseStartChatData(_ref) {
578
- var _ref$active = _ref.active,
579
- active = _ref$active === void 0 ? true : _ref$active,
580
- chat = _ref.chat,
581
- continuous = _ref.continuous;
582
- var data = {
583
- active: active,
584
- chat: {}
585
- };
586
- if (typeof continuous === 'boolean') {
587
- data.continuous = continuous;
588
- }
589
- if (!chat) {
590
- return data;
591
- }
592
- var access = chat.access,
593
- thread = chat.thread,
594
- properties = chat.properties;
595
- if (access && access.groupIds) {
596
- data.chat.access = {
597
- group_ids: access.groupIds
598
- };
599
- }
600
- if (properties) {
601
- data.chat.properties = properties;
602
- }
603
- if (thread) {
604
- data.chat.thread = parseThreadData(thread);
605
- }
606
- return data;
607
- };
608
- var parseResumeChatData = function parseResumeChatData(requestData) {
609
- var data = parseStartChatData(requestData);
610
- return _extends({}, data, {
611
- chat: _extends({}, data.chat, {
612
- id: requestData.chat.id
613
- })
614
- });
615
- };
616
- var parseCustomerSessionFields = function parseCustomerSessionFields(sessionFields) {
617
- return dataUtils.toPairs(sessionFields).map(function (_ref2) {
618
- var _ref3;
619
- var key = _ref2[0],
620
- value = _ref2[1];
621
- return _ref3 = {}, _ref3[key] = value, _ref3;
622
- });
623
- };
624
- var parseCustomerUpdate = function parseCustomerUpdate(update) {
625
- var result = dataUtils.pickOwn(['avatar', 'name', 'email'], update);
626
- if (update.sessionFields) {
627
- result.session_fields = parseCustomerSessionFields(update.sessionFields);
628
- }
629
- return result;
694
+ next.toString = function () {
695
+ return _next2.toString();
696
+ };
697
+ return next;
698
+ }(function () {
699
+ return new Promise(next);
700
+ })
701
+ };
630
702
  };
631
703
 
632
- var destroy = function destroy(reason) {
633
- return {
634
- type: DESTROY,
635
- payload: {
636
- reason: reason
637
- }
638
- };
639
- };
640
- var loginSuccess = function loginSuccess(payload) {
641
- return {
642
- type: LOGIN_SUCCESS,
643
- payload: payload
644
- };
645
- };
646
- var pauseConnection = function pauseConnection(reason) {
647
- return {
648
- type: PAUSE_CONNECTION,
649
- payload: {
650
- reason: reason
651
- }
652
- };
653
- };
654
- var prefetchToken = function prefetchToken(fresh) {
655
- if (fresh === void 0) {
656
- fresh = false;
704
+ function createError(_ref) {
705
+ var message = _ref.message,
706
+ code = _ref.code;
707
+ var error = new Error(message);
708
+ error.code = code;
709
+ return error;
710
+ }
711
+
712
+ var createReducer$1 = function createReducer(initialState, reducersMap) {
713
+ if (process.env.NODE_ENV !== 'development' && reducersMap[undefined]) {
714
+ // eslint-disable-next-line no-console
715
+ console.warn(["Reducer contains an 'undefined' action type.", 'Have you misspelled a constant?'].join('\n'));
657
716
  }
658
- return {
659
- type: PREFETCH_TOKEN,
660
- payload: {
661
- fresh: fresh
717
+ return function reducer(state, action) {
718
+ if (state === void 0) {
719
+ state = initialState;
662
720
  }
663
- };
664
- };
665
- var reconnect = function reconnect(delay) {
666
- return {
667
- type: RECONNECT,
668
- payload: {
669
- delay: delay
721
+ if (dataUtils.hasOwn(action.type, reducersMap)) {
722
+ return reducersMap[action.type](state, action.payload);
670
723
  }
724
+ return state;
671
725
  };
672
726
  };
673
727
 
674
- // TODO: this one was currently pretty hard to type in full
675
- // we should explore providing stricter types for this in the future
676
- var sendRequest = function sendRequest(action, payload, source) {
677
- return {
678
- type: SEND_REQUEST,
679
- payload: _extends({
680
- request: {
681
- action: action,
682
- payload: payload
683
- }
684
- }, source && {
685
- source: source
686
- })
687
- };
728
+ var getAllRequests = function getAllRequests(state) {
729
+ return state.requests;
688
730
  };
689
- var sendEvent = function sendEvent(_ref) {
690
- var chatId = _ref.chatId,
691
- event = _ref.event,
692
- attachToLastThread = _ref.attachToLastThread;
693
- var payload = {
694
- chat_id: chatId,
695
- event: parseEvent(event)
696
- };
697
- if (attachToLastThread) {
698
- payload.attach_to_last_thread = true;
699
- }
700
- return sendRequest(SEND_EVENT, payload);
731
+ var getConnectionStatus = function getConnectionStatus(state) {
732
+ return state.connection.status;
701
733
  };
702
- var setChatActive = function setChatActive(id, active) {
703
- return {
704
- type: SET_CHAT_ACTIVE,
705
- payload: {
706
- id: id,
707
- active: active
708
- }
709
- };
734
+ var getRequest = function getRequest(state, id) {
735
+ return state.requests[id];
710
736
  };
711
- var setSelfId = function setSelfId(id) {
712
- return {
713
- type: SET_SELF_ID,
714
- payload: {
715
- id: id
716
- }
717
- };
737
+ var getSelfId = function getSelfId(state) {
738
+ return state.users.self.id;
718
739
  };
719
- var socketDisconnected = function socketDisconnected() {
720
- return {
721
- type: SOCKET_DISCONNECTED
722
- };
740
+ var isChatActive = function isChatActive(state, chatId) {
741
+ var chat = state.chats[chatId];
742
+ return !!chat && chat.active;
723
743
  };
724
-
725
- // TODO: this thing is not really well typed and should be improved
726
- var sendRequestAction = function sendRequestAction(store, action) {
727
- action.payload.id = dataUtils.generateUniqueId(store.getState().requests);
728
- var _promiseDeferred = promiseUtils.promiseDeferred(),
729
- resolve = _promiseDeferred.resolve,
730
- reject = _promiseDeferred.reject,
731
- promise = _promiseDeferred.promise;
732
- action.payload.promise = promise;
733
- action.payload.resolve = resolve;
734
- action.payload.reject = reject;
735
- store.dispatch(action);
736
- return promise;
744
+ var isConnected = function isConnected(state) {
745
+ return getConnectionStatus(state) === CONNECTED;
737
746
  };
738
-
739
- var AUTHENTICATION = 'AUTHENTICATION';
740
- var AUTHORIZATION = 'AUTHORIZATION';
741
- var CHAT_ALREADY_ACTIVE = 'CHAT_ALREADY_ACTIVE';
742
- var CHAT_LIMIT_REACHED = 'CHAT_LIMIT_REACHED';
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';
759
- var USERS_LIMIT_REACHED = 'USERS_LIMIT_REACHED';
760
- var VALIDATION = 'VALIDATION';
761
- var WRONG_PRODUCT_VERSION = 'WRONG_PRODUCT_VERSION';
762
-
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) {
790
- var _store$getState = store.getState(),
791
- groupId = _store$getState.groupId,
792
- uniqueGroups = _store$getState.uniqueGroups;
793
- return "side_storage_" + licenseId + (uniqueGroups ? ":" + groupId : '');
747
+ var isDestroyed = function isDestroyed(state) {
748
+ return getConnectionStatus(state) === DESTROYED;
794
749
  };
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 : '');
750
+ var getRegionParam = function getRegionParam(options) {
751
+ var _options$region;
752
+ return {
753
+ 'x-region': (_options$region = options.region) != null ? _options$region : ''
754
+ };
801
755
  };
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
- });
816
- })
817
- // shouldnt get triggered, just a defensive measure against malformed storage entries
818
- ["catch"](dataUtils.noop);
756
+ var getEnvPart = function getEnvPart(_ref) {
757
+ var env = _ref.env;
758
+ if (env === 'production') {
759
+ return '';
760
+ }
761
+ return "." + env;
819
762
  };
820
- var saveSideStorage = function saveSideStorage(store, sideStorage) {
821
- storage__default['default'].setItem(getSideStorageKeyByOrganization(store), JSON.stringify(sideStorage))["catch"](dataUtils.noop);
763
+ var getApiOrigin = function getApiOrigin(state) {
764
+ {
765
+ return "https://api" + getEnvPart(state) + ".livechatinc.com";
766
+ }
822
767
  };
823
-
824
- var taskChain = function taskChain(_ref, onSuccess, onError) {
825
- var steps = _ref.slice(0);
826
- var cancelled = false;
827
- var next = function next(intermediateResult) {
828
- var step = steps.shift();
829
- promiseUtils.promiseTry(function () {
830
- return step(intermediateResult);
831
- }).then(function (result) {
832
- if (cancelled) {
833
- return;
834
- }
835
- if (steps.length) {
836
- next(result);
837
- return;
838
- }
839
- onSuccess(result);
840
- }, function (error) {
841
- if (cancelled) {
842
- return;
843
- }
844
- onError(error);
845
- });
846
- };
847
- next();
768
+ var getServerUrl = function getServerUrl(state) {
769
+ return getApiOrigin(state) + "/v3.6/customer";
770
+ };
771
+ var createInitialState = function createInitialState(initialStateData) {
772
+ var _initialStateData$app = initialStateData.application,
773
+ application = _initialStateData$app === void 0 ? {} : _initialStateData$app,
774
+ organizationId = initialStateData.organizationId,
775
+ _initialStateData$gro = initialStateData.groupId,
776
+ groupId = _initialStateData$gro === void 0 ? null : _initialStateData$gro,
777
+ env = initialStateData.env,
778
+ _initialStateData$pag = initialStateData.page,
779
+ page = _initialStateData$pag === void 0 ? null : _initialStateData$pag,
780
+ _initialStateData$reg = initialStateData.region,
781
+ region = _initialStateData$reg === void 0 ? null : _initialStateData$reg,
782
+ _initialStateData$ref = initialStateData.referrer,
783
+ referrer = _initialStateData$ref === void 0 ? null : _initialStateData$ref,
784
+ _initialStateData$tab = initialStateData.tabId,
785
+ tabId = _initialStateData$tab === void 0 ? null : _initialStateData$tab,
786
+ _initialStateData$uni = initialStateData.uniqueGroups,
787
+ uniqueGroups = _initialStateData$uni === void 0 ? false : _initialStateData$uni,
788
+ _initialStateData$mob = initialStateData.mobile,
789
+ mobile = _initialStateData$mob === void 0 ? false : _initialStateData$mob;
848
790
  return {
849
- cancel: function cancel() {
850
- cancelled = true;
851
- }
791
+ application: _extends({}, application, {
792
+ name: "customer_sdk",
793
+ version: "5.0.1"
794
+ }),
795
+ organizationId: organizationId,
796
+ env: env,
797
+ groupId: groupId,
798
+ chats: {},
799
+ connection: {
800
+ status: DISCONNECTED
801
+ },
802
+ page: page,
803
+ region: region,
804
+ referrer: referrer,
805
+ tabId: tabId,
806
+ requests: {},
807
+ users: {
808
+ self: {
809
+ id: null,
810
+ type: CUSTOMER
811
+ },
812
+ others: {}
813
+ },
814
+ uniqueGroups: uniqueGroups,
815
+ mobile: mobile
852
816
  };
853
817
  };
854
- var sendLoginFlowRequest = function sendLoginFlowRequest(store, type, payload) {
855
- return sendRequestAction(store, sendRequest(type, payload, 'login'));
856
- };
857
- var delay = function delay(ms) {
858
- return new Promise(function (resolve) {
859
- setTimeout(resolve, ms);
818
+ var removeStoredRequest = function removeStoredRequest(state, _ref2) {
819
+ var id = _ref2.id;
820
+ var _state$requests = state.requests,
821
+ requests = _objectWithoutPropertiesLoose(_state$requests, [id].map(_toPropertyKey));
822
+ return _extends({}, state, {
823
+ requests: requests
860
824
  });
861
- };
862
- function createLoginTask(auth, customerDataProvider, licenseId) {
863
- var store;
864
- var sentPage = null;
865
- var task;
866
- var backoffConfig = {
867
- min: 300,
868
- max: 60000,
869
- jitter: 0.3
870
- };
871
- var defaultBackoffStrategy = createBackoff__default['default'](backoffConfig);
872
- var slowerBackoffStrategy = createBackoff__default['default'](_extends({}, backoffConfig, {
873
- min: 1000
874
- }));
875
- var currentBackoffStrategy = defaultBackoffStrategy;
876
- var destroy$1 = function destroy$1(reason) {
877
- return store.dispatch(destroy(reason));
878
- };
879
- var reconnect$1 = function reconnect$1() {
880
- return store.dispatch(reconnect(currentBackoffStrategy.duration()));
881
- };
882
- var getTokenAndSideStorage = function getTokenAndSideStorage() {
883
- return Promise.all([auth.getToken(), getSideStorage(store, licenseId)]);
884
- };
885
- var dispatchSelfId = function dispatchSelfId(_ref2) {
886
- var token = _ref2[0],
887
- sideStorage = _ref2[1];
888
- var selfId = getSelfId(store.getState());
889
- if (selfId === null) {
890
- store.dispatch(setSelfId(token.entityId));
891
- } else if (selfId !== token.entityId) {
892
- var err = new Error('Identity has changed.');
893
- err.code = IDENTITY_MISMATCH;
894
- throw err;
895
- }
896
- return [token, sideStorage];
897
- };
898
- var _sendLogin = function sendLogin(_ref3) {
899
- var token = _ref3[0],
900
- sideStorage = _ref3[1];
901
- var state = store.getState();
902
- var application = state.application,
903
- groupId = state.groupId,
904
- page = state.page,
905
- referrer = state.referrer,
906
- mobile = state.mobile;
907
- var payload = {
908
- token: token.tokenType + " " + token.accessToken,
909
- customer: typeof customerDataProvider === 'function' ? parseCustomerUpdate(customerDataProvider()) : {},
910
- customer_side_storage: sideStorage,
911
- is_mobile: mobile,
912
- application: dataUtils.pick(['name', 'version'], application)
913
- };
914
- if (typeof groupId === 'number') {
915
- payload.group_id = groupId;
916
- }
917
- if (application.channelType) {
918
- payload.application.channel_type = application.channelType;
919
- }
920
- if (page !== null) {
921
- sentPage = page;
922
- payload.customer_page = page;
923
- }
924
- if (referrer !== null) {
925
- payload.referrer = referrer;
926
- }
927
- return Promise.race([sendLoginFlowRequest(store, LOGIN, payload), delay(15 * 1000).then(function () {
928
- return Promise.reject(createError({
929
- message: 'Request timed out.',
930
- code: REQUEST_TIMEOUT
931
- }));
932
- })]);
933
- };
934
- var updateCustomerPageIfNeeded = function updateCustomerPageIfNeeded() {
935
- var _store$getState = store.getState(),
936
- page = _store$getState.page;
937
- if (sentPage !== page) {
938
- sendLoginFlowRequest(store, UPDATE_CUSTOMER_PAGE$1, page)["catch"](dataUtils.noop);
825
+ };
826
+ var setConnectionStatus = function setConnectionStatus(status, state) {
827
+ return _extends({}, state, {
828
+ connection: _extends({}, state.connection, {
829
+ status: status
830
+ })
831
+ });
832
+ };
833
+ var createReducer = (function (state) {
834
+ var _createReducer;
835
+ return createReducer$1(state, (_createReducer = {}, _createReducer[CHANGE_REGION] = function (state, _ref3) {
836
+ var region = _ref3.region;
837
+ return _extends({}, state, {
838
+ region: region
839
+ });
840
+ }, _createReducer[DESTROY] = function (state) {
841
+ return setConnectionStatus(DESTROYED, state);
842
+ }, _createReducer[LOGIN_SUCCESS] = function (state) {
843
+ return setConnectionStatus(CONNECTED, state);
844
+ }, _createReducer[PAUSE_CONNECTION] = function (state) {
845
+ return setConnectionStatus(PAUSED, state);
846
+ }, _createReducer[REQUEST_FAILED] = removeStoredRequest, _createReducer[RESPONSE_RECEIVED] = removeStoredRequest, _createReducer[PUSH_RESPONSE_RECEIVED] = removeStoredRequest, _createReducer[SEND_REQUEST] = function (state, _ref4) {
847
+ var _extends2;
848
+ var promise = _ref4.promise,
849
+ resolve = _ref4.resolve,
850
+ reject = _ref4.reject,
851
+ id = _ref4.id,
852
+ request = _ref4.request;
853
+ return _extends({}, state, {
854
+ requests: _extends({}, state.requests, (_extends2 = {}, _extends2[id] = {
855
+ id: id,
856
+ promise: promise,
857
+ resolve: resolve,
858
+ reject: reject,
859
+ request: request
860
+ }, _extends2))
861
+ });
862
+ }, _createReducer[SET_CHAT_ACTIVE] = function (state, _ref5) {
863
+ var _extends3;
864
+ var id = _ref5.id,
865
+ active = _ref5.active;
866
+ return _extends({}, state, {
867
+ chats: _extends({}, state.chats, (_extends3 = {}, _extends3[id] = _extends({}, state.chats[id], {
868
+ active: active
869
+ }), _extends3))
870
+ });
871
+ }, _createReducer[SET_SELF_ID] = function (state, payload) {
872
+ return _extends({}, state, {
873
+ users: _extends({}, state.users, {
874
+ self: _extends({}, state.users.self, {
875
+ id: payload.id
876
+ })
877
+ })
878
+ });
879
+ }, _createReducer[SOCKET_DISCONNECTED] = function (state) {
880
+ var previousStatus = getConnectionStatus(state);
881
+ if (process.env.NODE_ENV !== 'production' && (previousStatus === PAUSED || previousStatus === DESTROYED)) {
882
+ throw new Error("Got 'socket_disconnected' action when in " + previousStatus + " state. This should be an impossible state.");
939
883
  }
940
- sentPage = null;
941
- };
942
- return {
943
- sendLogin: function sendLogin(_store) {
944
- var _task;
945
- // after switching to callbags, we should be able to use smth similar to redux-observable
946
- // and thus just use store given to epic
947
- store = _store;
948
- (_task = task) == null ? void 0 : _task.cancel();
949
- task = taskChain([getTokenAndSideStorage, dispatchSelfId, _sendLogin], function (loginResponse) {
950
- task = null;
951
- defaultBackoffStrategy.reset();
952
- slowerBackoffStrategy.reset();
953
- currentBackoffStrategy = defaultBackoffStrategy;
884
+ var state1 = setConnectionStatus(previousStatus === DISCONNECTED ? DISCONNECTED : RECONNECTING, state);
885
+ return _extends({}, state1, {
886
+ requests: {}
887
+ });
888
+ }, _createReducer[UPDATE_CUSTOMER_PAGE$1] = function (state, page) {
889
+ return _extends({}, state, {
890
+ page: _extends({}, state.page, page)
891
+ });
892
+ }, _createReducer[CLEAR_SENSITIVE_SESSION_STATE] = function (state) {
893
+ return _extends({}, state, {
894
+ chats: {},
895
+ users: {
896
+ self: {
897
+ id: null,
898
+ type: CUSTOMER
899
+ },
900
+ others: {}
901
+ },
902
+ requests: {}
903
+ });
904
+ }, _createReducer[IDENTITY_CHANGED] = function (state) {
905
+ return state;
906
+ }, _createReducer));
907
+ });
954
908
 
955
- // TODO: rethink if this should be handled by SDK consumer
956
- updateCustomerPageIfNeeded();
957
- store.dispatch(loginSuccess(loginResponse));
958
- }, function (error) {
959
- task = null;
960
- if (process.env.NODE_ENV !== 'production') {
961
- console.error('[Customer SDK] Login flow has thrown code', error.code, 'with', error);
962
- }
963
- switch (error.code) {
964
- case AUTHENTICATION:
965
- auth.getFreshToken();
966
- reconnect$1();
967
- return;
968
- case CONNECTION_LOST:
969
- // this is connectivity problem, not a server error
970
- // and is taken care of in socket module
971
- // as it has its own backoff implementation
972
- return;
973
- case MISDIRECTED_CONNECTION:
974
- // socket gets reinitialized on this anyway, so just ignore it here
975
- return;
976
- case SDK_DESTROYED:
977
- return;
978
- // those are auth errors, we should maybe export those constants from the auth package
979
- case 'SSO_IDENTITY_EXCEPTION':
980
- case 'SSO_OAUTH_EXCEPTION':
981
- if (error.message === 'server_error' || error.message === 'temporarily_unavailable') {
982
- reconnect$1();
983
- return;
984
- }
985
- destroy$1(error.message);
986
- return;
987
- case USERS_LIMIT_REACHED:
988
- store.dispatch(pauseConnection(error.code.toLowerCase()));
989
- return;
990
- case IDENTITY_MISMATCH:
991
- case CUSTOMER_BANNED$1:
992
- case WRONG_PRODUCT_VERSION:
993
- destroy$1(error.code.toLowerCase());
994
- return;
995
- case SERVICE_TEMPORARILY_UNAVAILABLE:
996
- currentBackoffStrategy = slowerBackoffStrategy;
997
- reconnect$1();
998
- return;
999
- default:
1000
- reconnect$1();
1001
- return;
1002
- }
1003
- });
1004
- },
1005
- cancel: function cancel() {
1006
- var _task2;
1007
- (_task2 = task) == null ? void 0 : _task2.cancel();
909
+ function finalCreateStore(initialStateData) {
910
+ var compose = process.env.NODE_ENV === 'development' && typeof window !== 'undefined' && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({
911
+ name: '@livechat/customer-sdk'
912
+ }) : dataUtils.identity;
913
+ var sideEffectsMiddleware = createSideEffectsMiddleware__default["default"]();
914
+ var store = redux.createStore(createReducer(createInitialState(initialStateData)), compose(redux.applyMiddleware(sideEffectsMiddleware)));
915
+ store.addSideEffectsHandler = sideEffectsMiddleware.add;
916
+ return store;
917
+ }
918
+
919
+ var makeGraylogRequest = function makeGraylogRequest(url, body) {
920
+ return fetch__default["default"](url, {
921
+ body: body,
922
+ method: 'POST',
923
+ headers: {
924
+ Accept: '*/*',
925
+ 'Content-Type': 'application/x-www-form-urlencoded'
1008
926
  }
927
+ })["catch"](dataUtils.noop);
928
+ };
929
+
930
+ // eslint-disable-next-line local/no-livechat-package-direct-file-import
931
+ /**
932
+ * Logs event to Graylog with provided config data.
933
+ * Logging request is fired only when all of those conditions are true:
934
+ * 1. package is used in lc production environment
935
+ * 2. package is used standalone because only then "customer_sdk" will be set to customer_sdk
936
+ */
937
+ var log = function log(_ref) {
938
+ var env = _ref.env,
939
+ organizationId = _ref.organizationId,
940
+ eventName = _ref.eventName;
941
+ if (env !== 'production' || "customer_sdk" !== 'customer_sdk') {
942
+ return Promise.resolve();
943
+ }
944
+ var message = {
945
+ event_name: eventName,
946
+ severity: 'Informational',
947
+ sdkVersion: "5.0.1"
1009
948
  };
1010
- }
949
+ var body = {
950
+ organizationId: organizationId,
951
+ event_id: 'chat_widget_customer_sdk',
952
+ message: JSON.stringify(message)
953
+ };
954
+ return makeGraylogRequest('https://applog.livechatinc.com/logs', urlUtils.buildQueryString(body));
955
+ };
1011
956
 
1012
- var checkGoals = function checkGoals(store, auth, sessionFields) {
957
+ var sendCustomerActions = function sendCustomerActions(_ref, _ref2) {
958
+ var auth = _ref.auth,
959
+ store = _ref.store;
960
+ var actions = _ref2.actions;
1013
961
  return auth.getToken().then(function (token) {
1014
962
  var state = store.getState();
1015
- if (getSelfId(state) === null) {
1016
- store.dispatch(setSelfId(token.entityId));
1017
- }
1018
- var page = state.page;
1019
- if (!page || !page.url) {
1020
- return;
1021
- }
1022
- var query = urlUtils.buildQueryString({
963
+ var query = urlUtils.buildQueryString(_extends({
1023
964
  organization_id: state.organizationId
1024
- });
1025
- var payload = {
1026
- session_fields: parseCustomerSessionFields(sessionFields || {}),
1027
- group_id: state.groupId || 0,
1028
- page_url: page.url
1029
- };
1030
- return unfetch__default['default'](getServerUrl(state) + "/action/" + CHECK_GOALS$1 + "?" + query, {
965
+ }, getRegionParam(state)));
966
+ var apiUrl = getServerUrl(state) + "/action/" + SEND_CUSTOMER_ACTIONS + "?" + query;
967
+ return fetch(apiUrl, {
1031
968
  method: 'POST',
1032
969
  headers: {
1033
970
  'Content-Type': 'application/json',
1034
971
  Authorization: token.tokenType + " " + token.accessToken
1035
972
  },
1036
- body: JSON.stringify(payload)
1037
- }).then(function () {
1038
- // TODO: we should actually normalize response here
1039
- return undefined;
1040
- });
973
+ body: JSON.stringify({
974
+ actions: actions
975
+ }),
976
+ keepalive: true
977
+ }).then(dataUtils.noop);
1041
978
  });
1042
979
  };
1043
980
 
1044
- var failAllRequests = function failAllRequests(_ref, reason) {
1045
- var getState = _ref.getState,
1046
- dispatch = _ref.dispatch;
1047
- var state = getState();
1048
- var requests = getAllRequests(state);
1049
- dispatch({
1050
- type: FAIL_ALL_REQUESTS,
1051
- payload: {
1052
- rejects: Object.keys(requests).map(function (requestId) {
1053
- return requests[requestId].reject;
981
+ var sendGreetingButtonClicked = function sendGreetingButtonClicked(_ref, _ref2) {
982
+ var auth = _ref.auth,
983
+ store = _ref.store;
984
+ var greetingUniqueId = _ref2.greetingUniqueId,
985
+ buttonId = _ref2.buttonId;
986
+ return auth.getToken().then(function (token) {
987
+ var state = store.getState();
988
+ var query = urlUtils.buildQueryString(_extends({
989
+ organization_id: state.organizationId
990
+ }, getRegionParam(state)));
991
+ var apiUrl = getServerUrl(state) + "/action/" + SEND_GREETING_BUTTON_CLICKED + "?" + query;
992
+ return fetch(apiUrl, {
993
+ method: 'POST',
994
+ headers: {
995
+ 'Content-Type': 'application/json',
996
+ Authorization: token.tokenType + " " + token.accessToken
997
+ },
998
+ body: JSON.stringify({
999
+ greeting_unique_id: greetingUniqueId,
1000
+ button_id: buttonId
1054
1001
  }),
1055
- reason: reason
1056
- }
1002
+ keepalive: true
1003
+ }).then(dataUtils.noop);
1057
1004
  });
1058
1005
  };
1059
- var failRequest = function failRequest(_ref2, requestAction, error) {
1060
- var getState = _ref2.getState,
1061
- dispatch = _ref2.dispatch;
1062
- var requestId = requestAction.payload.id;
1063
- dispatch({
1064
- type: REQUEST_FAILED,
1065
- payload: {
1066
- id: requestId,
1067
- reject: getState().requests[requestId].reject,
1068
- error: error
1069
- }
1070
- });
1006
+
1007
+ // TODO: this thing is not really well typed and should be improved
1008
+ var sendRequestAction = function sendRequestAction(store, action) {
1009
+ action.payload.id = dataUtils.generateUniqueId(store.getState().requests);
1010
+ var _promiseDeferred = promiseUtils.promiseDeferred(),
1011
+ resolve = _promiseDeferred.resolve,
1012
+ reject = _promiseDeferred.reject,
1013
+ promise = _promiseDeferred.promise;
1014
+ action.payload.promise = promise;
1015
+ action.payload.resolve = resolve;
1016
+ action.payload.reject = reject;
1017
+ store.dispatch(action);
1018
+ return promise;
1071
1019
  };
1072
1020
 
1073
1021
  var SUCCESS = Object.freeze({
1074
1022
  success: true
1075
1023
  });
1076
1024
 
1025
+ var _excluded$4 = ["group_id"];
1077
1026
  var parseCommonEventProps = function parseCommonEventProps(threadId, event) {
1078
1027
  var parsed = {
1079
1028
  id: event.id,
@@ -1138,18 +1087,24 @@ var parseFile = function parseFile(thread, file) {
1138
1087
  name: file.name
1139
1088
  });
1140
1089
  };
1141
- var parseForm = function parseForm(thread, form) {
1090
+ var parseForm$1 = function parseForm(thread, form) {
1142
1091
  return _extends({}, parseCommonEventProps(thread, form), {
1143
1092
  authorId: 'system',
1144
1093
  type: FORM,
1145
- formId: form.form_id,
1094
+ formId: form.form_id
1095
+ }, form.form_type && {
1096
+ formType: form.form_type
1097
+ }, {
1146
1098
  fields: form.fields
1147
1099
  });
1148
1100
  };
1149
1101
  var parseFilledForm = function parseFilledForm(thread, filledForm) {
1150
1102
  return _extends({}, parseCommonEventProps(thread, filledForm), {
1151
1103
  type: FILLED_FORM,
1152
- formId: filledForm.form_id,
1104
+ formId: filledForm.form_id
1105
+ }, filledForm.form_type && {
1106
+ formType: filledForm.form_type
1107
+ }, {
1153
1108
  fields: filledForm.fields.map(function (field) {
1154
1109
  switch (field.type) {
1155
1110
  case 'group_chooser':
@@ -1159,7 +1114,7 @@ var parseFilledForm = function parseFilledForm(thread, filledForm) {
1159
1114
  }
1160
1115
  var _field$answer = field.answer,
1161
1116
  groupId = _field$answer.group_id,
1162
- answer = _objectWithoutPropertiesLoose(_field$answer, ["group_id"]);
1117
+ answer = _objectWithoutPropertiesLoose(_field$answer, _excluded$4);
1163
1118
  return _extends({}, field, {
1164
1119
  answer: _extends({}, answer, {
1165
1120
  groupId: groupId
@@ -1203,69 +1158,147 @@ var parseRichMessageElement = function parseRichMessageElement(element) {
1203
1158
  alternativeText: image.alternative_text
1204
1159
  });
1205
1160
  }
1161
+ if (element.ecommerce) {
1162
+ parsed.ecommerce = _extends({
1163
+ productId: element.ecommerce.product_id,
1164
+ viewType: element.ecommerce.view_type
1165
+ }, typeof element.ecommerce.label === 'string' && {
1166
+ label: element.ecommerce.label
1167
+ }, Array.isArray(element.ecommerce.options) && {
1168
+ options: element.ecommerce.options.map(function (option) {
1169
+ return _extends({
1170
+ label: option.label,
1171
+ optionId: option.option_id
1172
+ }, option.price !== undefined && {
1173
+ price: option.price
1174
+ }, option.regular_price !== undefined && {
1175
+ regularPrice: option.regular_price
1176
+ }, option.max_price !== undefined && {
1177
+ maxPrice: option.max_price
1178
+ }, option.currency !== undefined && {
1179
+ currency: option.currency
1180
+ }, typeof option.color === 'string' && {
1181
+ color: option.color
1182
+ }, option.image_url && _extends({
1183
+ imageUrl: option.image_url
1184
+ }, typeof option.image_thumbnail_url === 'string' && {
1185
+ imageThumbnailUrl: option.image_thumbnail_url
1186
+ }), typeof option.available === 'boolean' && {
1187
+ available: option.available
1188
+ }, typeof option.selected === 'boolean' && {
1189
+ selected: option.selected
1190
+ });
1191
+ })
1192
+ }, Array.isArray(element.ecommerce.addons) && {
1193
+ addons: element.ecommerce.addons.map(function (addon) {
1194
+ switch (addon.addon_type) {
1195
+ case 'price_range':
1196
+ return _extends({
1197
+ addonType: addon.addon_type
1198
+ }, addon.range_from !== undefined && {
1199
+ rangeFrom: addon.range_from
1200
+ }, addon.range_to !== undefined && {
1201
+ rangeTo: addon.range_to
1202
+ }, typeof addon.currency === 'string' && {
1203
+ currency: addon.currency
1204
+ });
1205
+ default:
1206
+ return {
1207
+ addonType: addon.addon_type
1208
+ };
1209
+ }
1210
+ })
1211
+ });
1212
+ }
1206
1213
  if (element.buttons) {
1207
1214
  parsed.buttons = element.buttons.map(function (serverButton) {
1208
1215
  switch (serverButton.type) {
1209
1216
  case 'message':
1217
+ case 'add_to_cart':
1218
+ case 'show_gallery':
1219
+ case 'copy':
1210
1220
  case 'phone':
1211
1221
  {
1212
- return {
1222
+ return _extends({
1213
1223
  type: serverButton.type,
1214
1224
  text: serverButton.text,
1215
1225
  postbackId: serverButton.postback_id,
1216
1226
  userIds: serverButton.user_ids,
1217
1227
  value: serverButton.value,
1218
1228
  role: serverButton.role || 'default'
1219
- };
1229
+ }, serverButton.button_id && {
1230
+ buttonId: serverButton.button_id
1231
+ });
1220
1232
  }
1221
1233
  case 'cancel':
1222
1234
  {
1223
- return {
1235
+ return _extends({
1224
1236
  type: serverButton.type,
1225
1237
  text: serverButton.text,
1226
1238
  postbackId: serverButton.postback_id,
1227
1239
  userIds: serverButton.user_ids,
1228
1240
  role: serverButton.role || 'default'
1229
- };
1241
+ }, serverButton.button_id && {
1242
+ buttonId: serverButton.button_id
1243
+ });
1230
1244
  }
1231
1245
  case 'url':
1232
1246
  {
1233
- var button = {
1247
+ var button = _extends({
1234
1248
  type: serverButton.type,
1235
1249
  text: serverButton.text,
1236
1250
  postbackId: serverButton.postback_id,
1237
1251
  userIds: serverButton.user_ids,
1238
1252
  value: serverButton.value,
1239
1253
  role: serverButton.role || 'default'
1240
- };
1254
+ }, serverButton.button_id && {
1255
+ buttonId: serverButton.button_id
1256
+ });
1241
1257
  if (serverButton.target) {
1242
1258
  button.target = serverButton.target;
1243
1259
  }
1244
1260
  return button;
1245
1261
  }
1246
- case 'webview':
1262
+ case 'open_external':
1247
1263
  {
1248
- var _button = {
1264
+ var _button = _extends({
1249
1265
  type: serverButton.type,
1250
1266
  text: serverButton.text,
1251
1267
  postbackId: serverButton.postback_id,
1252
1268
  userIds: serverButton.user_ids,
1253
1269
  value: serverButton.value,
1254
1270
  role: serverButton.role || 'default'
1255
- };
1256
- if (typeof serverButton.webview_height === 'string') {
1257
- _button.webviewHeight = serverButton.webview_height;
1258
- }
1271
+ }, serverButton.button_id && {
1272
+ buttonId: serverButton.button_id
1273
+ }, serverButton.target && {
1274
+ target: serverButton.target
1275
+ });
1259
1276
  return _button;
1260
1277
  }
1278
+ case 'webview':
1279
+ {
1280
+ var _button2 = _extends({
1281
+ type: serverButton.type,
1282
+ text: serverButton.text,
1283
+ postbackId: serverButton.postback_id,
1284
+ userIds: serverButton.user_ids,
1285
+ value: serverButton.value,
1286
+ role: serverButton.role || 'default'
1287
+ }, serverButton.button_id && {
1288
+ buttonId: serverButton.button_id
1289
+ });
1290
+ return _button2;
1291
+ }
1261
1292
  default:
1262
1293
  {
1263
- return {
1294
+ return _extends({
1264
1295
  text: serverButton.text,
1265
1296
  postbackId: serverButton.postback_id,
1266
1297
  userIds: serverButton.user_ids,
1267
1298
  role: serverButton.role || 'default'
1268
- };
1299
+ }, serverButton.button_id && {
1300
+ buttonId: serverButton.button_id
1301
+ });
1269
1302
  }
1270
1303
  }
1271
1304
  });
@@ -1277,6 +1310,7 @@ var parseRichMessage = function parseRichMessage(thread, richMessage) {
1277
1310
  case 'cards':
1278
1311
  case 'quick_replies':
1279
1312
  case 'sticker':
1313
+ case 'ecommerce':
1280
1314
  return _extends({}, parseCommonEventProps(thread, richMessage), {
1281
1315
  type: RICH_MESSAGE,
1282
1316
  template: richMessage.template_id,
@@ -1299,12 +1333,12 @@ var parseSystemMessage = function parseSystemMessage(thread, systemMessage) {
1299
1333
  }
1300
1334
  return parsed;
1301
1335
  };
1302
- var parseEvent$1 = function parseEvent(thread, event) {
1336
+ var parseEvent = function parseEvent(thread, event) {
1303
1337
  switch (event.type) {
1304
1338
  case FILE:
1305
1339
  return parseFile(thread, event);
1306
1340
  case FORM:
1307
- return parseForm(thread, event);
1341
+ return parseForm$1(thread, event);
1308
1342
  case FILLED_FORM:
1309
1343
  return parseFilledForm(thread, event);
1310
1344
  case MESSAGE:
@@ -1325,10 +1359,11 @@ var parseGreeting = function parseGreeting(greeting) {
1325
1359
  addon: greeting.addon || null,
1326
1360
  uniqueId: greeting.unique_id,
1327
1361
  displayedFirstTime: greeting.displayed_first_time,
1362
+ isExitIntent: greeting.is_exit_intent,
1328
1363
  accepted: greeting.accepted || false,
1329
1364
  subtype: greeting.subtype || 'greeting',
1330
1365
  // threadId is typed as nonoptional string but for greetings it doesn't exist
1331
- event: parseEvent$1(null, greeting.event),
1366
+ event: parseEvent(null, greeting.event),
1332
1367
  agent: {
1333
1368
  id: greeting.agent.id,
1334
1369
  name: greeting.agent.name,
@@ -1341,7 +1376,7 @@ var parseGreeting = function parseGreeting(greeting) {
1341
1376
 
1342
1377
  // we could use `mergeAll` for this, but we need to preserve insertion order here
1343
1378
  // so it's better to rely on a custom implementation
1344
- var parseCustomerSessionFields$1 = function parseCustomerSessionFields(sessionFields) {
1379
+ var parseCustomerSessionFields = function parseCustomerSessionFields(sessionFields) {
1345
1380
  return sessionFields.reduce(function (acc, field) {
1346
1381
  var _Object$keys = Object.keys(field),
1347
1382
  key = _Object$keys[0];
@@ -1372,7 +1407,7 @@ var parseThread = function parseThread(chatId, thread) {
1372
1407
  createdAt: thread.created_at,
1373
1408
  userIds: thread.user_ids,
1374
1409
  events: thread.events.map(function (event) {
1375
- return parseEvent$1(thread.id, event);
1410
+ return parseEvent(thread.id, event);
1376
1411
  }).filter(Boolean),
1377
1412
  properties: properties,
1378
1413
  previousThreadId: thread.previous_thread_id || null,
@@ -1405,7 +1440,7 @@ var parseChatAgent = function parseChatAgent(agent) {
1405
1440
  var parseCustomerOptionalProps = function parseCustomerOptionalProps(customerProps) {
1406
1441
  var optionalProps = dataUtils.pickOwn(['avatar', 'email', 'name'], customerProps);
1407
1442
  if (customerProps.session_fields) {
1408
- optionalProps.sessionFields = parseCustomerSessionFields$1(customerProps.session_fields);
1443
+ optionalProps.sessionFields = parseCustomerSessionFields(customerProps.session_fields);
1409
1444
  }
1410
1445
  return optionalProps;
1411
1446
  };
@@ -1436,44 +1471,315 @@ var parseCustomer = function parseCustomer(customer) {
1436
1471
  }
1437
1472
  });
1438
1473
  };
1439
- var parsePredictedAgent = function parsePredictedAgent(payload) {
1440
- var agent = payload.agent,
1441
- queue = payload.queue;
1474
+ var parseQueueUpdate = function parseQueueUpdate(queueUpdate) {
1442
1475
  return {
1443
- agent: {
1444
- id: agent.id,
1445
- type: AGENT,
1446
- name: agent.name,
1447
- avatar: agent.avatar,
1448
- jobTitle: agent.job_title,
1449
- isBot: agent.is_bot
1476
+ position: queueUpdate.position,
1477
+ waitTime: queueUpdate.wait_time
1478
+ };
1479
+ };
1480
+ var parseQueue = function parseQueue(queue) {
1481
+ return _extends({}, parseQueueUpdate(queue), {
1482
+ queuedAt: queue.queued_at
1483
+ });
1484
+ };
1485
+ var parseChatUser = function parseChatUser(user) {
1486
+ return user.type === CUSTOMER ? parseChatCustomer(user) : parseChatAgent(user);
1487
+ };
1488
+ var parseGroupStatus = function parseGroupStatus(status) {
1489
+ return status === 'offline' ? 'offline' : 'online';
1490
+ };
1491
+
1492
+ var getSideStorageKey = function getSideStorageKey(store) {
1493
+ var _store$getState = store.getState(),
1494
+ organizationId = _store$getState.organizationId,
1495
+ groupId = _store$getState.groupId,
1496
+ uniqueGroups = _store$getState.uniqueGroups;
1497
+ return "side_storage_" + organizationId + (uniqueGroups ? ":" + groupId : '');
1498
+ };
1499
+ var getSideStorage = function getSideStorage(store, parentStorage) {
1500
+ var storage = isomorphicStorage.createAsyncStorage(parentStorage);
1501
+ var sideStorageKey = getSideStorageKey(store);
1502
+ return storage.getItem(sideStorageKey)["catch"](dataUtils.noop).then(function (sideStorage) {
1503
+ return JSON.parse(sideStorage || '{}');
1504
+ })
1505
+ // shouldnt get triggered, just a defensive measure against malformed storage entries
1506
+ ["catch"](dataUtils.noop);
1507
+ };
1508
+ var saveSideStorage = function saveSideStorage(store, sideStorage, parentStorage) {
1509
+ var storage = isomorphicStorage.createAsyncStorage(parentStorage);
1510
+ storage.setItem(getSideStorageKey(store), JSON.stringify(sideStorage))["catch"](dataUtils.noop);
1511
+ };
1512
+ var clearSideStorage = function clearSideStorage(store, parentStorage) {
1513
+ var storage = isomorphicStorage.createAsyncStorage(parentStorage);
1514
+ storage.removeItem(getSideStorageKey(store))["catch"](dataUtils.noop);
1515
+ };
1516
+
1517
+ var failAllRequests = function failAllRequests(_ref, reason) {
1518
+ var getState = _ref.getState,
1519
+ dispatch = _ref.dispatch;
1520
+ var state = getState();
1521
+ var requests = getAllRequests(state);
1522
+ dispatch({
1523
+ type: FAIL_ALL_REQUESTS,
1524
+ payload: {
1525
+ rejects: Object.keys(requests).map(function (requestId) {
1526
+ return requests[requestId].reject;
1527
+ }),
1528
+ reason: reason
1529
+ }
1530
+ });
1531
+ };
1532
+ var failRequest = function failRequest(_ref2, requestAction, error) {
1533
+ var getState = _ref2.getState,
1534
+ dispatch = _ref2.dispatch;
1535
+ var requestId = requestAction.payload.id;
1536
+ dispatch({
1537
+ type: REQUEST_FAILED,
1538
+ payload: {
1539
+ id: requestId,
1540
+ reject: getState().requests[requestId].reject,
1541
+ error: error
1542
+ }
1543
+ });
1544
+ };
1545
+
1546
+ var checkGoals = function checkGoals(store, auth, sessionFields) {
1547
+ return auth.getToken().then(function (token) {
1548
+ var state = store.getState();
1549
+ if (getSelfId(state) === null) {
1550
+ store.dispatch(setSelfId(token.entityId));
1551
+ }
1552
+ var page = state.page;
1553
+ if (!page || !page.url) {
1554
+ return;
1555
+ }
1556
+ var query = urlUtils.buildQueryString(_extends({
1557
+ organization_id: state.organizationId
1558
+ }, getRegionParam(state)));
1559
+ var payload = {
1560
+ session_fields: parseCustomerSessionFields$1(sessionFields || {}),
1561
+ group_id: state.groupId || 0,
1562
+ page_url: page.url
1563
+ };
1564
+ return fetch__default["default"](getServerUrl(state) + "/action/" + CHECK_GOALS + "?" + query, {
1565
+ method: 'POST',
1566
+ headers: {
1567
+ 'Content-Type': 'application/json',
1568
+ Authorization: token.tokenType + " " + token.accessToken
1569
+ },
1570
+ body: JSON.stringify(payload)
1571
+ }).then(function () {
1572
+ // TODO: we should actually normalize response here
1573
+ return undefined;
1574
+ });
1575
+ });
1576
+ };
1577
+
1578
+ var taskChain = function taskChain(_ref, onSuccess, onError) {
1579
+ var steps = _arrayLikeToArray(_ref).slice(0);
1580
+ var cancelled = false;
1581
+ var _next = function next(intermediateResult) {
1582
+ var step = steps.shift();
1583
+ promiseUtils.promiseTry(function () {
1584
+ return step(intermediateResult);
1585
+ }).then(function (result) {
1586
+ if (cancelled) {
1587
+ return;
1588
+ }
1589
+ if (steps.length) {
1590
+ _next(result);
1591
+ return;
1592
+ }
1593
+ onSuccess(result);
1594
+ }, function (error) {
1595
+ if (cancelled) {
1596
+ return;
1597
+ }
1598
+ onError(error);
1599
+ });
1600
+ };
1601
+ _next();
1602
+ return {
1603
+ cancel: function cancel() {
1604
+ cancelled = true;
1605
+ }
1606
+ };
1607
+ };
1608
+ var sendLoginFlowRequest = function sendLoginFlowRequest(store, type, payload) {
1609
+ return sendRequestAction(store, sendRequest$1(type, payload, 'login'));
1610
+ };
1611
+ var delay = function delay(ms) {
1612
+ return new Promise(function (resolve) {
1613
+ setTimeout(resolve, ms);
1614
+ });
1615
+ };
1616
+ function createLoginTask(auth, customerDataProvider, parentStorage) {
1617
+ var store;
1618
+ var sentPage = null;
1619
+ var task;
1620
+ var backoffConfig = {
1621
+ min: 300,
1622
+ max: 60000,
1623
+ jitter: 0.3
1624
+ };
1625
+ var defaultBackoffStrategy = createBackoff__default["default"](backoffConfig);
1626
+ var slowerBackoffStrategy = createBackoff__default["default"](_extends({}, backoffConfig, {
1627
+ min: 1000
1628
+ }));
1629
+ var currentBackoffStrategy = defaultBackoffStrategy;
1630
+ var destroy$1 = function destroy$1(reason) {
1631
+ return store.dispatch(destroy(reason));
1632
+ };
1633
+ var reconnect$1 = function reconnect$1() {
1634
+ return store.dispatch(reconnect(currentBackoffStrategy.duration()));
1635
+ };
1636
+ var getTokenAndSideStorage = function getTokenAndSideStorage() {
1637
+ return Promise.all([auth.getToken(), getSideStorage(store, parentStorage)]);
1638
+ };
1639
+ var dispatchSelfId = function dispatchSelfId(_ref3) {
1640
+ var token = _ref3[0],
1641
+ sideStorage = _ref3[1];
1642
+ var selfId = getSelfId(store.getState());
1643
+ if (selfId === null) {
1644
+ store.dispatch(setSelfId(token.entityId));
1645
+ } else if (selfId !== token.entityId) {
1646
+ if (parentStorage) {
1647
+ clearSideStorage(store, parentStorage);
1648
+ }
1649
+ store.dispatch(clearSensitiveSessionState());
1650
+ store.dispatch(setSelfId(token.entityId));
1651
+ store.dispatch(identityChanged({
1652
+ previousId: selfId,
1653
+ newId: token.entityId
1654
+ }));
1655
+ return [token, {}];
1656
+ }
1657
+ return [token, sideStorage];
1658
+ };
1659
+ var _sendLogin = function sendLogin(_ref4) {
1660
+ var token = _ref4[0],
1661
+ sideStorage = _ref4[1];
1662
+ var state = store.getState();
1663
+ var application = state.application,
1664
+ groupId = state.groupId,
1665
+ page = state.page,
1666
+ referrer = state.referrer,
1667
+ mobile = state.mobile,
1668
+ tabId = state.tabId;
1669
+ var payload = {
1670
+ token: token.tokenType + " " + token.accessToken,
1671
+ customer: typeof customerDataProvider === 'function' ? parseCustomerUpdate(customerDataProvider()) : {},
1672
+ customer_side_storage: sideStorage,
1673
+ is_mobile: mobile,
1674
+ application: dataUtils.pick(['name', 'version'], application)
1675
+ };
1676
+ if (typeof groupId === 'number') {
1677
+ payload.group_id = groupId;
1678
+ }
1679
+ if (application.channelType) {
1680
+ payload.application.channel_type = application.channelType;
1681
+ }
1682
+ if (page !== null) {
1683
+ sentPage = page;
1684
+ payload.customer_page = page;
1685
+ }
1686
+ if (referrer !== null) {
1687
+ payload.referrer = referrer;
1688
+ }
1689
+ if (tabId !== null) {
1690
+ payload.tab_id = tabId;
1691
+ }
1692
+ return Promise.race([sendLoginFlowRequest(store, LOGIN, payload), delay(15 * 1000).then(function () {
1693
+ return Promise.reject(createError({
1694
+ message: 'Request timed out.',
1695
+ code: REQUEST_TIMEOUT$1
1696
+ }));
1697
+ })]);
1698
+ };
1699
+ var updateCustomerPageIfNeeded = function updateCustomerPageIfNeeded() {
1700
+ var _store$getState = store.getState(),
1701
+ page = _store$getState.page;
1702
+ if (sentPage !== page) {
1703
+ sendLoginFlowRequest(store, UPDATE_CUSTOMER_PAGE, page)["catch"](dataUtils.noop);
1704
+ }
1705
+ sentPage = null;
1706
+ };
1707
+ return {
1708
+ sendLogin: function sendLogin(_store) {
1709
+ var _task;
1710
+ // after switching to callbags, we should be able to use smth similar to redux-observable
1711
+ // and thus just use store given to epic
1712
+ store = _store;
1713
+ (_task = task) == null || _task.cancel();
1714
+ task = taskChain([getTokenAndSideStorage, dispatchSelfId, _sendLogin], function (loginResponse) {
1715
+ task = null;
1716
+ defaultBackoffStrategy.reset();
1717
+ slowerBackoffStrategy.reset();
1718
+ currentBackoffStrategy = defaultBackoffStrategy;
1719
+
1720
+ // TODO: rethink if this should be handled by SDK consumer
1721
+ updateCustomerPageIfNeeded();
1722
+ store.dispatch(loginSuccess(loginResponse));
1723
+ }, function (error) {
1724
+ task = null;
1725
+ if (process.env.NODE_ENV !== 'production') {
1726
+ console.error('[Customer SDK] Login flow has thrown code', error.code, 'with', error);
1727
+ }
1728
+ switch (error.code) {
1729
+ case AUTHENTICATION:
1730
+ auth.getFreshToken();
1731
+ reconnect$1();
1732
+ return;
1733
+ case CONNECTION_LOST:
1734
+ // this is connectivity problem, not a server error
1735
+ // and is taken care of in socket module
1736
+ // as it has its own backoff implementation
1737
+ return;
1738
+ case MISDIRECTED_CONNECTION$1:
1739
+ // socket gets reinitialized on this anyway, so just ignore it here
1740
+ return;
1741
+ case SDK_DESTROYED:
1742
+ return;
1743
+ // those are auth errors, we should maybe export those constants from the auth package
1744
+ case 'SSO_IDENTITY_EXCEPTION':
1745
+ case 'SSO_OAUTH_EXCEPTION':
1746
+ if (error.message === 'server_error' || error.message === 'temporarily_unavailable') {
1747
+ reconnect$1();
1748
+ return;
1749
+ }
1750
+ destroy$1(error.message);
1751
+ return;
1752
+ case USERS_LIMIT_REACHED:
1753
+ store.dispatch(pauseConnection(error.code.toLowerCase()));
1754
+ return;
1755
+ case CUSTOMER_BANNED:
1756
+ case WRONG_PRODUCT_VERSION:
1757
+ destroy$1(error.code.toLowerCase());
1758
+ return;
1759
+ case SERVICE_TEMPORARILY_UNAVAILABLE$1:
1760
+ currentBackoffStrategy = slowerBackoffStrategy;
1761
+ reconnect$1();
1762
+ return;
1763
+ default:
1764
+ reconnect$1();
1765
+ return;
1766
+ }
1767
+ });
1450
1768
  },
1451
- queue: queue
1452
- };
1453
- };
1454
- var parseQueueUpdate = function parseQueueUpdate(queueUpdate) {
1455
- return {
1456
- position: queueUpdate.position,
1457
- waitTime: queueUpdate.wait_time
1769
+ cancel: function cancel() {
1770
+ var _task2;
1771
+ (_task2 = task) == null || _task2.cancel();
1772
+ }
1458
1773
  };
1459
- };
1460
- var parseQueue = function parseQueue(queue) {
1461
- return _extends({}, parseQueueUpdate(queue), {
1462
- queuedAt: queue.queued_at
1463
- });
1464
- };
1465
- var parseChatUser = function parseChatUser(user) {
1466
- return user.type === CUSTOMER ? parseChatCustomer(user) : parseChatAgent(user);
1467
- };
1468
- var parseGroupStatus = function parseGroupStatus(status) {
1469
- return status === 'offline' ? 'offline' : 'online';
1470
- };
1774
+ }
1471
1775
 
1776
+ var _excluded$3 = ["present"],
1777
+ _excluded2$1 = ["statistics"];
1472
1778
  var _FAIL_ALL_REQUESTS_ME;
1473
1779
 
1474
1780
  // TODO: rethink how we handle reconnects
1475
1781
  var SMALL_RECONNECT_DELAY = 100;
1476
- var FAIL_ALL_REQUESTS_MESSAGES = (_FAIL_ALL_REQUESTS_ME = {}, _FAIL_ALL_REQUESTS_ME[CONNECTION_LOST] = 'Connection lost.', _FAIL_ALL_REQUESTS_ME[MISDIRECTED_CONNECTION] = 'Connected to wrong region.', _FAIL_ALL_REQUESTS_ME);
1782
+ var FAIL_ALL_REQUESTS_MESSAGES = (_FAIL_ALL_REQUESTS_ME = {}, _FAIL_ALL_REQUESTS_ME[CONNECTION_LOST] = 'Connection lost.', _FAIL_ALL_REQUESTS_ME[MISDIRECTED_CONNECTION$1] = 'Connected to wrong region.', _FAIL_ALL_REQUESTS_ME);
1477
1783
  var updateStateIfNeeded = function updateStateIfNeeded(store, action) {
1478
1784
  var state = store.getState();
1479
1785
  switch (action.type) {
@@ -1507,7 +1813,7 @@ var updateStateIfNeeded = function updateStateIfNeeded(store, action) {
1507
1813
  }
1508
1814
  }
1509
1815
  };
1510
- var sendRequest$1 = function sendRequest(socket, _ref3) {
1816
+ var sendRequest = function sendRequest(socket, _ref3, hasCustomIdentityProvider) {
1511
1817
  var _ref3$payload = _ref3.payload,
1512
1818
  id = _ref3$payload.id,
1513
1819
  request = _ref3$payload.request;
@@ -1517,20 +1823,19 @@ var sendRequest$1 = function sendRequest(socket, _ref3) {
1517
1823
  switch (frame.action) {
1518
1824
  case LOGIN:
1519
1825
  {
1520
- var upgradedPushes = [];
1826
+ var pushes = {
1827
+ '3.6': dataUtils.values(serverPushActions).filter(function (pushAction) {
1828
+ return (
1829
+ // `customer_disconnected` can be sent immediately after opening the connection, before it even received login request
1830
+ // therefore it's not possible to subscribe for a particular version of this push - the "connection version" is always used
1831
+ pushAction !== CUSTOMER_DISCONNECTED
1832
+ );
1833
+ })
1834
+ };
1521
1835
  socket.emit(_extends({}, frame, {
1522
- version: '3.5',
1836
+ version: '3.6',
1523
1837
  payload: _extends({}, frame.payload, {
1524
- pushes: {
1525
- // '3.6': upgradedPushes,
1526
- '3.5': dataUtils.values(serverPushActions).filter(function (pushAction) {
1527
- return (
1528
- // `customer_disconnected` can be sent immediately after opening the connection, before it even received login request
1529
- // therefore it's not possible to subscribe for a particular version of this push - the "connection version" is always used
1530
- pushAction !== CUSTOMER_DISCONNECTED && !dataUtils.includes(pushAction, upgradedPushes)
1531
- );
1532
- })
1533
- }
1838
+ pushes: pushes
1534
1839
  })
1535
1840
  }));
1536
1841
  return;
@@ -1543,19 +1848,19 @@ var sendRequest$1 = function sendRequest(socket, _ref3) {
1543
1848
  var emitUsers = function emitUsers(emit, users) {
1544
1849
  users.forEach(function (user) {
1545
1850
  if ('present' in user) {
1546
- var rest = _objectWithoutPropertiesLoose(user, ["present"]);
1851
+ var rest = _objectWithoutPropertiesLoose(user, _excluded$3);
1547
1852
  emit('user_data', rest);
1548
1853
  return;
1549
1854
  }
1550
1855
  if (user.type === CUSTOMER) {
1551
- var _rest = _objectWithoutPropertiesLoose(user, ["statistics"]);
1856
+ var _rest = _objectWithoutPropertiesLoose(user, _excluded2$1);
1552
1857
  emit('user_data', _rest);
1553
1858
  return;
1554
1859
  }
1555
1860
  emit('user_data', user);
1556
1861
  });
1557
1862
  };
1558
- var handlePush = function handlePush(_ref4, _ref5) {
1863
+ var handlePush$1 = function handlePush(_ref4, _ref5, parentStorage) {
1559
1864
  var emit = _ref4.emit,
1560
1865
  store = _ref4.store;
1561
1866
  var payload = _ref5.payload;
@@ -1574,7 +1879,7 @@ var handlePush = function handlePush(_ref4, _ref5) {
1574
1879
  emit('thread_properties_updated', payload.payload);
1575
1880
  return;
1576
1881
  case CUSTOMER_SIDE_STORAGE_UPDATED:
1577
- saveSideStorage(store, payload.payload.customer_side_storage);
1882
+ saveSideStorage(store, payload.payload.customer_side_storage, parentStorage);
1578
1883
  return;
1579
1884
  case CUSTOMER_DISCONNECTED:
1580
1885
  // each of those should currently lead to either reconnect or destroy call
@@ -1592,24 +1897,24 @@ var handlePush = function handlePush(_ref4, _ref5) {
1592
1897
  store.dispatch(reconnect(SMALL_RECONNECT_DELAY));
1593
1898
  emit('disconnected', payload.payload);
1594
1899
  break;
1595
- case CUSTOMER_BANNED:
1900
+ case CUSTOMER_BANNED$1:
1596
1901
  case CUSTOMER_TEMPORARILY_BLOCKED:
1597
1902
  case LICENSE_NOT_FOUND:
1598
1903
  case PRODUCT_VERSION_CHANGED:
1599
1904
  case TOO_MANY_CONNECTIONS:
1600
- case UNSUPPORTED_VERSION:
1905
+ case UNSUPPORTED_VERSION$1:
1601
1906
  case LOGGED_OUT_REMOTELY:
1602
1907
  // this also emits `disconnected` event - but it's handled in response to this action by destroy handler
1603
1908
  store.dispatch(destroy(payload.payload.reason));
1604
1909
  break;
1605
- case MISDIRECTED_CONNECTION$1:
1606
- failAllRequests(store, MISDIRECTED_CONNECTION);
1910
+ case MISDIRECTED_CONNECTION:
1911
+ failAllRequests(store, MISDIRECTED_CONNECTION$1);
1607
1912
  store.dispatch({
1608
1913
  type: CHANGE_REGION,
1609
1914
  payload: payload.payload.data
1610
1915
  });
1611
1916
  break;
1612
- case SERVICE_TEMPORARILY_UNAVAILABLE$1:
1917
+ case SERVICE_TEMPORARILY_UNAVAILABLE:
1613
1918
  case TOO_MANY_UNAUTHORIZED_CONNECTIONS:
1614
1919
  // this should only really fail a `login` request - as it's the only one sent before authorization
1615
1920
  // and login should reconnect on its own right now
@@ -1644,6 +1949,12 @@ var handlePush = function handlePush(_ref4, _ref5) {
1644
1949
  case INCOMING_TYPING_INDICATOR:
1645
1950
  emit(payload.action, payload.payload);
1646
1951
  return;
1952
+ case INCOMING_THINKING_INDICATOR:
1953
+ emit(payload.action, payload.payload);
1954
+ return;
1955
+ case INCOMING_EVENT_PREVIEW:
1956
+ emit(payload.action, payload.payload);
1957
+ return;
1647
1958
  case USER_ADDED_TO_CHAT:
1648
1959
  emitUsers(emit, [payload.payload.user]);
1649
1960
  emit(payload.action, payload.payload);
@@ -1653,7 +1964,7 @@ var handlePush = function handlePush(_ref4, _ref5) {
1653
1964
  return;
1654
1965
  }
1655
1966
  };
1656
- var handleResponse = function handleResponse(_ref6, _ref7) {
1967
+ var handleResponse$1 = function handleResponse(_ref6, _ref7) {
1657
1968
  var emit = _ref6.emit;
1658
1969
  var payload = _ref7.payload;
1659
1970
  switch (payload.action) {
@@ -1685,9 +1996,9 @@ var createSideEffectsHandler = (function (_ref8) {
1685
1996
  customerDataProvider = _ref8.customerDataProvider,
1686
1997
  emitter = _ref8.emitter,
1687
1998
  socket = _ref8.socket,
1688
- licenseId = _ref8.licenseId;
1999
+ parentStorage = _ref8.parentStorage;
1689
2000
  var emit = emitter.emit;
1690
- var loginTask = createLoginTask(auth, customerDataProvider, licenseId);
2001
+ var loginTask = createLoginTask(auth, customerDataProvider, parentStorage);
1691
2002
 
1692
2003
  // TODO: using Store type here is a lie, middleware only provides MiddlewareAPI here
1693
2004
  return function (action, store) {
@@ -1695,7 +2006,7 @@ var createSideEffectsHandler = (function (_ref8) {
1695
2006
  case CHANGE_REGION:
1696
2007
  socket.reinitialize();
1697
2008
  return;
1698
- case CHECK_GOALS:
2009
+ case CHECK_GOALS$1:
1699
2010
  checkGoals(store, auth, action.payload.sessionFields)["catch"](dataUtils.noop);
1700
2011
  return;
1701
2012
  case DESTROY:
@@ -1707,8 +2018,8 @@ var createSideEffectsHandler = (function (_ref8) {
1707
2018
  case 'manual':
1708
2019
  failAllRequests(store, SDK_DESTROYED);
1709
2020
  break;
1710
- case CUSTOMER_BANNED:
1711
- case LICENSE_EXPIRED:
2021
+ case CUSTOMER_BANNED$1:
2022
+ case LICENSE_EXPIRED$1:
1712
2023
  case PRODUCT_VERSION_CHANGED:
1713
2024
  case LOGGED_OUT_REMOTELY:
1714
2025
  // normalize those to CONNECTION_LOST as the handling on the consumer's side should be the same
@@ -1798,21 +2109,21 @@ var createSideEffectsHandler = (function (_ref8) {
1798
2109
  // TODO: this if doesn't seem to make much sense
1799
2110
  // I'm too afraid to remove it right now though
1800
2111
  if (action.payload.action === CUSTOMER_DISCONNECTED) {
1801
- handlePush({
2112
+ handlePush$1({
1802
2113
  emit: emit,
1803
2114
  store: store
1804
- }, action);
2115
+ }, action, parentStorage);
1805
2116
  return;
1806
2117
  }
1807
2118
  updateStateIfNeeded(store, action);
1808
- handlePush({
2119
+ handlePush$1({
1809
2120
  emit: emit,
1810
2121
  store: store
1811
- }, action);
2122
+ }, action, parentStorage);
1812
2123
  return;
1813
2124
  case PUSH_RESPONSE_RECEIVED:
1814
2125
  updateStateIfNeeded(store, action);
1815
- handleResponse({
2126
+ handleResponse$1({
1816
2127
  emit: emit
1817
2128
  }, action);
1818
2129
  return;
@@ -1830,7 +2141,7 @@ var createSideEffectsHandler = (function (_ref8) {
1830
2141
  }
1831
2142
  case RESPONSE_RECEIVED:
1832
2143
  updateStateIfNeeded(store, action);
1833
- handleResponse({
2144
+ handleResponse$1({
1834
2145
  emit: emit
1835
2146
  }, action);
1836
2147
  return;
@@ -1851,7 +2162,7 @@ var createSideEffectsHandler = (function (_ref8) {
1851
2162
  });
1852
2163
  return;
1853
2164
  }
1854
- sendRequest$1(socket, action);
2165
+ sendRequest(socket, action);
1855
2166
  }
1856
2167
  return;
1857
2168
  case SET_SELF_ID:
@@ -1883,115 +2194,43 @@ var createSideEffectsHandler = (function (_ref8) {
1883
2194
  socket.connect();
1884
2195
  store.dispatch(prefetchToken());
1885
2196
  return;
1886
- case UPDATE_CUSTOMER_PAGE:
2197
+ case UPDATE_CUSTOMER_PAGE$1:
1887
2198
  if (!isConnected(store.getState())) {
1888
2199
  return;
1889
2200
  }
1890
- sendRequestAction(store, sendRequest(UPDATE_CUSTOMER_PAGE$1, action.payload))["catch"](dataUtils.noop);
1891
- return;
1892
- default:
1893
- return;
1894
- }
1895
- };
1896
- });
1897
-
1898
- var HISTORY_EVENT_COUNT_TARGET = 25;
1899
- var createState = function createState() {
1900
- return {
1901
- status: 'idle',
1902
- queuedTasks: [],
1903
- nextPageId: null
1904
- };
1905
- };
1906
- var createChatHistoryIterator = function createChatHistoryIterator(sdk, chatId) {
1907
- var historyState = createState();
1908
- var next = function next(resolve, reject) {
1909
- switch (historyState.status) {
1910
- case 'idle':
1911
- historyState.status = 'fetching';
1912
- sdk.listThreads(historyState.nextPageId ? {
1913
- chatId: chatId,
1914
- pageId: historyState.nextPageId
1915
- } : {
1916
- chatId: chatId,
1917
- minEventsCount: HISTORY_EVENT_COUNT_TARGET
1918
- }).then(function (_ref) {
1919
- var threads = _ref.threads,
1920
- nextPageId = _ref.nextPageId;
1921
- historyState.nextPageId = nextPageId;
1922
- if (!historyState.nextPageId) {
1923
- historyState.status = 'done';
1924
- resolve({
1925
- value: {
1926
- threads: [].concat(threads).reverse()
1927
- },
1928
- done: true
1929
- });
1930
- } else {
1931
- historyState.status = 'idle';
1932
- resolve({
1933
- value: {
1934
- threads: [].concat(threads).reverse()
1935
- },
1936
- done: false
2201
+ sendRequestAction(store, sendRequest$1(UPDATE_CUSTOMER_PAGE, action.payload)).then(function (response) {
2202
+ var _response$groups;
2203
+ if (response != null && (_response$groups = response.groups) != null && _response$groups.length) {
2204
+ var _response$groups2 = response.groups,
2205
+ group = _response$groups2[0];
2206
+ var _availability = parseGroupStatus(group.status);
2207
+ emit('availability_updated', {
2208
+ availability: _availability
1937
2209
  });
1938
2210
  }
1939
- var queuedTask = historyState.queuedTasks.shift();
1940
- if (!queuedTask) {
1941
- return;
1942
- }
1943
- next(queuedTask.resolve, queuedTask.reject);
1944
- }, function (err) {
1945
- var queuedTasks = historyState.queuedTasks;
1946
- historyState.status = 'idle';
1947
- historyState.queuedTasks = [];
1948
- reject(err);
1949
- queuedTasks.forEach(function (queuedTask) {
1950
- return queuedTask.reject(err);
1951
- });
1952
- });
2211
+ })["catch"](dataUtils.noop);
1953
2212
  return;
1954
- case 'fetching':
1955
- historyState.queuedTasks.push({
1956
- resolve: resolve,
1957
- reject: reject
1958
- });
2213
+ case IDENTITY_CHANGED:
2214
+ emit('identity_changed', action.payload);
1959
2215
  return;
1960
- case 'done':
1961
- resolve({
1962
- value: undefined,
1963
- done: true
1964
- });
2216
+ default:
1965
2217
  return;
1966
2218
  }
1967
2219
  };
1968
- return {
1969
- next: function (_next) {
1970
- function next() {
1971
- return _next.apply(this, arguments);
1972
- }
1973
- next.toString = function () {
1974
- return _next.toString();
1975
- };
1976
- return next;
1977
- }(function () {
1978
- return new Promise(next);
1979
- })
1980
- };
1981
- };
2220
+ });
1982
2221
 
1983
2222
  var initialize = function initialize(store, emitter) {
1984
2223
  var state = store.getState();
1985
2224
  var url = (getServerUrl(state) + "/rtm/ws").replace(/^https/, 'wss');
1986
- return createPlatformClient__default['default'](url, {
1987
- query: {
2225
+ return createPlatformClient__default["default"](url, {
2226
+ query: _extends({
1988
2227
  organization_id: state.organizationId
1989
- },
2228
+ }, getRegionParam(state)),
1990
2229
  emitter: emitter
1991
2230
  });
1992
2231
  };
1993
2232
  var createSocketClient = function createSocketClient(store) {
1994
- var emitter = mitt__default['default']();
2233
+ var emitter = mitt__default["default"]();
1995
2234
  var client = initialize(store, emitter);
1996
2235
  return _extends({}, Object.keys(client).reduce(function (proxy, method) {
1997
2236
  proxy[method] = function () {
@@ -2008,6 +2247,8 @@ var createSocketClient = function createSocketClient(store) {
2008
2247
  });
2009
2248
  };
2010
2249
 
2250
+ var _excluded$2 = ["group_id"],
2251
+ _excluded2 = ["comment_label"];
2011
2252
  var parseChatPropertiesDeletedPush = function parseChatPropertiesDeletedPush(payload) {
2012
2253
  return {
2013
2254
  chatId: payload.chat_id,
@@ -2041,13 +2282,6 @@ var parseChatTransferredPush = function parseChatTransferredPush(payload) {
2041
2282
  reason: payload.reason
2042
2283
  });
2043
2284
  };
2044
- var parseCustomerPageUpdatedPush = function parseCustomerPageUpdatedPush(payload) {
2045
- return {
2046
- url: payload.url,
2047
- title: payload.title,
2048
- openedAt: payload.opened_at
2049
- };
2050
- };
2051
2285
  var parseCustomerUpdatedPush = function parseCustomerUpdatedPush(payload) {
2052
2286
  return _extends({
2053
2287
  id: payload.id
@@ -2074,7 +2308,7 @@ var parseEventUpdatedPush = function parseEventUpdatedPush(payload) {
2074
2308
  return {
2075
2309
  chatId: payload.chat_id,
2076
2310
  threadId: threadId,
2077
- event: parseEvent$1(threadId, payload.event)
2311
+ event: parseEvent(threadId, payload.event)
2078
2312
  };
2079
2313
  };
2080
2314
  var parseEventsMarkedAsSeenPush = function parseEventsMarkedAsSeenPush(payload) {
@@ -2105,7 +2339,7 @@ var parseIncomingChatPush = function parseIncomingChatPush(payload) {
2105
2339
  var parseIncomingEventPush = function parseIncomingEventPush(payload) {
2106
2340
  return {
2107
2341
  chatId: payload.chat_id,
2108
- event: parseEvent$1(payload.thread_id, payload.event)
2342
+ event: parseEvent(payload.thread_id, payload.event)
2109
2343
  };
2110
2344
  };
2111
2345
  var parseIncomingGreetingPush = function parseIncomingGreetingPush(payload) {
@@ -2131,6 +2365,41 @@ var parseIncomingTypingIndicatorPush = function parseIncomingTypingIndicatorPush
2131
2365
  }
2132
2366
  };
2133
2367
  };
2368
+ var parseIncomingThinkingIndicatorPush = function parseIncomingThinkingIndicatorPush(payload) {
2369
+ var chatId = payload.chat_id,
2370
+ threadId = payload.thread_id,
2371
+ authorId = payload.author_id,
2372
+ sentAt = payload.sent_at,
2373
+ customId = payload.custom_id,
2374
+ title = payload.title,
2375
+ description = payload.description;
2376
+ return _extends({
2377
+ chatId: chatId,
2378
+ threadId: threadId,
2379
+ authorId: authorId,
2380
+ sentAt: sentAt
2381
+ }, customId && {
2382
+ customId: customId
2383
+ }, title && {
2384
+ title: title
2385
+ }, description && {
2386
+ description: description
2387
+ });
2388
+ };
2389
+ var parseIncomingEventPreviewPush = function parseIncomingEventPreviewPush(payload) {
2390
+ return {
2391
+ chatId: payload.chat_id,
2392
+ threadId: payload.thread_id,
2393
+ event: parseEvent(payload.thread_id, payload.event)
2394
+ };
2395
+ };
2396
+ var parseIncomingWelcomeMessagePush = function parseIncomingWelcomeMessagePush(payload) {
2397
+ return {
2398
+ id: payload.id,
2399
+ // threadId is typed as nonoptional string but for greetings it doesn't exist
2400
+ event: parseEvent(null, payload.event)
2401
+ };
2402
+ };
2134
2403
  var parseQueuePositionUpdatedPush = function parseQueuePositionUpdatedPush(payload) {
2135
2404
  return {
2136
2405
  chatId: payload.chat_id,
@@ -2162,7 +2431,8 @@ var parseUserAddedToChatPush = function parseUserAddedToChatPush(payload) {
2162
2431
  var parseUserRemovedFromChatPush = function parseUserRemovedFromChatPush(payload) {
2163
2432
  return {
2164
2433
  chatId: payload.chat_id,
2165
- userId: payload.user_id
2434
+ userId: payload.user_id,
2435
+ reason: payload.reason
2166
2436
  };
2167
2437
  };
2168
2438
  var parseFields = function parseFields(fields) {
@@ -2172,7 +2442,7 @@ var parseFields = function parseFields(fields) {
2172
2442
  return _extends({}, field, {
2173
2443
  options: field.options.map(function (_ref) {
2174
2444
  var groupId = _ref.group_id,
2175
- option = _objectWithoutPropertiesLoose(_ref, ["group_id"]);
2445
+ option = _objectWithoutPropertiesLoose(_ref, _excluded$2);
2176
2446
  return _extends({}, option, {
2177
2447
  groupId: groupId
2178
2448
  });
@@ -2181,7 +2451,7 @@ var parseFields = function parseFields(fields) {
2181
2451
  case 'rating':
2182
2452
  {
2183
2453
  var commentLabel = field.comment_label,
2184
- parsed = _objectWithoutPropertiesLoose(field, ["comment_label"]);
2454
+ parsed = _objectWithoutPropertiesLoose(field, _excluded2);
2185
2455
  return _extends({}, parsed, {
2186
2456
  commentLabel: commentLabel
2187
2457
  });
@@ -2199,7 +2469,7 @@ var parseTicketFormFields = function parseTicketFormFields(fields) {
2199
2469
  });
2200
2470
  return parseFields(withFakeIds);
2201
2471
  };
2202
- var parseForm$1 = function parseForm(form) {
2472
+ var parseForm = function parseForm(form) {
2203
2473
  var isTicketForm = !('id' in form.fields[0]);
2204
2474
  return {
2205
2475
  id: form.id,
@@ -2211,7 +2481,7 @@ var parseGetFormResponse = function parseGetFormResponse(payload) {
2211
2481
  return payload;
2212
2482
  }
2213
2483
  return _extends({}, payload, {
2214
- form: parseForm$1(payload.form)
2484
+ form: parseForm(payload.form)
2215
2485
  });
2216
2486
  };
2217
2487
  var parseGetUrlInfoResponse = function parseGetUrlInfoResponse(payload) {
@@ -2233,6 +2503,24 @@ var parseGetUrlInfoResponse = function parseGetUrlInfoResponse(payload) {
2233
2503
  }
2234
2504
  return urlInfo;
2235
2505
  };
2506
+ var parseRequestWelcomeMessageResponse = function parseRequestWelcomeMessageResponse(payload) {
2507
+ var id = payload.id,
2508
+ predicted_agent = payload.predicted_agent,
2509
+ queue = payload.queue;
2510
+ return {
2511
+ id: id,
2512
+ predictedAgent: {
2513
+ id: predicted_agent.id,
2514
+ type: predicted_agent.type,
2515
+ name: predicted_agent.name,
2516
+ avatar: predicted_agent.avatar,
2517
+ jobTitle: predicted_agent.job_title,
2518
+ isBot: predicted_agent.is_bot,
2519
+ botType: predicted_agent.bot_type
2520
+ },
2521
+ queue: queue
2522
+ };
2523
+ };
2236
2524
  var getAvailabilityBasedOnDynamicConfig = function getAvailabilityBasedOnDynamicConfig(_ref2) {
2237
2525
  var onlineGroups = _ref2.online_groups_ids,
2238
2526
  customerGroups = _ref2.customer_groups;
@@ -2268,7 +2556,7 @@ var parseListChatsResponse = function parseListChatsResponse(payload) {
2268
2556
  return chatSummary;
2269
2557
  }
2270
2558
  chatSummary.lastEventsPerType = dataUtils.mapValues(function (lastEventPerType) {
2271
- return parseEvent$1(lastEventPerType.thread_id, lastEventPerType.event);
2559
+ return parseEvent(lastEventPerType.thread_id, lastEventPerType.event);
2272
2560
  }, lastEventsPerType);
2273
2561
  var refinedLastEventsPerType = lastEventsPerType;
2274
2562
  var lastEventSummariesArray = Object.keys(refinedLastEventsPerType).map(function (eventType) {
@@ -2366,11 +2654,6 @@ var parsePush = function parsePush(push) {
2366
2654
  action: push.action,
2367
2655
  payload: push.payload
2368
2656
  };
2369
- case CUSTOMER_PAGE_UPDATED:
2370
- return {
2371
- action: push.action,
2372
- payload: parseCustomerPageUpdatedPush(push.payload)
2373
- };
2374
2657
  case CUSTOMER_UPDATED:
2375
2658
  return {
2376
2659
  action: push.action,
@@ -2442,6 +2725,21 @@ var parsePush = function parsePush(push) {
2442
2725
  action: push.action,
2443
2726
  payload: parseIncomingTypingIndicatorPush(push.payload)
2444
2727
  };
2728
+ case INCOMING_THINKING_INDICATOR:
2729
+ return {
2730
+ action: push.action,
2731
+ payload: parseIncomingThinkingIndicatorPush(push.payload)
2732
+ };
2733
+ case INCOMING_EVENT_PREVIEW:
2734
+ return {
2735
+ action: push.action,
2736
+ payload: parseIncomingEventPreviewPush(push.payload)
2737
+ };
2738
+ case INCOMING_WELCOME_MESSAGE:
2739
+ return {
2740
+ action: push.action,
2741
+ payload: parseIncomingWelcomeMessagePush(push.payload)
2742
+ };
2445
2743
  case QUEUE_POSITION_UPDATED:
2446
2744
  return {
2447
2745
  action: push.action,
@@ -2470,6 +2768,7 @@ var parsePush = function parsePush(push) {
2470
2768
  }
2471
2769
  };
2472
2770
  var parseResponse = function parseResponse(_ref6) {
2771
+ var _response$payload;
2473
2772
  var request = _ref6.request,
2474
2773
  response = _ref6.response;
2475
2774
  switch (response.action) {
@@ -2513,11 +2812,6 @@ var parseResponse = function parseResponse(_ref6) {
2513
2812
  action: response.action,
2514
2813
  payload: parseGetFormResponse(response.payload)
2515
2814
  };
2516
- case GET_PREDICTED_AGENT:
2517
- return {
2518
- action: response.action,
2519
- payload: parsePredictedAgent(response.payload)
2520
- };
2521
2815
  case GET_URL_INFO:
2522
2816
  return {
2523
2817
  action: response.action,
@@ -2548,6 +2842,11 @@ var parseResponse = function parseResponse(_ref6) {
2548
2842
  action: response.action,
2549
2843
  payload: SUCCESS
2550
2844
  };
2845
+ case REQUEST_WELCOME_MESSAGE:
2846
+ return {
2847
+ action: response.action,
2848
+ payload: parseRequestWelcomeMessageResponse(response.payload)
2849
+ };
2551
2850
  case SEND_SNEAK_PEEK:
2552
2851
  return {
2553
2852
  action: response.action,
@@ -2558,6 +2857,11 @@ var parseResponse = function parseResponse(_ref6) {
2558
2857
  action: response.action,
2559
2858
  payload: SUCCESS
2560
2859
  };
2860
+ case SEND_GREETING_BUTTON_CLICKED:
2861
+ return {
2862
+ action: response.action,
2863
+ payload: SUCCESS
2864
+ };
2561
2865
  case SEND_RICH_MESSAGE_POSTBACK:
2562
2866
  return {
2563
2867
  action: response.action,
@@ -2573,10 +2877,12 @@ var parseResponse = function parseResponse(_ref6) {
2573
2877
  action: response.action,
2574
2878
  payload: SUCCESS
2575
2879
  };
2576
- case UPDATE_CUSTOMER_PAGE$1:
2880
+ case UPDATE_CUSTOMER_PAGE:
2577
2881
  return {
2578
2882
  action: response.action,
2579
- payload: SUCCESS
2883
+ payload: _extends({}, SUCCESS, {
2884
+ groups: (_response$payload = response.payload) == null ? void 0 : _response$payload.groups
2885
+ })
2580
2886
  };
2581
2887
  case UPDATE_EVENT_PROPERTIES:
2582
2888
  return {
@@ -2613,7 +2919,7 @@ var handleResponseError = function handleResponseError(_ref, response) {
2613
2919
  }
2614
2920
  });
2615
2921
  };
2616
- var handleResponse$1 = function handleResponse(_ref2, response) {
2922
+ var handleResponse = function handleResponse(_ref2, response) {
2617
2923
  var dispatch = _ref2.dispatch,
2618
2924
  getState = _ref2.getState;
2619
2925
  var requestId = response.request_id;
@@ -2651,7 +2957,7 @@ var handlePushResponse = function handlePushResponse(_ref3, response) {
2651
2957
  }, parsedPush)
2652
2958
  });
2653
2959
  };
2654
- var handlePush$1 = function handlePush(store, push) {
2960
+ var handlePush = function handlePush(store, push) {
2655
2961
  var parsedPush = parsePush(push);
2656
2962
  if (!parsedPush) {
2657
2963
  // defensive measure against receiving unknown push
@@ -2682,7 +2988,7 @@ var socketListener = (function (store, socket) {
2682
2988
  // those are requests with indirect responses
2683
2989
  return;
2684
2990
  default:
2685
- handleResponse$1(store, message);
2991
+ handleResponse(store, message);
2686
2992
  return;
2687
2993
  }
2688
2994
  }
@@ -2695,7 +3001,7 @@ var socketListener = (function (store, socket) {
2695
3001
  return;
2696
3002
  }
2697
3003
  }
2698
- handlePush$1(store, message);
3004
+ handlePush(store, message);
2699
3005
  });
2700
3006
  socket.on('disconnect', function () {
2701
3007
  failAllRequests(store, CONNECTION_LOST);
@@ -2757,9 +3063,9 @@ var uploadFile = function uploadFile(_ref, _ref2) {
2757
3063
  var send = new Promise(function (resolve, reject) {
2758
3064
  validateFile(file);
2759
3065
  var state = store.getState();
2760
- var query = urlUtils.buildQueryString({
3066
+ var query = urlUtils.buildQueryString(_extends({
2761
3067
  organization_id: state.organizationId
2762
- });
3068
+ }, getRegionParam(state)));
2763
3069
  var url = getServerUrl(state) + "/action/" + UPLOAD_FILE + "?" + query;
2764
3070
  var payload = {
2765
3071
  file: file
@@ -2769,7 +3075,7 @@ var uploadFile = function uploadFile(_ref, _ref2) {
2769
3075
  reject(new Error('Upload cancelled.'));
2770
3076
  return;
2771
3077
  }
2772
- upload = rawUploadFile__default['default'](url, payload, {
3078
+ upload = rawUploadFile__default["default"](url, payload, {
2773
3079
  headers: {
2774
3080
  Authorization: token.tokenType + " " + token.accessToken
2775
3081
  },
@@ -2805,44 +3111,7 @@ var uploadFile = function uploadFile(_ref, _ref2) {
2805
3111
  };
2806
3112
  };
2807
3113
 
2808
- var makeGraylogRequest = function makeGraylogRequest(url, body) {
2809
- return unfetch__default['default'](url, {
2810
- body: body,
2811
- method: 'POST',
2812
- headers: {
2813
- Accept: '*/*',
2814
- 'Content-Type': 'application/x-www-form-urlencoded'
2815
- }
2816
- })["catch"](dataUtils.noop);
2817
- };
2818
-
2819
- // eslint-disable-next-line local/no-livechat-package-direct-file-import
2820
- /**
2821
- * Logs event to Graylog with provided config data.
2822
- * Logging request is fired only when all of those conditions are true:
2823
- * 1. package is used in lc production environment
2824
- * 2. package is used standalone because only then "customer_sdk" will be set to customer_sdk
2825
- */
2826
- var log = function log(_ref) {
2827
- var env = _ref.env,
2828
- organizationId = _ref.organizationId,
2829
- eventName = _ref.eventName;
2830
- if (env !== 'production' || "customer_sdk" !== 'customer_sdk') {
2831
- return Promise.resolve();
2832
- }
2833
- var message = {
2834
- event_name: eventName,
2835
- severity: 'Informational',
2836
- sdkVersion: "4.0.2"
2837
- };
2838
- var body = {
2839
- organizationId: organizationId,
2840
- event_id: 'chat_widget_customer_sdk',
2841
- message: JSON.stringify(message)
2842
- };
2843
- return makeGraylogRequest('https://queue.livechatinc.com/logs', urlUtils.buildQueryString(body));
2844
- };
2845
-
3114
+ var _excluded$1 = ["on", "once", "off", "getChatHistory", "auth"];
2846
3115
  var LISTENER_IDENTITY = 'LISTENER_IDENTITY';
2847
3116
  var listenersMap = {};
2848
3117
  var createDebuggedMethods = function createDebuggedMethods(methods, prefix) {
@@ -2906,7 +3175,7 @@ var debug = (function (_sdk) {
2906
3175
  _off = sdk.off,
2907
3176
  _getChatHistory = sdk.getChatHistory,
2908
3177
  auth = sdk.auth,
2909
- rest = _objectWithoutPropertiesLoose(sdk, ["on", "once", "off", "getChatHistory", "auth"]);
3178
+ rest = _objectWithoutPropertiesLoose(sdk, _excluded$1);
2910
3179
  var methods = createDebuggedMethods(rest);
2911
3180
  return Object.freeze(_extends({
2912
3181
  auth: Object.freeze(createDebuggedMethods(auth, '.auth'))
@@ -2953,38 +3222,35 @@ var debug = (function (_sdk) {
2953
3222
  }));
2954
3223
  });
2955
3224
 
2956
- var ASC = 'asc';
2957
- var DESC = 'desc';
2958
-
2959
- var sortOrders = /*#__PURE__*/Object.freeze({
2960
- __proto__: null,
2961
- ASC: ASC,
2962
- DESC: DESC
2963
- });
2964
-
3225
+ var _excluded = ["autoConnect", "customerDataProvider", "identityProvider", "parentStorage", "env"];
2965
3226
  var CHATS_PAGINATION_MAX_LIMIT = 25;
2966
- var init = function init(config, env, licenseId) {
2967
- if (env === void 0) {
2968
- env = 'production';
2969
- }
3227
+ var init = function init(config) {
2970
3228
  createAuth.validateConfig(config);
2971
- var _config$autoConnect = config.autoConnect,
2972
- autoConnect = _config$autoConnect === void 0 ? true : _config$autoConnect,
2973
- customerDataProvider = config.customerDataProvider,
2974
- identityProvider = config.identityProvider,
2975
- instanceConfig = _objectWithoutPropertiesLoose(config, ["autoConnect", "customerDataProvider", "identityProvider"]);
3229
+ var _ref = config,
3230
+ _ref$autoConnect = _ref.autoConnect,
3231
+ autoConnect = _ref$autoConnect === void 0 ? true : _ref$autoConnect,
3232
+ customerDataProvider = _ref.customerDataProvider,
3233
+ identityProvider = _ref.identityProvider,
3234
+ parentStorage = _ref.parentStorage,
3235
+ configEnv = _ref.env,
3236
+ instanceConfig = _objectWithoutPropertiesLoose(_ref, _excluded);
3237
+ var env = configEnv && ['labs', 'staging'].includes(configEnv) ? configEnv : 'production';
2976
3238
  var store = finalCreateStore(_extends({}, instanceConfig, {
2977
3239
  env: env
2978
3240
  }));
2979
- var emitter = mitt__default['default']();
3241
+ var emitter = mitt__default["default"]();
2980
3242
  var socket = createSocketClient(store);
2981
- var auth = typeof identityProvider === 'function' ? identityProvider() : createAuth__default['default'](instanceConfig, licenseId, env);
3243
+ var hasCustomIdentityProvider = typeof identityProvider === 'function';
3244
+ var auth = hasCustomIdentityProvider ? identityProvider() : createAuth__default["default"](_extends({}, instanceConfig, {
3245
+ env: env
3246
+ }), parentStorage);
2982
3247
  store.addSideEffectsHandler(createSideEffectsHandler({
2983
3248
  emitter: emitter,
2984
3249
  socket: socket,
2985
3250
  auth: auth,
2986
3251
  customerDataProvider: customerDataProvider,
2987
- licenseId: licenseId
3252
+ parentStorage: parentStorage,
3253
+ hasCustomIdentityProvider: hasCustomIdentityProvider
2988
3254
  }));
2989
3255
  socketListener(store, socket);
2990
3256
  var sendRequestAction$1 = sendRequestAction.bind(null, store);
@@ -2994,18 +3260,18 @@ var init = function init(config, env, licenseId) {
2994
3260
  });
2995
3261
  };
2996
3262
  var api = Object.freeze({
2997
- acceptGreeting: function acceptGreeting(_ref) {
2998
- var greetingId = _ref.greetingId,
2999
- uniqueId = _ref.uniqueId;
3000
- return sendRequestAction$1(sendRequest(ACCEPT_GREETING, {
3263
+ acceptGreeting: function acceptGreeting(_ref2) {
3264
+ var greetingId = _ref2.greetingId,
3265
+ uniqueId = _ref2.uniqueId;
3266
+ return sendRequestAction$1(sendRequest$1(ACCEPT_GREETING, {
3001
3267
  greeting_id: greetingId,
3002
3268
  unique_id: uniqueId
3003
3269
  }));
3004
3270
  },
3005
3271
  auth: auth,
3006
- cancelGreeting: function cancelGreeting(_ref2) {
3007
- var uniqueId = _ref2.uniqueId;
3008
- return sendRequestAction$1(sendRequest(CANCEL_GREETING, {
3272
+ cancelGreeting: function cancelGreeting(_ref3) {
3273
+ var uniqueId = _ref3.uniqueId;
3274
+ return sendRequestAction$1(sendRequest$1(CANCEL_GREETING, {
3009
3275
  unique_id: uniqueId
3010
3276
  }));
3011
3277
  },
@@ -3015,8 +3281,8 @@ var init = function init(config, env, licenseId) {
3015
3281
  properties = _params$properties === void 0 ? ['score'] : _params$properties;
3016
3282
  return api.listThreads({
3017
3283
  chatId: chatId
3018
- }).then(function (_ref3) {
3019
- var threads = _ref3.threads;
3284
+ }).then(function (_ref4) {
3285
+ var threads = _ref4.threads;
3020
3286
  if (!threads.length) {
3021
3287
  throw createError({
3022
3288
  message: "There is no thread in \"" + chatId + "\".",
@@ -3033,37 +3299,37 @@ var init = function init(config, env, licenseId) {
3033
3299
  });
3034
3300
  },
3035
3301
  connect: startConnection,
3036
- deactivateChat: function deactivateChat(_ref4) {
3037
- var id = _ref4.id;
3038
- return sendRequestAction$1(sendRequest(DEACTIVATE_CHAT, {
3302
+ deactivateChat: function deactivateChat(_ref5) {
3303
+ var id = _ref5.id;
3304
+ return sendRequestAction$1(sendRequest$1(DEACTIVATE_CHAT, {
3039
3305
  id: id
3040
3306
  }));
3041
3307
  },
3042
- deleteChatProperties: function deleteChatProperties(_ref5) {
3043
- var id = _ref5.id,
3044
- properties = _ref5.properties;
3045
- return sendRequestAction$1(sendRequest(DELETE_CHAT_PROPERTIES, {
3308
+ deleteChatProperties: function deleteChatProperties(_ref6) {
3309
+ var id = _ref6.id,
3310
+ properties = _ref6.properties;
3311
+ return sendRequestAction$1(sendRequest$1(DELETE_CHAT_PROPERTIES, {
3046
3312
  id: id,
3047
3313
  properties: properties
3048
3314
  }));
3049
3315
  },
3050
- deleteEventProperties: function deleteEventProperties(_ref6) {
3051
- var chatId = _ref6.chatId,
3052
- threadId = _ref6.threadId,
3053
- eventId = _ref6.eventId,
3054
- properties = _ref6.properties;
3055
- return sendRequestAction$1(sendRequest(DELETE_EVENT_PROPERTIES, {
3316
+ deleteEventProperties: function deleteEventProperties(_ref7) {
3317
+ var chatId = _ref7.chatId,
3318
+ threadId = _ref7.threadId,
3319
+ eventId = _ref7.eventId,
3320
+ properties = _ref7.properties;
3321
+ return sendRequestAction$1(sendRequest$1(DELETE_EVENT_PROPERTIES, {
3056
3322
  chat_id: chatId,
3057
3323
  thread_id: threadId,
3058
3324
  event_id: eventId,
3059
3325
  properties: properties
3060
3326
  }));
3061
3327
  },
3062
- deleteThreadProperties: function deleteThreadProperties(_ref7) {
3063
- var chatId = _ref7.chatId,
3064
- threadId = _ref7.threadId,
3065
- properties = _ref7.properties;
3066
- return sendRequestAction$1(sendRequest(DELETE_THREAD_PROPERTIES, {
3328
+ deleteThreadProperties: function deleteThreadProperties(_ref8) {
3329
+ var chatId = _ref8.chatId,
3330
+ threadId = _ref8.threadId,
3331
+ properties = _ref8.properties;
3332
+ return sendRequestAction$1(sendRequest$1(DELETE_THREAD_PROPERTIES, {
3067
3333
  chat_id: chatId,
3068
3334
  thread_id: threadId,
3069
3335
  properties: properties
@@ -3075,42 +3341,32 @@ var init = function init(config, env, licenseId) {
3075
3341
  disconnect: function disconnect() {
3076
3342
  store.dispatch(pauseConnection('manual'));
3077
3343
  },
3078
- getChat: function getChat(_ref8) {
3079
- var chatId = _ref8.chatId,
3080
- threadId = _ref8.threadId;
3081
- return sendRequestAction$1(sendRequest(GET_CHAT, {
3344
+ getChat: function getChat(_ref9) {
3345
+ var chatId = _ref9.chatId,
3346
+ threadId = _ref9.threadId;
3347
+ return sendRequestAction$1(sendRequest$1(GET_CHAT, {
3082
3348
  chat_id: chatId,
3083
3349
  thread_id: threadId
3084
3350
  }));
3085
3351
  },
3086
- getChatHistory: function getChatHistory(_ref9) {
3087
- var chatId = _ref9.chatId;
3352
+ getChatHistory: function getChatHistory(_ref0) {
3353
+ var chatId = _ref0.chatId;
3088
3354
  return createChatHistoryIterator(api, chatId);
3089
3355
  },
3090
3356
  getCustomer: function getCustomer() {
3091
- return sendRequestAction$1(sendRequest(GET_CUSTOMER, {}));
3357
+ return sendRequestAction$1(sendRequest$1(GET_CUSTOMER, {}));
3092
3358
  },
3093
- getForm: function getForm(_ref10) {
3094
- var groupId = _ref10.groupId,
3095
- type = _ref10.type;
3096
- return sendRequestAction$1(sendRequest(GET_FORM, {
3359
+ getForm: function getForm(_ref1) {
3360
+ var groupId = _ref1.groupId,
3361
+ type = _ref1.type;
3362
+ return sendRequestAction$1(sendRequest$1(GET_FORM, {
3097
3363
  group_id: groupId,
3098
3364
  type: type
3099
3365
  }));
3100
3366
  },
3101
- getPredictedAgent: function getPredictedAgent(params) {
3102
- if (params === void 0) {
3103
- params = {};
3104
- }
3105
- var _params = params,
3106
- groupId = _params.groupId;
3107
- return sendRequestAction$1(sendRequest(GET_PREDICTED_AGENT, typeof groupId === 'number' ? {
3108
- group_id: groupId
3109
- } : {}));
3110
- },
3111
- getUrlInfo: function getUrlInfo(_ref11) {
3112
- var url = _ref11.url;
3113
- return sendRequestAction$1(sendRequest(GET_URL_INFO, {
3367
+ getUrlInfo: function getUrlInfo(_ref10) {
3368
+ var url = _ref10.url;
3369
+ return sendRequestAction$1(sendRequest$1(GET_URL_INFO, {
3114
3370
  url: url
3115
3371
  }));
3116
3372
  },
@@ -3121,23 +3377,23 @@ var init = function init(config, env, licenseId) {
3121
3377
  if ('limit' in params && typeof params.limit === 'number' && params.limit > CHATS_PAGINATION_MAX_LIMIT) {
3122
3378
  return Promise.reject(new Error("Specified limit is too high (max " + CHATS_PAGINATION_MAX_LIMIT + ")."));
3123
3379
  }
3124
- return sendRequestAction$1(sendRequest(LIST_CHATS, params.pageId === undefined ? {
3380
+ return sendRequestAction$1(sendRequest$1(LIST_CHATS, params.pageId === undefined ? {
3125
3381
  limit: params.limit || 10
3126
3382
  } : {
3127
3383
  page_id: params.pageId
3128
3384
  }));
3129
3385
  },
3130
3386
  listGroupStatuses: function listGroupStatuses(_temp) {
3131
- var _ref12 = _temp === void 0 ? {} : _temp,
3132
- groupIds = _ref12.groupIds;
3133
- return sendRequestAction$1(sendRequest(LIST_GROUP_STATUSES, groupIds ? {
3387
+ var _ref11 = _temp === void 0 ? {} : _temp,
3388
+ groupIds = _ref11.groupIds;
3389
+ return sendRequestAction$1(sendRequest$1(LIST_GROUP_STATUSES, groupIds ? {
3134
3390
  group_ids: groupIds
3135
3391
  } : {
3136
3392
  all: true
3137
3393
  }));
3138
3394
  },
3139
3395
  listThreads: function listThreads(params) {
3140
- return sendRequestAction$1(sendRequest(LIST_THREADS, params.pageId === undefined ? {
3396
+ return sendRequestAction$1(sendRequest$1(LIST_THREADS, params.pageId === undefined ? {
3141
3397
  chat_id: params.chatId,
3142
3398
  sort_order: params.sortOrder,
3143
3399
  limit: params.limit,
@@ -3147,10 +3403,10 @@ var init = function init(config, env, licenseId) {
3147
3403
  page_id: params.pageId
3148
3404
  }));
3149
3405
  },
3150
- markEventsAsSeen: function markEventsAsSeen(_ref13) {
3151
- var chatId = _ref13.chatId,
3152
- seenUpTo = _ref13.seenUpTo;
3153
- return sendRequestAction$1(sendRequest(MARK_EVENTS_AS_SEEN, {
3406
+ markEventsAsSeen: function markEventsAsSeen(_ref12) {
3407
+ var chatId = _ref12.chatId,
3408
+ seenUpTo = _ref12.seenUpTo;
3409
+ return sendRequestAction$1(sendRequest$1(MARK_EVENTS_AS_SEEN, {
3154
3410
  chat_id: chatId,
3155
3411
  seen_up_to: seenUpTo
3156
3412
  }));
@@ -3163,8 +3419,8 @@ var init = function init(config, env, licenseId) {
3163
3419
  rating = params.rating;
3164
3420
  return api.listThreads({
3165
3421
  chatId: chatId
3166
- }).then(function (_ref14) {
3167
- var threads = _ref14.threads;
3422
+ }).then(function (_ref13) {
3423
+ var threads = _ref13.threads;
3168
3424
  if (!threads.length) {
3169
3425
  throw createError({
3170
3426
  message: "There is no thread in \"" + chatId + "\".",
@@ -3180,31 +3436,42 @@ var init = function init(config, env, licenseId) {
3180
3436
  });
3181
3437
  });
3182
3438
  },
3439
+ requestWelcomeMessage: function requestWelcomeMessage(_temp2) {
3440
+ var _ref14 = _temp2 === void 0 ? {} : _temp2,
3441
+ id = _ref14.id;
3442
+ return sendRequestAction$1(sendRequest$1(REQUEST_WELCOME_MESSAGE, id ? {
3443
+ id: id
3444
+ } : {}));
3445
+ },
3183
3446
  resumeChat: function resumeChat(data) {
3184
3447
  log({
3185
3448
  env: env,
3186
3449
  organizationId: config.organizationId,
3187
3450
  eventName: 'chat_started'
3188
3451
  });
3189
- return sendRequestAction$1(sendRequest(RESUME_CHAT, parseResumeChatData(data)));
3452
+ return sendRequestAction$1(sendRequest$1(RESUME_CHAT, parseResumeChatData(data)));
3190
3453
  },
3191
- sendEvent: function (_sendEvent) {
3192
- function sendEvent(_x) {
3193
- return _sendEvent.apply(this, arguments);
3194
- }
3195
- sendEvent.toString = function () {
3196
- return _sendEvent.toString();
3197
- };
3198
- return sendEvent;
3199
- }(function (params) {
3454
+ sendEvent: function sendEvent$1(params) {
3200
3455
  return sendRequestAction$1(sendEvent(params));
3201
- }),
3456
+ },
3457
+ sendGreetingButtonClicked: function sendGreetingButtonClicked$1(options) {
3458
+ return sendGreetingButtonClicked({
3459
+ auth: auth,
3460
+ store: store
3461
+ }, options);
3462
+ },
3463
+ sendCustomerActions: function sendCustomerActions$1(options) {
3464
+ return sendCustomerActions({
3465
+ auth: auth,
3466
+ store: store
3467
+ }, options);
3468
+ },
3202
3469
  sendRichMessagePostback: function sendRichMessagePostback(_ref15) {
3203
3470
  var chatId = _ref15.chatId,
3204
3471
  threadId = _ref15.threadId,
3205
3472
  eventId = _ref15.eventId,
3206
3473
  postback = _ref15.postback;
3207
- return sendRequestAction$1(sendRequest(SEND_RICH_MESSAGE_POSTBACK, {
3474
+ return sendRequestAction$1(sendRequest$1(SEND_RICH_MESSAGE_POSTBACK, {
3208
3475
  chat_id: chatId,
3209
3476
  event_id: eventId,
3210
3477
  thread_id: threadId,
@@ -3213,8 +3480,8 @@ var init = function init(config, env, licenseId) {
3213
3480
  },
3214
3481
  setCustomerSessionFields: function setCustomerSessionFields(_ref16) {
3215
3482
  var sessionFields = _ref16.sessionFields;
3216
- return sendRequestAction$1(sendRequest(SET_CUSTOMER_SESSION_FIELDS, {
3217
- session_fields: parseCustomerSessionFields(sessionFields)
3483
+ return sendRequestAction$1(sendRequest$1(SET_CUSTOMER_SESSION_FIELDS, {
3484
+ session_fields: parseCustomerSessionFields$1(sessionFields)
3218
3485
  }));
3219
3486
  },
3220
3487
  setSneakPeek: function setSneakPeek(_ref17) {
@@ -3224,7 +3491,7 @@ var init = function init(config, env, licenseId) {
3224
3491
  if (!isChatActive(state, chatId) || !isConnected(state)) {
3225
3492
  return;
3226
3493
  }
3227
- sendRequestAction$1(sendRequest(SEND_SNEAK_PEEK, {
3494
+ sendRequestAction$1(sendRequest$1(SEND_SNEAK_PEEK, {
3228
3495
  chat_id: chatId,
3229
3496
  sneak_peek_text: sneakPeekText
3230
3497
  }))["catch"](dataUtils.noop);
@@ -3238,22 +3505,22 @@ var init = function init(config, env, licenseId) {
3238
3505
  organizationId: config.organizationId,
3239
3506
  eventName: 'chat_started'
3240
3507
  });
3241
- return sendRequestAction$1(sendRequest(START_CHAT, parseStartChatData(data)));
3508
+ return sendRequestAction$1(sendRequest$1(START_CHAT, parseStartChatData(data)));
3242
3509
  },
3243
3510
  updateChatProperties: function updateChatProperties(_ref18) {
3244
3511
  var id = _ref18.id,
3245
3512
  properties = _ref18.properties;
3246
- return sendRequestAction$1(sendRequest(UPDATE_CHAT_PROPERTIES, {
3513
+ return sendRequestAction$1(sendRequest$1(UPDATE_CHAT_PROPERTIES, {
3247
3514
  id: id,
3248
3515
  properties: properties
3249
3516
  }));
3250
3517
  },
3251
3518
  updateCustomer: function updateCustomer(update) {
3252
- return sendRequestAction$1(sendRequest(UPDATE_CUSTOMER, parseCustomerUpdate(update)));
3519
+ return sendRequestAction$1(sendRequest$1(UPDATE_CUSTOMER, parseCustomerUpdate(update)));
3253
3520
  },
3254
3521
  updateCustomerPage: function updateCustomerPage(page) {
3255
3522
  store.dispatch({
3256
- type: UPDATE_CUSTOMER_PAGE,
3523
+ type: UPDATE_CUSTOMER_PAGE$1,
3257
3524
  payload: dataUtils.pickOwn(['title', 'url'], page)
3258
3525
  });
3259
3526
  },
@@ -3262,7 +3529,7 @@ var init = function init(config, env, licenseId) {
3262
3529
  threadId = _ref19.threadId,
3263
3530
  eventId = _ref19.eventId,
3264
3531
  properties = _ref19.properties;
3265
- return sendRequestAction$1(sendRequest(UPDATE_EVENT_PROPERTIES, {
3532
+ return sendRequestAction$1(sendRequest$1(UPDATE_EVENT_PROPERTIES, {
3266
3533
  chat_id: chatId,
3267
3534
  event_id: eventId,
3268
3535
  thread_id: threadId,
@@ -3273,7 +3540,7 @@ var init = function init(config, env, licenseId) {
3273
3540
  var chatId = _ref20.chatId,
3274
3541
  threadId = _ref20.threadId,
3275
3542
  properties = _ref20.properties;
3276
- return sendRequestAction$1(sendRequest(UPDATE_THREAD_PROPERTIES, {
3543
+ return sendRequestAction$1(sendRequest$1(UPDATE_THREAD_PROPERTIES, {
3277
3544
  chat_id: chatId,
3278
3545
  thread_id: threadId,
3279
3546
  properties: properties
@@ -3290,7 +3557,7 @@ var init = function init(config, env, licenseId) {
3290
3557
  startConnection();
3291
3558
  } else {
3292
3559
  store.dispatch({
3293
- type: CHECK_GOALS,
3560
+ type: CHECK_GOALS$1,
3294
3561
  payload: {
3295
3562
  sessionFields: typeof customerDataProvider === 'function' ? customerDataProvider().sessionFields : {}
3296
3563
  }
@@ -3304,10 +3571,10 @@ exports.debug = debug;
3304
3571
  exports.eventTypes = eventTypes;
3305
3572
  exports.init = init;
3306
3573
  exports.parseCustomEvent = parseCustomEvent;
3307
- exports.parseEvent = parseEvent$1;
3574
+ exports.parseEvent = parseEvent;
3308
3575
  exports.parseFile = parseFile;
3309
3576
  exports.parseFilledForm = parseFilledForm;
3310
- exports.parseForm = parseForm$1;
3577
+ exports.parseForm = parseForm;
3311
3578
  exports.parseGreeting = parseGreeting;
3312
3579
  exports.parseMessage = parseMessage;
3313
3580
  exports.parseRichMessage = parseRichMessage;