@seamly/web-ui 22.3.0 → 22.3.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.
- package/build/dist/lib/components.js +1 -1
- package/build/dist/lib/components.js.map +1 -1
- package/build/dist/lib/components.min.js +1 -1
- package/build/dist/lib/components.min.js.map +1 -1
- package/build/dist/lib/hooks.js +1 -1
- package/build/dist/lib/hooks.js.map +1 -1
- package/build/dist/lib/hooks.min.js +1 -1
- package/build/dist/lib/hooks.min.js.map +1 -1
- package/build/dist/lib/index.debug.js +2 -2
- package/build/dist/lib/index.debug.min.js +1 -1
- package/build/dist/lib/index.js +2 -2
- package/build/dist/lib/index.js.map +1 -1
- package/build/dist/lib/index.min.js +1 -1
- package/build/dist/lib/index.min.js.map +1 -1
- package/build/dist/lib/standalone.js +2 -2
- package/build/dist/lib/standalone.js.map +1 -1
- package/build/dist/lib/standalone.min.js +1 -1
- package/build/dist/lib/standalone.min.js.map +1 -1
- package/build/dist/lib/style-guide.js +2 -2
- package/build/dist/lib/style-guide.js.map +1 -1
- package/build/dist/lib/style-guide.min.js +1 -1
- package/build/dist/lib/style-guide.min.js.map +1 -1
- package/build/dist/lib/utils.js +2 -2
- package/build/dist/lib/utils.js.map +1 -1
- package/build/dist/lib/utils.min.js +1 -1
- package/build/dist/lib/utils.min.js.map +1 -1
- package/package.json +1 -1
- package/src/javascripts/domains/store/slice.ts +2 -1
|
@@ -112,7 +112,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
112
112
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
113
113
|
|
|
114
114
|
"use strict";
|
|
115
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ API: () => (/* binding */ API)\n/* harmony export */ });\n/* harmony import */ var config__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! config */ \"./src/javascripts/config.ts\");\n/* harmony import */ var api_errors_seamly_api_error__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! api/errors/seamly-api-error */ \"./src/javascripts/api/errors/seamly-api-error.ts\");\n/* harmony import */ var api_errors_seamly_configuration_error__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! api/errors/seamly-configuration-error */ \"./src/javascripts/api/errors/seamly-configuration-error.js\");\n/* harmony import */ var api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! api/errors/seamly-general-error */ \"./src/javascripts/api/errors/seamly-general-error.js\");\n/* harmony import */ var api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! api/errors/seamly-session-expired-error */ \"./src/javascripts/api/errors/seamly-session-expired-error.js\");\n/* harmony import */ var api_errors_seamly_unauthorized_error__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! api/errors/seamly-unauthorized-error */ \"./src/javascripts/api/errors/seamly-unauthorized-error.js\");\n/* harmony import */ var ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ui/utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var lib_debug__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! lib/debug */ \"./src/javascripts/lib/debug.js\");\n/* harmony import */ var lib_debug__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(lib_debug__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var lib_id__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! lib/id */ \"./src/javascripts/lib/id.js\");\n/* harmony import */ var lib_store_index__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! lib/store/index */ \"./src/javascripts/lib/store/index.js\");\n/* harmony import */ var lib_store_providers_session_storage__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! lib/store/providers/session-storage */ \"./src/javascripts/lib/store/providers/session-storage.js\");\n/* harmony import */ var _conversation_connector__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./conversation-connector */ \"./src/javascripts/api/conversation-connector.ts\");\nvar __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function (resolve) {\n resolve(value);\n });\n }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n function rejected(value) {\n try {\n step(generator[\"throw\"](value));\n } catch (e) {\n reject(e);\n }\n }\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __classPrivateFieldSet = undefined && undefined.__classPrivateFieldSet || function (receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value), value;\n};\nvar __classPrivateFieldGet = undefined && undefined.__classPrivateFieldGet || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar __rest = undefined && undefined.__rest || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n }\n return t;\n};\nvar _API_instances, _API_ready, _API_externalId, _API_conversationAuthToken, _API_layoutMode, _API_config, _API_getAccessToken, _API_setAccessToken, _API_setConversationUrl, _API_getChannelTopic, _API_setChannelTopic, _API_getLocale, _API_getUrlPrefix, _API_updateUrls, _API_createConversation, _API_getEnvironment;\n\n\n\n\n\n\n\n\n\n\n\n\nconst log = lib_debug__WEBPACK_IMPORTED_MODULE_7___default()('seamly');\nconst DOMAIN = 'api.seamly-app.com';\nconst TRANSLATIONS_VERSION = 4;\nfunction buildPayload(command, payload) {\n if (command !== 'message') {\n return payload;\n }\n const {\n type,\n body\n } = payload;\n let {\n transactionId\n } = payload;\n if (!transactionId) {\n transactionId = (0,lib_id__WEBPACK_IMPORTED_MODULE_8__.randomId)();\n }\n return {\n type,\n body,\n transactionId\n };\n}\nconst fetchApi = (input,\n// eslint-disable-next-line no-undef\ninit) => __awaiter(void 0, void 0, void 0, function* () {\n const url = new URL(input);\n url.searchParams.set('v', config__WEBPACK_IMPORTED_MODULE_0__.apiVersion);\n const response = yield fetch(url.href, Object.assign({\n mode: 'cors'\n }, init));\n if (!response.ok) {\n throw new api_errors_seamly_api_error__WEBPACK_IMPORTED_MODULE_1__[\"default\"](response.statusText || `Request failed with status: ${response.status}`, {\n status: response.status\n });\n }\n return response;\n});\n/**\n * Tries to get the time zone key directly from the operating system for those\n * environments that support the ECMAScript Internationalization API.\n *\n * Based on https://github.com/pellepim/jstimezonedetect/blob/master/jstz.main.js\n */\nfunction getTimeZone() {\n if (!Intl || typeof Intl === 'undefined' || typeof Intl.DateTimeFormat === 'undefined') {\n return null;\n }\n const format = Intl.DateTimeFormat();\n if (typeof format === 'undefined' || typeof format.resolvedOptions === 'undefined') {\n return null;\n }\n const timezone = format.resolvedOptions().timeZone;\n // Ensure we get a valid timezone\n if (timezone && (timezone.indexOf('/') > -1 || timezone === 'UTC')) {\n return timezone;\n } else {\n return null;\n }\n}\nclass API {\n constructor({\n layoutMode,\n namespace,\n config,\n context\n }) {\n var _a;\n _API_instances.add(this);\n _API_ready.set(this, void 0);\n _API_externalId.set(this, void 0);\n _API_conversationAuthToken.set(this, void 0);\n _API_layoutMode.set(this, void 0);\n _API_config.set(this, void 0);\n this.conversation = new _conversation_connector__WEBPACK_IMPORTED_MODULE_11__[\"default\"]();\n _API_getLocale.set(this, locale => locale || this.locale);\n this.store = (0,lib_store_index__WEBPACK_IMPORTED_MODULE_9__.objectStore)(`${namespace}.connection${context.locale ? `.${context.locale}` : ''}`, config.storageProvider || lib_store_providers_session_storage__WEBPACK_IMPORTED_MODULE_10__[\"default\"]);\n this.connectionInfo = {\n apiKey: config.key,\n domain: config.domain || DOMAIN,\n secure: config.secure !== false ? config.secure || true : false\n };\n __classPrivateFieldSet(this, _API_config, Object.assign(Object.assign({}, config), {\n sendEnvironment: (_a = config.sendEnvironment) !== null && _a !== void 0 ? _a : true,\n context: Object.assign(Object.assign({}, context), {\n channelName: context.channelName || 'web'\n })\n }), \"f\");\n __classPrivateFieldSet(this, _API_ready, false, \"f\");\n this.connected = false;\n this.configReady = false;\n __classPrivateFieldSet(this, _API_externalId, config.externalId, \"f\");\n __classPrivateFieldSet(this, _API_layoutMode, layoutMode, \"f\");\n this.userResponded = false;\n this.URLS = {};\n // We want to reconnect whenever the page is loaded from cache (bfcache).\n // Older browsers don't support 'pageshow' and 'bfcache' so this will be ignored and work as usual.\n window.addEventListener('pageshow', event => {\n if (event.persisted && this.connected) {\n this.connect();\n }\n });\n }\n getConversationUrl() {\n const conversationUrl = this.store.get('conversationUrl');\n return conversationUrl;\n }\n hasConversation() {\n return !!this.getConversationUrl();\n }\n clearStore() {\n this.store.delete('accessToken');\n this.store.delete('conversationUrl');\n // TODO: Remove `channelName` when all clients have been upgraded past v20.\n this.store.delete('channelName');\n this.store.delete('channelTopic');\n }\n reset() {\n return __awaiter(this, void 0, void 0, function* () {\n yield this.disconnect();\n this.clearStore();\n return this.getConfig();\n });\n }\n disconnect() {\n var _a;\n return __awaiter(this, void 0, void 0, function* () {\n if ((_a = this.conversation) === null || _a === void 0 ? void 0 : _a.disconnect) {\n this.conversation.disconnect();\n }\n this.connected = false;\n this.configReady = false;\n });\n }\n getConfig() {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n const response = yield fetchApi(`${__classPrivateFieldGet(this, _API_instances, \"m\", _API_getUrlPrefix).call(this, 'http')}/client/${this.connectionInfo.apiKey}/configs`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n context: Object.assign(Object.assign({}, __classPrivateFieldGet(this, _API_config, \"f\").context), {\n environment: __classPrivateFieldGet(this, _API_config, \"f\").sendEnvironment === true ? __classPrivateFieldGet(this, _API_instances, \"m\", _API_getEnvironment).call(this) : __classPrivateFieldGet(this, _API_config, \"f\").sendEnvironment\n })\n })\n });\n const body = yield response.json();\n __classPrivateFieldGet(this, _API_instances, \"m\", _API_updateUrls).call(this, body);\n this.configReady = true;\n return body.config;\n } catch (error) {\n if (error.status === 404) {\n throw new api_errors_seamly_configuration_error__WEBPACK_IMPORTED_MODULE_2__[\"default\"](error);\n }\n if (error.status >= 500) {\n throw new api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_3__[\"default\"](error);\n }\n throw error;\n }\n });\n }\n getConversation() {\n return __awaiter(this, void 0, void 0, function* () {\n if (!this.hasConversation()) {\n return null;\n }\n try {\n const response = yield fetchApi(`${__classPrivateFieldGet(this, _API_instances, \"m\", _API_getUrlPrefix).call(this, 'http')}${this.URLS.history}`, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${__classPrivateFieldGet(this, _API_instances, \"m\", _API_getAccessToken).call(this)}`\n }\n });\n const body = yield response.json();\n __classPrivateFieldGet(this, _API_instances, \"m\", _API_updateUrls).call(this, body);\n const {\n messages,\n participants,\n activeServiceSessionId,\n activeServiceSettings,\n serviceData,\n ui,\n translation\n } = body.history;\n return {\n events: messages.map(([type, msg]) => {\n return {\n type,\n payload: Object.assign(Object.assign({}, msg), {\n type: type === 'participant' ? type : msg.type\n })\n };\n }),\n participants,\n activeServiceSessionId,\n activeServiceSettings,\n serviceData,\n resumeConversationPrompt: ui ? Boolean(ui.resumeConversationPrompt) : false,\n translationProposal: ui.translationProposal,\n translation\n };\n } catch (error) {\n if (error.status === 401) {\n throw new api_errors_seamly_unauthorized_error__WEBPACK_IMPORTED_MODULE_5__[\"default\"](error);\n }\n if (error.status === 404) {\n throw new api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_4__[\"default\"](error);\n }\n if (error.status >= 500) {\n throw new api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_3__[\"default\"](error);\n }\n throw new api_errors_seamly_api_error__WEBPACK_IMPORTED_MODULE_1__[\"default\"](error);\n }\n });\n }\n connect() {\n return __awaiter(this, void 0, void 0, function* () {\n this.connected = false;\n let conversationInitialState = {};\n if (!this.hasConversation()) {\n conversationInitialState = yield __classPrivateFieldGet(this, _API_instances, \"m\", _API_createConversation).call(this);\n }\n this.conversation.connect(`${__classPrivateFieldGet(this, _API_instances, \"m\", _API_getUrlPrefix).call(this, 'ws')}${this.URLS.socket}`, __classPrivateFieldGet(this, _API_config, \"f\").context.channelName, __classPrivateFieldGet(this, _API_instances, \"m\", _API_getChannelTopic).call(this), __classPrivateFieldGet(this, _API_instances, \"m\", _API_getAccessToken).call(this));\n this.conversation.onConnection(({\n connected,\n ready\n }) => {\n this.connected = connected;\n __classPrivateFieldSet(this, _API_ready, ready, \"f\");\n });\n // Send environment\n if (__classPrivateFieldGet(this, _API_config, \"f\").sendEnvironment) {\n this.send('context', {\n environment: __classPrivateFieldGet(this, _API_config, \"f\").sendEnvironment === true ? __classPrivateFieldGet(this, _API_instances, \"m\", _API_getEnvironment).call(this) : __classPrivateFieldGet(this, _API_config, \"f\").sendEnvironment\n }, false);\n }\n return conversationInitialState;\n });\n }\n uploadFile(file, progressCallback, successCallback, errorCallback) {\n const formData = new FormData();\n formData.append('upload', file);\n const xhr = new XMLHttpRequest();\n xhr.open('POST', `${__classPrivateFieldGet(this, _API_instances, \"m\", _API_getUrlPrefix).call(this, 'http')}${this.URLS.uploads}`);\n xhr.setRequestHeader('Authorization', `Bearer ${__classPrivateFieldGet(this, _API_instances, \"m\", _API_getAccessToken).call(this)}`);\n xhr.upload.onprogress = event => {\n if (typeof progressCallback === 'function') {\n const percent = Math.ceil(event.loaded / event.total * 100);\n progressCallback(percent);\n }\n };\n xhr.onloadend = () => {\n // status is set to 0 when upload is aborted.\n if (xhr.status === 0) return;\n if (xhr.status === 200 || xhr.status === 201) {\n if (successCallback) {\n try {\n successCallback(JSON.parse(xhr.response));\n } catch (_) {\n successCallback(xhr.response);\n }\n return;\n }\n }\n if (errorCallback) {\n try {\n errorCallback(JSON.parse(xhr.response));\n } catch (_) {\n errorCallback(xhr.response);\n }\n } else {\n throw new Error(xhr.response);\n }\n };\n xhr.send(formData);\n return xhr;\n }\n getConversationIntitialState() {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n const response = yield fetchApi(`${__classPrivateFieldGet(this, _API_instances, \"m\", _API_getUrlPrefix).call(this, 'http')}${this.getConversationUrl()}`, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${__classPrivateFieldGet(this, _API_instances, \"m\", _API_getAccessToken).call(this)}`\n }\n });\n const body = yield response.json();\n __classPrivateFieldGet(this, _API_instances, \"m\", _API_updateUrls).call(this, body);\n this.userResponded = body.conversation.userResponded;\n return (0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_6__.omit)(body.conversation, ['accessToken', 'channelTopic']);\n } catch (error) {\n if (error.status === 401) {\n throw new api_errors_seamly_unauthorized_error__WEBPACK_IMPORTED_MODULE_5__[\"default\"](error);\n }\n if (error.status === 404) {\n throw new api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_4__[\"default\"](error);\n }\n if (error.status >= 500) {\n throw new api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_3__[\"default\"](error);\n }\n throw error;\n }\n });\n }\n getTranslations(locale) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n if (!this.URLS.translations) {\n throw new api_errors_seamly_configuration_error__WEBPACK_IMPORTED_MODULE_2__[\"default\"]();\n }\n const url = `${__classPrivateFieldGet(this, _API_instances, \"m\", _API_getUrlPrefix).call(this, 'http')}${this.URLS.translations}`.replace('{version}', String(TRANSLATIONS_VERSION)).replace('{locale}', __classPrivateFieldGet(this, _API_getLocale, \"f\").call(this, locale));\n const response = yield fetchApi(url, {\n method: 'GET'\n });\n const body = yield response.json();\n return body.translations;\n } catch (error) {\n if (error.status >= 500) {\n throw new api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_3__[\"default\"](error);\n }\n throw new api_errors_seamly_api_error__WEBPACK_IMPORTED_MODULE_1__[\"default\"](error);\n }\n });\n }\n send(command, payload, waitForReady = true) {\n var _a;\n if (!this.connected || waitForReady && !__classPrivateFieldGet(this, _API_ready, \"f\")) {\n // Wait for connection to be made\n (_a = this.conversation) === null || _a === void 0 ? void 0 : _a.onConnection(({\n connected,\n ready\n }) => {\n this.connected = connected;\n __classPrivateFieldSet(this, _API_ready, ready, \"f\");\n if (waitForReady ? ready : connected) {\n this.send(command, payload, waitForReady);\n return true;\n }\n return false;\n });\n return;\n }\n log('[SEND]', command, payload);\n this.conversation.pushToChannel(command, buildPayload(command, payload), 10000);\n }\n sendContext(context) {\n var _a;\n const {\n locale,\n variables\n } = context;\n const payload = {};\n if (locale) {\n if (typeof locale !== 'string') {\n throw new Error('Locale must be a string');\n }\n payload.locale = locale;\n }\n if (variables) {\n if (typeof variables !== 'object') {\n throw new Error('Variables must be an object');\n }\n payload.variables = variables;\n }\n // If we have empty context don't send context message\n if (Object.keys(payload).length === 0 && payload.constructor === Object) {\n return;\n }\n // Destructure the server locale from the payload\n const {\n locale: _\n } = payload,\n restPayload = __rest(payload, [\"locale\"]);\n const configLocale = (_a = __classPrivateFieldGet(this, _API_config, \"f\").context) === null || _a === void 0 ? void 0 : _a.locale;\n this.send('context', Object.assign(Object.assign({}, configLocale ? {\n locale: configLocale\n } : {}), restPayload), false);\n }\n}\n_API_ready = new WeakMap(), _API_externalId = new WeakMap(), _API_conversationAuthToken = new WeakMap(), _API_layoutMode = new WeakMap(), _API_config = new WeakMap(), _API_getLocale = new WeakMap(), _API_instances = new WeakSet(), _API_getAccessToken = function _API_getAccessToken() {\n const accessToken = this.store.get('accessToken');\n return accessToken;\n}, _API_setAccessToken = function _API_setAccessToken(accessToken) {\n this.store.set('accessToken', accessToken);\n}, _API_setConversationUrl = function _API_setConversationUrl(url) {\n this.store.set('conversationUrl', url);\n}, _API_getChannelTopic = function _API_getChannelTopic() {\n const channelTopic = this.store.get('channelTopic') || this.store.get('channelName');\n // The `channelName` fallback is needed for seamless client upgrades.\n // TODO: Remove when all clients have been upgraded past v20.\n return channelTopic;\n}, _API_setChannelTopic = function _API_setChannelTopic(topic) {\n this.store.set('channelTopic', topic);\n}, _API_getUrlPrefix = function _API_getUrlPrefix(protocol) {\n const realProtocol = this.connectionInfo.secure ? `${protocol}s` : protocol;\n return `${realProtocol}://${this.connectionInfo.domain}`;\n}, _API_updateUrls = function _API_updateUrls({\n _links: responseLinks\n}) {\n this.URLS = Object.entries(responseLinks).filter(([key]) => key !== 'self').reduce((urls, [key, {\n href\n }]) => {\n return Object.assign(Object.assign({}, urls), {\n [key]: href\n });\n }, this.URLS);\n}, _API_createConversation = function _API_createConversation() {\n var _a, _b;\n return __awaiter(this, void 0, void 0, function* () {\n try {\n if (typeof ((_a = __classPrivateFieldGet(this, _API_config, \"f\")) === null || _a === void 0 ? void 0 : _a.getConversationAuthToken) === 'function') {\n __classPrivateFieldSet(this, _API_conversationAuthToken, yield __classPrivateFieldGet(this, _API_config, \"f\").getConversationAuthToken(), \"f\");\n }\n const response = yield fetchApi(`${__classPrivateFieldGet(this, _API_instances, \"m\", _API_getUrlPrefix).call(this, 'http')}${this.URLS.conversations}`, {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n externalId: __classPrivateFieldGet(this, _API_conversationAuthToken, \"f\") ? undefined : __classPrivateFieldGet(this, _API_externalId, \"f\"),\n token: __classPrivateFieldGet(this, _API_conversationAuthToken, \"f\")\n })\n });\n const body = yield response.json();\n const {\n conversation\n } = body;\n const initialState = Object.assign({}, conversation);\n delete initialState.accessToken;\n delete initialState.channelTopic;\n __classPrivateFieldGet(this, _API_instances, \"m\", _API_setAccessToken).call(this, conversation.accessToken);\n __classPrivateFieldGet(this, _API_instances, \"m\", _API_setChannelTopic).call(this, conversation.channelTopic);\n __classPrivateFieldGet(this, _API_instances, \"m\", _API_updateUrls).call(this, body);\n __classPrivateFieldGet(this, _API_instances, \"m\", _API_setConversationUrl).call(this, this.URLS.conversation);\n this.locale = (_b = conversation.translation) === null || _b === void 0 ? void 0 : _b.locale;\n this.userResponded = conversation.userResponded;\n return initialState;\n } catch (error) {\n if (error.status >= 500) {\n throw new api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_3__[\"default\"](error);\n }\n if (error.status === 400) {\n throw new api_errors_seamly_unauthorized_error__WEBPACK_IMPORTED_MODULE_5__[\"default\"](error);\n }\n if (error.status === 404) {\n throw new api_errors_seamly_configuration_error__WEBPACK_IMPORTED_MODULE_2__[\"default\"](error);\n }\n throw error;\n }\n });\n}, _API_getEnvironment = function _API_getEnvironment() {\n return {\n clientName: \"@seamly/web-ui\",\n clientVariant: __classPrivateFieldGet(this, _API_layoutMode, \"f\"),\n clientVersion: \"22.3.0\",\n currentUrl: window.location.toString(),\n screenResolution: `${window.screen.width}x${window.screen.height}`,\n timezone: getTimeZone(),\n userAgent: navigator.userAgent,\n preferredLocale: navigator.language\n };\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/api/index.ts?");
|
|
115
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ API: () => (/* binding */ API)\n/* harmony export */ });\n/* harmony import */ var config__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! config */ \"./src/javascripts/config.ts\");\n/* harmony import */ var api_errors_seamly_api_error__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! api/errors/seamly-api-error */ \"./src/javascripts/api/errors/seamly-api-error.ts\");\n/* harmony import */ var api_errors_seamly_configuration_error__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! api/errors/seamly-configuration-error */ \"./src/javascripts/api/errors/seamly-configuration-error.js\");\n/* harmony import */ var api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! api/errors/seamly-general-error */ \"./src/javascripts/api/errors/seamly-general-error.js\");\n/* harmony import */ var api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! api/errors/seamly-session-expired-error */ \"./src/javascripts/api/errors/seamly-session-expired-error.js\");\n/* harmony import */ var api_errors_seamly_unauthorized_error__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! api/errors/seamly-unauthorized-error */ \"./src/javascripts/api/errors/seamly-unauthorized-error.js\");\n/* harmony import */ var ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ui/utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var lib_debug__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! lib/debug */ \"./src/javascripts/lib/debug.js\");\n/* harmony import */ var lib_debug__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(lib_debug__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var lib_id__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! lib/id */ \"./src/javascripts/lib/id.js\");\n/* harmony import */ var lib_store_index__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! lib/store/index */ \"./src/javascripts/lib/store/index.js\");\n/* harmony import */ var lib_store_providers_session_storage__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! lib/store/providers/session-storage */ \"./src/javascripts/lib/store/providers/session-storage.js\");\n/* harmony import */ var _conversation_connector__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./conversation-connector */ \"./src/javascripts/api/conversation-connector.ts\");\nvar __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function (resolve) {\n resolve(value);\n });\n }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n function rejected(value) {\n try {\n step(generator[\"throw\"](value));\n } catch (e) {\n reject(e);\n }\n }\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __classPrivateFieldSet = undefined && undefined.__classPrivateFieldSet || function (receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value), value;\n};\nvar __classPrivateFieldGet = undefined && undefined.__classPrivateFieldGet || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar __rest = undefined && undefined.__rest || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n }\n return t;\n};\nvar _API_instances, _API_ready, _API_externalId, _API_conversationAuthToken, _API_layoutMode, _API_config, _API_getAccessToken, _API_setAccessToken, _API_setConversationUrl, _API_getChannelTopic, _API_setChannelTopic, _API_getLocale, _API_getUrlPrefix, _API_updateUrls, _API_createConversation, _API_getEnvironment;\n\n\n\n\n\n\n\n\n\n\n\n\nconst log = lib_debug__WEBPACK_IMPORTED_MODULE_7___default()('seamly');\nconst DOMAIN = 'api.seamly-app.com';\nconst TRANSLATIONS_VERSION = 4;\nfunction buildPayload(command, payload) {\n if (command !== 'message') {\n return payload;\n }\n const {\n type,\n body\n } = payload;\n let {\n transactionId\n } = payload;\n if (!transactionId) {\n transactionId = (0,lib_id__WEBPACK_IMPORTED_MODULE_8__.randomId)();\n }\n return {\n type,\n body,\n transactionId\n };\n}\nconst fetchApi = (input,\n// eslint-disable-next-line no-undef\ninit) => __awaiter(void 0, void 0, void 0, function* () {\n const url = new URL(input);\n url.searchParams.set('v', config__WEBPACK_IMPORTED_MODULE_0__.apiVersion);\n const response = yield fetch(url.href, Object.assign({\n mode: 'cors'\n }, init));\n if (!response.ok) {\n throw new api_errors_seamly_api_error__WEBPACK_IMPORTED_MODULE_1__[\"default\"](response.statusText || `Request failed with status: ${response.status}`, {\n status: response.status\n });\n }\n return response;\n});\n/**\n * Tries to get the time zone key directly from the operating system for those\n * environments that support the ECMAScript Internationalization API.\n *\n * Based on https://github.com/pellepim/jstimezonedetect/blob/master/jstz.main.js\n */\nfunction getTimeZone() {\n if (!Intl || typeof Intl === 'undefined' || typeof Intl.DateTimeFormat === 'undefined') {\n return null;\n }\n const format = Intl.DateTimeFormat();\n if (typeof format === 'undefined' || typeof format.resolvedOptions === 'undefined') {\n return null;\n }\n const timezone = format.resolvedOptions().timeZone;\n // Ensure we get a valid timezone\n if (timezone && (timezone.indexOf('/') > -1 || timezone === 'UTC')) {\n return timezone;\n } else {\n return null;\n }\n}\nclass API {\n constructor({\n layoutMode,\n namespace,\n config,\n context\n }) {\n var _a;\n _API_instances.add(this);\n _API_ready.set(this, void 0);\n _API_externalId.set(this, void 0);\n _API_conversationAuthToken.set(this, void 0);\n _API_layoutMode.set(this, void 0);\n _API_config.set(this, void 0);\n this.conversation = new _conversation_connector__WEBPACK_IMPORTED_MODULE_11__[\"default\"]();\n _API_getLocale.set(this, locale => locale || this.locale);\n this.store = (0,lib_store_index__WEBPACK_IMPORTED_MODULE_9__.objectStore)(`${namespace}.connection${context.locale ? `.${context.locale}` : ''}`, config.storageProvider || lib_store_providers_session_storage__WEBPACK_IMPORTED_MODULE_10__[\"default\"]);\n this.connectionInfo = {\n apiKey: config.key,\n domain: config.domain || DOMAIN,\n secure: config.secure !== false ? config.secure || true : false\n };\n __classPrivateFieldSet(this, _API_config, Object.assign(Object.assign({}, config), {\n sendEnvironment: (_a = config.sendEnvironment) !== null && _a !== void 0 ? _a : true,\n context: Object.assign(Object.assign({}, context), {\n channelName: context.channelName || 'web'\n })\n }), \"f\");\n __classPrivateFieldSet(this, _API_ready, false, \"f\");\n this.connected = false;\n this.configReady = false;\n __classPrivateFieldSet(this, _API_externalId, config.externalId, \"f\");\n __classPrivateFieldSet(this, _API_layoutMode, layoutMode, \"f\");\n this.userResponded = false;\n this.URLS = {};\n // We want to reconnect whenever the page is loaded from cache (bfcache).\n // Older browsers don't support 'pageshow' and 'bfcache' so this will be ignored and work as usual.\n window.addEventListener('pageshow', event => {\n if (event.persisted && this.connected) {\n this.connect();\n }\n });\n }\n getConversationUrl() {\n const conversationUrl = this.store.get('conversationUrl');\n return conversationUrl;\n }\n hasConversation() {\n return !!this.getConversationUrl();\n }\n clearStore() {\n this.store.delete('accessToken');\n this.store.delete('conversationUrl');\n // TODO: Remove `channelName` when all clients have been upgraded past v20.\n this.store.delete('channelName');\n this.store.delete('channelTopic');\n }\n reset() {\n return __awaiter(this, void 0, void 0, function* () {\n yield this.disconnect();\n this.clearStore();\n return this.getConfig();\n });\n }\n disconnect() {\n var _a;\n return __awaiter(this, void 0, void 0, function* () {\n if ((_a = this.conversation) === null || _a === void 0 ? void 0 : _a.disconnect) {\n this.conversation.disconnect();\n }\n this.connected = false;\n this.configReady = false;\n });\n }\n getConfig() {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n const response = yield fetchApi(`${__classPrivateFieldGet(this, _API_instances, \"m\", _API_getUrlPrefix).call(this, 'http')}/client/${this.connectionInfo.apiKey}/configs`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n context: Object.assign(Object.assign({}, __classPrivateFieldGet(this, _API_config, \"f\").context), {\n environment: __classPrivateFieldGet(this, _API_config, \"f\").sendEnvironment === true ? __classPrivateFieldGet(this, _API_instances, \"m\", _API_getEnvironment).call(this) : __classPrivateFieldGet(this, _API_config, \"f\").sendEnvironment\n })\n })\n });\n const body = yield response.json();\n __classPrivateFieldGet(this, _API_instances, \"m\", _API_updateUrls).call(this, body);\n this.configReady = true;\n return body.config;\n } catch (error) {\n if (error.status === 404) {\n throw new api_errors_seamly_configuration_error__WEBPACK_IMPORTED_MODULE_2__[\"default\"](error);\n }\n if (error.status >= 500) {\n throw new api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_3__[\"default\"](error);\n }\n throw error;\n }\n });\n }\n getConversation() {\n return __awaiter(this, void 0, void 0, function* () {\n if (!this.hasConversation()) {\n return null;\n }\n try {\n const response = yield fetchApi(`${__classPrivateFieldGet(this, _API_instances, \"m\", _API_getUrlPrefix).call(this, 'http')}${this.URLS.history}`, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${__classPrivateFieldGet(this, _API_instances, \"m\", _API_getAccessToken).call(this)}`\n }\n });\n const body = yield response.json();\n __classPrivateFieldGet(this, _API_instances, \"m\", _API_updateUrls).call(this, body);\n const {\n messages,\n participants,\n activeServiceSessionId,\n activeServiceSettings,\n serviceData,\n ui,\n translation\n } = body.history;\n return {\n events: messages.map(([type, msg]) => {\n return {\n type,\n payload: Object.assign(Object.assign({}, msg), {\n type: type === 'participant' ? type : msg.type\n })\n };\n }),\n participants,\n activeServiceSessionId,\n activeServiceSettings,\n serviceData,\n resumeConversationPrompt: ui ? Boolean(ui.resumeConversationPrompt) : false,\n translationProposal: ui.translationProposal,\n translation\n };\n } catch (error) {\n if (error.status === 401) {\n throw new api_errors_seamly_unauthorized_error__WEBPACK_IMPORTED_MODULE_5__[\"default\"](error);\n }\n if (error.status === 404) {\n throw new api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_4__[\"default\"](error);\n }\n if (error.status >= 500) {\n throw new api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_3__[\"default\"](error);\n }\n throw new api_errors_seamly_api_error__WEBPACK_IMPORTED_MODULE_1__[\"default\"](error);\n }\n });\n }\n connect() {\n return __awaiter(this, void 0, void 0, function* () {\n this.connected = false;\n let conversationInitialState = {};\n if (!this.hasConversation()) {\n conversationInitialState = yield __classPrivateFieldGet(this, _API_instances, \"m\", _API_createConversation).call(this);\n }\n this.conversation.connect(`${__classPrivateFieldGet(this, _API_instances, \"m\", _API_getUrlPrefix).call(this, 'ws')}${this.URLS.socket}`, __classPrivateFieldGet(this, _API_config, \"f\").context.channelName, __classPrivateFieldGet(this, _API_instances, \"m\", _API_getChannelTopic).call(this), __classPrivateFieldGet(this, _API_instances, \"m\", _API_getAccessToken).call(this));\n this.conversation.onConnection(({\n connected,\n ready\n }) => {\n this.connected = connected;\n __classPrivateFieldSet(this, _API_ready, ready, \"f\");\n });\n // Send environment\n if (__classPrivateFieldGet(this, _API_config, \"f\").sendEnvironment) {\n this.send('context', {\n environment: __classPrivateFieldGet(this, _API_config, \"f\").sendEnvironment === true ? __classPrivateFieldGet(this, _API_instances, \"m\", _API_getEnvironment).call(this) : __classPrivateFieldGet(this, _API_config, \"f\").sendEnvironment\n }, false);\n }\n return conversationInitialState;\n });\n }\n uploadFile(file, progressCallback, successCallback, errorCallback) {\n const formData = new FormData();\n formData.append('upload', file);\n const xhr = new XMLHttpRequest();\n xhr.open('POST', `${__classPrivateFieldGet(this, _API_instances, \"m\", _API_getUrlPrefix).call(this, 'http')}${this.URLS.uploads}`);\n xhr.setRequestHeader('Authorization', `Bearer ${__classPrivateFieldGet(this, _API_instances, \"m\", _API_getAccessToken).call(this)}`);\n xhr.upload.onprogress = event => {\n if (typeof progressCallback === 'function') {\n const percent = Math.ceil(event.loaded / event.total * 100);\n progressCallback(percent);\n }\n };\n xhr.onloadend = () => {\n // status is set to 0 when upload is aborted.\n if (xhr.status === 0) return;\n if (xhr.status === 200 || xhr.status === 201) {\n if (successCallback) {\n try {\n successCallback(JSON.parse(xhr.response));\n } catch (_) {\n successCallback(xhr.response);\n }\n return;\n }\n }\n if (errorCallback) {\n try {\n errorCallback(JSON.parse(xhr.response));\n } catch (_) {\n errorCallback(xhr.response);\n }\n } else {\n throw new Error(xhr.response);\n }\n };\n xhr.send(formData);\n return xhr;\n }\n getConversationIntitialState() {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n const response = yield fetchApi(`${__classPrivateFieldGet(this, _API_instances, \"m\", _API_getUrlPrefix).call(this, 'http')}${this.getConversationUrl()}`, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${__classPrivateFieldGet(this, _API_instances, \"m\", _API_getAccessToken).call(this)}`\n }\n });\n const body = yield response.json();\n __classPrivateFieldGet(this, _API_instances, \"m\", _API_updateUrls).call(this, body);\n this.userResponded = body.conversation.userResponded;\n return (0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_6__.omit)(body.conversation, ['accessToken', 'channelTopic']);\n } catch (error) {\n if (error.status === 401) {\n throw new api_errors_seamly_unauthorized_error__WEBPACK_IMPORTED_MODULE_5__[\"default\"](error);\n }\n if (error.status === 404) {\n throw new api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_4__[\"default\"](error);\n }\n if (error.status >= 500) {\n throw new api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_3__[\"default\"](error);\n }\n throw error;\n }\n });\n }\n getTranslations(locale) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n if (!this.URLS.translations) {\n throw new api_errors_seamly_configuration_error__WEBPACK_IMPORTED_MODULE_2__[\"default\"]();\n }\n const url = `${__classPrivateFieldGet(this, _API_instances, \"m\", _API_getUrlPrefix).call(this, 'http')}${this.URLS.translations}`.replace('{version}', String(TRANSLATIONS_VERSION)).replace('{locale}', __classPrivateFieldGet(this, _API_getLocale, \"f\").call(this, locale));\n const response = yield fetchApi(url, {\n method: 'GET'\n });\n const body = yield response.json();\n return body.translations;\n } catch (error) {\n if (error.status >= 500) {\n throw new api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_3__[\"default\"](error);\n }\n throw new api_errors_seamly_api_error__WEBPACK_IMPORTED_MODULE_1__[\"default\"](error);\n }\n });\n }\n send(command, payload, waitForReady = true) {\n var _a;\n if (!this.connected || waitForReady && !__classPrivateFieldGet(this, _API_ready, \"f\")) {\n // Wait for connection to be made\n (_a = this.conversation) === null || _a === void 0 ? void 0 : _a.onConnection(({\n connected,\n ready\n }) => {\n this.connected = connected;\n __classPrivateFieldSet(this, _API_ready, ready, \"f\");\n if (waitForReady ? ready : connected) {\n this.send(command, payload, waitForReady);\n return true;\n }\n return false;\n });\n return;\n }\n log('[SEND]', command, payload);\n this.conversation.pushToChannel(command, buildPayload(command, payload), 10000);\n }\n sendContext(context) {\n var _a;\n const {\n locale,\n variables\n } = context;\n const payload = {};\n if (locale) {\n if (typeof locale !== 'string') {\n throw new Error('Locale must be a string');\n }\n payload.locale = locale;\n }\n if (variables) {\n if (typeof variables !== 'object') {\n throw new Error('Variables must be an object');\n }\n payload.variables = variables;\n }\n // If we have empty context don't send context message\n if (Object.keys(payload).length === 0 && payload.constructor === Object) {\n return;\n }\n // Destructure the server locale from the payload\n const {\n locale: _\n } = payload,\n restPayload = __rest(payload, [\"locale\"]);\n const configLocale = (_a = __classPrivateFieldGet(this, _API_config, \"f\").context) === null || _a === void 0 ? void 0 : _a.locale;\n this.send('context', Object.assign(Object.assign({}, configLocale ? {\n locale: configLocale\n } : {}), restPayload), false);\n }\n}\n_API_ready = new WeakMap(), _API_externalId = new WeakMap(), _API_conversationAuthToken = new WeakMap(), _API_layoutMode = new WeakMap(), _API_config = new WeakMap(), _API_getLocale = new WeakMap(), _API_instances = new WeakSet(), _API_getAccessToken = function _API_getAccessToken() {\n const accessToken = this.store.get('accessToken');\n return accessToken;\n}, _API_setAccessToken = function _API_setAccessToken(accessToken) {\n this.store.set('accessToken', accessToken);\n}, _API_setConversationUrl = function _API_setConversationUrl(url) {\n this.store.set('conversationUrl', url);\n}, _API_getChannelTopic = function _API_getChannelTopic() {\n const channelTopic = this.store.get('channelTopic') || this.store.get('channelName');\n // The `channelName` fallback is needed for seamless client upgrades.\n // TODO: Remove when all clients have been upgraded past v20.\n return channelTopic;\n}, _API_setChannelTopic = function _API_setChannelTopic(topic) {\n this.store.set('channelTopic', topic);\n}, _API_getUrlPrefix = function _API_getUrlPrefix(protocol) {\n const realProtocol = this.connectionInfo.secure ? `${protocol}s` : protocol;\n return `${realProtocol}://${this.connectionInfo.domain}`;\n}, _API_updateUrls = function _API_updateUrls({\n _links: responseLinks\n}) {\n this.URLS = Object.entries(responseLinks).filter(([key]) => key !== 'self').reduce((urls, [key, {\n href\n }]) => {\n return Object.assign(Object.assign({}, urls), {\n [key]: href\n });\n }, this.URLS);\n}, _API_createConversation = function _API_createConversation() {\n var _a, _b;\n return __awaiter(this, void 0, void 0, function* () {\n try {\n if (typeof ((_a = __classPrivateFieldGet(this, _API_config, \"f\")) === null || _a === void 0 ? void 0 : _a.getConversationAuthToken) === 'function') {\n __classPrivateFieldSet(this, _API_conversationAuthToken, yield __classPrivateFieldGet(this, _API_config, \"f\").getConversationAuthToken(), \"f\");\n }\n const response = yield fetchApi(`${__classPrivateFieldGet(this, _API_instances, \"m\", _API_getUrlPrefix).call(this, 'http')}${this.URLS.conversations}`, {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n externalId: __classPrivateFieldGet(this, _API_conversationAuthToken, \"f\") ? undefined : __classPrivateFieldGet(this, _API_externalId, \"f\"),\n token: __classPrivateFieldGet(this, _API_conversationAuthToken, \"f\")\n })\n });\n const body = yield response.json();\n const {\n conversation\n } = body;\n const initialState = Object.assign({}, conversation);\n delete initialState.accessToken;\n delete initialState.channelTopic;\n __classPrivateFieldGet(this, _API_instances, \"m\", _API_setAccessToken).call(this, conversation.accessToken);\n __classPrivateFieldGet(this, _API_instances, \"m\", _API_setChannelTopic).call(this, conversation.channelTopic);\n __classPrivateFieldGet(this, _API_instances, \"m\", _API_updateUrls).call(this, body);\n __classPrivateFieldGet(this, _API_instances, \"m\", _API_setConversationUrl).call(this, this.URLS.conversation);\n this.locale = (_b = conversation.translation) === null || _b === void 0 ? void 0 : _b.locale;\n this.userResponded = conversation.userResponded;\n return initialState;\n } catch (error) {\n if (error.status >= 500) {\n throw new api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_3__[\"default\"](error);\n }\n if (error.status === 400) {\n throw new api_errors_seamly_unauthorized_error__WEBPACK_IMPORTED_MODULE_5__[\"default\"](error);\n }\n if (error.status === 404) {\n throw new api_errors_seamly_configuration_error__WEBPACK_IMPORTED_MODULE_2__[\"default\"](error);\n }\n throw error;\n }\n });\n}, _API_getEnvironment = function _API_getEnvironment() {\n return {\n clientName: \"@seamly/web-ui\",\n clientVariant: __classPrivateFieldGet(this, _API_layoutMode, \"f\"),\n clientVersion: \"22.3.1\",\n currentUrl: window.location.toString(),\n screenResolution: `${window.screen.width}x${window.screen.height}`,\n timezone: getTimeZone(),\n userAgent: navigator.userAgent,\n preferredLocale: navigator.language\n };\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/api/index.ts?");
|
|
116
116
|
|
|
117
117
|
/***/ }),
|
|
118
118
|
|
|
@@ -409,7 +409,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
409
409
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
410
410
|
|
|
411
411
|
"use strict";
|
|
412
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ackEvent: () => (/* binding */ ackEvent),\n/* harmony export */ addEvent: () => (/* binding */ addEvent),\n/* harmony export */ clearAbortTransaction: () => (/* binding */ clearAbortTransaction),\n/* harmony export */ clearAllUploads: () => (/* binding */ clearAllUploads),\n/* harmony export */ clearEvents: () => (/* binding */ clearEvents),\n/* harmony export */ clearFeatures: () => (/* binding */ clearFeatures),\n/* harmony export */ clearIdleDetachCountdown: () => (/* binding */ clearIdleDetachCountdown),\n/* harmony export */ clearResumeConversationPrompt: () => (/* binding */ clearResumeConversationPrompt),\n/* harmony export */ decrementIdleDetachCountdownCounter: () => (/* binding */ decrementIdleDetachCountdownCounter),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ doneProcessingImage: () => (/* binding */ doneProcessingImage),\n/* harmony export */ hideOption: () => (/* binding */ hideOption),\n/* harmony export */ initIdleDetachCountdown: () => (/* binding */ initIdleDetachCountdown),\n/* harmony export */ initResumeConversationPrompt: () => (/* binding */ initResumeConversationPrompt),\n/* harmony export */ initialStoreState: () => (/* binding */ initialStoreState),\n/* harmony export */ isUnreadMessage: () => (/* binding */ isUnreadMessage),\n/* harmony export */ mergeHistory: () => (/* binding */ mergeHistory),\n/* harmony export */ orderHistory: () => (/* binding */ orderHistory),\n/* harmony export */ registerUpload: () => (/* binding */ registerUpload),\n/* harmony export */ resetHistoryLoadedFlag: () => (/* binding */ resetHistoryLoadedFlag),\n/* harmony export */ setActiveEntryType: () => (/* binding */ setActiveEntryType),\n/* harmony export */ setActiveService: () => (/* binding */ setActiveService),\n/* harmony export */ setBlockAutoEntrySwitch: () => (/* binding */ setBlockAutoEntrySwitch),\n/* harmony export */ setEventsRead: () => (/* binding */ setEventsRead),\n/* harmony export */ setFeatureEnabledState: () => (/* binding */ setFeatureEnabledState),\n/* harmony export */ setFeatures: () => (/* binding */ setFeatures),\n/* harmony export */ setHeaderSubTitle: () => (/* binding */ setHeaderSubTitle),\n/* harmony export */ setHeaderTitle: () => (/* binding */ setHeaderTitle),\n/* harmony export */ setHistory: () => (/* binding */ setHistory),\n/* harmony export */ setInitialState: () => (/* binding */ setInitialState),\n/* harmony export */ setIsLoading: () => (/* binding */ setIsLoading),\n/* harmony export */ setLoadedImageEventIds: () => (/* binding */ setLoadedImageEventIds),\n/* harmony export */ setParticipant: () => (/* binding */ setParticipant),\n/* harmony export */ setProactiveMessages: () => (/* binding */ setProactiveMessages),\n/* harmony export */ setSeamlyContainerElement: () => (/* binding */ setSeamlyContainerElement),\n/* harmony export */ setServiceDataItem: () => (/* binding */ setServiceDataItem),\n/* harmony export */ setServiceEntryMetadata: () => (/* binding */ setServiceEntryMetadata),\n/* harmony export */ setUploadComplete: () => (/* binding */ setUploadComplete),\n/* harmony export */ setUploadError: () => (/* binding */ setUploadError),\n/* harmony export */ setUploadProgress: () => (/* binding */ setUploadProgress),\n/* harmony export */ setUserEntryType: () => (/* binding */ setUserEntryType),\n/* harmony export */ setUserSelectedOption: () => (/* binding */ setUserSelectedOption),\n/* harmony export */ setUserSelectedOptions: () => (/* binding */ setUserSelectedOptions),\n/* harmony export */ showOption: () => (/* binding */ showOption),\n/* harmony export */ startProcessingImage: () => (/* binding */ startProcessingImage),\n/* harmony export */ stopIdleDetachCountdownCounter: () => (/* binding */ stopIdleDetachCountdownCounter),\n/* harmony export */ storeSlice: () => (/* binding */ storeSlice)\n/* harmony export */ });\n/* harmony import */ var _reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @reduxjs/toolkit */ \"./node_modules/@reduxjs/toolkit/dist/redux-toolkit.esm.js\");\n/* harmony import */ var ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ui/utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.ts\");\n/* harmony import */ var domains_app_actions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/app/actions */ \"./src/javascripts/domains/app/actions.ts\");\n/* harmony import */ var domains_config_actions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! domains/config/actions */ \"./src/javascripts/domains/config/actions.ts\");\n/* harmony import */ var lib_id__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lib/id */ \"./src/javascripts/lib/id.js\");\n\n\n\n\n\n\nconst isUnreadMessage = ({\n type,\n payload\n}) => document.visibilityState === 'hidden' || type === ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.eventTypes.message && !payload.fromClient || type === ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.eventTypes.info && payload.type === ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.payloadTypes.text;\nconst orderHistory = events => {\n return events.sort(({\n payload: {\n occurredAt: occurredAtA\n }\n }, {\n payload: {\n occurredAt: occurredAtB\n }\n }) => occurredAtA - occurredAtB);\n};\nconst mergeHistory = (stateEvents, historyEvents) => {\n const newStateEvents = stateEvents.filter(stateEvent => stateEvent.type === 'message' && !stateEvent.payload.optimisticallyInjected &&\n // Deduplicate the event streams, giving events in historyEvents\n // precedence so the server is able to push changes to events.\n !historyEvents.some(historyEvent => historyEvent.payload.id === stateEvent.payload.id));\n const newHistoryEvents = historyEvents.filter(historyEvent =>\n // Remove all non displayable participant messages\n !(historyEvent.type === 'participant' && !historyEvent.payload.participant.introduction))\n // Reverse is done here because the server sends the history in the order\n // newest to oldest. In the case of exactly the same occurredAt timestamps\n // these messages will be shown in the wrong order if not reversed. For\n // the normal merging logic there is no added effect.\n .reverse();\n return orderHistory([...newHistoryEvents, ...newStateEvents]);\n};\nconst participantReducer = (participantInfo, action) => {\n // TODO: a) Styleguide only! b) Should be removed after styleguide overhaul.\n if (!participantInfo) {\n return {\n participants: {},\n currentAgent: ''\n };\n }\n const {\n participants\n } = participantInfo || {\n participants: {}\n };\n const {\n id,\n avatar,\n name,\n introduction\n } = action.participant;\n const oldParticipant = participants[id];\n const newParticipants = Object.assign(Object.assign({}, participants), {\n [id]: oldParticipant ? Object.assign(Object.assign(Object.assign(Object.assign({}, oldParticipant), avatar ? {\n avatar\n } : {}), name ? {\n name\n } : {}), introduction ? {\n introduction\n } : {}) : action.participant\n });\n return Object.assign(Object.assign({}, participantInfo), {\n participants: newParticipants,\n currentAgent: participantInfo.currentAgent !== id && !action.fromClient ? id : participantInfo.currentAgent\n });\n};\nconst calculateNewEntryMeta = (entryMeta, channelEvent) => {\n var _a, _b;\n const entry = (channelEvent === null || channelEvent === void 0 ? void 0 : channelEvent.type) === 'message' ? (channelEvent === null || channelEvent === void 0 ? void 0 : channelEvent.payload.translatedEntry) || (channelEvent === null || channelEvent === void 0 ? void 0 : channelEvent.payload.entry) : {};\n const {\n blockAutoEntrySwitch\n } = entryMeta;\n const actions = ((_a = channelEvent === null || channelEvent === void 0 ? void 0 : channelEvent.payload) === null || _a === void 0 ? void 0 : _a.actions) || {};\n const translatedActions = ((_b = channelEvent === null || channelEvent === void 0 ? void 0 : channelEvent.payload) === null || _b === void 0 ? void 0 : _b.translatedActions) || {};\n if (!entry) {\n return Object.assign(Object.assign({}, entryMeta), {\n optionsOverride: {},\n actions,\n translatedActions\n });\n }\n const {\n type,\n options\n } = entry;\n let newActive = entryMeta.active;\n if (!blockAutoEntrySwitch && type !== entryMeta.userSelected) {\n newActive = type;\n }\n return Object.assign(Object.assign({}, entryMeta), {\n active: newActive,\n optionsOverride: Object.assign(Object.assign({}, entryMeta.optionsOverride), {\n [type]: options || {}\n }),\n actions,\n translatedActions\n });\n};\nconst initialStoreState = {\n events: [],\n isLastEventFromClient: false,\n initialState: {\n userResponded: false\n },\n unreadEvents: 0,\n userHasResponded: false,\n loadedImageEventIds: [],\n isLoading: false,\n idleDetachCountdown: {\n hasCountdown: false,\n isActive: false,\n remaining: undefined,\n wasStopped: undefined,\n count: undefined,\n timer: undefined\n },\n resumeConversationPrompt: false,\n serviceInfo: {\n activeServiceSessionId: '',\n proactiveMessages: false\n },\n participantInfo: {\n participants: {},\n currentAgent: ''\n },\n headerTitles: {\n title: null,\n subTitle: ''\n },\n historyLoaded: false,\n skiplinkTargetId: (0,lib_id__WEBPACK_IMPORTED_MODULE_4__.randomId)(),\n optionsButtonId: (0,lib_id__WEBPACK_IMPORTED_MODULE_4__.randomId)(),\n headerCollapseButtonId: (0,lib_id__WEBPACK_IMPORTED_MODULE_4__.randomId)(),\n serviceData: {},\n options: {\n features: {\n webNotifications: {\n enabled: false\n }\n },\n panelActive: false,\n optionActive: '',\n userSelectedOptions: {}\n },\n showFileUpload: false,\n currentUploads: [],\n processingFileUploads: [],\n entryMeta: {\n default: ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.entryTypes.text,\n active: ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.entryTypes.text,\n userSelected: null,\n blockAutoEntrySwitch: false,\n options: {},\n optionsOverride: {},\n actions: {},\n translatedActions: {}\n },\n seamlyContainerElement: null\n};\nconst storeSlice = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_5__.createSlice)({\n name: 'store',\n initialState: initialStoreState,\n reducers: {\n addEvent: (state, action) => {\n var _a, _b;\n const {\n type: eventType,\n payload\n } = action.payload;\n const accountHasUploads = state.options.features.hasOwnProperty(ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.featureKeys.uploads);\n let newOptions = Object.assign({}, state.options);\n // This enabled override of the service enabled value for uploads.\n // If a message is sent with entry of type upload it will temporarily\n // override service value and enable uploads.\n if (accountHasUploads && (eventType === ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.eventTypes.message || eventType === ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.eventTypes.participant) && !payload.fromClient) {\n const entryType = eventType === 'message' ? (_a = payload.entry) === null || _a === void 0 ? void 0 : _a.type : {};\n newOptions = Object.assign(Object.assign({}, newOptions), {\n features: Object.assign(Object.assign({}, newOptions.features), {\n uploads: Object.assign(Object.assign({}, (_b = newOptions.features) === null || _b === void 0 ? void 0 : _b.uploads), {\n enabledFromEntry: entryType === ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.entryTypes.upload\n })\n })\n });\n }\n const incrementUnread = isUnreadMessage(action.payload);\n // We check for duplicated and ignore them as in some error of the websocket\n // a duplicate join can be active for a while until the server connection\n // times out.\n const eventExists = state.events.find(e => e.payload.id === payload.id);\n if (eventExists) {\n return;\n }\n const newEntryMeta = calculateNewEntryMeta(state.entryMeta, action.payload);\n state.entryMeta = !accountHasUploads && newEntryMeta.active === ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.entryTypes.upload ? Object.assign({}, state.entryMeta) : newEntryMeta;\n state.options = newOptions;\n if (incrementUnread) {\n state.unreadEvents += 1;\n if (eventType !== 'service_data') {\n action.payload.payload.messageStatus = payload.fromClient ? ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.readStates.read : ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.readStates.received;\n }\n }\n action.payload.payload.key = (0,lib_id__WEBPACK_IMPORTED_MODULE_4__.randomId)();\n state.events.push(action.payload);\n state.isLastEventFromClient = payload.fromClient;\n },\n ackEvent: (state, {\n payload: {\n payload\n }\n }) => {\n // If any ACKs are sent without transactionID the conversation crashes.\n // Ensure that this edge case is handled gracefully.\n if (!payload.transactionId) {\n console.warn('ACK received without transaction ID.');\n return;\n }\n const matchedEvent = state.events.find(m => m.payload.transactionId === payload.transactionId && (!payload.type || m.type === payload.type));\n const {\n id,\n occurredAt\n } = payload;\n if (matchedEvent) {\n matchedEvent.payload.id = id;\n matchedEvent.payload.occurredAt = occurredAt;\n state.events = orderHistory(state.events);\n }\n },\n clearEvents: state => {\n state.unreadEvents = 0;\n state.loadedImageEventIds = [];\n state.events = [];\n },\n setEventsRead: (state, {\n payload\n }) => {\n state.unreadEvents = 0;\n state.events.forEach(event => {\n if (payload.indexOf(event.payload.id) !== -1) {\n event.payload = Object.assign(Object.assign({}, event.payload), event.type !== 'service_data' && event.payload.messageStatus === ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.readStates.received && {\n messageStatus: ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.readStates.read\n });\n }\n return event;\n });\n },\n setLoadedImageEventIds: (state, {\n payload\n }) => {\n state.loadedImageEventIds.push(payload);\n },\n setHistory: (state, {\n payload: {\n events: history,\n participants,\n activeServiceSessionId,\n activeServiceSettings = {},\n serviceData,\n resumeConversationPrompt\n }\n }) => {\n var _a, _b, _c;\n const events = mergeHistory(state.events, history);\n const mergedParticipants = Object.assign(Object.assign({}, state.participantInfo.participants), participants);\n const lastParticipantEvent = events.slice().reverse().find(m => (m.type === 'message' || m.type === 'participant') && !m.payload.fromClient);\n let lastParticipantId = null;\n if (lastParticipantEvent) {\n if (lastParticipantEvent.type === 'message') {\n lastParticipantId = lastParticipantEvent.payload.participant;\n }\n if (lastParticipantEvent.type === 'participant') {\n lastParticipantId = lastParticipantEvent.payload.participant.id;\n }\n }\n const {\n entry\n } = activeServiceSettings;\n const upload = (_a = entry === null || entry === void 0 ? void 0 : entry.options) === null || _a === void 0 ? void 0 : _a.upload;\n const historyNewEntryMeta = calculateNewEntryMeta(Object.assign(Object.assign(Object.assign({}, state.entryMeta), entry), {\n active: (entry === null || entry === void 0 ? void 0 : entry.default) || ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.payloadTypes.text,\n options: Object.assign({}, (entry === null || entry === void 0 ? void 0 : entry.options) ? entry.options : {})\n }), events[events.length - 1]);\n let newFeatures = Object.assign({}, state.options.features);\n const newFeaturesHasUpload = newFeatures.hasOwnProperty(ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.featureKeys.uploads);\n // Only set uploads if it was initialised by the account config.\n if (newFeaturesHasUpload && (lastParticipantEvent === null || lastParticipantEvent === void 0 ? void 0 : lastParticipantEvent.type) === 'message') {\n const {\n payload: lastParticipantEventPayload\n } = lastParticipantEvent;\n const entryType = ((_b = lastParticipantEventPayload === null || lastParticipantEventPayload === void 0 ? void 0 : lastParticipantEventPayload.entry) === null || _b === void 0 ? void 0 : _b.type) || {};\n newFeatures = Object.assign(Object.assign({}, newFeatures), {\n uploads: {\n enabled: !!(upload && (upload === null || upload === void 0 ? void 0 : upload.enabled)),\n enabledFromEntry: entryType === ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.entryTypes.upload\n }\n });\n }\n state.unreadEvents = events.filter(event => event.type === 'message' && event.payload.messageStatus === ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.readStates.received).length;\n state.events = events.filter(e => e.type !== 'participant' || !!e.payload.participant.introduction);\n state.participantInfo = Object.assign(Object.assign(Object.assign({}, state.participantInfo), lastParticipantId ? participantReducer(state.participantInfo, {\n participant: mergedParticipants[lastParticipantId]\n }) : {}), {\n participants: mergedParticipants\n });\n state.historyLoaded = true;\n state.serviceInfo = Object.assign(Object.assign({}, state.serviceInfo), {\n activeServiceSessionId,\n proactiveMessages: ((_c = activeServiceSettings === null || activeServiceSettings === void 0 ? void 0 : activeServiceSettings.proactiveMessages) === null || _c === void 0 ? void 0 : _c.enabled) || false\n });\n state.serviceData = Object.assign(Object.assign({}, state.serviceData), serviceData);\n state.options = Object.assign(Object.assign({}, state.options), {\n features: newFeatures\n });\n state.entryMeta = !newFeaturesHasUpload && historyNewEntryMeta.active === ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.entryTypes.upload ? Object.assign({}, state.entryMeta) : historyNewEntryMeta;\n state.resumeConversationPrompt = resumeConversationPrompt || false;\n if (lastParticipantId) {\n state.headerTitles.subTitle = mergedParticipants[lastParticipantId].name;\n }\n },\n resetHistoryLoadedFlag: state => {\n state.historyLoaded = false;\n },\n setIsLoading: (state, {\n payload\n }) => {\n state.isLoading = payload;\n },\n initIdleDetachCountdown: (state, {\n payload\n }) => {\n const {\n delaySeconds,\n delayTime\n } = payload;\n state.idleDetachCountdown = {\n hasCountdown: true,\n isActive: true,\n wasStopped: false,\n count: delaySeconds,\n remaining: delaySeconds,\n timer: delayTime\n };\n },\n decrementIdleDetachCountdownCounter: state => {\n const {\n idleDetachCountdown\n } = state;\n const {\n remaining: prevRemaining\n } = idleDetachCountdown;\n const remaining = prevRemaining - 1;\n state.idleDetachCountdown.remaining = remaining;\n state.idleDetachCountdown.timer = (0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_0__.getTimeFromSeconds)(remaining);\n },\n stopIdleDetachCountdownCounter: state => {\n state.idleDetachCountdown.isActive = false;\n state.idleDetachCountdown.wasStopped = true;\n },\n clearIdleDetachCountdown: state => {\n state.idleDetachCountdown.hasCountdown = false;\n state.idleDetachCountdown.isActive = false;\n },\n initResumeConversationPrompt: state => {\n state.resumeConversationPrompt = true;\n },\n clearResumeConversationPrompt: state => {\n state.resumeConversationPrompt = false;\n },\n setParticipant: (state, {\n payload\n }) => {\n state.participantInfo = participantReducer(state.participantInfo, {\n participant: payload.participant,\n fromClient: payload.fromClient\n });\n },\n setActiveService: (state, {\n payload\n }) => {\n if (state.serviceInfo.activeServiceSessionId !== payload) {\n state.serviceInfo.activeServiceSessionId = payload;\n }\n },\n setHeaderTitle: (state, {\n payload\n }) => {\n state.headerTitles.title = payload;\n },\n setHeaderSubTitle: (state, {\n payload\n }) => {\n state.headerTitles.subTitle = payload;\n },\n setInitialState: (state, {\n payload\n }) => {\n state.initialState = payload.initialState;\n state.unreadEvents = initialStoreState.unreadEvents;\n },\n setServiceDataItem: (state, {\n payload\n }) => {\n state.serviceData[payload.type] = payload;\n },\n setFeatures: (state, {\n payload\n }) => {\n if (!payload.features) {\n return;\n }\n state.options.features = payload.features;\n },\n setFeatureEnabledState: (state, {\n payload\n }) => {\n if (!state.options.features.hasOwnProperty(payload.key)) {\n return;\n }\n state.options.features[payload.key].enabled = payload.enabled;\n },\n clearFeatures: state => {\n state.options.features = {\n webNotifications: state.options.features.webNotifications\n };\n },\n showOption: (state, {\n payload\n }) => {\n state.options.panelActive = true;\n state.options.optionActive = payload;\n },\n hideOption: state => {\n state.options.panelActive = false;\n state.options.optionActive = '';\n },\n setUserSelectedOptions: (state, {\n payload\n }) => {\n state.options.userSelectedOptions = payload;\n },\n setUserSelectedOption: (state, {\n payload\n }) => {\n const {\n option,\n value\n } = payload;\n state.options.userSelectedOptions[option] = value;\n },\n setBlockAutoEntrySwitch: (state, {\n payload\n }) => {\n state.entryMeta.blockAutoEntrySwitch = payload;\n },\n setServiceEntryMetadata: (state, {\n payload\n }) => {\n state.entryMeta.active = payload.default;\n state.entryMeta.options = payload.options || {};\n state.entryMeta.optionsOverride = {};\n state.entryMeta.actions = {};\n state.entryMeta.translatedActions = {};\n },\n setActiveEntryType: (state, {\n payload\n }) => {\n state.entryMeta.active = payload;\n },\n setUserEntryType: (state, {\n payload\n }) => {\n state.entryMeta.userSelected = payload;\n },\n clearAbortTransaction: state => {\n state.entryMeta.actions = {};\n state.entryMeta.translatedActions = {};\n },\n registerUpload: (state, {\n payload\n }) => {\n state.currentUploads.push({\n id: payload.fileId,\n name: payload.fileName,\n progress: 1,\n uploading: true,\n complete: false,\n error: '',\n uploadHandle: payload.uploadHandle\n });\n },\n setUploadProgress: (state, {\n payload\n }) => {\n state.currentUploads = state.currentUploads.map(fileUpload => {\n if (fileUpload.id === payload.fileId) {\n return Object.assign(Object.assign({}, fileUpload), {\n progress: payload.progress,\n uploading: payload.progress !== 100,\n uploadHandle: payload.progress === 100 ? null : fileUpload.uploadHandle\n });\n }\n return fileUpload;\n });\n },\n startProcessingImage: (state, {\n payload\n }) => {\n state.processingFileUploads.push(payload);\n },\n doneProcessingImage: (state, {\n payload\n }) => {\n state.processingFileUploads = state.processingFileUploads.filter(fileId => fileId !== payload);\n },\n setUploadError: (state, {\n payload\n }) => {\n state.currentUploads = state.currentUploads.map(fileUpload => {\n if (fileUpload.id === payload.fileId) {\n return Object.assign(Object.assign({}, fileUpload), {\n error: payload.errorText,\n progress: 0,\n uploading: false,\n uploadHandle: null\n });\n }\n return fileUpload;\n });\n },\n setUploadComplete: (state, {\n payload\n }) => {\n state.currentUploads = state.currentUploads.map(fileUpload => {\n if (fileUpload.id === payload) {\n return Object.assign(Object.assign({}, fileUpload), {\n complete: true\n });\n }\n return fileUpload;\n });\n },\n clearAllUploads: state => {\n state.currentUploads = [];\n },\n setSeamlyContainerElement: (state, {\n payload\n }) => {\n state.seamlyContainerElement = payload;\n },\n setProactiveMessages: (state, {\n payload\n }) => {\n state.serviceInfo.proactiveMessages = payload;\n }\n },\n extraReducers: builder => {\n builder.addCase(domains_app_actions__WEBPACK_IMPORTED_MODULE_2__.resetApp.pending, () => initialStoreState).addCase(domains_app_actions__WEBPACK_IMPORTED_MODULE_2__.initializeApp.pending, state => {\n state.isLoading = true;\n }).addCase(domains_config_actions__WEBPACK_IMPORTED_MODULE_3__.initializeConfig.fulfilled, (state, {\n payload\n }) => {\n var _a;\n state.headerTitles.subTitle = (_a = payload.agentParticipant) === null || _a === void 0 ? void 0 : _a.name;\n if (!payload.features) return;\n state.options.features = payload.features;\n }).addCase(domains_app_actions__WEBPACK_IMPORTED_MODULE_2__.initializeApp.fulfilled, (state, {\n payload\n }) => {\n if (!payload.initialState) return;\n state.isLoading = false;\n state.initialState = payload.initialState;\n }).addMatcher((0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_5__.isAnyOf)(initIdleDetachCountdown, initResumeConversationPrompt), state => {\n state.isLastEventFromClient = false;\n });\n }\n});\nconst {\n ackEvent,\n addEvent,\n clearAllUploads,\n clearEvents,\n clearFeatures,\n clearIdleDetachCountdown,\n clearResumeConversationPrompt,\n decrementIdleDetachCountdownCounter,\n hideOption,\n initIdleDetachCountdown,\n initResumeConversationPrompt,\n registerUpload,\n resetHistoryLoadedFlag,\n setActiveEntryType,\n setActiveService,\n setBlockAutoEntrySwitch,\n setEventsRead,\n setFeatureEnabledState,\n setFeatures,\n setHeaderSubTitle,\n setHeaderTitle,\n setHistory,\n setInitialState,\n setIsLoading,\n setLoadedImageEventIds,\n setParticipant,\n setSeamlyContainerElement,\n setServiceDataItem,\n setServiceEntryMetadata,\n clearAbortTransaction,\n setUploadComplete,\n setUploadError,\n setUploadProgress,\n startProcessingImage,\n doneProcessingImage,\n setUserEntryType,\n setUserSelectedOption,\n setUserSelectedOptions,\n showOption,\n stopIdleDetachCountdownCounter,\n setProactiveMessages\n} = storeSlice.actions;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (storeSlice.reducer);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/store/slice.ts?");
|
|
412
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ackEvent: () => (/* binding */ ackEvent),\n/* harmony export */ addEvent: () => (/* binding */ addEvent),\n/* harmony export */ clearAbortTransaction: () => (/* binding */ clearAbortTransaction),\n/* harmony export */ clearAllUploads: () => (/* binding */ clearAllUploads),\n/* harmony export */ clearEvents: () => (/* binding */ clearEvents),\n/* harmony export */ clearFeatures: () => (/* binding */ clearFeatures),\n/* harmony export */ clearIdleDetachCountdown: () => (/* binding */ clearIdleDetachCountdown),\n/* harmony export */ clearResumeConversationPrompt: () => (/* binding */ clearResumeConversationPrompt),\n/* harmony export */ decrementIdleDetachCountdownCounter: () => (/* binding */ decrementIdleDetachCountdownCounter),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ doneProcessingImage: () => (/* binding */ doneProcessingImage),\n/* harmony export */ hideOption: () => (/* binding */ hideOption),\n/* harmony export */ initIdleDetachCountdown: () => (/* binding */ initIdleDetachCountdown),\n/* harmony export */ initResumeConversationPrompt: () => (/* binding */ initResumeConversationPrompt),\n/* harmony export */ initialStoreState: () => (/* binding */ initialStoreState),\n/* harmony export */ isUnreadMessage: () => (/* binding */ isUnreadMessage),\n/* harmony export */ mergeHistory: () => (/* binding */ mergeHistory),\n/* harmony export */ orderHistory: () => (/* binding */ orderHistory),\n/* harmony export */ registerUpload: () => (/* binding */ registerUpload),\n/* harmony export */ resetHistoryLoadedFlag: () => (/* binding */ resetHistoryLoadedFlag),\n/* harmony export */ setActiveEntryType: () => (/* binding */ setActiveEntryType),\n/* harmony export */ setActiveService: () => (/* binding */ setActiveService),\n/* harmony export */ setBlockAutoEntrySwitch: () => (/* binding */ setBlockAutoEntrySwitch),\n/* harmony export */ setEventsRead: () => (/* binding */ setEventsRead),\n/* harmony export */ setFeatureEnabledState: () => (/* binding */ setFeatureEnabledState),\n/* harmony export */ setFeatures: () => (/* binding */ setFeatures),\n/* harmony export */ setHeaderSubTitle: () => (/* binding */ setHeaderSubTitle),\n/* harmony export */ setHeaderTitle: () => (/* binding */ setHeaderTitle),\n/* harmony export */ setHistory: () => (/* binding */ setHistory),\n/* harmony export */ setInitialState: () => (/* binding */ setInitialState),\n/* harmony export */ setIsLoading: () => (/* binding */ setIsLoading),\n/* harmony export */ setLoadedImageEventIds: () => (/* binding */ setLoadedImageEventIds),\n/* harmony export */ setParticipant: () => (/* binding */ setParticipant),\n/* harmony export */ setProactiveMessages: () => (/* binding */ setProactiveMessages),\n/* harmony export */ setSeamlyContainerElement: () => (/* binding */ setSeamlyContainerElement),\n/* harmony export */ setServiceDataItem: () => (/* binding */ setServiceDataItem),\n/* harmony export */ setServiceEntryMetadata: () => (/* binding */ setServiceEntryMetadata),\n/* harmony export */ setUploadComplete: () => (/* binding */ setUploadComplete),\n/* harmony export */ setUploadError: () => (/* binding */ setUploadError),\n/* harmony export */ setUploadProgress: () => (/* binding */ setUploadProgress),\n/* harmony export */ setUserEntryType: () => (/* binding */ setUserEntryType),\n/* harmony export */ setUserSelectedOption: () => (/* binding */ setUserSelectedOption),\n/* harmony export */ setUserSelectedOptions: () => (/* binding */ setUserSelectedOptions),\n/* harmony export */ showOption: () => (/* binding */ showOption),\n/* harmony export */ startProcessingImage: () => (/* binding */ startProcessingImage),\n/* harmony export */ stopIdleDetachCountdownCounter: () => (/* binding */ stopIdleDetachCountdownCounter),\n/* harmony export */ storeSlice: () => (/* binding */ storeSlice)\n/* harmony export */ });\n/* harmony import */ var _reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @reduxjs/toolkit */ \"./node_modules/@reduxjs/toolkit/dist/redux-toolkit.esm.js\");\n/* harmony import */ var ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ui/utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.ts\");\n/* harmony import */ var domains_app_actions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/app/actions */ \"./src/javascripts/domains/app/actions.ts\");\n/* harmony import */ var domains_config_actions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! domains/config/actions */ \"./src/javascripts/domains/config/actions.ts\");\n/* harmony import */ var lib_id__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lib/id */ \"./src/javascripts/lib/id.js\");\n\n\n\n\n\n\nconst isUnreadMessage = ({\n type,\n payload\n}) => document.visibilityState === 'hidden' || type === ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.eventTypes.message && !payload.fromClient || type === ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.eventTypes.info && payload.type === ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.payloadTypes.text;\nconst orderHistory = events => {\n return events.sort(({\n payload: {\n occurredAt: occurredAtA\n }\n }, {\n payload: {\n occurredAt: occurredAtB\n }\n }) => occurredAtA - occurredAtB);\n};\nconst mergeHistory = (stateEvents, historyEvents) => {\n const newStateEvents = stateEvents.filter(stateEvent => stateEvent.type === 'message' && !stateEvent.payload.optimisticallyInjected &&\n // Deduplicate the event streams, giving events in historyEvents\n // precedence so the server is able to push changes to events.\n !historyEvents.some(historyEvent => historyEvent.payload.id === stateEvent.payload.id));\n const newHistoryEvents = historyEvents.filter(historyEvent =>\n // Remove all non displayable participant messages\n !(historyEvent.type === 'participant' && !historyEvent.payload.participant.introduction))\n // Reverse is done here because the server sends the history in the order\n // newest to oldest. In the case of exactly the same occurredAt timestamps\n // these messages will be shown in the wrong order if not reversed. For\n // the normal merging logic there is no added effect.\n .reverse();\n return orderHistory([...newHistoryEvents, ...newStateEvents]);\n};\nconst participantReducer = (participantInfo, action) => {\n // TODO: a) Styleguide only! b) Should be removed after styleguide overhaul.\n if (!participantInfo) {\n return {\n participants: {},\n currentAgent: ''\n };\n }\n const {\n participants\n } = participantInfo || {\n participants: {}\n };\n const {\n id,\n avatar,\n name,\n introduction\n } = action.participant;\n const oldParticipant = participants[id];\n const newParticipants = Object.assign(Object.assign({}, participants), {\n [id]: oldParticipant ? Object.assign(Object.assign(Object.assign(Object.assign({}, oldParticipant), avatar ? {\n avatar\n } : {}), name ? {\n name\n } : {}), introduction ? {\n introduction\n } : {}) : action.participant\n });\n return Object.assign(Object.assign({}, participantInfo), {\n participants: newParticipants,\n currentAgent: participantInfo.currentAgent !== id && !action.fromClient ? id : participantInfo.currentAgent\n });\n};\nconst calculateNewEntryMeta = (entryMeta, channelEvent) => {\n var _a, _b;\n const entry = (channelEvent === null || channelEvent === void 0 ? void 0 : channelEvent.type) === 'message' ? (channelEvent === null || channelEvent === void 0 ? void 0 : channelEvent.payload.translatedEntry) || (channelEvent === null || channelEvent === void 0 ? void 0 : channelEvent.payload.entry) : {};\n const {\n blockAutoEntrySwitch\n } = entryMeta;\n const actions = ((_a = channelEvent === null || channelEvent === void 0 ? void 0 : channelEvent.payload) === null || _a === void 0 ? void 0 : _a.actions) || {};\n const translatedActions = ((_b = channelEvent === null || channelEvent === void 0 ? void 0 : channelEvent.payload) === null || _b === void 0 ? void 0 : _b.translatedActions) || {};\n if (!entry) {\n return Object.assign(Object.assign({}, entryMeta), {\n optionsOverride: {},\n actions,\n translatedActions\n });\n }\n const {\n type,\n options\n } = entry;\n let newActive = entryMeta.active;\n if (!blockAutoEntrySwitch && type !== entryMeta.userSelected) {\n newActive = type;\n }\n return Object.assign(Object.assign({}, entryMeta), {\n active: newActive,\n optionsOverride: Object.assign(Object.assign({}, entryMeta.optionsOverride), {\n [type]: options || {}\n }),\n actions,\n translatedActions\n });\n};\nconst initialStoreState = {\n events: [],\n isLastEventFromClient: false,\n initialState: {\n userResponded: false\n },\n unreadEvents: 0,\n userHasResponded: false,\n loadedImageEventIds: [],\n isLoading: false,\n idleDetachCountdown: {\n hasCountdown: false,\n isActive: false,\n remaining: undefined,\n wasStopped: undefined,\n count: undefined,\n timer: undefined\n },\n resumeConversationPrompt: false,\n serviceInfo: {\n activeServiceSessionId: '',\n proactiveMessages: false\n },\n participantInfo: {\n participants: {},\n currentAgent: ''\n },\n headerTitles: {\n title: null,\n subTitle: ''\n },\n historyLoaded: false,\n skiplinkTargetId: (0,lib_id__WEBPACK_IMPORTED_MODULE_4__.randomId)(),\n optionsButtonId: (0,lib_id__WEBPACK_IMPORTED_MODULE_4__.randomId)(),\n headerCollapseButtonId: (0,lib_id__WEBPACK_IMPORTED_MODULE_4__.randomId)(),\n serviceData: {},\n options: {\n features: {\n webNotifications: {\n enabled: false\n }\n },\n panelActive: false,\n optionActive: '',\n userSelectedOptions: {}\n },\n showFileUpload: false,\n currentUploads: [],\n processingFileUploads: [],\n entryMeta: {\n default: ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.entryTypes.text,\n active: ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.entryTypes.text,\n userSelected: null,\n blockAutoEntrySwitch: false,\n options: {},\n optionsOverride: {},\n actions: {},\n translatedActions: {}\n },\n seamlyContainerElement: null\n};\nconst storeSlice = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_5__.createSlice)({\n name: 'store',\n initialState: initialStoreState,\n reducers: {\n addEvent: (state, action) => {\n var _a, _b;\n const {\n type: eventType,\n payload\n } = action.payload;\n const accountHasUploads = state.options.features.hasOwnProperty(ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.featureKeys.uploads);\n let newOptions = Object.assign({}, state.options);\n // This enabled override of the service enabled value for uploads.\n // If a message is sent with entry of type upload it will temporarily\n // override service value and enable uploads.\n if (accountHasUploads && (eventType === ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.eventTypes.message || eventType === ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.eventTypes.participant) && !payload.fromClient) {\n const entryType = eventType === 'message' ? (_a = payload.entry) === null || _a === void 0 ? void 0 : _a.type : {};\n newOptions = Object.assign(Object.assign({}, newOptions), {\n features: Object.assign(Object.assign({}, newOptions.features), {\n uploads: Object.assign(Object.assign({}, (_b = newOptions.features) === null || _b === void 0 ? void 0 : _b.uploads), {\n enabledFromEntry: entryType === ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.entryTypes.upload\n })\n })\n });\n }\n const incrementUnread = isUnreadMessage(action.payload);\n // We check for duplicated and ignore them as in some error of the websocket\n // a duplicate join can be active for a while until the server connection\n // times out.\n const eventExists = state.events.find(e => e.payload.id === payload.id);\n if (eventExists) {\n return;\n }\n const newEntryMeta = calculateNewEntryMeta(state.entryMeta, action.payload);\n state.entryMeta = !accountHasUploads && newEntryMeta.active === ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.entryTypes.upload ? Object.assign({}, state.entryMeta) : newEntryMeta;\n state.options = newOptions;\n if (incrementUnread) {\n state.unreadEvents += 1;\n if (eventType !== 'service_data') {\n action.payload.payload.messageStatus = payload.fromClient ? ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.readStates.read : ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.readStates.received;\n }\n }\n action.payload.payload.key = (0,lib_id__WEBPACK_IMPORTED_MODULE_4__.randomId)();\n state.events.push(action.payload);\n state.isLastEventFromClient = payload.fromClient;\n },\n ackEvent: (state, {\n payload: {\n payload\n }\n }) => {\n // If any ACKs are sent without transactionID the conversation crashes.\n // Ensure that this edge case is handled gracefully.\n if (!payload.transactionId) {\n console.warn('ACK received without transaction ID.');\n return;\n }\n const matchedEvent = state.events.find(m => m.payload.transactionId === payload.transactionId && (!payload.type || m.type === payload.type));\n const {\n id,\n occurredAt\n } = payload;\n if (matchedEvent) {\n matchedEvent.payload.id = id;\n matchedEvent.payload.occurredAt = occurredAt;\n state.events = orderHistory(state.events);\n }\n },\n clearEvents: state => {\n state.unreadEvents = 0;\n state.loadedImageEventIds = [];\n state.events = [];\n },\n setEventsRead: (state, {\n payload\n }) => {\n state.unreadEvents = 0;\n state.events.forEach(event => {\n if (payload.indexOf(event.payload.id) !== -1) {\n event.payload = Object.assign(Object.assign({}, event.payload), event.type !== 'service_data' && event.payload.messageStatus === ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.readStates.received && {\n messageStatus: ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.readStates.read\n });\n }\n return event;\n });\n },\n setLoadedImageEventIds: (state, {\n payload\n }) => {\n state.loadedImageEventIds.push(payload);\n },\n setHistory: (state, {\n payload: {\n events: history,\n participants,\n activeServiceSessionId,\n activeServiceSettings = {},\n serviceData,\n resumeConversationPrompt\n }\n }) => {\n var _a, _b, _c;\n const events = mergeHistory(state.events, history);\n const mergedParticipants = Object.assign(Object.assign({}, state.participantInfo.participants), participants);\n const lastParticipantEvent = events.slice().reverse().find(m => (m.type === 'message' || m.type === 'participant') && !m.payload.fromClient);\n let lastParticipantId = null;\n if (lastParticipantEvent) {\n if (lastParticipantEvent.type === 'message') {\n lastParticipantId = lastParticipantEvent.payload.participant;\n }\n if (lastParticipantEvent.type === 'participant') {\n lastParticipantId = lastParticipantEvent.payload.participant.id;\n }\n }\n const {\n entry\n } = activeServiceSettings;\n const upload = (_a = entry === null || entry === void 0 ? void 0 : entry.options) === null || _a === void 0 ? void 0 : _a.upload;\n const historyNewEntryMeta = calculateNewEntryMeta(Object.assign(Object.assign(Object.assign({}, state.entryMeta), entry), {\n active: (entry === null || entry === void 0 ? void 0 : entry.default) || ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.payloadTypes.text,\n options: Object.assign({}, (entry === null || entry === void 0 ? void 0 : entry.options) ? entry.options : {})\n }), events[events.length - 1]);\n let newFeatures = Object.assign({}, state.options.features);\n const newFeaturesHasUpload = newFeatures.hasOwnProperty(ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.featureKeys.uploads);\n // Only set uploads if it was initialised by the account config.\n if (newFeaturesHasUpload && (lastParticipantEvent === null || lastParticipantEvent === void 0 ? void 0 : lastParticipantEvent.type) === 'message') {\n const {\n payload: lastParticipantEventPayload\n } = lastParticipantEvent;\n const entryType = ((_b = lastParticipantEventPayload === null || lastParticipantEventPayload === void 0 ? void 0 : lastParticipantEventPayload.entry) === null || _b === void 0 ? void 0 : _b.type) || {};\n newFeatures = Object.assign(Object.assign({}, newFeatures), {\n uploads: {\n enabled: !!(upload && (upload === null || upload === void 0 ? void 0 : upload.enabled)),\n enabledFromEntry: entryType === ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.entryTypes.upload\n }\n });\n }\n state.unreadEvents = events.filter(event => event.type === 'message' && event.payload.messageStatus === ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.readStates.received).length;\n state.events = events.filter(e => e.type !== 'participant' || !!e.payload.participant.introduction);\n state.participantInfo = Object.assign(Object.assign(Object.assign({}, state.participantInfo), lastParticipantId ? participantReducer(state.participantInfo, {\n participant: mergedParticipants[lastParticipantId]\n }) : {}), {\n participants: mergedParticipants\n });\n state.historyLoaded = true;\n state.serviceInfo = Object.assign(Object.assign({}, state.serviceInfo), {\n activeServiceSessionId,\n proactiveMessages: ((_c = activeServiceSettings === null || activeServiceSettings === void 0 ? void 0 : activeServiceSettings.proactiveMessages) === null || _c === void 0 ? void 0 : _c.enabled) || false\n });\n state.serviceData = Object.assign(Object.assign({}, state.serviceData), serviceData);\n state.options = Object.assign(Object.assign({}, state.options), {\n features: newFeatures\n });\n state.entryMeta = !newFeaturesHasUpload && historyNewEntryMeta.active === ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.entryTypes.upload ? Object.assign({}, state.entryMeta) : historyNewEntryMeta;\n state.resumeConversationPrompt = resumeConversationPrompt || false;\n if (lastParticipantId) {\n state.headerTitles.subTitle = mergedParticipants[lastParticipantId].name;\n }\n },\n resetHistoryLoadedFlag: state => {\n state.historyLoaded = false;\n },\n setIsLoading: (state, {\n payload\n }) => {\n state.isLoading = payload;\n },\n initIdleDetachCountdown: (state, {\n payload\n }) => {\n const {\n delaySeconds,\n delayTime\n } = payload;\n state.idleDetachCountdown = {\n hasCountdown: true,\n isActive: true,\n wasStopped: false,\n count: delaySeconds,\n remaining: delaySeconds,\n timer: delayTime\n };\n },\n decrementIdleDetachCountdownCounter: state => {\n const {\n idleDetachCountdown\n } = state;\n const {\n remaining: prevRemaining\n } = idleDetachCountdown;\n const remaining = prevRemaining - 1;\n state.idleDetachCountdown.remaining = remaining;\n state.idleDetachCountdown.timer = (0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_0__.getTimeFromSeconds)(remaining);\n },\n stopIdleDetachCountdownCounter: state => {\n state.idleDetachCountdown.isActive = false;\n state.idleDetachCountdown.wasStopped = true;\n },\n clearIdleDetachCountdown: state => {\n state.idleDetachCountdown.hasCountdown = false;\n state.idleDetachCountdown.isActive = false;\n },\n initResumeConversationPrompt: state => {\n state.resumeConversationPrompt = true;\n },\n clearResumeConversationPrompt: state => {\n state.resumeConversationPrompt = false;\n },\n setParticipant: (state, {\n payload\n }) => {\n state.participantInfo = participantReducer(state.participantInfo, {\n participant: payload.participant,\n fromClient: payload.fromClient\n });\n },\n setActiveService: (state, {\n payload\n }) => {\n if (state.serviceInfo.activeServiceSessionId !== payload) {\n state.serviceInfo.activeServiceSessionId = payload;\n }\n },\n setHeaderTitle: (state, {\n payload\n }) => {\n state.headerTitles.title = payload;\n },\n setHeaderSubTitle: (state, {\n payload\n }) => {\n state.headerTitles.subTitle = payload;\n },\n setInitialState: (state, {\n payload\n }) => {\n state.initialState = payload.initialState;\n state.unreadEvents = initialStoreState.unreadEvents;\n },\n setServiceDataItem: (state, {\n payload\n }) => {\n state.serviceData[payload.type] = payload;\n },\n setFeatures: (state, {\n payload\n }) => {\n if (!payload.features) {\n return;\n }\n state.options.features = payload.features;\n },\n setFeatureEnabledState: (state, {\n payload\n }) => {\n if (!state.options.features.hasOwnProperty(payload.key)) {\n return;\n }\n state.options.features[payload.key].enabled = payload.enabled;\n },\n clearFeatures: state => {\n state.options.features = {\n webNotifications: state.options.features.webNotifications\n };\n },\n showOption: (state, {\n payload\n }) => {\n state.options.panelActive = true;\n state.options.optionActive = payload;\n },\n hideOption: state => {\n state.options.panelActive = false;\n state.options.optionActive = '';\n },\n setUserSelectedOptions: (state, {\n payload\n }) => {\n state.options.userSelectedOptions = payload;\n },\n setUserSelectedOption: (state, {\n payload\n }) => {\n const {\n option,\n value\n } = payload;\n state.options.userSelectedOptions[option] = value;\n },\n setBlockAutoEntrySwitch: (state, {\n payload\n }) => {\n state.entryMeta.blockAutoEntrySwitch = payload;\n },\n setServiceEntryMetadata: (state, {\n payload\n }) => {\n state.entryMeta.active = payload.default;\n state.entryMeta.options = payload.options || {};\n state.entryMeta.optionsOverride = {};\n state.entryMeta.actions = {};\n state.entryMeta.translatedActions = {};\n },\n setActiveEntryType: (state, {\n payload\n }) => {\n state.entryMeta.active = payload;\n },\n setUserEntryType: (state, {\n payload\n }) => {\n state.entryMeta.userSelected = payload;\n },\n clearAbortTransaction: state => {\n state.entryMeta.actions = {};\n state.entryMeta.translatedActions = {};\n },\n registerUpload: (state, {\n payload\n }) => {\n state.currentUploads.push({\n id: payload.fileId,\n name: payload.fileName,\n progress: 1,\n uploading: true,\n complete: false,\n error: '',\n uploadHandle: payload.uploadHandle\n });\n },\n setUploadProgress: (state, {\n payload\n }) => {\n state.currentUploads = state.currentUploads.map(fileUpload => {\n if (fileUpload.id === payload.fileId) {\n return Object.assign(Object.assign({}, fileUpload), {\n progress: payload.progress,\n uploading: payload.progress !== 100,\n uploadHandle: payload.progress === 100 ? null : fileUpload.uploadHandle\n });\n }\n return fileUpload;\n });\n },\n startProcessingImage: (state, {\n payload\n }) => {\n state.processingFileUploads.push(payload);\n },\n doneProcessingImage: (state, {\n payload\n }) => {\n state.processingFileUploads = state.processingFileUploads.filter(fileId => fileId !== payload);\n },\n setUploadError: (state, {\n payload\n }) => {\n state.currentUploads = state.currentUploads.map(fileUpload => {\n if (fileUpload.id === payload.fileId) {\n return Object.assign(Object.assign({}, fileUpload), {\n error: payload.errorText,\n progress: 0,\n uploading: false,\n uploadHandle: null\n });\n }\n return fileUpload;\n });\n },\n setUploadComplete: (state, {\n payload\n }) => {\n state.currentUploads = state.currentUploads.map(fileUpload => {\n if (fileUpload.id === payload) {\n return Object.assign(Object.assign({}, fileUpload), {\n complete: true\n });\n }\n return fileUpload;\n });\n },\n clearAllUploads: state => {\n state.currentUploads = [];\n },\n setSeamlyContainerElement: (state, {\n payload\n }) => {\n state.seamlyContainerElement = payload;\n },\n setProactiveMessages: (state, {\n payload\n }) => {\n state.serviceInfo.proactiveMessages = payload;\n }\n },\n extraReducers: builder => {\n builder.addCase(domains_app_actions__WEBPACK_IMPORTED_MODULE_2__.resetApp.pending, () => initialStoreState).addCase(domains_app_actions__WEBPACK_IMPORTED_MODULE_2__.initializeApp.pending, state => {\n state.isLoading = true;\n }).addCase(domains_config_actions__WEBPACK_IMPORTED_MODULE_3__.initializeConfig.fulfilled, (state, {\n payload\n }) => {\n var _a;\n state.headerTitles.subTitle = (_a = payload.agentParticipant) === null || _a === void 0 ? void 0 : _a.name;\n if (!payload.features) return;\n state.options.features = payload.features;\n }).addCase(domains_app_actions__WEBPACK_IMPORTED_MODULE_2__.initializeApp.fulfilled, (state, {\n payload\n }) => {\n state.isLoading = false;\n if (!payload.initialState) return;\n state.initialState = payload.initialState;\n }).addMatcher((0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_5__.isAnyOf)(initIdleDetachCountdown, initResumeConversationPrompt), state => {\n state.isLastEventFromClient = false;\n });\n }\n});\nconst {\n ackEvent,\n addEvent,\n clearAllUploads,\n clearEvents,\n clearFeatures,\n clearIdleDetachCountdown,\n clearResumeConversationPrompt,\n decrementIdleDetachCountdownCounter,\n hideOption,\n initIdleDetachCountdown,\n initResumeConversationPrompt,\n registerUpload,\n resetHistoryLoadedFlag,\n setActiveEntryType,\n setActiveService,\n setBlockAutoEntrySwitch,\n setEventsRead,\n setFeatureEnabledState,\n setFeatures,\n setHeaderSubTitle,\n setHeaderTitle,\n setHistory,\n setInitialState,\n setIsLoading,\n setLoadedImageEventIds,\n setParticipant,\n setSeamlyContainerElement,\n setServiceDataItem,\n setServiceEntryMetadata,\n clearAbortTransaction,\n setUploadComplete,\n setUploadError,\n setUploadProgress,\n startProcessingImage,\n doneProcessingImage,\n setUserEntryType,\n setUserSelectedOption,\n setUserSelectedOptions,\n showOption,\n stopIdleDetachCountdownCounter,\n setProactiveMessages\n} = storeSlice.actions;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (storeSlice.reducer);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/store/slice.ts?");
|
|
413
413
|
|
|
414
414
|
/***/ }),
|
|
415
415
|
|