@livechat/customer-sdk 4.0.1 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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.1"
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
- };
688
- };
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);
701
- };
702
- var setChatActive = function setChatActive(id, active) {
703
- return {
704
- type: SET_CHAT_ACTIVE,
705
- payload: {
706
- id: id,
707
- active: active
708
- }
709
- };
710
- };
711
- var setSelfId = function setSelfId(id) {
712
- return {
713
- type: SET_SELF_ID,
714
- payload: {
715
- id: id
716
- }
717
- };
728
+ var getAllRequests = function getAllRequests(state) {
729
+ return state.requests;
718
730
  };
719
- var socketDisconnected = function socketDisconnected() {
720
- return {
721
- type: SOCKET_DISCONNECTED
722
- };
731
+ var getConnectionStatus = function getConnectionStatus(state) {
732
+ return state.connection.status;
723
733
  };
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;
734
+ var getRequest = function getRequest(state, id) {
735
+ return state.requests[id];
737
736
  };
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 : '');
737
+ var getSelfId = function getSelfId(state) {
738
+ return state.users.self.id;
794
739
  };
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 : '');
740
+ var isChatActive = function isChatActive(state, chatId) {
741
+ var chat = state.chats[chatId];
742
+ return !!chat && chat.active;
801
743
  };
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);
744
+ var isConnected = function isConnected(state) {
745
+ return getConnectionStatus(state) === CONNECTED;
819
746
  };
820
- var saveSideStorage = function saveSideStorage(store, sideStorage) {
821
- storage__default['default'].setItem(getSideStorageKeyByOrganization(store), JSON.stringify(sideStorage))["catch"](dataUtils.noop);
747
+ var isDestroyed = function isDestroyed(state) {
748
+ return getConnectionStatus(state) === DESTROYED;
822
749
  };
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();
750
+ var getRegionParam = function getRegionParam(options) {
751
+ var _options$region;
848
752
  return {
849
- cancel: function cancel() {
850
- cancelled = true;
851
- }
753
+ 'x-region': (_options$region = options.region) != null ? _options$region : ''
852
754
  };
853
755
  };
854
- var sendLoginFlowRequest = function sendLoginFlowRequest(store, type, payload) {
855
- return sendRequestAction(store, sendRequest(type, payload, 'login'));
756
+ var getEnvPart = function getEnvPart(_ref) {
757
+ var env = _ref.env;
758
+ if (env === 'production') {
759
+ return '';
760
+ }
761
+ return "." + env;
856
762
  };
857
- var delay = function delay(ms) {
858
- return new Promise(function (resolve) {
859
- setTimeout(resolve, ms);
860
- });
763
+ var getApiOrigin = function getApiOrigin(state) {
764
+ {
765
+ return "https://api" + getEnvPart(state) + ".livechatinc.com";
766
+ }
861
767
  };
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
- })]);
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;
790
+ return {
791
+ application: _extends({}, application, {
792
+ name: "customer_sdk",
793
+ version: "5.0.0"
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
933
816
  };
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);
817
+ };
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
824
+ });
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.0"
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,11 +2194,14 @@ 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);
2201
+ sendRequestAction(store, sendRequest$1(UPDATE_CUSTOMER_PAGE, action.payload))["catch"](dataUtils.noop);
2202
+ return;
2203
+ case IDENTITY_CHANGED:
2204
+ emit('identity_changed', action.payload);
1891
2205
  return;
1892
2206
  default:
1893
2207
  return;
@@ -1895,103 +2209,18 @@ var createSideEffectsHandler = (function (_ref8) {
1895
2209
  };
1896
2210
  });
1897
2211
 
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
1937
- });
1938
- }
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
- });
1953
- return;
1954
- case 'fetching':
1955
- historyState.queuedTasks.push({
1956
- resolve: resolve,
1957
- reject: reject
1958
- });
1959
- return;
1960
- case 'done':
1961
- resolve({
1962
- value: undefined,
1963
- done: true
1964
- });
1965
- return;
1966
- }
1967
- };
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
- };
1982
-
1983
2212
  var initialize = function initialize(store, emitter) {
1984
2213
  var state = store.getState();
1985
2214
  var url = (getServerUrl(state) + "/rtm/ws").replace(/^https/, 'wss');
1986
- return createPlatformClient__default['default'](url, {
1987
- query: {
2215
+ return createPlatformClient__default["default"](url, {
2216
+ query: _extends({
1988
2217
  organization_id: state.organizationId
1989
- },
2218
+ }, getRegionParam(state)),
1990
2219
  emitter: emitter
1991
2220
  });
1992
2221
  };
1993
2222
  var createSocketClient = function createSocketClient(store) {
1994
- var emitter = mitt__default['default']();
2223
+ var emitter = mitt__default["default"]();
1995
2224
  var client = initialize(store, emitter);
1996
2225
  return _extends({}, Object.keys(client).reduce(function (proxy, method) {
1997
2226
  proxy[method] = function () {
@@ -2008,6 +2237,8 @@ var createSocketClient = function createSocketClient(store) {
2008
2237
  });
2009
2238
  };
2010
2239
 
2240
+ var _excluded$2 = ["group_id"],
2241
+ _excluded2 = ["comment_label"];
2011
2242
  var parseChatPropertiesDeletedPush = function parseChatPropertiesDeletedPush(payload) {
2012
2243
  return {
2013
2244
  chatId: payload.chat_id,
@@ -2041,13 +2272,6 @@ var parseChatTransferredPush = function parseChatTransferredPush(payload) {
2041
2272
  reason: payload.reason
2042
2273
  });
2043
2274
  };
2044
- var parseCustomerPageUpdatedPush = function parseCustomerPageUpdatedPush(payload) {
2045
- return {
2046
- url: payload.url,
2047
- title: payload.title,
2048
- openedAt: payload.opened_at
2049
- };
2050
- };
2051
2275
  var parseCustomerUpdatedPush = function parseCustomerUpdatedPush(payload) {
2052
2276
  return _extends({
2053
2277
  id: payload.id
@@ -2074,7 +2298,7 @@ var parseEventUpdatedPush = function parseEventUpdatedPush(payload) {
2074
2298
  return {
2075
2299
  chatId: payload.chat_id,
2076
2300
  threadId: threadId,
2077
- event: parseEvent$1(threadId, payload.event)
2301
+ event: parseEvent(threadId, payload.event)
2078
2302
  };
2079
2303
  };
2080
2304
  var parseEventsMarkedAsSeenPush = function parseEventsMarkedAsSeenPush(payload) {
@@ -2105,7 +2329,7 @@ var parseIncomingChatPush = function parseIncomingChatPush(payload) {
2105
2329
  var parseIncomingEventPush = function parseIncomingEventPush(payload) {
2106
2330
  return {
2107
2331
  chatId: payload.chat_id,
2108
- event: parseEvent$1(payload.thread_id, payload.event)
2332
+ event: parseEvent(payload.thread_id, payload.event)
2109
2333
  };
2110
2334
  };
2111
2335
  var parseIncomingGreetingPush = function parseIncomingGreetingPush(payload) {
@@ -2131,6 +2355,41 @@ var parseIncomingTypingIndicatorPush = function parseIncomingTypingIndicatorPush
2131
2355
  }
2132
2356
  };
2133
2357
  };
2358
+ var parseIncomingThinkingIndicatorPush = function parseIncomingThinkingIndicatorPush(payload) {
2359
+ var chatId = payload.chat_id,
2360
+ threadId = payload.thread_id,
2361
+ authorId = payload.author_id,
2362
+ sentAt = payload.sent_at,
2363
+ customId = payload.custom_id,
2364
+ title = payload.title,
2365
+ description = payload.description;
2366
+ return _extends({
2367
+ chatId: chatId,
2368
+ threadId: threadId,
2369
+ authorId: authorId,
2370
+ sentAt: sentAt
2371
+ }, customId && {
2372
+ customId: customId
2373
+ }, title && {
2374
+ title: title
2375
+ }, description && {
2376
+ description: description
2377
+ });
2378
+ };
2379
+ var parseIncomingEventPreviewPush = function parseIncomingEventPreviewPush(payload) {
2380
+ return {
2381
+ chatId: payload.chat_id,
2382
+ threadId: payload.thread_id,
2383
+ event: parseEvent(payload.thread_id, payload.event)
2384
+ };
2385
+ };
2386
+ var parseIncomingWelcomeMessagePush = function parseIncomingWelcomeMessagePush(payload) {
2387
+ return {
2388
+ id: payload.id,
2389
+ // threadId is typed as nonoptional string but for greetings it doesn't exist
2390
+ event: parseEvent(null, payload.event)
2391
+ };
2392
+ };
2134
2393
  var parseQueuePositionUpdatedPush = function parseQueuePositionUpdatedPush(payload) {
2135
2394
  return {
2136
2395
  chatId: payload.chat_id,
@@ -2162,7 +2421,8 @@ var parseUserAddedToChatPush = function parseUserAddedToChatPush(payload) {
2162
2421
  var parseUserRemovedFromChatPush = function parseUserRemovedFromChatPush(payload) {
2163
2422
  return {
2164
2423
  chatId: payload.chat_id,
2165
- userId: payload.user_id
2424
+ userId: payload.user_id,
2425
+ reason: payload.reason
2166
2426
  };
2167
2427
  };
2168
2428
  var parseFields = function parseFields(fields) {
@@ -2172,7 +2432,7 @@ var parseFields = function parseFields(fields) {
2172
2432
  return _extends({}, field, {
2173
2433
  options: field.options.map(function (_ref) {
2174
2434
  var groupId = _ref.group_id,
2175
- option = _objectWithoutPropertiesLoose(_ref, ["group_id"]);
2435
+ option = _objectWithoutPropertiesLoose(_ref, _excluded$2);
2176
2436
  return _extends({}, option, {
2177
2437
  groupId: groupId
2178
2438
  });
@@ -2181,7 +2441,7 @@ var parseFields = function parseFields(fields) {
2181
2441
  case 'rating':
2182
2442
  {
2183
2443
  var commentLabel = field.comment_label,
2184
- parsed = _objectWithoutPropertiesLoose(field, ["comment_label"]);
2444
+ parsed = _objectWithoutPropertiesLoose(field, _excluded2);
2185
2445
  return _extends({}, parsed, {
2186
2446
  commentLabel: commentLabel
2187
2447
  });
@@ -2199,7 +2459,7 @@ var parseTicketFormFields = function parseTicketFormFields(fields) {
2199
2459
  });
2200
2460
  return parseFields(withFakeIds);
2201
2461
  };
2202
- var parseForm$1 = function parseForm(form) {
2462
+ var parseForm = function parseForm(form) {
2203
2463
  var isTicketForm = !('id' in form.fields[0]);
2204
2464
  return {
2205
2465
  id: form.id,
@@ -2211,7 +2471,7 @@ var parseGetFormResponse = function parseGetFormResponse(payload) {
2211
2471
  return payload;
2212
2472
  }
2213
2473
  return _extends({}, payload, {
2214
- form: parseForm$1(payload.form)
2474
+ form: parseForm(payload.form)
2215
2475
  });
2216
2476
  };
2217
2477
  var parseGetUrlInfoResponse = function parseGetUrlInfoResponse(payload) {
@@ -2233,6 +2493,24 @@ var parseGetUrlInfoResponse = function parseGetUrlInfoResponse(payload) {
2233
2493
  }
2234
2494
  return urlInfo;
2235
2495
  };
2496
+ var parseRequestWelcomeMessageResponse = function parseRequestWelcomeMessageResponse(payload) {
2497
+ var id = payload.id,
2498
+ predicted_agent = payload.predicted_agent,
2499
+ queue = payload.queue;
2500
+ return {
2501
+ id: id,
2502
+ predictedAgent: {
2503
+ id: predicted_agent.id,
2504
+ type: predicted_agent.type,
2505
+ name: predicted_agent.name,
2506
+ avatar: predicted_agent.avatar,
2507
+ jobTitle: predicted_agent.job_title,
2508
+ isBot: predicted_agent.is_bot,
2509
+ botType: predicted_agent.bot_type
2510
+ },
2511
+ queue: queue
2512
+ };
2513
+ };
2236
2514
  var getAvailabilityBasedOnDynamicConfig = function getAvailabilityBasedOnDynamicConfig(_ref2) {
2237
2515
  var onlineGroups = _ref2.online_groups_ids,
2238
2516
  customerGroups = _ref2.customer_groups;
@@ -2268,7 +2546,7 @@ var parseListChatsResponse = function parseListChatsResponse(payload) {
2268
2546
  return chatSummary;
2269
2547
  }
2270
2548
  chatSummary.lastEventsPerType = dataUtils.mapValues(function (lastEventPerType) {
2271
- return parseEvent$1(lastEventPerType.thread_id, lastEventPerType.event);
2549
+ return parseEvent(lastEventPerType.thread_id, lastEventPerType.event);
2272
2550
  }, lastEventsPerType);
2273
2551
  var refinedLastEventsPerType = lastEventsPerType;
2274
2552
  var lastEventSummariesArray = Object.keys(refinedLastEventsPerType).map(function (eventType) {
@@ -2366,11 +2644,6 @@ var parsePush = function parsePush(push) {
2366
2644
  action: push.action,
2367
2645
  payload: push.payload
2368
2646
  };
2369
- case CUSTOMER_PAGE_UPDATED:
2370
- return {
2371
- action: push.action,
2372
- payload: parseCustomerPageUpdatedPush(push.payload)
2373
- };
2374
2647
  case CUSTOMER_UPDATED:
2375
2648
  return {
2376
2649
  action: push.action,
@@ -2442,6 +2715,21 @@ var parsePush = function parsePush(push) {
2442
2715
  action: push.action,
2443
2716
  payload: parseIncomingTypingIndicatorPush(push.payload)
2444
2717
  };
2718
+ case INCOMING_THINKING_INDICATOR:
2719
+ return {
2720
+ action: push.action,
2721
+ payload: parseIncomingThinkingIndicatorPush(push.payload)
2722
+ };
2723
+ case INCOMING_EVENT_PREVIEW:
2724
+ return {
2725
+ action: push.action,
2726
+ payload: parseIncomingEventPreviewPush(push.payload)
2727
+ };
2728
+ case INCOMING_WELCOME_MESSAGE:
2729
+ return {
2730
+ action: push.action,
2731
+ payload: parseIncomingWelcomeMessagePush(push.payload)
2732
+ };
2445
2733
  case QUEUE_POSITION_UPDATED:
2446
2734
  return {
2447
2735
  action: push.action,
@@ -2513,11 +2801,6 @@ var parseResponse = function parseResponse(_ref6) {
2513
2801
  action: response.action,
2514
2802
  payload: parseGetFormResponse(response.payload)
2515
2803
  };
2516
- case GET_PREDICTED_AGENT:
2517
- return {
2518
- action: response.action,
2519
- payload: parsePredictedAgent(response.payload)
2520
- };
2521
2804
  case GET_URL_INFO:
2522
2805
  return {
2523
2806
  action: response.action,
@@ -2548,6 +2831,11 @@ var parseResponse = function parseResponse(_ref6) {
2548
2831
  action: response.action,
2549
2832
  payload: SUCCESS
2550
2833
  };
2834
+ case REQUEST_WELCOME_MESSAGE:
2835
+ return {
2836
+ action: response.action,
2837
+ payload: parseRequestWelcomeMessageResponse(response.payload)
2838
+ };
2551
2839
  case SEND_SNEAK_PEEK:
2552
2840
  return {
2553
2841
  action: response.action,
@@ -2558,6 +2846,11 @@ var parseResponse = function parseResponse(_ref6) {
2558
2846
  action: response.action,
2559
2847
  payload: SUCCESS
2560
2848
  };
2849
+ case SEND_GREETING_BUTTON_CLICKED:
2850
+ return {
2851
+ action: response.action,
2852
+ payload: SUCCESS
2853
+ };
2561
2854
  case SEND_RICH_MESSAGE_POSTBACK:
2562
2855
  return {
2563
2856
  action: response.action,
@@ -2573,7 +2866,7 @@ var parseResponse = function parseResponse(_ref6) {
2573
2866
  action: response.action,
2574
2867
  payload: SUCCESS
2575
2868
  };
2576
- case UPDATE_CUSTOMER_PAGE$1:
2869
+ case UPDATE_CUSTOMER_PAGE:
2577
2870
  return {
2578
2871
  action: response.action,
2579
2872
  payload: SUCCESS
@@ -2613,7 +2906,7 @@ var handleResponseError = function handleResponseError(_ref, response) {
2613
2906
  }
2614
2907
  });
2615
2908
  };
2616
- var handleResponse$1 = function handleResponse(_ref2, response) {
2909
+ var handleResponse = function handleResponse(_ref2, response) {
2617
2910
  var dispatch = _ref2.dispatch,
2618
2911
  getState = _ref2.getState;
2619
2912
  var requestId = response.request_id;
@@ -2651,7 +2944,7 @@ var handlePushResponse = function handlePushResponse(_ref3, response) {
2651
2944
  }, parsedPush)
2652
2945
  });
2653
2946
  };
2654
- var handlePush$1 = function handlePush(store, push) {
2947
+ var handlePush = function handlePush(store, push) {
2655
2948
  var parsedPush = parsePush(push);
2656
2949
  if (!parsedPush) {
2657
2950
  // defensive measure against receiving unknown push
@@ -2682,7 +2975,7 @@ var socketListener = (function (store, socket) {
2682
2975
  // those are requests with indirect responses
2683
2976
  return;
2684
2977
  default:
2685
- handleResponse$1(store, message);
2978
+ handleResponse(store, message);
2686
2979
  return;
2687
2980
  }
2688
2981
  }
@@ -2695,7 +2988,7 @@ var socketListener = (function (store, socket) {
2695
2988
  return;
2696
2989
  }
2697
2990
  }
2698
- handlePush$1(store, message);
2991
+ handlePush(store, message);
2699
2992
  });
2700
2993
  socket.on('disconnect', function () {
2701
2994
  failAllRequests(store, CONNECTION_LOST);
@@ -2757,9 +3050,9 @@ var uploadFile = function uploadFile(_ref, _ref2) {
2757
3050
  var send = new Promise(function (resolve, reject) {
2758
3051
  validateFile(file);
2759
3052
  var state = store.getState();
2760
- var query = urlUtils.buildQueryString({
3053
+ var query = urlUtils.buildQueryString(_extends({
2761
3054
  organization_id: state.organizationId
2762
- });
3055
+ }, getRegionParam(state)));
2763
3056
  var url = getServerUrl(state) + "/action/" + UPLOAD_FILE + "?" + query;
2764
3057
  var payload = {
2765
3058
  file: file
@@ -2769,7 +3062,7 @@ var uploadFile = function uploadFile(_ref, _ref2) {
2769
3062
  reject(new Error('Upload cancelled.'));
2770
3063
  return;
2771
3064
  }
2772
- upload = rawUploadFile__default['default'](url, payload, {
3065
+ upload = rawUploadFile__default["default"](url, payload, {
2773
3066
  headers: {
2774
3067
  Authorization: token.tokenType + " " + token.accessToken
2775
3068
  },
@@ -2805,43 +3098,7 @@ var uploadFile = function uploadFile(_ref, _ref2) {
2805
3098
  };
2806
3099
  };
2807
3100
 
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
- /**
2820
- * Logs event to Graylog with provided config data.
2821
- * Logging request is fired only when all of those conditions are true:
2822
- * 1. package is used in lc production environment
2823
- * 2. package is used standalone because only then "customer_sdk" will be set to customer_sdk
2824
- */
2825
- var log = function log(_ref) {
2826
- var env = _ref.env,
2827
- organizationId = _ref.organizationId,
2828
- eventName = _ref.eventName;
2829
- if (env !== 'production' || "customer_sdk" !== 'customer_sdk') {
2830
- return Promise.resolve();
2831
- }
2832
- var message = {
2833
- event_name: eventName,
2834
- severity: 'Informational',
2835
- sdkVersion: "4.0.1"
2836
- };
2837
- var body = {
2838
- organizationId: organizationId,
2839
- event_id: 'chat_widget_customer_sdk',
2840
- message: JSON.stringify(message)
2841
- };
2842
- return makeGraylogRequest('https://queue.livechatinc.com/logs', urlUtils.buildQueryString(body));
2843
- };
2844
-
3101
+ var _excluded$1 = ["on", "once", "off", "getChatHistory", "auth"];
2845
3102
  var LISTENER_IDENTITY = 'LISTENER_IDENTITY';
2846
3103
  var listenersMap = {};
2847
3104
  var createDebuggedMethods = function createDebuggedMethods(methods, prefix) {
@@ -2905,7 +3162,7 @@ var debug = (function (_sdk) {
2905
3162
  _off = sdk.off,
2906
3163
  _getChatHistory = sdk.getChatHistory,
2907
3164
  auth = sdk.auth,
2908
- rest = _objectWithoutPropertiesLoose(sdk, ["on", "once", "off", "getChatHistory", "auth"]);
3165
+ rest = _objectWithoutPropertiesLoose(sdk, _excluded$1);
2909
3166
  var methods = createDebuggedMethods(rest);
2910
3167
  return Object.freeze(_extends({
2911
3168
  auth: Object.freeze(createDebuggedMethods(auth, '.auth'))
@@ -2952,38 +3209,35 @@ var debug = (function (_sdk) {
2952
3209
  }));
2953
3210
  });
2954
3211
 
2955
- var ASC = 'asc';
2956
- var DESC = 'desc';
2957
-
2958
- var sortOrders = /*#__PURE__*/Object.freeze({
2959
- __proto__: null,
2960
- ASC: ASC,
2961
- DESC: DESC
2962
- });
2963
-
3212
+ var _excluded = ["autoConnect", "customerDataProvider", "identityProvider", "parentStorage", "env"];
2964
3213
  var CHATS_PAGINATION_MAX_LIMIT = 25;
2965
- var init = function init(config, env, licenseId) {
2966
- if (env === void 0) {
2967
- env = 'production';
2968
- }
3214
+ var init = function init(config) {
2969
3215
  createAuth.validateConfig(config);
2970
- var _config$autoConnect = config.autoConnect,
2971
- autoConnect = _config$autoConnect === void 0 ? true : _config$autoConnect,
2972
- customerDataProvider = config.customerDataProvider,
2973
- identityProvider = config.identityProvider,
2974
- instanceConfig = _objectWithoutPropertiesLoose(config, ["autoConnect", "customerDataProvider", "identityProvider"]);
3216
+ var _ref = config,
3217
+ _ref$autoConnect = _ref.autoConnect,
3218
+ autoConnect = _ref$autoConnect === void 0 ? true : _ref$autoConnect,
3219
+ customerDataProvider = _ref.customerDataProvider,
3220
+ identityProvider = _ref.identityProvider,
3221
+ parentStorage = _ref.parentStorage,
3222
+ configEnv = _ref.env,
3223
+ instanceConfig = _objectWithoutPropertiesLoose(_ref, _excluded);
3224
+ var env = configEnv && ['labs', 'staging'].includes(configEnv) ? configEnv : 'production';
2975
3225
  var store = finalCreateStore(_extends({}, instanceConfig, {
2976
3226
  env: env
2977
3227
  }));
2978
- var emitter = mitt__default['default']();
3228
+ var emitter = mitt__default["default"]();
2979
3229
  var socket = createSocketClient(store);
2980
- var auth = typeof identityProvider === 'function' ? identityProvider() : createAuth__default['default'](instanceConfig, licenseId, env);
3230
+ var hasCustomIdentityProvider = typeof identityProvider === 'function';
3231
+ var auth = hasCustomIdentityProvider ? identityProvider() : createAuth__default["default"](_extends({}, instanceConfig, {
3232
+ env: env
3233
+ }), parentStorage);
2981
3234
  store.addSideEffectsHandler(createSideEffectsHandler({
2982
3235
  emitter: emitter,
2983
3236
  socket: socket,
2984
3237
  auth: auth,
2985
3238
  customerDataProvider: customerDataProvider,
2986
- licenseId: licenseId
3239
+ parentStorage: parentStorage,
3240
+ hasCustomIdentityProvider: hasCustomIdentityProvider
2987
3241
  }));
2988
3242
  socketListener(store, socket);
2989
3243
  var sendRequestAction$1 = sendRequestAction.bind(null, store);
@@ -2993,18 +3247,18 @@ var init = function init(config, env, licenseId) {
2993
3247
  });
2994
3248
  };
2995
3249
  var api = Object.freeze({
2996
- acceptGreeting: function acceptGreeting(_ref) {
2997
- var greetingId = _ref.greetingId,
2998
- uniqueId = _ref.uniqueId;
2999
- return sendRequestAction$1(sendRequest(ACCEPT_GREETING, {
3250
+ acceptGreeting: function acceptGreeting(_ref2) {
3251
+ var greetingId = _ref2.greetingId,
3252
+ uniqueId = _ref2.uniqueId;
3253
+ return sendRequestAction$1(sendRequest$1(ACCEPT_GREETING, {
3000
3254
  greeting_id: greetingId,
3001
3255
  unique_id: uniqueId
3002
3256
  }));
3003
3257
  },
3004
3258
  auth: auth,
3005
- cancelGreeting: function cancelGreeting(_ref2) {
3006
- var uniqueId = _ref2.uniqueId;
3007
- return sendRequestAction$1(sendRequest(CANCEL_GREETING, {
3259
+ cancelGreeting: function cancelGreeting(_ref3) {
3260
+ var uniqueId = _ref3.uniqueId;
3261
+ return sendRequestAction$1(sendRequest$1(CANCEL_GREETING, {
3008
3262
  unique_id: uniqueId
3009
3263
  }));
3010
3264
  },
@@ -3014,8 +3268,8 @@ var init = function init(config, env, licenseId) {
3014
3268
  properties = _params$properties === void 0 ? ['score'] : _params$properties;
3015
3269
  return api.listThreads({
3016
3270
  chatId: chatId
3017
- }).then(function (_ref3) {
3018
- var threads = _ref3.threads;
3271
+ }).then(function (_ref4) {
3272
+ var threads = _ref4.threads;
3019
3273
  if (!threads.length) {
3020
3274
  throw createError({
3021
3275
  message: "There is no thread in \"" + chatId + "\".",
@@ -3032,37 +3286,37 @@ var init = function init(config, env, licenseId) {
3032
3286
  });
3033
3287
  },
3034
3288
  connect: startConnection,
3035
- deactivateChat: function deactivateChat(_ref4) {
3036
- var id = _ref4.id;
3037
- return sendRequestAction$1(sendRequest(DEACTIVATE_CHAT, {
3289
+ deactivateChat: function deactivateChat(_ref5) {
3290
+ var id = _ref5.id;
3291
+ return sendRequestAction$1(sendRequest$1(DEACTIVATE_CHAT, {
3038
3292
  id: id
3039
3293
  }));
3040
3294
  },
3041
- deleteChatProperties: function deleteChatProperties(_ref5) {
3042
- var id = _ref5.id,
3043
- properties = _ref5.properties;
3044
- return sendRequestAction$1(sendRequest(DELETE_CHAT_PROPERTIES, {
3295
+ deleteChatProperties: function deleteChatProperties(_ref6) {
3296
+ var id = _ref6.id,
3297
+ properties = _ref6.properties;
3298
+ return sendRequestAction$1(sendRequest$1(DELETE_CHAT_PROPERTIES, {
3045
3299
  id: id,
3046
3300
  properties: properties
3047
3301
  }));
3048
3302
  },
3049
- deleteEventProperties: function deleteEventProperties(_ref6) {
3050
- var chatId = _ref6.chatId,
3051
- threadId = _ref6.threadId,
3052
- eventId = _ref6.eventId,
3053
- properties = _ref6.properties;
3054
- return sendRequestAction$1(sendRequest(DELETE_EVENT_PROPERTIES, {
3303
+ deleteEventProperties: function deleteEventProperties(_ref7) {
3304
+ var chatId = _ref7.chatId,
3305
+ threadId = _ref7.threadId,
3306
+ eventId = _ref7.eventId,
3307
+ properties = _ref7.properties;
3308
+ return sendRequestAction$1(sendRequest$1(DELETE_EVENT_PROPERTIES, {
3055
3309
  chat_id: chatId,
3056
3310
  thread_id: threadId,
3057
3311
  event_id: eventId,
3058
3312
  properties: properties
3059
3313
  }));
3060
3314
  },
3061
- deleteThreadProperties: function deleteThreadProperties(_ref7) {
3062
- var chatId = _ref7.chatId,
3063
- threadId = _ref7.threadId,
3064
- properties = _ref7.properties;
3065
- return sendRequestAction$1(sendRequest(DELETE_THREAD_PROPERTIES, {
3315
+ deleteThreadProperties: function deleteThreadProperties(_ref8) {
3316
+ var chatId = _ref8.chatId,
3317
+ threadId = _ref8.threadId,
3318
+ properties = _ref8.properties;
3319
+ return sendRequestAction$1(sendRequest$1(DELETE_THREAD_PROPERTIES, {
3066
3320
  chat_id: chatId,
3067
3321
  thread_id: threadId,
3068
3322
  properties: properties
@@ -3074,42 +3328,32 @@ var init = function init(config, env, licenseId) {
3074
3328
  disconnect: function disconnect() {
3075
3329
  store.dispatch(pauseConnection('manual'));
3076
3330
  },
3077
- getChat: function getChat(_ref8) {
3078
- var chatId = _ref8.chatId,
3079
- threadId = _ref8.threadId;
3080
- return sendRequestAction$1(sendRequest(GET_CHAT, {
3331
+ getChat: function getChat(_ref9) {
3332
+ var chatId = _ref9.chatId,
3333
+ threadId = _ref9.threadId;
3334
+ return sendRequestAction$1(sendRequest$1(GET_CHAT, {
3081
3335
  chat_id: chatId,
3082
3336
  thread_id: threadId
3083
3337
  }));
3084
3338
  },
3085
- getChatHistory: function getChatHistory(_ref9) {
3086
- var chatId = _ref9.chatId;
3339
+ getChatHistory: function getChatHistory(_ref0) {
3340
+ var chatId = _ref0.chatId;
3087
3341
  return createChatHistoryIterator(api, chatId);
3088
3342
  },
3089
3343
  getCustomer: function getCustomer() {
3090
- return sendRequestAction$1(sendRequest(GET_CUSTOMER, {}));
3344
+ return sendRequestAction$1(sendRequest$1(GET_CUSTOMER, {}));
3091
3345
  },
3092
- getForm: function getForm(_ref10) {
3093
- var groupId = _ref10.groupId,
3094
- type = _ref10.type;
3095
- return sendRequestAction$1(sendRequest(GET_FORM, {
3346
+ getForm: function getForm(_ref1) {
3347
+ var groupId = _ref1.groupId,
3348
+ type = _ref1.type;
3349
+ return sendRequestAction$1(sendRequest$1(GET_FORM, {
3096
3350
  group_id: groupId,
3097
3351
  type: type
3098
3352
  }));
3099
3353
  },
3100
- getPredictedAgent: function getPredictedAgent(params) {
3101
- if (params === void 0) {
3102
- params = {};
3103
- }
3104
- var _params = params,
3105
- groupId = _params.groupId;
3106
- return sendRequestAction$1(sendRequest(GET_PREDICTED_AGENT, typeof groupId === 'number' ? {
3107
- group_id: groupId
3108
- } : {}));
3109
- },
3110
- getUrlInfo: function getUrlInfo(_ref11) {
3111
- var url = _ref11.url;
3112
- return sendRequestAction$1(sendRequest(GET_URL_INFO, {
3354
+ getUrlInfo: function getUrlInfo(_ref10) {
3355
+ var url = _ref10.url;
3356
+ return sendRequestAction$1(sendRequest$1(GET_URL_INFO, {
3113
3357
  url: url
3114
3358
  }));
3115
3359
  },
@@ -3120,23 +3364,23 @@ var init = function init(config, env, licenseId) {
3120
3364
  if ('limit' in params && typeof params.limit === 'number' && params.limit > CHATS_PAGINATION_MAX_LIMIT) {
3121
3365
  return Promise.reject(new Error("Specified limit is too high (max " + CHATS_PAGINATION_MAX_LIMIT + ")."));
3122
3366
  }
3123
- return sendRequestAction$1(sendRequest(LIST_CHATS, params.pageId === undefined ? {
3367
+ return sendRequestAction$1(sendRequest$1(LIST_CHATS, params.pageId === undefined ? {
3124
3368
  limit: params.limit || 10
3125
3369
  } : {
3126
3370
  page_id: params.pageId
3127
3371
  }));
3128
3372
  },
3129
3373
  listGroupStatuses: function listGroupStatuses(_temp) {
3130
- var _ref12 = _temp === void 0 ? {} : _temp,
3131
- groupIds = _ref12.groupIds;
3132
- return sendRequestAction$1(sendRequest(LIST_GROUP_STATUSES, groupIds ? {
3374
+ var _ref11 = _temp === void 0 ? {} : _temp,
3375
+ groupIds = _ref11.groupIds;
3376
+ return sendRequestAction$1(sendRequest$1(LIST_GROUP_STATUSES, groupIds ? {
3133
3377
  group_ids: groupIds
3134
3378
  } : {
3135
3379
  all: true
3136
3380
  }));
3137
3381
  },
3138
3382
  listThreads: function listThreads(params) {
3139
- return sendRequestAction$1(sendRequest(LIST_THREADS, params.pageId === undefined ? {
3383
+ return sendRequestAction$1(sendRequest$1(LIST_THREADS, params.pageId === undefined ? {
3140
3384
  chat_id: params.chatId,
3141
3385
  sort_order: params.sortOrder,
3142
3386
  limit: params.limit,
@@ -3146,10 +3390,10 @@ var init = function init(config, env, licenseId) {
3146
3390
  page_id: params.pageId
3147
3391
  }));
3148
3392
  },
3149
- markEventsAsSeen: function markEventsAsSeen(_ref13) {
3150
- var chatId = _ref13.chatId,
3151
- seenUpTo = _ref13.seenUpTo;
3152
- return sendRequestAction$1(sendRequest(MARK_EVENTS_AS_SEEN, {
3393
+ markEventsAsSeen: function markEventsAsSeen(_ref12) {
3394
+ var chatId = _ref12.chatId,
3395
+ seenUpTo = _ref12.seenUpTo;
3396
+ return sendRequestAction$1(sendRequest$1(MARK_EVENTS_AS_SEEN, {
3153
3397
  chat_id: chatId,
3154
3398
  seen_up_to: seenUpTo
3155
3399
  }));
@@ -3162,8 +3406,8 @@ var init = function init(config, env, licenseId) {
3162
3406
  rating = params.rating;
3163
3407
  return api.listThreads({
3164
3408
  chatId: chatId
3165
- }).then(function (_ref14) {
3166
- var threads = _ref14.threads;
3409
+ }).then(function (_ref13) {
3410
+ var threads = _ref13.threads;
3167
3411
  if (!threads.length) {
3168
3412
  throw createError({
3169
3413
  message: "There is no thread in \"" + chatId + "\".",
@@ -3179,31 +3423,42 @@ var init = function init(config, env, licenseId) {
3179
3423
  });
3180
3424
  });
3181
3425
  },
3426
+ requestWelcomeMessage: function requestWelcomeMessage(_temp2) {
3427
+ var _ref14 = _temp2 === void 0 ? {} : _temp2,
3428
+ id = _ref14.id;
3429
+ return sendRequestAction$1(sendRequest$1(REQUEST_WELCOME_MESSAGE, id ? {
3430
+ id: id
3431
+ } : {}));
3432
+ },
3182
3433
  resumeChat: function resumeChat(data) {
3183
3434
  log({
3184
3435
  env: env,
3185
3436
  organizationId: config.organizationId,
3186
3437
  eventName: 'chat_started'
3187
3438
  });
3188
- return sendRequestAction$1(sendRequest(RESUME_CHAT, parseResumeChatData(data)));
3439
+ return sendRequestAction$1(sendRequest$1(RESUME_CHAT, parseResumeChatData(data)));
3189
3440
  },
3190
- sendEvent: function (_sendEvent) {
3191
- function sendEvent(_x) {
3192
- return _sendEvent.apply(this, arguments);
3193
- }
3194
- sendEvent.toString = function () {
3195
- return _sendEvent.toString();
3196
- };
3197
- return sendEvent;
3198
- }(function (params) {
3441
+ sendEvent: function sendEvent$1(params) {
3199
3442
  return sendRequestAction$1(sendEvent(params));
3200
- }),
3443
+ },
3444
+ sendGreetingButtonClicked: function sendGreetingButtonClicked$1(options) {
3445
+ return sendGreetingButtonClicked({
3446
+ auth: auth,
3447
+ store: store
3448
+ }, options);
3449
+ },
3450
+ sendCustomerActions: function sendCustomerActions$1(options) {
3451
+ return sendCustomerActions({
3452
+ auth: auth,
3453
+ store: store
3454
+ }, options);
3455
+ },
3201
3456
  sendRichMessagePostback: function sendRichMessagePostback(_ref15) {
3202
3457
  var chatId = _ref15.chatId,
3203
3458
  threadId = _ref15.threadId,
3204
3459
  eventId = _ref15.eventId,
3205
3460
  postback = _ref15.postback;
3206
- return sendRequestAction$1(sendRequest(SEND_RICH_MESSAGE_POSTBACK, {
3461
+ return sendRequestAction$1(sendRequest$1(SEND_RICH_MESSAGE_POSTBACK, {
3207
3462
  chat_id: chatId,
3208
3463
  event_id: eventId,
3209
3464
  thread_id: threadId,
@@ -3212,8 +3467,8 @@ var init = function init(config, env, licenseId) {
3212
3467
  },
3213
3468
  setCustomerSessionFields: function setCustomerSessionFields(_ref16) {
3214
3469
  var sessionFields = _ref16.sessionFields;
3215
- return sendRequestAction$1(sendRequest(SET_CUSTOMER_SESSION_FIELDS, {
3216
- session_fields: parseCustomerSessionFields(sessionFields)
3470
+ return sendRequestAction$1(sendRequest$1(SET_CUSTOMER_SESSION_FIELDS, {
3471
+ session_fields: parseCustomerSessionFields$1(sessionFields)
3217
3472
  }));
3218
3473
  },
3219
3474
  setSneakPeek: function setSneakPeek(_ref17) {
@@ -3223,7 +3478,7 @@ var init = function init(config, env, licenseId) {
3223
3478
  if (!isChatActive(state, chatId) || !isConnected(state)) {
3224
3479
  return;
3225
3480
  }
3226
- sendRequestAction$1(sendRequest(SEND_SNEAK_PEEK, {
3481
+ sendRequestAction$1(sendRequest$1(SEND_SNEAK_PEEK, {
3227
3482
  chat_id: chatId,
3228
3483
  sneak_peek_text: sneakPeekText
3229
3484
  }))["catch"](dataUtils.noop);
@@ -3237,22 +3492,22 @@ var init = function init(config, env, licenseId) {
3237
3492
  organizationId: config.organizationId,
3238
3493
  eventName: 'chat_started'
3239
3494
  });
3240
- return sendRequestAction$1(sendRequest(START_CHAT, parseStartChatData(data)));
3495
+ return sendRequestAction$1(sendRequest$1(START_CHAT, parseStartChatData(data)));
3241
3496
  },
3242
3497
  updateChatProperties: function updateChatProperties(_ref18) {
3243
3498
  var id = _ref18.id,
3244
3499
  properties = _ref18.properties;
3245
- return sendRequestAction$1(sendRequest(UPDATE_CHAT_PROPERTIES, {
3500
+ return sendRequestAction$1(sendRequest$1(UPDATE_CHAT_PROPERTIES, {
3246
3501
  id: id,
3247
3502
  properties: properties
3248
3503
  }));
3249
3504
  },
3250
3505
  updateCustomer: function updateCustomer(update) {
3251
- return sendRequestAction$1(sendRequest(UPDATE_CUSTOMER, parseCustomerUpdate(update)));
3506
+ return sendRequestAction$1(sendRequest$1(UPDATE_CUSTOMER, parseCustomerUpdate(update)));
3252
3507
  },
3253
3508
  updateCustomerPage: function updateCustomerPage(page) {
3254
3509
  store.dispatch({
3255
- type: UPDATE_CUSTOMER_PAGE,
3510
+ type: UPDATE_CUSTOMER_PAGE$1,
3256
3511
  payload: dataUtils.pickOwn(['title', 'url'], page)
3257
3512
  });
3258
3513
  },
@@ -3261,7 +3516,7 @@ var init = function init(config, env, licenseId) {
3261
3516
  threadId = _ref19.threadId,
3262
3517
  eventId = _ref19.eventId,
3263
3518
  properties = _ref19.properties;
3264
- return sendRequestAction$1(sendRequest(UPDATE_EVENT_PROPERTIES, {
3519
+ return sendRequestAction$1(sendRequest$1(UPDATE_EVENT_PROPERTIES, {
3265
3520
  chat_id: chatId,
3266
3521
  event_id: eventId,
3267
3522
  thread_id: threadId,
@@ -3272,7 +3527,7 @@ var init = function init(config, env, licenseId) {
3272
3527
  var chatId = _ref20.chatId,
3273
3528
  threadId = _ref20.threadId,
3274
3529
  properties = _ref20.properties;
3275
- return sendRequestAction$1(sendRequest(UPDATE_THREAD_PROPERTIES, {
3530
+ return sendRequestAction$1(sendRequest$1(UPDATE_THREAD_PROPERTIES, {
3276
3531
  chat_id: chatId,
3277
3532
  thread_id: threadId,
3278
3533
  properties: properties
@@ -3289,7 +3544,7 @@ var init = function init(config, env, licenseId) {
3289
3544
  startConnection();
3290
3545
  } else {
3291
3546
  store.dispatch({
3292
- type: CHECK_GOALS,
3547
+ type: CHECK_GOALS$1,
3293
3548
  payload: {
3294
3549
  sessionFields: typeof customerDataProvider === 'function' ? customerDataProvider().sessionFields : {}
3295
3550
  }
@@ -3303,10 +3558,10 @@ exports.debug = debug;
3303
3558
  exports.eventTypes = eventTypes;
3304
3559
  exports.init = init;
3305
3560
  exports.parseCustomEvent = parseCustomEvent;
3306
- exports.parseEvent = parseEvent$1;
3561
+ exports.parseEvent = parseEvent;
3307
3562
  exports.parseFile = parseFile;
3308
3563
  exports.parseFilledForm = parseFilledForm;
3309
- exports.parseForm = parseForm$1;
3564
+ exports.parseForm = parseForm;
3310
3565
  exports.parseGreeting = parseGreeting;
3311
3566
  exports.parseMessage = parseMessage;
3312
3567
  exports.parseRichMessage = parseRichMessage;