@livechat/customer-sdk 4.0.2 → 5.0.1

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