@seamly/web-ui 22.2.0 → 22.3.0-beta.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.
Files changed (47) hide show
  1. package/build/dist/lib/components.js +269 -138
  2. package/build/dist/lib/components.js.map +1 -1
  3. package/build/dist/lib/components.min.js +1 -1
  4. package/build/dist/lib/components.min.js.map +1 -1
  5. package/build/dist/lib/hooks.js +217 -41
  6. package/build/dist/lib/hooks.js.map +1 -1
  7. package/build/dist/lib/hooks.min.js +1 -1
  8. package/build/dist/lib/hooks.min.js.map +1 -1
  9. package/build/dist/lib/index.debug.js +43 -21
  10. package/build/dist/lib/index.debug.js.map +1 -1
  11. package/build/dist/lib/index.debug.min.js +1 -1
  12. package/build/dist/lib/index.debug.min.js.LICENSE.txt +12 -4
  13. package/build/dist/lib/index.debug.min.js.map +1 -1
  14. package/build/dist/lib/index.js +257 -133
  15. package/build/dist/lib/index.js.map +1 -1
  16. package/build/dist/lib/index.min.js +1 -1
  17. package/build/dist/lib/index.min.js.map +1 -1
  18. package/build/dist/lib/standalone.js +265 -133
  19. package/build/dist/lib/standalone.js.map +1 -1
  20. package/build/dist/lib/standalone.min.js +1 -1
  21. package/build/dist/lib/standalone.min.js.map +1 -1
  22. package/build/dist/lib/style-guide.js +274 -134
  23. package/build/dist/lib/style-guide.js.map +1 -1
  24. package/build/dist/lib/style-guide.min.js +1 -1
  25. package/build/dist/lib/style-guide.min.js.map +1 -1
  26. package/build/dist/lib/styles.css +1 -1
  27. package/build/dist/lib/utils.js +325 -171
  28. package/build/dist/lib/utils.js.map +1 -1
  29. package/build/dist/lib/utils.min.js +1 -1
  30. package/build/dist/lib/utils.min.js.map +1 -1
  31. package/package.json +1 -1
  32. package/src/javascripts/api/errors/seamly-api-error.ts +0 -1
  33. package/src/javascripts/api/index.ts +16 -8
  34. package/src/javascripts/domains/app/actions.ts +8 -3
  35. package/src/javascripts/domains/interrupt/selectors.ts +3 -2
  36. package/src/javascripts/domains/interrupt/slice.ts +2 -0
  37. package/src/javascripts/domains/redux/create-debounced-async-thunk.ts +109 -0
  38. package/src/javascripts/domains/redux/redux.types.ts +2 -1
  39. package/src/javascripts/domains/store/actions.ts +38 -0
  40. package/src/javascripts/domains/visibility/actions.ts +4 -1
  41. package/src/javascripts/style-guide/states.js +18 -1
  42. package/src/javascripts/ui/components/conversation/event/{card-component.js → card-component.tsx} +6 -4
  43. package/src/javascripts/ui/components/conversation/event/event-participant.js +1 -1
  44. package/src/javascripts/ui/components/core/seamly-event-subscriber.ts +14 -30
  45. package/src/javascripts/ui/components/view/window-view/window-open-button.js +8 -3
  46. package/src/javascripts/ui/hooks/use-session-expired-command.ts +31 -2
  47. package/src/stylesheets/5-components/_message-count.scss +11 -9
@@ -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 return this.store.get('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 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 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 return this.store.get('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 // The `channelName` fallback is needed for seamless client upgrades.\n // TODO: Remove when all clients have been upgraded past v20.\n return this.store.get('channelTopic') || this.store.get('channelName');\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.2.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.0-beta.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
 
@@ -134,7 +134,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
134
134
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
135
135
 
136
136
  "use strict";
137
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ initializeApp: () => (/* binding */ initializeApp),\n/* harmony export */ resetApp: () => (/* binding */ resetApp)\n/* harmony export */ });\n/* harmony import */ var _reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @reduxjs/toolkit */ \"./node_modules/@reduxjs/toolkit/dist/redux-toolkit.esm.js\");\n/* harmony import */ var api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! api/errors/seamly-session-expired-error */ \"./src/javascripts/api/errors/seamly-session-expired-error.js\");\n/* harmony import */ var api_errors_seamly_unavailable_error__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! api/errors/seamly-unavailable-error */ \"./src/javascripts/api/errors/seamly-unavailable-error.js\");\n/* harmony import */ var ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.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 domains_i18n_actions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! domains/i18n/actions */ \"./src/javascripts/domains/i18n/actions.ts\");\n/* harmony import */ var domains_visibility_actions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! domains/visibility/actions */ \"./src/javascripts/domains/visibility/actions.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};\n\n\n\n\n\n\n\nconst initializeApp = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_6__.createAsyncThunk)('initializeApp', (_, {\n extra: {\n api,\n config\n },\n rejectWithValue\n}) => __awaiter(void 0, void 0, void 0, function* () {\n var _a, _b, _c, _d;\n let locale = (_a = config === null || config === void 0 ? void 0 : config.context) === null || _a === void 0 ? void 0 : _a.locale;\n try {\n if (api.hasConversation()) {\n const initialState = yield api.getConversationIntitialState();\n locale = ((_b = initialState.translation) === null || _b === void 0 ? void 0 : _b.locale) || locale;\n return {\n initialState,\n locale,\n config\n };\n } else {\n if ((_c = config === null || config === void 0 ? void 0 : config.context) === null || _c === void 0 ? void 0 : _c.topic) {\n api.send('action', {\n type: ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__.actionTypes.setTopic,\n body: {\n name: config.context.topic,\n // Separate fallback message is not needed here. Only an attached service will use this, but none will\n // be attached before the conversation has started (meaning the fallback message will never be shown).\n fallbackMessage: config.context.topic\n }\n });\n }\n if ((_d = config === null || config === void 0 ? void 0 : config.context) === null || _d === void 0 ? void 0 : _d.translationLocale) {\n locale = config.context.translationLocale;\n api.send('action', {\n type: ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__.actionTypes.setTranslation,\n body: {\n enabled: true,\n locale\n }\n }, false);\n }\n return {\n initialState: undefined,\n locale,\n config\n };\n }\n } catch (e) {\n if (e instanceof api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_0__[\"default\"]) {\n const err = new api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_0__[\"default\"]();\n return rejectWithValue({\n name: err.name,\n message: err.message,\n originalEvent: err.originalEvent,\n originalError: err.originalError,\n action: err.action\n });\n }\n const err = new api_errors_seamly_unavailable_error__WEBPACK_IMPORTED_MODULE_1__[\"default\"]();\n return rejectWithValue({\n name: err.name,\n message: err.message,\n langKey: err.langKey\n });\n }\n}));\nconst resetApp = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_6__.createAsyncThunk)('resetApp', (_, {\n dispatch,\n extra: {\n api\n }\n}) => __awaiter(void 0, void 0, void 0, function* () {\n yield api.disconnect();\n yield api.clearStore();\n dispatch((0,domains_config_actions__WEBPACK_IMPORTED_MODULE_3__.resetConfig)());\n yield dispatch((0,domains_config_actions__WEBPACK_IMPORTED_MODULE_3__.initializeConfig)());\n try {\n const {\n locale\n } = yield dispatch(initializeApp()).unwrap();\n yield dispatch((0,domains_i18n_actions__WEBPACK_IMPORTED_MODULE_4__.setLocale)(locale));\n } catch (rejectedValueOrSerializedError) {\n // nothing to do\n }\n dispatch((0,domains_visibility_actions__WEBPACK_IMPORTED_MODULE_5__.initializeVisibility)());\n}));\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/app/actions.ts?");
137
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ initializeApp: () => (/* binding */ initializeApp),\n/* harmony export */ resetApp: () => (/* binding */ resetApp)\n/* harmony export */ });\n/* harmony import */ var _reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @reduxjs/toolkit */ \"./node_modules/@reduxjs/toolkit/dist/redux-toolkit.esm.js\");\n/* harmony import */ var api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! api/errors/seamly-session-expired-error */ \"./src/javascripts/api/errors/seamly-session-expired-error.js\");\n/* harmony import */ var api_errors_seamly_unavailable_error__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! api/errors/seamly-unavailable-error */ \"./src/javascripts/api/errors/seamly-unavailable-error.js\");\n/* harmony import */ var ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.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 domains_i18n_actions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! domains/i18n/actions */ \"./src/javascripts/domains/i18n/actions.ts\");\n/* harmony import */ var domains_redux_create_debounced_async_thunk__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! domains/redux/create-debounced-async-thunk */ \"./src/javascripts/domains/redux/create-debounced-async-thunk.ts\");\n/* harmony import */ var domains_visibility_actions__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! domains/visibility/actions */ \"./src/javascripts/domains/visibility/actions.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};\n\n\n\n\n\n\n\n\nconst initializeApp = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_7__.createAsyncThunk)('initializeApp', (_, {\n extra: {\n api,\n config\n },\n rejectWithValue\n}) => __awaiter(void 0, void 0, void 0, function* () {\n var _a, _b, _c, _d;\n let locale = (_a = config === null || config === void 0 ? void 0 : config.context) === null || _a === void 0 ? void 0 : _a.locale;\n try {\n if (api.hasConversation()) {\n const initialState = yield api.getConversationIntitialState();\n locale = ((_b = initialState.translation) === null || _b === void 0 ? void 0 : _b.locale) || locale;\n return {\n initialState,\n locale,\n config\n };\n } else {\n if ((_c = config === null || config === void 0 ? void 0 : config.context) === null || _c === void 0 ? void 0 : _c.topic) {\n api.send('action', {\n type: ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__.actionTypes.setTopic,\n body: {\n name: config.context.topic,\n // Separate fallback message is not needed here. Only an attached service will use this, but none will\n // be attached before the conversation has started (meaning the fallback message will never be shown).\n fallbackMessage: config.context.topic\n }\n });\n }\n if ((_d = config === null || config === void 0 ? void 0 : config.context) === null || _d === void 0 ? void 0 : _d.translationLocale) {\n locale = config.context.translationLocale;\n api.send('action', {\n type: ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__.actionTypes.setTranslation,\n body: {\n enabled: true,\n locale\n }\n }, false);\n }\n return {\n initialState: undefined,\n locale,\n config\n };\n }\n } catch (e) {\n if (e instanceof api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_0__[\"default\"]) {\n const err = new api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_0__[\"default\"]();\n return rejectWithValue({\n name: err.name,\n message: err.message,\n originalEvent: err.originalEvent,\n originalError: err.originalError,\n action: err.action\n });\n }\n const err = new api_errors_seamly_unavailable_error__WEBPACK_IMPORTED_MODULE_1__[\"default\"]();\n return rejectWithValue({\n name: err.name,\n message: err.message,\n langKey: err.langKey\n });\n }\n}));\nconst resetApp = (0,domains_redux_create_debounced_async_thunk__WEBPACK_IMPORTED_MODULE_5__[\"default\"])('resetApp', (_, {\n dispatch,\n extra: {\n api\n }\n}) => __awaiter(void 0, void 0, void 0, function* () {\n yield api.disconnect();\n api.clearStore();\n dispatch((0,domains_config_actions__WEBPACK_IMPORTED_MODULE_3__.resetConfig)());\n yield dispatch((0,domains_config_actions__WEBPACK_IMPORTED_MODULE_3__.initializeConfig)());\n try {\n const {\n locale\n } = yield dispatch(initializeApp()).unwrap();\n yield dispatch((0,domains_i18n_actions__WEBPACK_IMPORTED_MODULE_4__.setLocale)(locale));\n } catch (e) {\n // nothing to do\n }\n dispatch((0,domains_visibility_actions__WEBPACK_IMPORTED_MODULE_6__.initializeVisibility)());\n}), {\n wait: 2000,\n leading: true\n});\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/app/actions.ts?");
138
138
 
139
139
  /***/ }),
140
140
 
@@ -354,7 +354,29 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
354
354
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
355
355
 
356
356
  "use strict";
357
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ clearInterrupt: () => (/* binding */ clearInterrupt),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ interruptSlice: () => (/* binding */ interruptSlice),\n/* harmony export */ setInterrupt: () => (/* binding */ setInterrupt)\n/* harmony export */ });\n/* harmony import */ var _reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @reduxjs/toolkit */ \"./node_modules/@reduxjs/toolkit/dist/redux-toolkit.esm.js\");\n/* harmony import */ var domains_app_actions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! domains/app/actions */ \"./src/javascripts/domains/app/actions.ts\");\n/* harmony import */ var domains_config_actions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! domains/config/actions */ \"./src/javascripts/domains/config/actions.ts\");\n/* harmony import */ var domains_i18n_actions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/i18n/actions */ \"./src/javascripts/domains/i18n/actions.ts\");\n/* harmony import */ var domains_visibility_actions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! domains/visibility/actions */ \"./src/javascripts/domains/visibility/actions.ts\");\n\n\n\n\n\nconst initialState = {\n error: undefined\n};\nconst interruptSlice = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_4__.createSlice)({\n name: 'interrupt',\n initialState,\n reducers: {\n setInterrupt: (state, action) => {\n state.error = action.payload;\n },\n clearInterrupt: () => initialState\n },\n extraReducers: builder => {\n builder.addCase(domains_config_actions__WEBPACK_IMPORTED_MODULE_1__.initializeConfig.pending, () => initialState).addMatcher((0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_4__.isAnyOf)(domains_app_actions__WEBPACK_IMPORTED_MODULE_0__.initializeApp.rejected, domains_config_actions__WEBPACK_IMPORTED_MODULE_1__.initializeConfig.rejected, domains_i18n_actions__WEBPACK_IMPORTED_MODULE_2__.setLocale.rejected, domains_visibility_actions__WEBPACK_IMPORTED_MODULE_3__.setVisibility.rejected, domains_visibility_actions__WEBPACK_IMPORTED_MODULE_3__.initializeVisibility.rejected), (state, {\n payload\n }) => {\n state.error = payload;\n });\n }\n});\nconst {\n setInterrupt,\n clearInterrupt\n} = interruptSlice.actions;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (interruptSlice.reducer);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/interrupt/slice.ts?");
357
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ clearInterrupt: () => (/* binding */ clearInterrupt),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ interruptSlice: () => (/* binding */ interruptSlice),\n/* harmony export */ setInterrupt: () => (/* binding */ setInterrupt)\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 domains_app_actions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! domains/app/actions */ \"./src/javascripts/domains/app/actions.ts\");\n/* harmony import */ var domains_config_actions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! domains/config/actions */ \"./src/javascripts/domains/config/actions.ts\");\n/* harmony import */ var domains_i18n_actions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/i18n/actions */ \"./src/javascripts/domains/i18n/actions.ts\");\n/* harmony import */ var domains_store_actions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! domains/store/actions */ \"./src/javascripts/domains/store/actions.ts\");\n/* harmony import */ var domains_visibility_actions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! domains/visibility/actions */ \"./src/javascripts/domains/visibility/actions.ts\");\n\n\n\n\n\n\nconst initialState = {\n error: undefined\n};\nconst interruptSlice = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_5__.createSlice)({\n name: 'interrupt',\n initialState,\n reducers: {\n setInterrupt: (state, action) => {\n state.error = action.payload;\n },\n clearInterrupt: () => initialState\n },\n extraReducers: builder => {\n builder.addCase(domains_config_actions__WEBPACK_IMPORTED_MODULE_1__.initializeConfig.pending, () => initialState).addMatcher((0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_5__.isAnyOf)(domains_app_actions__WEBPACK_IMPORTED_MODULE_0__.initializeApp.rejected, domains_config_actions__WEBPACK_IMPORTED_MODULE_1__.initializeConfig.rejected, domains_i18n_actions__WEBPACK_IMPORTED_MODULE_2__.setLocale.rejected, domains_visibility_actions__WEBPACK_IMPORTED_MODULE_4__.setVisibility.rejected, domains_visibility_actions__WEBPACK_IMPORTED_MODULE_4__.initializeVisibility.rejected, domains_store_actions__WEBPACK_IMPORTED_MODULE_3__.getConversation.rejected), (state, {\n payload\n }) => {\n state.error = payload;\n });\n }\n});\nconst {\n setInterrupt,\n clearInterrupt\n} = interruptSlice.actions;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (interruptSlice.reducer);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/interrupt/slice.ts?");
358
+
359
+ /***/ }),
360
+
361
+ /***/ "./src/javascripts/domains/redux/create-debounced-async-thunk.ts":
362
+ /*!***********************************************************************!*\
363
+ !*** ./src/javascripts/domains/redux/create-debounced-async-thunk.ts ***!
364
+ \***********************************************************************/
365
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
366
+
367
+ "use strict";
368
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @reduxjs/toolkit */ \"./node_modules/@reduxjs/toolkit/dist/redux-toolkit.esm.js\");\n\n/**\n * A debounced analogue of the `createAsyncThunk` from `@reduxjs/toolkit`\n * @param typePrefix - a string action type value\n * @param payloadCreator - a callback function that should return a promise containing the result of some asynchronous logic\n * @param debounceOptions - the debounce options object\n */\nconst createDebouncedAsyncThunk = (typePrefix, payloadCreator, debounceOptions) => {\n const {\n wait = 300,\n maxWait = 0,\n leading = false\n } = debounceOptions !== null && debounceOptions !== void 0 ? debounceOptions : {};\n let debounceTimer = null;\n let maxWaitTimer = null;\n let resolve;\n const cancel = () => {\n if (resolve) {\n resolve(false);\n resolve = undefined;\n }\n };\n const invoke = () => {\n clearTimeout(maxWaitTimer);\n maxWaitTimer = undefined;\n if (resolve) {\n resolve(true);\n resolve = undefined;\n }\n };\n const debounceExecutionCondition = () => {\n const immediate = leading && !debounceTimer;\n // Start debounced condition resolution\n clearTimeout(debounceTimer);\n debounceTimer = setTimeout(() => {\n invoke();\n debounceTimer = null;\n }, wait);\n if (immediate) {\n return true;\n }\n cancel();\n // Start max wait condition resolution\n if (maxWait && !maxWaitTimer) {\n maxWaitTimer = setTimeout(invoke, maxWait);\n }\n return new Promise(res => {\n resolve = res;\n });\n };\n return (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__.createAsyncThunk)(typePrefix, payloadCreator, {\n condition: debounceExecutionCondition\n });\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (createDebouncedAsyncThunk);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/redux/create-debounced-async-thunk.ts?");
369
+
370
+ /***/ }),
371
+
372
+ /***/ "./src/javascripts/domains/store/actions.ts":
373
+ /*!**************************************************!*\
374
+ !*** ./src/javascripts/domains/store/actions.ts ***!
375
+ \**************************************************/
376
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
377
+
378
+ "use strict";
379
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getConversation: () => (/* binding */ getConversation)\n/* harmony export */ });\n/* harmony import */ var _reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @reduxjs/toolkit */ \"./node_modules/@reduxjs/toolkit/dist/redux-toolkit.esm.js\");\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};\n\nconst getConversation = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__.createAsyncThunk)('getConversation', (_, {\n extra: {\n api\n },\n rejectWithValue\n}) => __awaiter(void 0, void 0, void 0, function* () {\n try {\n return api.getConversation();\n } catch (error) {\n return rejectWithValue({\n name: error === null || error === void 0 ? void 0 : error.name,\n message: error === null || error === void 0 ? void 0 : error.message,\n langKey: error === null || error === void 0 ? void 0 : error.langKey,\n action: error === null || error === void 0 ? void 0 : error.action,\n originalEvent: error === null || error === void 0 ? void 0 : error.originalEvent,\n originalError: error === null || error === void 0 ? void 0 : error.originalError\n });\n }\n}), {\n condition(payload, {\n getState\n }) {\n var _a;\n const {\n state: {\n events\n }\n } = getState();\n const lastEvent = events[events.length - 1];\n const payloadLastEventId = (_a = payload === null || payload === void 0 ? void 0 : payload.lastEvent) === null || _a === void 0 ? void 0 : _a.id;\n return lastEvent && payloadLastEventId !== lastEvent.payload.id;\n }\n});\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/store/actions.ts?");
358
380
 
359
381
  /***/ }),
360
382
 
@@ -431,7 +453,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
431
453
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
432
454
 
433
455
  "use strict";
434
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ initializeVisibility: () => (/* binding */ initializeVisibility),\n/* harmony export */ setVisibility: () => (/* binding */ setVisibility)\n/* harmony export */ });\n/* harmony import */ var _reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @reduxjs/toolkit */ \"./node_modules/@reduxjs/toolkit/dist/redux-toolkit.esm.js\");\n/* harmony import */ var ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ui/hooks/seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.ts\");\n/* harmony import */ var domains_app_selectors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! domains/app/selectors */ \"./src/javascripts/domains/app/selectors.ts\");\n/* harmony import */ var domains_config_selectors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/config/selectors */ \"./src/javascripts/domains/config/selectors.ts\");\n/* harmony import */ var domains_visibility_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! domains/visibility/utils */ \"./src/javascripts/domains/visibility/utils.js\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./constants */ \"./src/javascripts/domains/visibility/constants.ts\");\n/* harmony import */ var _selectors__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./selectors */ \"./src/javascripts/domains/visibility/selectors.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};\n\n\n\n\n\n\n\nconst validVisibilityStates = [_constants__WEBPACK_IMPORTED_MODULE_4__.visibilityStates.open, _constants__WEBPACK_IMPORTED_MODULE_4__.visibilityStates.minimized, _constants__WEBPACK_IMPORTED_MODULE_4__.visibilityStates.hidden];\nconst setVisibility = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_6__.createAsyncThunk)('setVisibility', (requestedVisibility, {\n getState,\n extra: {\n api,\n eventBus\n }\n}) => {\n const state = getState();\n const previousVisibility = _selectors__WEBPACK_IMPORTED_MODULE_5__.selectVisibility(state);\n const userHasResponded = (0,domains_app_selectors__WEBPACK_IMPORTED_MODULE_1__.selectUserHasResponded)(state);\n const hasConversation = api.hasConversation();\n const config = domains_config_selectors__WEBPACK_IMPORTED_MODULE_2__.selectConfig(state);\n const {\n visibilityCallback = domains_visibility_utils__WEBPACK_IMPORTED_MODULE_3__.calculateVisibility,\n layoutMode\n } = config;\n const {\n unreadEvents: unreadMessageCount\n } = (0,ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_0__.selectState)(state);\n const calculatedVisibility = visibilityCallback({\n hasResponded: userHasResponded,\n previousVisibility,\n requestedVisibility,\n config\n });\n if (!validVisibilityStates.includes(calculatedVisibility)) {\n console.error('The visibilityCallback function should return \"open\", \"minimized\" or \"hidden\".');\n return undefined;\n }\n if (previousVisibility === calculatedVisibility) {\n return undefined;\n }\n // Store the user-requested visibility in order to reinitialize after refresh\n api.store.set(_constants__WEBPACK_IMPORTED_MODULE_4__.StoreKey, Object.assign(Object.assign({}, api.store.get(_constants__WEBPACK_IMPORTED_MODULE_4__.StoreKey) || {}), {\n [layoutMode]: requestedVisibility\n }));\n if (requestedVisibility) {\n eventBus.emit('ui.visible', requestedVisibility, {\n visibility: requestedVisibility,\n hasConversation,\n hasResponded: userHasResponded,\n unreadMessageCount\n });\n }\n return calculatedVisibility;\n});\nconst initializeVisibility = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_6__.createAsyncThunk)('initialize', (_, {\n dispatch,\n getState,\n extra: {\n api\n }\n}) => __awaiter(void 0, void 0, void 0, function* () {\n var _a;\n // initialize stored visibility\n const {\n layoutMode\n } = domains_config_selectors__WEBPACK_IMPORTED_MODULE_2__.selectConfig(getState());\n const storedVisibility = ((_a = api.store.get(_constants__WEBPACK_IMPORTED_MODULE_4__.StoreKey)) === null || _a === void 0 ? void 0 : _a[layoutMode]) || _constants__WEBPACK_IMPORTED_MODULE_4__.visibilityStates.initialize;\n dispatch(setVisibility(storedVisibility));\n return storedVisibility;\n}));\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/visibility/actions.ts?");
456
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ initializeVisibility: () => (/* binding */ initializeVisibility),\n/* harmony export */ setVisibility: () => (/* binding */ setVisibility)\n/* harmony export */ });\n/* harmony import */ var _reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @reduxjs/toolkit */ \"./node_modules/@reduxjs/toolkit/dist/redux-toolkit.esm.js\");\n/* harmony import */ var ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ui/hooks/seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.ts\");\n/* harmony import */ var domains_app_selectors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! domains/app/selectors */ \"./src/javascripts/domains/app/selectors.ts\");\n/* harmony import */ var domains_config_selectors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/config/selectors */ \"./src/javascripts/domains/config/selectors.ts\");\n/* harmony import */ var domains_visibility_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! domains/visibility/utils */ \"./src/javascripts/domains/visibility/utils.js\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./constants */ \"./src/javascripts/domains/visibility/constants.ts\");\n/* harmony import */ var _selectors__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./selectors */ \"./src/javascripts/domains/visibility/selectors.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};\n\n\n\n\n\n\n\nconst validVisibilityStates = [_constants__WEBPACK_IMPORTED_MODULE_4__.visibilityStates.open, _constants__WEBPACK_IMPORTED_MODULE_4__.visibilityStates.minimized, _constants__WEBPACK_IMPORTED_MODULE_4__.visibilityStates.hidden];\nconst setVisibility = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_6__.createAsyncThunk)('setVisibility', (requestedVisibility, {\n getState,\n extra: {\n api,\n eventBus\n }\n}) => {\n const state = getState();\n const previousVisibility = _selectors__WEBPACK_IMPORTED_MODULE_5__.selectVisibility(state);\n const userHasResponded = (0,domains_app_selectors__WEBPACK_IMPORTED_MODULE_1__.selectUserHasResponded)(state);\n const hasConversation = api.hasConversation();\n const config = domains_config_selectors__WEBPACK_IMPORTED_MODULE_2__.selectConfig(state);\n const {\n visibilityCallback = domains_visibility_utils__WEBPACK_IMPORTED_MODULE_3__.calculateVisibility,\n layoutMode\n } = config;\n const {\n unreadEvents: unreadMessageCount\n } = (0,ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_0__.selectState)(state);\n const calculatedVisibility = visibilityCallback({\n hasResponded: userHasResponded,\n previousVisibility,\n requestedVisibility,\n config\n });\n if (!validVisibilityStates.includes(calculatedVisibility)) {\n console.error('The visibilityCallback function should return \"open\", \"minimized\" or \"hidden\".');\n return undefined;\n }\n if (previousVisibility === calculatedVisibility) {\n return undefined;\n }\n const visibility = api.store.get(_constants__WEBPACK_IMPORTED_MODULE_4__.StoreKey);\n // Store the user-requested visibility in order to reinitialize after refresh\n api.store.set(_constants__WEBPACK_IMPORTED_MODULE_4__.StoreKey, Object.assign(Object.assign({}, visibility || {}), {\n [layoutMode]: requestedVisibility\n }));\n if (requestedVisibility) {\n eventBus.emit('ui.visible', requestedVisibility, {\n visibility: requestedVisibility,\n hasConversation,\n hasResponded: userHasResponded,\n unreadMessageCount\n });\n }\n return calculatedVisibility;\n});\nconst initializeVisibility = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_6__.createAsyncThunk)('initialize', (_, {\n dispatch,\n getState,\n extra: {\n api\n }\n}) => __awaiter(void 0, void 0, void 0, function* () {\n var _a;\n // initialize stored visibility\n const {\n layoutMode\n } = domains_config_selectors__WEBPACK_IMPORTED_MODULE_2__.selectConfig(getState());\n const storedVisibility = ((_a = api.store.get(_constants__WEBPACK_IMPORTED_MODULE_4__.StoreKey)) === null || _a === void 0 ? void 0 : _a[layoutMode]) || _constants__WEBPACK_IMPORTED_MODULE_4__.visibilityStates.initialize;\n dispatch(setVisibility(storedVisibility));\n return storedVisibility;\n}));\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/visibility/actions.ts?");
435
457
 
436
458
  /***/ }),
437
459
 
@@ -530,7 +552,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
530
552
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
531
553
 
532
554
  "use strict";
533
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-redux */ \"./node_modules/react-redux/es/index.js\");\n/* harmony import */ var api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! api/errors/seamly-general-error */ \"./src/javascripts/api/errors/seamly-general-error.js\");\n/* harmony import */ var api_errors_seamly_offline_error__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! api/errors/seamly-offline-error */ \"./src/javascripts/api/errors/seamly-offline-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 ui_components_core_seamly_api_context__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ui/components/core/seamly-api-context */ \"./src/javascripts/ui/components/core/seamly-api-context.ts\");\n/* harmony import */ var ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.ts\");\n/* harmony import */ var domains_app_slice__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! domains/app/slice */ \"./src/javascripts/domains/app/slice.ts\");\n/* harmony import */ var domains_interrupt_slice__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! domains/interrupt/slice */ \"./src/javascripts/domains/interrupt/slice.ts\");\n/* harmony import */ var domains_store_slice__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! domains/store/slice */ \"./src/javascripts/domains/store/slice.ts\");\n/* harmony import */ var domains_translations_slice__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! domains/translations/slice */ \"./src/javascripts/domains/translations/slice.ts\");\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};\n\n\n\n\n\n\n\n\n\n\n\n\nconst EMITTABLE_MESSAGE_TYPES = ['text', 'choice_prompt', 'image', 'video'];\nconst SeamlyEventSubscriber = () => {\n const api = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_6__.useSeamlyApiContext)();\n const syncChannelRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)();\n const messageChannelRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)();\n const dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useDispatch)();\n const events = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_6__.useEvents)();\n const eventBus = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useContext)(ui_components_core_seamly_api_context__WEBPACK_IMPORTED_MODULE_5__.SeamlyEventBusContext);\n const prevEmittedEventId = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const {\n initCountdown,\n endCountdown\n } = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_6__.useSeamlyIdleDetachCountdown)();\n const {\n emitEvent\n } = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_6__.useSeamlyCommands)();\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (api.connectionInfo && api.conversation.socket) {\n const {\n socket\n } = api.conversation;\n socket.onError(err => {\n const seamlyOfflineError = new api_errors_seamly_offline_error__WEBPACK_IMPORTED_MODULE_3__[\"default\"](err);\n dispatch((0,domains_interrupt_slice__WEBPACK_IMPORTED_MODULE_9__.setInterrupt)({\n name: seamlyOfflineError.name,\n message: seamlyOfflineError.message,\n langKey: seamlyOfflineError.langKey,\n originalEvent: seamlyOfflineError.originalEvent,\n originalError: seamlyOfflineError.originalError\n }));\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_10__.clearEvents)());\n });\n socket.onOpen(() => {\n dispatch((0,domains_interrupt_slice__WEBPACK_IMPORTED_MODULE_9__.clearInterrupt)());\n });\n }\n }, [api, api.connectionInfo, api.conversation.socket, dispatch]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n api.conversation.onConnection(({\n currentState\n }) => {\n if (currentState === 'join_channel_erred') {\n const seamlyGeneralError = new api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_2__[\"default\"]();\n dispatch((0,domains_interrupt_slice__WEBPACK_IMPORTED_MODULE_9__.setInterrupt)({\n name: seamlyGeneralError.name,\n message: seamlyGeneralError.message,\n langKey: seamlyGeneralError.langKey,\n originalEvent: seamlyGeneralError.originalEvent,\n originalError: seamlyGeneralError.originalError,\n action: seamlyGeneralError.action\n }));\n }\n });\n }, [api, api.connectionInfo, api.conversation.channel, dispatch]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (api.connectionInfo) {\n const updateParticipant = event => {\n if (event.type !== 'participant') {\n return;\n }\n const {\n payload\n } = event;\n if (!payload || !payload.participant) {\n return;\n }\n const {\n fromClient,\n participant\n } = payload;\n if (!fromClient && typeof participant !== 'string' && (participant === null || participant === void 0 ? void 0 : participant.name)) {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_10__.setHeaderSubTitle)(participant.name));\n }\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_10__.setParticipant)({\n participant,\n fromClient\n }));\n if (typeof participant !== 'string' && participant.introduction) {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_10__.addEvent)(event));\n }\n };\n api.conversation.onConnection(({\n connected\n }) => {\n if (!connected) return false;\n const {\n channel\n } = api.conversation;\n channel.onMessage = (type, payload) => {\n const event = {\n type,\n payload\n };\n switch (type) {\n case 'ui':\n if (payload.state && payload.state.hasOwnProperty('loading')) {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_10__.setIsLoading)(payload.state.loading));\n }\n switch (payload.type) {\n case 'idle_detach_countdown':\n initCountdown(payload.body.duration);\n break;\n case 'idle_detach_countdown_elapsed':\n endCountdown(undefined, true);\n break;\n case 'resume_conversation_prompt':\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_10__.initResumeConversationPrompt)());\n break;\n case 'translation_proposal':\n dispatch((0,domains_translations_slice__WEBPACK_IMPORTED_MODULE_11__.setTranslationProposalPrompt)(payload.body));\n break;\n case 'user_first_response':\n dispatch((0,domains_app_slice__WEBPACK_IMPORTED_MODULE_8__.setHasResponded)(true));\n // @ts-ignore\n eventBus.emit('system.userFirstResponse', payload.body);\n break;\n }\n break;\n case 'message':\n updateParticipant(payload);\n switch (payload.type) {\n case 'text':\n case 'choice_prompt':\n case 'splash':\n case 'image':\n case 'upload':\n case 'video':\n case 'cta':\n case 'custom':\n case 'carousel':\n case 'card':\n if (payload.service && payload.service.serviceSessionId) {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_10__.setActiveService)(payload.service.serviceSessionId));\n }\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_10__.addEvent)(event));\n break;\n }\n break;\n case 'participant':\n updateParticipant(event);\n break;\n case 'service_data':\n if (payload.persist) {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_10__.setServiceDataItem)(payload));\n }\n break;\n case 'ack':\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_10__.ackEvent)(event));\n break;\n case 'system':\n if (payload.type === 'service_changed') {\n const {\n serviceSettings\n } = payload,\n eventPayload = __rest(payload, [\"serviceSettings\"]);\n const {\n entry,\n proactiveMessages\n } = serviceSettings;\n const {\n upload\n } = entry.options;\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_10__.setFeatureEnabledState)({\n key: ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_7__.featureKeys.uploads,\n enabled: !!(upload && upload.enabled)\n }));\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_10__.setProactiveMessages)(proactiveMessages.enabled || false));\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_10__.setServiceEntryMetadata)(entry));\n if (payload.serviceSessionId) {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_10__.setActiveService)(payload.serviceSessionId));\n }\n emitEvent('system.serviceChanged', eventPayload);\n }\n break;\n case 'info':\n if (payload.type === 'divider' || payload.type === 'text' || payload.type === 'translation') {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_10__.addEvent)(event));\n }\n break;\n case 'error':\n switch (payload.type) {\n case 'find_conversation_erred':\n const seamlySessionExpiredError = new api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_4__[\"default\"](event);\n dispatch((0,domains_interrupt_slice__WEBPACK_IMPORTED_MODULE_9__.setInterrupt)({\n name: seamlySessionExpiredError.name,\n action: seamlySessionExpiredError.action,\n message: seamlySessionExpiredError.message,\n originalEvent: seamlySessionExpiredError.originalEvent,\n originalError: seamlySessionExpiredError.originalError\n }));\n break;\n case 'conversation_erred':\n case 'attach_channel_erred':\n const seamlyGeneralError = new api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_2__[\"default\"](event);\n dispatch((0,domains_interrupt_slice__WEBPACK_IMPORTED_MODULE_9__.setInterrupt)({\n name: seamlyGeneralError.name,\n message: seamlyGeneralError.message,\n langKey: seamlyGeneralError.langKey,\n originalEvent: seamlyGeneralError.originalEvent,\n originalError: seamlyGeneralError.originalError,\n action: seamlyGeneralError.action\n }));\n break;\n }\n }\n return payload;\n };\n return false;\n });\n }\n }, [api, api.connectionInfo, api.conversation.channel, dispatch, emitEvent, endCountdown, eventBus, initCountdown]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (api.connectionInfo) {\n api.conversation.onConnection(({\n connected\n }) => {\n if (!connected) return false;\n const {\n channel\n } = api.conversation;\n if (messageChannelRef.current) {\n channel === null || channel === void 0 ? void 0 : channel.off('message', messageChannelRef.current);\n }\n messageChannelRef.current = channel.on('message', payload => {\n if (!EMITTABLE_MESSAGE_TYPES.includes(payload.type)) {\n return payload;\n }\n // This check dedupes the sending of messages via\n // the bus if a duplicate connection exists in an\n // error situation.\n if (payload.id !== prevEmittedEventId.current) {\n // @ts-ignore\n eventBus.emit('message', payload);\n }\n prevEmittedEventId.current = payload.id;\n return payload;\n });\n return true;\n });\n }\n }, [api, api.connectionInfo, api.conversation.channel, eventBus]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (api.connectionInfo) {\n api.conversation.onConnection(({\n connected\n }) => {\n var _a;\n if (!connected) return false;\n if (syncChannelRef.current) {\n (_a = api.conversation.channel) === null || _a === void 0 ? void 0 : _a.off('sync', syncChannelRef.current);\n }\n syncChannelRef.current = api.conversation.channel.on('sync', payload => {\n var _a;\n const lastEvent = events[events.length - 1];\n const payloadLastEventId = (_a = payload === null || payload === void 0 ? void 0 : payload.lastEvent) === null || _a === void 0 ? void 0 : _a.id;\n if (lastEvent && payloadLastEventId === lastEvent.payload.id) {\n return payload;\n }\n return api.getConversation().then(history => {\n if (!history) return;\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_10__.setHistory)(history));\n }).catch(error => {\n dispatch((0,domains_interrupt_slice__WEBPACK_IMPORTED_MODULE_9__.setInterrupt)({\n name: error === null || error === void 0 ? void 0 : error.name,\n message: error === null || error === void 0 ? void 0 : error.message,\n langKey: error === null || error === void 0 ? void 0 : error.langKey,\n action: error === null || error === void 0 ? void 0 : error.action,\n originalEvent: error === null || error === void 0 ? void 0 : error.originalEvent,\n originalError: error === null || error === void 0 ? void 0 : error.originalError\n }));\n });\n });\n return true;\n });\n }\n }, [api, api.connectionInfo, api.conversation.channel, events, dispatch]);\n return null;\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SeamlyEventSubscriber);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/core/seamly-event-subscriber.ts?");
555
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! api/errors/seamly-general-error */ \"./src/javascripts/api/errors/seamly-general-error.js\");\n/* harmony import */ var api_errors_seamly_offline_error__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! api/errors/seamly-offline-error */ \"./src/javascripts/api/errors/seamly-offline-error.js\");\n/* harmony import */ var api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! api/errors/seamly-session-expired-error */ \"./src/javascripts/api/errors/seamly-session-expired-error.js\");\n/* harmony import */ var ui_components_core_seamly_api_context__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ui/components/core/seamly-api-context */ \"./src/javascripts/ui/components/core/seamly-api-context.ts\");\n/* harmony import */ var ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.ts\");\n/* harmony import */ var domains_app_slice__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! domains/app/slice */ \"./src/javascripts/domains/app/slice.ts\");\n/* harmony import */ var domains_interrupt_slice__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! domains/interrupt/slice */ \"./src/javascripts/domains/interrupt/slice.ts\");\n/* harmony import */ var domains_store__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! domains/store */ \"./src/javascripts/domains/store/index.ts\");\n/* harmony import */ var domains_store_actions__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! domains/store/actions */ \"./src/javascripts/domains/store/actions.ts\");\n/* harmony import */ var domains_store_slice__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! domains/store/slice */ \"./src/javascripts/domains/store/slice.ts\");\n/* harmony import */ var domains_translations_slice__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! domains/translations/slice */ \"./src/javascripts/domains/translations/slice.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 __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};\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst EMITTABLE_MESSAGE_TYPES = ['text', 'choice_prompt', 'image', 'video'];\nconst SeamlyEventSubscriber = () => {\n const api = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_5__.useSeamlyApiContext)();\n const syncChannelRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)();\n const messageChannelRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)();\n const dispatch = (0,domains_store__WEBPACK_IMPORTED_MODULE_9__.useAppDispatch)();\n const eventBus = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useContext)(ui_components_core_seamly_api_context__WEBPACK_IMPORTED_MODULE_4__.SeamlyEventBusContext);\n const prevEmittedEventId = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const {\n initCountdown,\n endCountdown\n } = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_5__.useSeamlyIdleDetachCountdown)();\n const {\n emitEvent\n } = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_5__.useSeamlyCommands)();\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (api.connectionInfo && api.conversation.socket) {\n const {\n socket\n } = api.conversation;\n socket.onError(err => {\n const seamlyOfflineError = new api_errors_seamly_offline_error__WEBPACK_IMPORTED_MODULE_2__[\"default\"](err);\n dispatch((0,domains_interrupt_slice__WEBPACK_IMPORTED_MODULE_8__.setInterrupt)({\n name: seamlyOfflineError.name,\n message: seamlyOfflineError.message,\n langKey: seamlyOfflineError.langKey,\n originalEvent: seamlyOfflineError.originalEvent,\n originalError: seamlyOfflineError.originalError\n }));\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_11__.clearEvents)());\n });\n socket.onOpen(() => {\n dispatch((0,domains_interrupt_slice__WEBPACK_IMPORTED_MODULE_8__.clearInterrupt)());\n });\n }\n }, [api, api.connectionInfo, api.conversation.socket, dispatch]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n api.conversation.onConnection(({\n currentState\n }) => {\n if (currentState === 'join_channel_erred') {\n const seamlyGeneralError = new api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_1__[\"default\"]();\n dispatch((0,domains_interrupt_slice__WEBPACK_IMPORTED_MODULE_8__.setInterrupt)({\n name: seamlyGeneralError.name,\n message: seamlyGeneralError.message,\n langKey: seamlyGeneralError.langKey,\n originalEvent: seamlyGeneralError.originalEvent,\n originalError: seamlyGeneralError.originalError,\n action: seamlyGeneralError.action\n }));\n }\n });\n }, [api, api.connectionInfo, api.conversation.channel, dispatch]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (api.connectionInfo) {\n const updateParticipant = event => {\n if (event.type !== 'participant') {\n return;\n }\n const {\n payload\n } = event;\n if (!payload || !payload.participant) {\n return;\n }\n const {\n fromClient,\n participant\n } = payload;\n if (!fromClient && typeof participant !== 'string' && (participant === null || participant === void 0 ? void 0 : participant.name)) {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_11__.setHeaderSubTitle)(participant.name));\n }\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_11__.setParticipant)({\n participant,\n fromClient\n }));\n if (typeof participant !== 'string' && participant.introduction) {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_11__.addEvent)(event));\n }\n };\n api.conversation.onConnection(({\n connected\n }) => {\n if (!connected) return false;\n const {\n channel\n } = api.conversation;\n channel.onMessage = (type, payload) => {\n const event = {\n type,\n payload\n };\n switch (type) {\n case 'ui':\n if (payload.state && payload.state.hasOwnProperty('loading')) {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_11__.setIsLoading)(payload.state.loading));\n }\n switch (payload.type) {\n case 'idle_detach_countdown':\n initCountdown(payload.body.duration);\n break;\n case 'idle_detach_countdown_elapsed':\n endCountdown(undefined, true);\n break;\n case 'resume_conversation_prompt':\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_11__.initResumeConversationPrompt)());\n break;\n case 'translation_proposal':\n dispatch((0,domains_translations_slice__WEBPACK_IMPORTED_MODULE_12__.setTranslationProposalPrompt)(payload.body));\n break;\n case 'user_first_response':\n dispatch((0,domains_app_slice__WEBPACK_IMPORTED_MODULE_7__.setHasResponded)(true));\n // @ts-ignore\n eventBus.emit('system.userFirstResponse', payload.body);\n break;\n }\n break;\n case 'message':\n updateParticipant(payload);\n switch (payload.type) {\n case 'text':\n case 'choice_prompt':\n case 'splash':\n case 'image':\n case 'upload':\n case 'video':\n case 'cta':\n case 'custom':\n case 'carousel':\n case 'card':\n if (payload.service && payload.service.serviceSessionId) {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_11__.setActiveService)(payload.service.serviceSessionId));\n }\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_11__.addEvent)(event));\n break;\n }\n break;\n case 'participant':\n updateParticipant(event);\n break;\n case 'service_data':\n if (payload.persist) {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_11__.setServiceDataItem)(payload));\n }\n break;\n case 'ack':\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_11__.ackEvent)(event));\n break;\n case 'system':\n if (payload.type === 'service_changed') {\n const {\n serviceSettings\n } = payload,\n eventPayload = __rest(payload, [\"serviceSettings\"]);\n const {\n entry,\n proactiveMessages\n } = serviceSettings;\n const {\n upload\n } = entry.options;\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_11__.setFeatureEnabledState)({\n key: ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_6__.featureKeys.uploads,\n enabled: !!(upload && upload.enabled)\n }));\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_11__.setProactiveMessages)(proactiveMessages.enabled || false));\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_11__.setServiceEntryMetadata)(entry));\n if (payload.serviceSessionId) {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_11__.setActiveService)(payload.serviceSessionId));\n }\n emitEvent('system.serviceChanged', eventPayload);\n }\n break;\n case 'info':\n if (payload.type === 'divider' || payload.type === 'text' || payload.type === 'translation') {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_11__.addEvent)(event));\n }\n break;\n case 'error':\n switch (payload.type) {\n case 'find_conversation_erred':\n const seamlySessionExpiredError = new api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_3__[\"default\"](event);\n dispatch((0,domains_interrupt_slice__WEBPACK_IMPORTED_MODULE_8__.setInterrupt)({\n name: seamlySessionExpiredError.name,\n action: seamlySessionExpiredError.action,\n message: seamlySessionExpiredError.message,\n originalEvent: seamlySessionExpiredError.originalEvent,\n originalError: seamlySessionExpiredError.originalError\n }));\n break;\n case 'conversation_erred':\n case 'attach_channel_erred':\n const seamlyGeneralError = new api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_1__[\"default\"](event);\n dispatch((0,domains_interrupt_slice__WEBPACK_IMPORTED_MODULE_8__.setInterrupt)({\n name: seamlyGeneralError.name,\n message: seamlyGeneralError.message,\n langKey: seamlyGeneralError.langKey,\n originalEvent: seamlyGeneralError.originalEvent,\n originalError: seamlyGeneralError.originalError,\n action: seamlyGeneralError.action\n }));\n break;\n }\n }\n return payload;\n };\n return false;\n });\n }\n }, [api, api.connectionInfo, api.conversation.channel, dispatch, emitEvent, endCountdown, eventBus, initCountdown]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (api.connectionInfo) {\n api.conversation.onConnection(({\n connected\n }) => {\n if (!connected) return false;\n const {\n channel\n } = api.conversation;\n if (messageChannelRef.current) {\n channel === null || channel === void 0 ? void 0 : channel.off('message', messageChannelRef.current);\n }\n messageChannelRef.current = channel.on('message', payload => {\n if (!EMITTABLE_MESSAGE_TYPES.includes(payload.type)) {\n return payload;\n }\n // This check dedupes the sending of messages via\n // the bus if a duplicate connection exists in an\n // error situation.\n if (payload.id !== prevEmittedEventId.current) {\n // @ts-ignore\n eventBus.emit('message', payload);\n }\n prevEmittedEventId.current = payload.id;\n return payload;\n });\n return true;\n });\n }\n }, [api, api.connectionInfo, api.conversation.channel, eventBus]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (api.connectionInfo) {\n api.conversation.onConnection(({\n connected\n }) => {\n var _a;\n if (!connected) return false;\n if (syncChannelRef.current) {\n (_a = api.conversation.channel) === null || _a === void 0 ? void 0 : _a.off('sync', syncChannelRef.current);\n }\n syncChannelRef.current = api.conversation.channel.on('sync', payload => __awaiter(void 0, void 0, void 0, function* () {\n try {\n const history = yield dispatch((0,domains_store_actions__WEBPACK_IMPORTED_MODULE_10__.getConversation)(payload)).unwrap();\n if (!history) return;\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_11__.setHistory)(history));\n } catch (_e) {\n // nothing to do, the error is handled in the thunk\n }\n }));\n return true;\n });\n }\n }, [api, api.connectionInfo, api.conversation.channel, dispatch]);\n return null;\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SeamlyEventSubscriber);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/core/seamly-event-subscriber.ts?");
534
556
 
535
557
  /***/ }),
536
558
 
@@ -629,7 +651,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
629
651
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
630
652
 
631
653
  "use strict";
632
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ useSessionExpiredCommand)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! domains/interrupt/hooks */ \"./src/javascripts/domains/interrupt/hooks.ts\");\n/* harmony import */ var _use_seamly_commands__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./use-seamly-commands */ \"./src/javascripts/ui/hooks/use-seamly-commands.js\");\n\n\n\nfunction useSessionExpiredCommand() {\n const {\n meta: {\n originalError,\n action\n }\n } = (0,domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_1__.useInterrupt)();\n const seamlyCommands = (0,_use_seamly_commands__WEBPACK_IMPORTED_MODULE_2__[\"default\"])();\n const isExpiredError = (originalError === null || originalError === void 0 ? void 0 : originalError.name) === 'SeamlySessionExpiredError';\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (isExpiredError && seamlyCommands[action]) {\n seamlyCommands[action]();\n }\n }, [action, seamlyCommands, isExpiredError]);\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/use-session-expired-command.ts?");
654
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ useSessionExpiredCommand)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! api/errors/seamly-general-error */ \"./src/javascripts/api/errors/seamly-general-error.js\");\n/* harmony import */ var domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/interrupt/hooks */ \"./src/javascripts/domains/interrupt/hooks.ts\");\n/* harmony import */ var domains_interrupt_slice__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! domains/interrupt/slice */ \"./src/javascripts/domains/interrupt/slice.ts\");\n/* harmony import */ var domains_store__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! domains/store */ \"./src/javascripts/domains/store/index.ts\");\n/* harmony import */ var _use_seamly_commands__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./use-seamly-commands */ \"./src/javascripts/ui/hooks/use-seamly-commands.js\");\n\n\n\n\n\n\nfunction useSessionExpiredCommand() {\n const {\n meta: {\n originalError,\n action\n }\n } = (0,domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_2__.useInterrupt)();\n const dispatch = (0,domains_store__WEBPACK_IMPORTED_MODULE_4__.useAppDispatch)();\n const seamlyCommands = (0,_use_seamly_commands__WEBPACK_IMPORTED_MODULE_5__[\"default\"])();\n const isExpiredError = (originalError === null || originalError === void 0 ? void 0 : originalError.name) === 'SeamlySessionExpiredError';\n const limit = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(0);\n const limitTimer = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (isExpiredError && seamlyCommands[action]) {\n if (limit.current >= 10) {\n limitTimer.current = setTimeout(() => {\n limit.current = 0;\n }, 10000);\n const error = new api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_1__[\"default\"]();\n dispatch((0,domains_interrupt_slice__WEBPACK_IMPORTED_MODULE_3__.setInterrupt)({\n name: error.name,\n message: error.message,\n langKey: error.langKey,\n originalEvent: error.originalEvent,\n originalError: error.originalError,\n action: error.action\n }));\n return () => {};\n }\n limit.current += 1;\n seamlyCommands[action]();\n }\n return () => {\n if (limitTimer.current) clearTimeout(limitTimer.current);\n };\n }, [action, seamlyCommands, isExpiredError, dispatch]);\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/use-session-expired-command.ts?");
633
655
 
634
656
  /***/ }),
635
657
 
@@ -929,17 +951,6 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
929
951
 
930
952
  /***/ }),
931
953
 
932
- /***/ "./src/javascripts/ui/components/conversation/event/card-component.js":
933
- /*!****************************************************************************!*\
934
- !*** ./src/javascripts/ui/components/conversation/event/card-component.js ***!
935
- \****************************************************************************/
936
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
937
-
938
- "use strict";
939
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.ts\");\n/* harmony import */ var lib_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__);\n\n\n\n\n\n\nconst CardComponent = ({\n id,\n action,\n buttonText,\n description,\n hasFocus,\n image,\n title,\n isCarouselItem\n}) => {\n const cardRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const {\n sendMessage,\n sendAction,\n emitEvent\n } = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyCommands)();\n const descriptionId = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useGeneratedId)();\n const isMounted = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)();\n const CardActionComponent = action.type === ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__.cardTypes.navigate ? 'a' : 'button';\n const emitCardEvent = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => emitEvent(`action.${ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__.actionTypes.clickCard}`, {\n type: ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__.actionTypes.clickCta,\n originMessage: id,\n action\n }), [emitEvent, id, action]);\n const handleClick = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n emitCardEvent();\n if (action.type === ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__.cardTypes.ask) {\n sendMessage({\n body: action.ask\n });\n } else if (action.type === ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__.cardTypes.topic) {\n const {\n topic: name,\n fallbackMessage\n } = action;\n sendAction({\n type: ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__.actionTypes.setTopic,\n body: {\n name,\n fallbackMessage\n }\n });\n }\n }, [sendMessage, action, sendAction, emitCardEvent]);\n const actionProps = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => action.type === ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__.cardTypes.navigate ? {\n href: action.link,\n rel: 'noopener noreferrer',\n target: action.newTab ? '_blank' : '_self',\n onClick: emitCardEvent\n } : {\n onClick: handleClick\n }, [action, handleClick, emitCardEvent]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (isCarouselItem) {\n if (hasFocus && isMounted.current) {\n window.requestAnimationFrame(() => cardRef.current.focus());\n } else {\n cardRef.current.blur();\n }\n }\n isMounted.current = true;\n }, [hasFocus, isCarouselItem]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(\"div\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_3__.className)('card__wrapper'),\n id: id,\n tabIndex: \"-1\" // set tabIndex of -1 so card can be focussed\n ,\n ref: cardRef,\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"img\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_3__.className)('card__image'),\n src: image,\n alt: \"\"\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(\"div\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_3__.className)('card__content'),\n id: id,\n children: [title && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"h2\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_3__.className)('card__title'),\n children: title\n }), description && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"div\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_3__.className)('card__description'),\n dangerouslySetInnerHTML: {\n __html: description\n }\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(CardActionComponent, {\n tabIndex: isCarouselItem && !hasFocus ? '-1' : undefined // disable to prevent tabbing through cards\n ,\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_3__.className)('button', 'button--primary'),\n \"aria-describedby\": descriptionId,\n ...actionProps,\n children: buttonText\n })]\n })]\n });\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CardComponent);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/card-component.js?");
940
-
941
- /***/ }),
942
-
943
954
  /***/ "./src/javascripts/ui/components/conversation/event/card-message.js":
944
955
  /*!**************************************************************************!*\
945
956
  !*** ./src/javascripts/ui/components/conversation/event/card-message.js ***!
@@ -947,7 +958,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
947
958
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
948
959
 
949
960
  "use strict";
950
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ui/components/conversation/message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var _card_component__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./card-component */ \"./src/javascripts/ui/components/conversation/event/card-component.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__);\n\n\n\n\n\nconst CardMessage = ({\n event\n}) => {\n const {\n body\n } = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_2__.useTranslatedEventData)(event);\n const descriptionId = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useGeneratedId)();\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_0__[\"default\"], {\n type: \"card\",\n event: event,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_card_component__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n id: descriptionId,\n ...body\n })\n });\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CardMessage);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/card-message.js?");
961
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ui/components/conversation/message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var _card_component__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./card-component */ \"./src/javascripts/ui/components/conversation/event/card-component.tsx\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__);\n\n\n\n\n\nconst CardMessage = ({\n event\n}) => {\n const {\n body\n } = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_2__.useTranslatedEventData)(event);\n const descriptionId = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useGeneratedId)();\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_0__[\"default\"], {\n type: \"card\",\n event: event,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_card_component__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n id: descriptionId,\n ...body\n })\n });\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CardMessage);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/card-message.js?");
951
962
 
952
963
  /***/ }),
953
964
 
@@ -991,7 +1002,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
991
1002
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
992
1003
 
993
1004
  "use strict";
994
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ CarouselMessageSlide)\n/* harmony export */ });\n/* harmony import */ var ui_components_conversation_event_card_component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ui/components/conversation/event/card-component */ \"./src/javascripts/ui/components/conversation/event/card-component.js\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var lib_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__);\n\n\n\n\nfunction CarouselMessageSlide({\n item: slide,\n items,\n index,\n isActive\n}) {\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_1__.useI18n)();\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"div\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('carousel-item', `carousel-item--${slide.type}`),\n role: \"group\",\n \"aria-roledescription\": \"slide\",\n \"aria-label\": t('carousel.slide.label', {\n index: index + 1,\n total: items.length\n }),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(ui_components_conversation_event_card_component__WEBPACK_IMPORTED_MODULE_0__[\"default\"], {\n ...slide,\n isCarouselItem: true,\n hasFocus: isActive\n })\n });\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/carousel-message/components/slide.js?");
1005
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ CarouselMessageSlide)\n/* harmony export */ });\n/* harmony import */ var ui_components_conversation_event_card_component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ui/components/conversation/event/card-component */ \"./src/javascripts/ui/components/conversation/event/card-component.tsx\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var lib_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__);\n\n\n\n\nfunction CarouselMessageSlide({\n item: slide,\n items,\n index,\n isActive\n}) {\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_1__.useI18n)();\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"div\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('carousel-item', `carousel-item--${slide.type}`),\n role: \"group\",\n \"aria-roledescription\": \"slide\",\n \"aria-label\": t('carousel.slide.label', {\n index: index + 1,\n total: items.length\n }),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(ui_components_conversation_event_card_component__WEBPACK_IMPORTED_MODULE_0__[\"default\"], {\n ...slide,\n isCarouselItem: true,\n hasFocus: isActive\n })\n });\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/carousel-message/components/slide.js?");
995
1006
 
996
1007
  /***/ }),
997
1008
 
@@ -1090,7 +1101,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1090
1101
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1091
1102
 
1092
1103
  "use strict";
1093
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var domains_config_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! domains/config/hooks */ \"./src/javascripts/domains/config/hooks.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var lib_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__);\n\n\n\n\n\nconst EventParticipant = ({\n eventPayload\n}) => {\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_2__.useI18n)();\n const {\n fromClient,\n participant: participantId\n } = eventPayload;\n const participant = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_0__.useSeamlyParticipant)(participantId) || {};\n const {\n messages\n } = (0,domains_config_hooks__WEBPACK_IMPORTED_MODULE_1__.useConfig)();\n const participantName = fromClient ? t('participants.user.name') : participant && participant.name;\n const {\n showAvatar,\n showName\n } = messages[fromClient ? 'user' : 'agent'] || {};\n if (!showAvatar && !showName) {\n return null;\n }\n const authorInfo = [];\n if (showAvatar && participantName && participant.avatar) {\n authorInfo.push((0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"span\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_3__.className)('message__avatar'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"img\", {\n src: participant.avatar,\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_3__.className)('avatar'),\n alt: \"\"\n })\n }));\n }\n if (showName) {\n authorInfo.push((0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"span\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_3__.className)('message__author-name'),\n children: participantName\n }));\n }\n return authorInfo.length > 0 && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"div\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_3__.className)('message__author'),\n children: authorInfo\n });\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (EventParticipant);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/event-participant.js?");
1104
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var domains_config_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! domains/config/hooks */ \"./src/javascripts/domains/config/hooks.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var lib_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__);\n\n\n\n\n\nconst EventParticipant = ({\n eventPayload\n}) => {\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_2__.useI18n)();\n const {\n fromClient,\n participant: participantId\n } = eventPayload;\n const participant = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_0__.useSeamlyParticipant)(participantId) || {};\n const {\n messages\n } = (0,domains_config_hooks__WEBPACK_IMPORTED_MODULE_1__.useConfig)();\n const participantName = fromClient ? t('participants.user.name') : participant && participant.name;\n const {\n showAvatar,\n showName\n } = messages[fromClient ? 'user' : 'agent'] || {};\n if (!showAvatar && !showName) {\n return null;\n }\n const authorInfo = [];\n if (showAvatar && participantName && participant.avatar) {\n authorInfo.push((0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"span\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_3__.className)('message__avatar'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"img\", {\n src: participant.avatar,\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_3__.className)('avatar'),\n alt: \"\"\n })\n }));\n }\n if (showName && participantName) {\n authorInfo.push((0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"span\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_3__.className)('message__author-name'),\n children: participantName\n }));\n }\n return authorInfo.length > 0 && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"div\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_3__.className)('message__author'),\n children: authorInfo\n });\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (EventParticipant);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/event-participant.js?");
1094
1105
 
1095
1106
  /***/ }),
1096
1107
 
@@ -1618,7 +1629,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1618
1629
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1619
1630
 
1620
1631
  "use strict";
1621
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-redux */ \"./node_modules/react-redux/es/index.js\");\n/* harmony import */ var ui_components_layout_icon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ui/components/layout/icon */ \"./src/javascripts/ui/components/layout/icon.js\");\n/* harmony import */ var ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ui/components/widgets/in-out-transition */ \"./src/javascripts/ui/components/widgets/in-out-transition.tsx\");\n/* harmony import */ var ui_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ui/hooks/focus-helper-hooks */ \"./src/javascripts/ui/hooks/focus-helper-hooks.js\");\n/* harmony import */ var ui_hooks_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ui/hooks/seamly-api-hooks */ \"./src/javascripts/ui/hooks/seamly-api-hooks.ts\");\n/* harmony import */ var ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ui/hooks/seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.ts\");\n/* harmony import */ var domains_config_hooks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! domains/config/hooks */ \"./src/javascripts/domains/config/hooks.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var domains_interrupt_selectors__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! domains/interrupt/selectors */ \"./src/javascripts/domains/interrupt/selectors.ts\");\n/* harmony import */ var domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! domains/visibility/hooks */ \"./src/javascripts/domains/visibility/hooks.ts\");\n/* harmony import */ var lib_css__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst ButtonIcon = () => {\n const startChatIcon = (0,domains_config_hooks__WEBPACK_IMPORTED_MODULE_7__.useStartChatIcon)();\n const currentAgent = (0,ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_6__.useSeamlyCurrentAgent)();\n const hasError = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useSelector)(domains_interrupt_selectors__WEBPACK_IMPORTED_MODULE_9__.selectHasError);\n const isActiveConversation = currentAgent && !hasError;\n const src = isActiveConversation ? currentAgent.avatar : startChatIcon;\n return src ? (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(\"img\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_11__.className)(isActiveConversation ? 'avatar' : 'icon'),\n src: src,\n alt: \"\"\n }) : (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(ui_components_layout_icon__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n name: \"avatar\",\n size: \"32\"\n });\n};\nconst WindowOpenButton = ({\n onClick\n}) => {\n const hasConversation = (0,ui_hooks_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_5__.useSeamlyHasConversation)();\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_8__.useI18n)();\n const ariaLabel = hasConversation() ? t('window.openButton.srContinue') : t('window.openButton.srStart');\n const focusSkiplinkTarget = (0,ui_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_4__.useSkiplinkTargetFocusing)();\n const {\n isOpen\n } = (0,domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_10__.useVisibility)();\n const count = (0,ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_6__.useSeamlyUnreadCount)();\n const handleClick = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n onClick();\n focusSkiplinkTarget();\n }, [focusSkiplinkTarget, onClick]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n isActive: !isOpen,\n transitionStartState: ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_3__.transitionStartStates.rendered,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsxs)(\"button\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_11__.className)('window-open-button'),\n \"aria-label\": ariaLabel,\n \"aria-hidden\": isOpen,\n onClick: handleClick,\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(\"span\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_11__.className)('message-count'),\n \"aria-hidden\": \"true\",\n children: !!count && count\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(ButtonIcon, {})]\n })\n });\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (WindowOpenButton);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/view/window-view/window-open-button.js?");
1632
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-redux */ \"./node_modules/react-redux/es/index.js\");\n/* harmony import */ var ui_components_layout_icon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ui/components/layout/icon */ \"./src/javascripts/ui/components/layout/icon.js\");\n/* harmony import */ var ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ui/components/widgets/in-out-transition */ \"./src/javascripts/ui/components/widgets/in-out-transition.tsx\");\n/* harmony import */ var ui_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ui/hooks/focus-helper-hooks */ \"./src/javascripts/ui/hooks/focus-helper-hooks.js\");\n/* harmony import */ var ui_hooks_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ui/hooks/seamly-api-hooks */ \"./src/javascripts/ui/hooks/seamly-api-hooks.ts\");\n/* harmony import */ var ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ui/hooks/seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.ts\");\n/* harmony import */ var domains_config_hooks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! domains/config/hooks */ \"./src/javascripts/domains/config/hooks.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var domains_interrupt_selectors__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! domains/interrupt/selectors */ \"./src/javascripts/domains/interrupt/selectors.ts\");\n/* harmony import */ var domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! domains/visibility/hooks */ \"./src/javascripts/domains/visibility/hooks.ts\");\n/* harmony import */ var lib_css__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst ButtonIcon = () => {\n const startChatIcon = (0,domains_config_hooks__WEBPACK_IMPORTED_MODULE_7__.useStartChatIcon)();\n const currentAgent = (0,ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_6__.useSeamlyCurrentAgent)();\n const hasError = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useSelector)(domains_interrupt_selectors__WEBPACK_IMPORTED_MODULE_9__.selectHasError);\n const isActiveConversation = currentAgent && !hasError;\n const src = isActiveConversation ? currentAgent.avatar : startChatIcon;\n return src ? (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(\"img\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_11__.className)(isActiveConversation ? 'avatar' : 'icon'),\n src: src,\n alt: \"\"\n }) : (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(ui_components_layout_icon__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n name: \"avatar\",\n size: \"32\"\n });\n};\nconst WindowOpenButton = ({\n onClick\n}) => {\n const hasConversation = (0,ui_hooks_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_5__.useSeamlyHasConversation)();\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_8__.useI18n)();\n const ariaLabel = hasConversation() ? t('window.openButton.srContinue') : t('window.openButton.srStart');\n const focusSkiplinkTarget = (0,ui_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_4__.useSkiplinkTargetFocusing)();\n const {\n isOpen\n } = (0,domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_10__.useVisibility)();\n const count = (0,ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_6__.useSeamlyUnreadCount)();\n const handleClick = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n onClick();\n focusSkiplinkTarget();\n }, [focusSkiplinkTarget, onClick]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n isActive: !isOpen,\n transitionStartState: ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_3__.transitionStartStates.rendered,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsxs)(\"button\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_11__.className)('window-open-button'),\n \"aria-label\": ariaLabel,\n \"aria-hidden\": isOpen,\n onClick: handleClick,\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n isActive: !!count,\n transitionStartState: ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_3__.transitionStartStates.notRendered,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(\"span\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_11__.className)('message-count'),\n \"aria-hidden\": \"true\",\n children: count\n })\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(ButtonIcon, {})]\n })\n });\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (WindowOpenButton);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/view/window-view/window-open-button.js?");
1622
1633
 
1623
1634
  /***/ }),
1624
1635
 
@@ -3430,6 +3441,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
3430
3441
 
3431
3442
  /***/ }),
3432
3443
 
3444
+ /***/ "./src/javascripts/ui/components/conversation/event/card-component.tsx":
3445
+ /*!*****************************************************************************!*\
3446
+ !*** ./src/javascripts/ui/components/conversation/event/card-component.tsx ***!
3447
+ \*****************************************************************************/
3448
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3449
+
3450
+ "use strict";
3451
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.ts\");\n/* harmony import */ var lib_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.js\");\n\n\n\n\n\nconst CardComponent = ({ id, action, buttonText, description, hasFocus, image, title, isCarouselItem, }) => {\n const cardRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);\n const { sendMessage, sendAction, emitEvent } = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyCommands)();\n const descriptionId = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useGeneratedId)();\n const isMounted = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useRef)(false);\n const CardActionComponent = action.type === ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__.cardTypes.navigate ? 'a' : 'button';\n const emitCardEvent = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useCallback)(() => emitEvent(`action.${ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__.actionTypes.clickCard}`, {\n type: ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__.actionTypes.clickCta,\n originMessage: id,\n action,\n }), [emitEvent, id, action]);\n const handleClick = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useCallback)(() => {\n emitCardEvent();\n if (action.type === ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__.cardTypes.ask) {\n sendMessage({ body: action.ask });\n }\n else if (action.type === ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__.cardTypes.topic) {\n const { topic: name, fallbackMessage } = action;\n sendAction({\n type: ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__.actionTypes.setTopic,\n body: { name, fallbackMessage },\n });\n }\n }, [sendMessage, action, sendAction, emitCardEvent]);\n const actionProps = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useMemo)(() => action.type === ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__.cardTypes.navigate\n ? {\n href: action.link,\n rel: 'noopener noreferrer',\n target: action.newTab ? '_blank' : '_self',\n onClick: emitCardEvent,\n }\n : {\n onClick: handleClick,\n }, [action, handleClick, emitCardEvent]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {\n if (isCarouselItem) {\n if (hasFocus && isMounted.current) {\n window.requestAnimationFrame(() => cardRef.current.focus());\n }\n else {\n cardRef.current.blur();\n }\n }\n isMounted.current = true;\n }, [hasFocus, isCarouselItem]);\n return ((0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"div\", { className: (0,lib_css__WEBPACK_IMPORTED_MODULE_4__.className)('card__wrapper'), id: id, tabIndex: -1, ref: cardRef, children: [image ? ((0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"img\", { className: (0,lib_css__WEBPACK_IMPORTED_MODULE_4__.className)('card__image'), src: image, alt: \"\" })) : null, (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"div\", { className: (0,lib_css__WEBPACK_IMPORTED_MODULE_4__.className)('card__content'), id: id, children: [title && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"h2\", { className: (0,lib_css__WEBPACK_IMPORTED_MODULE_4__.className)('card__title'), children: title }), description && ((0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", { className: (0,lib_css__WEBPACK_IMPORTED_MODULE_4__.className)('card__description'), dangerouslySetInnerHTML: { __html: description } })), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(CardActionComponent, Object.assign({ tabIndex: isCarouselItem && !hasFocus ? -1 : undefined, className: (0,lib_css__WEBPACK_IMPORTED_MODULE_4__.className)('button', 'button--primary'), \"aria-describedby\": descriptionId }, actionProps, { children: buttonText }))] })] }));\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CardComponent);\n\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/card-component.tsx?");
3452
+
3453
+ /***/ }),
3454
+
3433
3455
  /***/ "./src/javascripts/ui/components/conversation/event/chat-scroll/chat-scroll-provider.tsx":
3434
3456
  /*!***********************************************************************************************!*\
3435
3457
  !*** ./src/javascripts/ui/components/conversation/event/chat-scroll/chat-scroll-provider.tsx ***!
@@ -1 +1 @@
1
- {"version":3,"file":"index.debug.js","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UCAA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA,CAAC;;;;;WCPD;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;WCNA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;;;;UElBA;UACA;UACA;UACA","sources":["webpack:///external commonjs2 \"preact\"","webpack:///external commonjs2 \"preact/compat\"","webpack:///external commonjs2 \"preact/hooks\"","webpack:///external commonjs2 \"preact/jsx-runtime\"","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/global","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///webpack/runtime/publicPath","webpack:///webpack/before-startup","webpack:///webpack/startup","webpack:///webpack/after-startup"],"sourcesContent":["module.exports = require(\"preact\");","module.exports = require(\"preact/compat\");","module.exports = require(\"preact/hooks\");","module.exports = require(\"preact/jsx-runtime\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && !scriptUrl) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","","// startup\n// Load entry module and return exports\n// This entry module can't be inlined because the eval devtool is used.\nvar __webpack_exports__ = __webpack_require__(\"./src/javascripts/index.ts\");\n",""],"names":[],"sourceRoot":""}
1
+ {"version":3,"file":"index.debug.js","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UCAA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA,CAAC;;;;;WCPD;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;WCNA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;;;;UElBA;UACA;UACA;UACA","sources":["webpack:///external commonjs2 \"preact\"","webpack:///external commonjs2 \"preact/compat\"","webpack:///external commonjs2 \"preact/hooks\"","webpack:///external commonjs2 \"preact/jsx-runtime\"","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/global","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///webpack/runtime/publicPath","webpack:///webpack/before-startup","webpack:///webpack/startup","webpack:///webpack/after-startup"],"sourcesContent":["module.exports = require(\"preact\");","module.exports = require(\"preact/compat\");","module.exports = require(\"preact/hooks\");","module.exports = require(\"preact/jsx-runtime\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && !scriptUrl) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","","// startup\n// Load entry module and return exports\n// This entry module can't be inlined because the eval devtool is used.\nvar __webpack_exports__ = __webpack_require__(\"./src/javascripts/index.ts\");\n",""],"names":[],"sourceRoot":""}