@seamly/web-ui 22.0.0-beta.1 → 22.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/build/dist/lib/components.js +46 -47
  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 +43 -43
  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 +19 -19
  10. package/build/dist/lib/index.debug.min.js +1 -1
  11. package/build/dist/lib/index.debug.min.js.LICENSE.txt +1 -1
  12. package/build/dist/lib/index.debug.min.js.map +1 -1
  13. package/build/dist/lib/index.js +4 -5
  14. package/build/dist/lib/index.js.map +1 -1
  15. package/build/dist/lib/index.min.js +1 -1
  16. package/build/dist/lib/index.min.js.map +1 -1
  17. package/build/dist/lib/standalone.js +4 -5
  18. package/build/dist/lib/standalone.js.map +1 -1
  19. package/build/dist/lib/standalone.min.js +1 -1
  20. package/build/dist/lib/standalone.min.js.map +1 -1
  21. package/build/dist/lib/style-guide.js +43 -6
  22. package/build/dist/lib/style-guide.js.map +1 -1
  23. package/build/dist/lib/style-guide.min.js +1 -1
  24. package/build/dist/lib/style-guide.min.js.map +1 -1
  25. package/build/dist/lib/utils.js +48 -49
  26. package/build/dist/lib/utils.js.map +1 -1
  27. package/build/dist/lib/utils.min.js +1 -1
  28. package/build/dist/lib/utils.min.js.map +1 -1
  29. package/package.json +1 -1
  30. package/src/javascripts/domains/forms/provider.tsx +1 -1
  31. package/src/javascripts/domains/store/store.types.ts +2 -0
  32. package/src/javascripts/style-guide/states.js +44 -0
  33. package/src/javascripts/ui/hooks/{seamly-api-hooks.js → seamly-api-hooks.ts} +1 -1
  34. package/src/.DS_Store +0 -0
@@ -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 _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 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 this.send('context', payload, 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: \"21.0.8\",\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 _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 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 this.send('context', payload, 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.0.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?");
116
116
 
117
117
  /***/ }),
118
118
 
@@ -545,6 +545,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
545
545
 
546
546
  /***/ }),
547
547
 
548
+ /***/ "./src/javascripts/ui/hooks/seamly-api-hooks.ts":
549
+ /*!******************************************************!*\
550
+ !*** ./src/javascripts/ui/hooks/seamly-api-hooks.ts ***!
551
+ \******************************************************/
552
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
553
+
554
+ "use strict";
555
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useSeamlyApiContext\": () => (/* binding */ useSeamlyApiContext),\n/* harmony export */ \"useSeamlyConversationUrl\": () => (/* binding */ useSeamlyConversationUrl),\n/* harmony export */ \"useSeamlyHasConversation\": () => (/* binding */ useSeamlyHasConversation),\n/* harmony export */ \"useSeamlyObjectStore\": () => (/* binding */ useSeamlyObjectStore)\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_components_core_seamly_api_context__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ui/components/core/seamly-api-context */ \"./src/javascripts/ui/components/core/seamly-api-context.ts\");\n\n\nconst useSeamlyApiContext = () => (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useContext)(ui_components_core_seamly_api_context__WEBPACK_IMPORTED_MODULE_1__.SeamlyApiContext);\nconst useSeamlyObjectStore = () => {\n const api = useSeamlyApiContext();\n return api.store;\n};\nconst useSeamlyConversationUrl = () => {\n const {\n get\n } = useSeamlyObjectStore();\n if (get) {\n return get('conversationUrl');\n }\n return null;\n};\nconst useSeamlyHasConversation = () => {\n const api = useSeamlyApiContext();\n const hasConversation = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n return api.hasConversation();\n }, [api]);\n return hasConversation;\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/seamly-api-hooks.ts?");
556
+
557
+ /***/ }),
558
+
548
559
  /***/ "./src/javascripts/ui/hooks/seamly-state-hooks.ts":
549
560
  /*!********************************************************!*\
550
561
  !*** ./src/javascripts/ui/hooks/seamly-state-hooks.ts ***!
@@ -596,7 +607,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
596
607
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
597
608
 
598
609
  "use strict";
599
- 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_hooks_use_seamly_commands__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ui/hooks/use-seamly-commands */ \"./src/javascripts/ui/hooks/use-seamly-commands.js\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var domains_store_slice__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! domains/store/slice */ \"./src/javascripts/domains/store/slice.ts\");\n/* harmony import */ var domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! domains/visibility/hooks */ \"./src/javascripts/domains/visibility/hooks.ts\");\n/* harmony import */ var _domains_visibility_selectors__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../domains/visibility/selectors */ \"./src/javascripts/domains/visibility/selectors.ts\");\n/* harmony import */ var _live_region_hooks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./live-region-hooks */ \"./src/javascripts/ui/hooks/live-region-hooks.js\");\n/* harmony import */ var _seamly_api_hooks__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./seamly-api-hooks */ \"./src/javascripts/ui/hooks/seamly-api-hooks.js\");\n/* harmony import */ var _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.ts\");\n/* harmony import */ var _use_session_expired_command__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./use-session-expired-command */ \"./src/javascripts/ui/hooks/use-session-expired-command.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\n\n\n\nconst useSeamlyChat = () => {\n const events = (0,_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_9__.useEvents)();\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_3__.useI18n)();\n const {\n isInline,\n isWindow,\n isApp\n } = (0,_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_9__.useSeamlyLayoutMode)();\n const {\n isOpen,\n isVisible\n } = (0,domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_5__.useVisibility)();\n const showInlineView = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useSelector)(_domains_visibility_selectors__WEBPACK_IMPORTED_MODULE_6__.selectShowInlineView);\n const dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useDispatch)();\n const spinnerTimeout = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const {\n start,\n connect,\n apiConfigReady,\n apiConnected\n } = (0,ui_hooks_use_seamly_commands__WEBPACK_IMPORTED_MODULE_2__[\"default\"])();\n const hasConversation = (0,_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_8__.useSeamlyHasConversation)();\n const connectCalled = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(false);\n const {\n sendAssertive\n } = (0,_live_region_hooks__WEBPACK_IMPORTED_MODULE_7__.useLiveRegion)();\n // Automatically reset conversation if the session has expired\n (0,_use_session_expired_command__WEBPACK_IMPORTED_MODULE_10__[\"default\"])();\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (isVisible) {\n // Wait for the live containers to stabilise in the DOM before injecting\n // the message or some screen readers will swallow it.\n setTimeout(() => {\n sendAssertive(t('window.srTexts.onLoad'));\n }, 500);\n }\n }, [isVisible, sendAssertive, t]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!isVisible) {\n return;\n }\n if (isOpen) {\n sendAssertive(t('window.srTexts.onOpen'));\n } else {\n sendAssertive(t('window.srTexts.onClose'));\n }\n }, [isOpen, isVisible, sendAssertive, t]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n // This delays the start of the loading inidicator we set when we initialise\n // the application. This is done to only avoid BSOD on initial load if DCX is slow.\n spinnerTimeout.current = setTimeout(() => {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_4__.setIsLoading)(true));\n }, 500);\n return () => {\n clearTimeout(spinnerTimeout.current);\n };\n }, [dispatch]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (events.length) {\n spinnerTimeout.current = setTimeout(() => {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_4__.setIsLoading)(false));\n }, 5000);\n }\n return () => {\n clearTimeout(spinnerTimeout.current);\n };\n }, [events, dispatch]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n // This is needed to reset the ref to allow connect and start to happen again.\n // Mostly due to Interrupt situations and a reset being called.\n if (!apiConfigReady || !apiConnected) {\n connectCalled.current = false;\n }\n }, [apiConfigReady, apiConnected]);\n const connectAndStart = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => __awaiter(void 0, void 0, void 0, function* () {\n // We don't connect if we are already connected to the api to avoid multiple in-flight connection processes.\n if (!apiConnected) {\n connectCalled.current = true;\n yield connect();\n }\n // We only start a conversation when the chat interface is either app, 'open' or if using the inline view if it's 'open' or 'minimized'.\n if (isApp || isOpen || isVisible && isInline) {\n start();\n }\n }), [apiConnected, connect, isApp, isInline, isOpen, isVisible, start]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n // We dont't connect or start when the apiConfig is not ready yet.\n // We also keep track of whether start has been called to avoid multiple in-flight connection processes.\n // We check if the window view is not open and no conversation is started yet.\n // Lastly we check if the inline view is not scrolled in to view.\n if (!apiConfigReady || connectCalled.current || isWindow && !isOpen || isInline && (!isVisible || !showInlineView)) {\n return;\n }\n if (hasConversation() && isOpen) {\n // We deactivate the extra startup loading spinner when a conversation is available\n // We also stop setting the loading indicator in the first place to avoid a flash.\n clearTimeout(spinnerTimeout.current);\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_4__.setIsLoading)(false));\n }\n connectAndStart();\n }, [apiConfigReady, connectAndStart, dispatch, hasConversation, isInline, isOpen, isWindow, isVisible, showInlineView]);\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (useSeamlyChat);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/use-seamly-chat.ts?");
610
+ 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_hooks_use_seamly_commands__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ui/hooks/use-seamly-commands */ \"./src/javascripts/ui/hooks/use-seamly-commands.js\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var domains_store_slice__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! domains/store/slice */ \"./src/javascripts/domains/store/slice.ts\");\n/* harmony import */ var domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! domains/visibility/hooks */ \"./src/javascripts/domains/visibility/hooks.ts\");\n/* harmony import */ var _domains_visibility_selectors__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../domains/visibility/selectors */ \"./src/javascripts/domains/visibility/selectors.ts\");\n/* harmony import */ var _live_region_hooks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./live-region-hooks */ \"./src/javascripts/ui/hooks/live-region-hooks.js\");\n/* harmony import */ var _seamly_api_hooks__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./seamly-api-hooks */ \"./src/javascripts/ui/hooks/seamly-api-hooks.ts\");\n/* harmony import */ var _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.ts\");\n/* harmony import */ var _use_session_expired_command__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./use-session-expired-command */ \"./src/javascripts/ui/hooks/use-session-expired-command.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\n\n\n\nconst useSeamlyChat = () => {\n const events = (0,_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_9__.useEvents)();\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_3__.useI18n)();\n const {\n isInline,\n isWindow,\n isApp\n } = (0,_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_9__.useSeamlyLayoutMode)();\n const {\n isOpen,\n isVisible\n } = (0,domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_5__.useVisibility)();\n const showInlineView = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useSelector)(_domains_visibility_selectors__WEBPACK_IMPORTED_MODULE_6__.selectShowInlineView);\n const dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useDispatch)();\n const spinnerTimeout = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const {\n start,\n connect,\n apiConfigReady,\n apiConnected\n } = (0,ui_hooks_use_seamly_commands__WEBPACK_IMPORTED_MODULE_2__[\"default\"])();\n const hasConversation = (0,_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_8__.useSeamlyHasConversation)();\n const connectCalled = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(false);\n const {\n sendAssertive\n } = (0,_live_region_hooks__WEBPACK_IMPORTED_MODULE_7__.useLiveRegion)();\n // Automatically reset conversation if the session has expired\n (0,_use_session_expired_command__WEBPACK_IMPORTED_MODULE_10__[\"default\"])();\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (isVisible) {\n // Wait for the live containers to stabilise in the DOM before injecting\n // the message or some screen readers will swallow it.\n setTimeout(() => {\n sendAssertive(t('window.srTexts.onLoad'));\n }, 500);\n }\n }, [isVisible, sendAssertive, t]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!isVisible) {\n return;\n }\n if (isOpen) {\n sendAssertive(t('window.srTexts.onOpen'));\n } else {\n sendAssertive(t('window.srTexts.onClose'));\n }\n }, [isOpen, isVisible, sendAssertive, t]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n // This delays the start of the loading inidicator we set when we initialise\n // the application. This is done to only avoid BSOD on initial load if DCX is slow.\n spinnerTimeout.current = setTimeout(() => {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_4__.setIsLoading)(true));\n }, 500);\n return () => {\n clearTimeout(spinnerTimeout.current);\n };\n }, [dispatch]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (events.length) {\n spinnerTimeout.current = setTimeout(() => {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_4__.setIsLoading)(false));\n }, 5000);\n }\n return () => {\n clearTimeout(spinnerTimeout.current);\n };\n }, [events, dispatch]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n // This is needed to reset the ref to allow connect and start to happen again.\n // Mostly due to Interrupt situations and a reset being called.\n if (!apiConfigReady || !apiConnected) {\n connectCalled.current = false;\n }\n }, [apiConfigReady, apiConnected]);\n const connectAndStart = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => __awaiter(void 0, void 0, void 0, function* () {\n // We don't connect if we are already connected to the api to avoid multiple in-flight connection processes.\n if (!apiConnected) {\n connectCalled.current = true;\n yield connect();\n }\n // We only start a conversation when the chat interface is either app, 'open' or if using the inline view if it's 'open' or 'minimized'.\n if (isApp || isOpen || isVisible && isInline) {\n start();\n }\n }), [apiConnected, connect, isApp, isInline, isOpen, isVisible, start]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n // We dont't connect or start when the apiConfig is not ready yet.\n // We also keep track of whether start has been called to avoid multiple in-flight connection processes.\n // We check if the window view is not open and no conversation is started yet.\n // Lastly we check if the inline view is not scrolled in to view.\n if (!apiConfigReady || connectCalled.current || isWindow && !isOpen || isInline && (!isVisible || !showInlineView)) {\n return;\n }\n if (hasConversation() && isOpen) {\n // We deactivate the extra startup loading spinner when a conversation is available\n // We also stop setting the loading indicator in the first place to avoid a flash.\n clearTimeout(spinnerTimeout.current);\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_4__.setIsLoading)(false));\n }\n connectAndStart();\n }, [apiConfigReady, connectAndStart, dispatch, hasConversation, isInline, isOpen, isWindow, isVisible, showInlineView]);\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (useSeamlyChat);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/use-seamly-chat.ts?");
600
611
 
601
612
  /***/ }),
602
613
 
@@ -1651,7 +1662,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1651
1662
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1652
1663
 
1653
1664
  "use strict";
1654
- 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.js\");\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?");
1665
+ 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?");
1655
1666
 
1656
1667
  /***/ }),
1657
1668
 
@@ -1765,17 +1776,6 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1765
1776
 
1766
1777
  /***/ }),
1767
1778
 
1768
- /***/ "./src/javascripts/ui/hooks/seamly-api-hooks.js":
1769
- /*!******************************************************!*\
1770
- !*** ./src/javascripts/ui/hooks/seamly-api-hooks.js ***!
1771
- \******************************************************/
1772
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1773
-
1774
- "use strict";
1775
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useSeamlyApiContext\": () => (/* binding */ useSeamlyApiContext),\n/* harmony export */ \"useSeamlyConversationUrl\": () => (/* binding */ useSeamlyConversationUrl),\n/* harmony export */ \"useSeamlyHasConversation\": () => (/* binding */ useSeamlyHasConversation),\n/* harmony export */ \"useSeamlyObjectStore\": () => (/* binding */ useSeamlyObjectStore)\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_components_core_seamly_api_context__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ui/components/core/seamly-api-context */ \"./src/javascripts/ui/components/core/seamly-api-context.ts\");\n\n\nconst useSeamlyApiContext = () => (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useContext)(ui_components_core_seamly_api_context__WEBPACK_IMPORTED_MODULE_1__.SeamlyApiContext);\nconst useSeamlyObjectStore = () => {\n const api = useSeamlyApiContext();\n return api.store || {};\n};\nconst useSeamlyConversationUrl = () => {\n const {\n get\n } = useSeamlyObjectStore();\n if (get) {\n return get('conversationUrl');\n }\n return null;\n};\nconst useSeamlyHasConversation = () => {\n const api = useSeamlyApiContext();\n const hasConversation = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n return api.hasConversation();\n }, [api]);\n return hasConversation;\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/seamly-api-hooks.js?");
1776
-
1777
- /***/ }),
1778
-
1779
1779
  /***/ "./src/javascripts/ui/hooks/seamly-entry-hooks.js":
1780
1780
  /*!********************************************************!*\
1781
1781
  !*** ./src/javascripts/ui/hooks/seamly-entry-hooks.js ***!
@@ -1794,7 +1794,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1794
1794
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1795
1795
 
1796
1796
  "use strict";
1797
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useElementFocusingById\": () => (/* reexport safe */ ui_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_2__.useElementFocusingById),\n/* harmony export */ \"useEntryTextLimit\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__.useEntryTextLimit),\n/* harmony export */ \"useEvents\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__.useEvents),\n/* harmony export */ \"useFileUploadMeta\": () => (/* reexport safe */ _file_upload_hooks__WEBPACK_IMPORTED_MODULE_4__.useFileUploadMeta),\n/* harmony export */ \"useFileUploads\": () => (/* reexport safe */ _file_upload_hooks__WEBPACK_IMPORTED_MODULE_4__.useFileUploads),\n/* harmony export */ \"useFocusIfSeamlyContainedFocus\": () => (/* reexport safe */ ui_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_2__.useFocusIfSeamlyContainedFocus),\n/* harmony export */ \"useForceUpdate\": () => (/* reexport safe */ _utility_hooks__WEBPACK_IMPORTED_MODULE_13__.useForceUpdate),\n/* harmony export */ \"useGeneratedId\": () => (/* reexport safe */ _utility_hooks__WEBPACK_IMPORTED_MODULE_13__.useGeneratedId),\n/* harmony export */ \"useLastMessageEventId\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__.useLastMessageEventId),\n/* harmony export */ \"useLiveRegion\": () => (/* reexport safe */ _live_region_hooks__WEBPACK_IMPORTED_MODULE_5__.useLiveRegion),\n/* harmony export */ \"useOptionButton\": () => (/* reexport safe */ _seamly_option_hooks__WEBPACK_IMPORTED_MODULE_6__.useOptionButton),\n/* harmony export */ \"useSeamlyActivityEventHandler\": () => (/* reexport safe */ _use_seamly_activity_event_handler__WEBPACK_IMPORTED_MODULE_8__[\"default\"]),\n/* harmony export */ \"useSeamlyApiContext\": () => (/* reexport safe */ _seamly_api_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyApiContext),\n/* harmony export */ \"useSeamlyAppContainerClassNames\": () => (/* reexport safe */ _component_helper_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyAppContainerClassNames),\n/* harmony export */ \"useSeamlyChat\": () => (/* reexport safe */ _use_seamly_chat__WEBPACK_IMPORTED_MODULE_9__[\"default\"]),\n/* harmony export */ \"useSeamlyCommands\": () => (/* reexport safe */ _use_seamly_commands__WEBPACK_IMPORTED_MODULE_10__[\"default\"]),\n/* harmony export */ \"useSeamlyContainerElement\": () => (/* reexport safe */ ui_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyContainerElement),\n/* harmony export */ \"useSeamlyConversationUrl\": () => (/* reexport safe */ _seamly_api_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyConversationUrl),\n/* harmony export */ \"useSeamlyCurrentAgent\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__.useSeamlyCurrentAgent),\n/* harmony export */ \"useSeamlyEventStream\": () => (/* binding */ useSeamlyEventStream),\n/* harmony export */ \"useSeamlyHeaderData\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__.useSeamlyHeaderData),\n/* harmony export */ \"useSeamlyIdleDetachCountdown\": () => (/* reexport safe */ _use_seamly_idle_detach_countdown__WEBPACK_IMPORTED_MODULE_11__[\"default\"]),\n/* harmony export */ \"useSeamlyIsHistoryLoaded\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__.useSeamlyIsHistoryLoaded),\n/* harmony export */ \"useSeamlyIsLoading\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__.useSeamlyIsLoading),\n/* harmony export */ \"useSeamlyLayoutMode\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__.useSeamlyLayoutMode),\n/* harmony export */ \"useSeamlyLiveRegionContext\": () => (/* reexport safe */ _live_region_hooks__WEBPACK_IMPORTED_MODULE_5__.useSeamlyLiveRegionContext),\n/* harmony export */ \"useSeamlyMessageContainerClassNames\": () => (/* reexport safe */ _component_helper_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyMessageContainerClassNames),\n/* harmony export */ \"useSeamlyOptions\": () => (/* reexport safe */ _seamly_option_hooks__WEBPACK_IMPORTED_MODULE_6__.useSeamlyOptions),\n/* harmony export */ \"useSeamlyParticipant\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__.useSeamlyParticipant),\n/* harmony export */ \"useSeamlyResumeConversationPrompt\": () => (/* reexport safe */ _use_seamly_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_12__[\"default\"]),\n/* harmony export */ \"useSeamlyServiceData\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__.useSeamlyServiceData),\n/* harmony export */ \"useSeamlyServiceInfo\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__.useSeamlyServiceInfo),\n/* harmony export */ \"useSeamlyStateContext\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__.useSeamlyStateContext),\n/* harmony export */ \"useSeamlyUnreadCount\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__.useSeamlyUnreadCount),\n/* harmony export */ \"useSkiplink\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__.useSkiplink),\n/* harmony export */ \"useSkiplinkTargetFocusing\": () => (/* reexport safe */ ui_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_2__.useSkiplinkTargetFocusing),\n/* harmony export */ \"useStableCallback\": () => (/* reexport safe */ _utility_hooks__WEBPACK_IMPORTED_MODULE_13__.useStableCallback)\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 _seamly_api_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./seamly-api-hooks */ \"./src/javascripts/ui/hooks/seamly-api-hooks.js\");\n/* harmony import */ var ui_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ui/hooks/focus-helper-hooks */ \"./src/javascripts/ui/hooks/focus-helper-hooks.js\");\n/* harmony import */ var _component_helper_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./component-helper-hooks */ \"./src/javascripts/ui/hooks/component-helper-hooks.js\");\n/* harmony import */ var _file_upload_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./file-upload-hooks */ \"./src/javascripts/ui/hooks/file-upload-hooks.js\");\n/* harmony import */ var _live_region_hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./live-region-hooks */ \"./src/javascripts/ui/hooks/live-region-hooks.js\");\n/* harmony import */ var _seamly_option_hooks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./seamly-option-hooks */ \"./src/javascripts/ui/hooks/seamly-option-hooks.js\");\n/* harmony import */ var _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.ts\");\n/* harmony import */ var _use_seamly_activity_event_handler__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./use-seamly-activity-event-handler */ \"./src/javascripts/ui/hooks/use-seamly-activity-event-handler.js\");\n/* harmony import */ var _use_seamly_chat__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./use-seamly-chat */ \"./src/javascripts/ui/hooks/use-seamly-chat.ts\");\n/* harmony import */ var _use_seamly_commands__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./use-seamly-commands */ \"./src/javascripts/ui/hooks/use-seamly-commands.js\");\n/* harmony import */ var _use_seamly_idle_detach_countdown__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./use-seamly-idle-detach-countdown */ \"./src/javascripts/ui/hooks/use-seamly-idle-detach-countdown.js\");\n/* harmony import */ var _use_seamly_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./use-seamly-resume-conversation-prompt */ \"./src/javascripts/ui/hooks/use-seamly-resume-conversation-prompt.js\");\n/* harmony import */ var _utility_hooks__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./utility-hooks */ \"./src/javascripts/ui/hooks/utility-hooks.js\");\n\n// Import extracted hooks here for use inside this file\n\n\n// Export extracted hooks here,\n// although this is a redundant, it prevents a bazillion code changes for now.\n// TODO: Remove exports and import them from the correct files\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// This hook isn't used within the core\n// But it is used in implementations\n// and imported directly from this file\n// Please do not remove\nconst useSeamlyEventStream = (nextFn, filterFn) => {\n const api = (0,_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyApiContext)();\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (api.connectionInfo && api.conversation?.channel) {\n const {\n channel\n } = api.conversation;\n channel.onMessage = (type, payload) => {\n if (!filterFn || filterFn({\n type,\n payload\n })) {\n nextFn({\n type,\n payload\n });\n }\n return payload;\n };\n }\n }, [nextFn, filterFn, api.connectionInfo, api.conversation]);\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/seamly-hooks.js?");
1797
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useElementFocusingById\": () => (/* reexport safe */ ui_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_2__.useElementFocusingById),\n/* harmony export */ \"useEntryTextLimit\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__.useEntryTextLimit),\n/* harmony export */ \"useEvents\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__.useEvents),\n/* harmony export */ \"useFileUploadMeta\": () => (/* reexport safe */ _file_upload_hooks__WEBPACK_IMPORTED_MODULE_4__.useFileUploadMeta),\n/* harmony export */ \"useFileUploads\": () => (/* reexport safe */ _file_upload_hooks__WEBPACK_IMPORTED_MODULE_4__.useFileUploads),\n/* harmony export */ \"useFocusIfSeamlyContainedFocus\": () => (/* reexport safe */ ui_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_2__.useFocusIfSeamlyContainedFocus),\n/* harmony export */ \"useForceUpdate\": () => (/* reexport safe */ _utility_hooks__WEBPACK_IMPORTED_MODULE_13__.useForceUpdate),\n/* harmony export */ \"useGeneratedId\": () => (/* reexport safe */ _utility_hooks__WEBPACK_IMPORTED_MODULE_13__.useGeneratedId),\n/* harmony export */ \"useLastMessageEventId\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__.useLastMessageEventId),\n/* harmony export */ \"useLiveRegion\": () => (/* reexport safe */ _live_region_hooks__WEBPACK_IMPORTED_MODULE_5__.useLiveRegion),\n/* harmony export */ \"useOptionButton\": () => (/* reexport safe */ _seamly_option_hooks__WEBPACK_IMPORTED_MODULE_6__.useOptionButton),\n/* harmony export */ \"useSeamlyActivityEventHandler\": () => (/* reexport safe */ _use_seamly_activity_event_handler__WEBPACK_IMPORTED_MODULE_8__[\"default\"]),\n/* harmony export */ \"useSeamlyApiContext\": () => (/* reexport safe */ _seamly_api_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyApiContext),\n/* harmony export */ \"useSeamlyAppContainerClassNames\": () => (/* reexport safe */ _component_helper_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyAppContainerClassNames),\n/* harmony export */ \"useSeamlyChat\": () => (/* reexport safe */ _use_seamly_chat__WEBPACK_IMPORTED_MODULE_9__[\"default\"]),\n/* harmony export */ \"useSeamlyCommands\": () => (/* reexport safe */ _use_seamly_commands__WEBPACK_IMPORTED_MODULE_10__[\"default\"]),\n/* harmony export */ \"useSeamlyContainerElement\": () => (/* reexport safe */ ui_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyContainerElement),\n/* harmony export */ \"useSeamlyConversationUrl\": () => (/* reexport safe */ _seamly_api_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyConversationUrl),\n/* harmony export */ \"useSeamlyCurrentAgent\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__.useSeamlyCurrentAgent),\n/* harmony export */ \"useSeamlyEventStream\": () => (/* binding */ useSeamlyEventStream),\n/* harmony export */ \"useSeamlyHeaderData\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__.useSeamlyHeaderData),\n/* harmony export */ \"useSeamlyIdleDetachCountdown\": () => (/* reexport safe */ _use_seamly_idle_detach_countdown__WEBPACK_IMPORTED_MODULE_11__[\"default\"]),\n/* harmony export */ \"useSeamlyIsHistoryLoaded\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__.useSeamlyIsHistoryLoaded),\n/* harmony export */ \"useSeamlyIsLoading\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__.useSeamlyIsLoading),\n/* harmony export */ \"useSeamlyLayoutMode\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__.useSeamlyLayoutMode),\n/* harmony export */ \"useSeamlyLiveRegionContext\": () => (/* reexport safe */ _live_region_hooks__WEBPACK_IMPORTED_MODULE_5__.useSeamlyLiveRegionContext),\n/* harmony export */ \"useSeamlyMessageContainerClassNames\": () => (/* reexport safe */ _component_helper_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyMessageContainerClassNames),\n/* harmony export */ \"useSeamlyOptions\": () => (/* reexport safe */ _seamly_option_hooks__WEBPACK_IMPORTED_MODULE_6__.useSeamlyOptions),\n/* harmony export */ \"useSeamlyParticipant\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__.useSeamlyParticipant),\n/* harmony export */ \"useSeamlyResumeConversationPrompt\": () => (/* reexport safe */ _use_seamly_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_12__[\"default\"]),\n/* harmony export */ \"useSeamlyServiceData\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__.useSeamlyServiceData),\n/* harmony export */ \"useSeamlyServiceInfo\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__.useSeamlyServiceInfo),\n/* harmony export */ \"useSeamlyStateContext\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__.useSeamlyStateContext),\n/* harmony export */ \"useSeamlyUnreadCount\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__.useSeamlyUnreadCount),\n/* harmony export */ \"useSkiplink\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__.useSkiplink),\n/* harmony export */ \"useSkiplinkTargetFocusing\": () => (/* reexport safe */ ui_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_2__.useSkiplinkTargetFocusing),\n/* harmony export */ \"useStableCallback\": () => (/* reexport safe */ _utility_hooks__WEBPACK_IMPORTED_MODULE_13__.useStableCallback)\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 _seamly_api_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./seamly-api-hooks */ \"./src/javascripts/ui/hooks/seamly-api-hooks.ts\");\n/* harmony import */ var ui_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ui/hooks/focus-helper-hooks */ \"./src/javascripts/ui/hooks/focus-helper-hooks.js\");\n/* harmony import */ var _component_helper_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./component-helper-hooks */ \"./src/javascripts/ui/hooks/component-helper-hooks.js\");\n/* harmony import */ var _file_upload_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./file-upload-hooks */ \"./src/javascripts/ui/hooks/file-upload-hooks.js\");\n/* harmony import */ var _live_region_hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./live-region-hooks */ \"./src/javascripts/ui/hooks/live-region-hooks.js\");\n/* harmony import */ var _seamly_option_hooks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./seamly-option-hooks */ \"./src/javascripts/ui/hooks/seamly-option-hooks.js\");\n/* harmony import */ var _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.ts\");\n/* harmony import */ var _use_seamly_activity_event_handler__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./use-seamly-activity-event-handler */ \"./src/javascripts/ui/hooks/use-seamly-activity-event-handler.js\");\n/* harmony import */ var _use_seamly_chat__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./use-seamly-chat */ \"./src/javascripts/ui/hooks/use-seamly-chat.ts\");\n/* harmony import */ var _use_seamly_commands__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./use-seamly-commands */ \"./src/javascripts/ui/hooks/use-seamly-commands.js\");\n/* harmony import */ var _use_seamly_idle_detach_countdown__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./use-seamly-idle-detach-countdown */ \"./src/javascripts/ui/hooks/use-seamly-idle-detach-countdown.js\");\n/* harmony import */ var _use_seamly_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./use-seamly-resume-conversation-prompt */ \"./src/javascripts/ui/hooks/use-seamly-resume-conversation-prompt.js\");\n/* harmony import */ var _utility_hooks__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./utility-hooks */ \"./src/javascripts/ui/hooks/utility-hooks.js\");\n\n// Import extracted hooks here for use inside this file\n\n\n// Export extracted hooks here,\n// although this is a redundant, it prevents a bazillion code changes for now.\n// TODO: Remove exports and import them from the correct files\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// This hook isn't used within the core\n// But it is used in implementations\n// and imported directly from this file\n// Please do not remove\nconst useSeamlyEventStream = (nextFn, filterFn) => {\n const api = (0,_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyApiContext)();\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (api.connectionInfo && api.conversation?.channel) {\n const {\n channel\n } = api.conversation;\n channel.onMessage = (type, payload) => {\n if (!filterFn || filterFn({\n type,\n payload\n })) {\n nextFn({\n type,\n payload\n });\n }\n return payload;\n };\n }\n }, [nextFn, filterFn, api.connectionInfo, api.conversation]);\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/seamly-hooks.js?");
1798
1798
 
1799
1799
  /***/ }),
1800
1800
 
@@ -1805,7 +1805,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1805
1805
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1806
1806
 
1807
1807
  "use strict";
1808
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useOptionButton\": () => (/* binding */ useOptionButton),\n/* harmony export */ \"useSeamlyOptions\": () => (/* binding */ useSeamlyOptions)\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_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_2__ = __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_3__ = __webpack_require__(/*! ui/hooks/seamly-api-hooks */ \"./src/javascripts/ui/hooks/seamly-api-hooks.js\");\n/* harmony import */ var ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ui/hooks/seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var domains_store_slice__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! domains/store/slice */ \"./src/javascripts/domains/store/slice.ts\");\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return typeof key === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (typeof input !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (typeof res !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\n\n\n\n\n\n\nconst useSeamlyOptions = () => {\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_5__.useI18n)();\n const {\n options\n } = (0,ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_4__.useSeamlyStateContext)();\n const {\n panelActive,\n optionActive,\n userSelectedOptions,\n features\n } = options;\n const {\n extraMenuItem,\n sendTranscript\n } = features;\n const optionsObj = {\n extraMenuItem,\n sendTranscript\n };\n const menuTitle = option => {\n return option === 'extraMenuItem' ? 'Extra menu item' : t(`options.${option}.menuTitle`);\n };\n const menuOptions = Object.keys(optionsObj).filter(key => {\n return optionsObj[key];\n }).map(option => ({\n name: option,\n title: menuTitle(option),\n available: optionsObj[option].enabled\n }));\n const allowOptionSelection = extraMenuItem || sendTranscript;\n const dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useDispatch)();\n const {\n get,\n set\n } = (0,ui_hooks_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyObjectStore)();\n const initUserSelectedOptions = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n const storedOptions = get('options') || {};\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_6__.setUserSelectedOptions)(storedOptions));\n }, [get, dispatch]);\n const setUserSelectedOptions = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(optionValues => {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_6__.setUserSelectedOptions)(optionValues));\n set('options', optionValues);\n }, [set, dispatch]);\n const setUserSelectedOption = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)((option, value) => {\n const storedOptions = get('options') || {};\n set('options', _objectSpread(_objectSpread({}, storedOptions), {}, {\n [option]: value\n }));\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_6__.setUserSelectedOption)({\n option,\n value\n }));\n }, [dispatch, get, set]);\n const showOption = optionName => {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_6__.showOption)(optionName));\n };\n const hideOption = () => {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_6__.hideOption)());\n };\n return {\n allowOptionSelection,\n userSelectedOptions,\n features,\n menuOptions,\n initUserSelectedOptions,\n setUserSelectedOptions,\n setUserSelectedOption,\n showOption,\n hideOption,\n panelActive,\n optionActive\n };\n};\nconst useOptionButton = () => {\n const {\n optionsButtonId: id\n } = (0,ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_4__.useSeamlyStateContext)();\n const focusButton = (0,ui_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_2__.useElementFocusingById)(id);\n return {\n id,\n focusButton\n };\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/seamly-option-hooks.js?");
1808
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useOptionButton\": () => (/* binding */ useOptionButton),\n/* harmony export */ \"useSeamlyOptions\": () => (/* binding */ useSeamlyOptions)\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_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_2__ = __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_3__ = __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_4__ = __webpack_require__(/*! ui/hooks/seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var domains_store_slice__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! domains/store/slice */ \"./src/javascripts/domains/store/slice.ts\");\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return typeof key === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (typeof input !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (typeof res !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\n\n\n\n\n\n\nconst useSeamlyOptions = () => {\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_5__.useI18n)();\n const {\n options\n } = (0,ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_4__.useSeamlyStateContext)();\n const {\n panelActive,\n optionActive,\n userSelectedOptions,\n features\n } = options;\n const {\n extraMenuItem,\n sendTranscript\n } = features;\n const optionsObj = {\n extraMenuItem,\n sendTranscript\n };\n const menuTitle = option => {\n return option === 'extraMenuItem' ? 'Extra menu item' : t(`options.${option}.menuTitle`);\n };\n const menuOptions = Object.keys(optionsObj).filter(key => {\n return optionsObj[key];\n }).map(option => ({\n name: option,\n title: menuTitle(option),\n available: optionsObj[option].enabled\n }));\n const allowOptionSelection = extraMenuItem || sendTranscript;\n const dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useDispatch)();\n const {\n get,\n set\n } = (0,ui_hooks_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyObjectStore)();\n const initUserSelectedOptions = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n const storedOptions = get('options') || {};\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_6__.setUserSelectedOptions)(storedOptions));\n }, [get, dispatch]);\n const setUserSelectedOptions = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(optionValues => {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_6__.setUserSelectedOptions)(optionValues));\n set('options', optionValues);\n }, [set, dispatch]);\n const setUserSelectedOption = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)((option, value) => {\n const storedOptions = get('options') || {};\n set('options', _objectSpread(_objectSpread({}, storedOptions), {}, {\n [option]: value\n }));\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_6__.setUserSelectedOption)({\n option,\n value\n }));\n }, [dispatch, get, set]);\n const showOption = optionName => {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_6__.showOption)(optionName));\n };\n const hideOption = () => {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_6__.hideOption)());\n };\n return {\n allowOptionSelection,\n userSelectedOptions,\n features,\n menuOptions,\n initUserSelectedOptions,\n setUserSelectedOptions,\n setUserSelectedOption,\n showOption,\n hideOption,\n panelActive,\n optionActive\n };\n};\nconst useOptionButton = () => {\n const {\n optionsButtonId: id\n } = (0,ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_4__.useSeamlyStateContext)();\n const focusButton = (0,ui_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_2__.useElementFocusingById)(id);\n return {\n id,\n focusButton\n };\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/seamly-option-hooks.js?");
1809
1809
 
1810
1810
  /***/ }),
1811
1811
 
@@ -1849,7 +1849,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1849
1849
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1850
1850
 
1851
1851
  "use strict";
1852
- 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 config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! config */ \"./src/javascripts/config.ts\");\n/* harmony import */ var ui_components_core_seamly_api_context__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ui/components/core/seamly-api-context */ \"./src/javascripts/ui/components/core/seamly-api-context.ts\");\n/* harmony import */ var ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.ts\");\n/* harmony import */ var domains_app_actions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! domains/app/actions */ \"./src/javascripts/domains/app/actions.ts\");\n/* harmony import */ var domains_app_hooks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! domains/app/hooks */ \"./src/javascripts/domains/app/hooks.js\");\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_config_hooks__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! domains/config/hooks */ \"./src/javascripts/domains/config/hooks.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_visibility_constants__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! domains/visibility/constants */ \"./src/javascripts/domains/visibility/constants.ts\");\n/* harmony import */ var domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! domains/visibility/hooks */ \"./src/javascripts/domains/visibility/hooks.ts\");\n/* harmony import */ var lib_id__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! lib/id */ \"./src/javascripts/lib/id.js\");\n/* harmony import */ var _seamly_api_hooks__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./seamly-api-hooks */ \"./src/javascripts/ui/hooks/seamly-api-hooks.js\");\n/* harmony import */ var _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.ts\");\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return typeof key === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (typeof input !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (typeof res !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst useSeamlyCommands = () => {\n const api = (0,_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_14__.useSeamlyApiContext)();\n const appConfig = (0,domains_config_hooks__WEBPACK_IMPORTED_MODULE_8__.useConfig)();\n const dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useDispatch)();\n const eventBus = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useContext)(ui_components_core_seamly_api_context__WEBPACK_IMPORTED_MODULE_3__.SeamlyEventBusContext);\n const userHasResponded = (0,domains_app_hooks__WEBPACK_IMPORTED_MODULE_6__.useUserHasResponded)();\n const hasConversation = (0,_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_14__.useSeamlyHasConversation)();\n const {\n visible: visibility,\n setVisibility\n } = (0,domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_12__.useVisibility)();\n const unreadMessageCount = (0,_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_15__.useSeamlyUnreadCount)();\n const emitEvent = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)((...args) => {\n eventBus.emit(...args);\n }, [eventBus]);\n const start = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n api.sendContext(appConfig.context || {});\n emitEvent('ui.beforeStart', {\n visibility,\n hasConversation: hasConversation(),\n hasResponded: userHasResponded,\n unreadMessageCount\n });\n api.send('start');\n emitEvent('ui.start', {\n visibility,\n hasConversation: hasConversation(),\n hasResponded: userHasResponded,\n unreadMessageCount\n });\n }, [api, appConfig.context, emitEvent, hasConversation, userHasResponded, unreadMessageCount, visibility]);\n const reset = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n dispatch(domains_app_actions__WEBPACK_IMPORTED_MODULE_5__.resetApp());\n }, [dispatch]);\n const getMessageBase = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(type => ({\n type,\n id: (0,lib_id__WEBPACK_IMPORTED_MODULE_13__.randomId)(),\n transactionId: (0,lib_id__WEBPACK_IMPORTED_MODULE_13__.randomId)(),\n participant: config__WEBPACK_IMPORTED_MODULE_2__.userParticipantId,\n fromClient: true,\n occurredAt: Date.now() * 1000,\n meta: {}\n }), []);\n const getTextMessageBase = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(bodyText => {\n const base = getMessageBase('text');\n return _objectSpread(_objectSpread({}, base), {}, {\n body: {\n text: bodyText\n }\n });\n }, [getMessageBase]);\n const sendMessage = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n body,\n config = {}\n }) => {\n if (body.trim() === '') {\n return;\n }\n const message = _objectSpread(_objectSpread({}, getTextMessageBase(body)), config);\n api.send('message', message);\n emitEvent('message', message);\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_10__.addEvent)({\n type: 'message',\n payload: _objectSpread(_objectSpread({}, message), {}, {\n optimisticallyInjected: true\n })\n }));\n }, [api, dispatch, emitEvent, getTextMessageBase]);\n const addMessageBubble = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)((text, transactionId = (0,lib_id__WEBPACK_IMPORTED_MODULE_13__.randomId)()) => {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_10__.addEvent)({\n type: 'message',\n payload: _objectSpread(_objectSpread({}, getTextMessageBase(text)), {}, {\n transactionId\n })\n }));\n }, [dispatch, getTextMessageBase]);\n const addUploadBubble = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)((id, transactionId, occurredAt, contentType, filename, filesize, url) => {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_10__.addEvent)({\n type: 'message',\n payload: {\n type: 'upload',\n id,\n transactionId,\n participant: config__WEBPACK_IMPORTED_MODULE_2__.userParticipantId,\n fromClient: true,\n occurredAt,\n meta: {},\n body: {\n contentType,\n filename,\n filesize,\n url\n }\n }\n }));\n }, [dispatch]);\n const addDivider = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)((subtype, transactionId = (0,lib_id__WEBPACK_IMPORTED_MODULE_13__.randomId)()) => {\n const payload = {\n body: {\n subtype,\n type: 'divider'\n },\n fromClient: false,\n fromHistory: true,\n id: (0,lib_id__WEBPACK_IMPORTED_MODULE_13__.randomId)(),\n transactionId,\n type: 'divider'\n };\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_10__.addEvent)({\n type: 'info',\n payload\n }));\n }, [dispatch]);\n const sendAction = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(body => {\n if (!body) {\n return;\n }\n api.send('action', body);\n const {\n type\n } = body;\n if (type !== ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__.actionTypes.typing && type !== ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__.actionTypes.read) {\n emitEvent(`action.${type}`, body);\n }\n }, [api, emitEvent]);\n const sendContext = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(context => {\n api.sendContext(context);\n }, [api]);\n const connect = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n if (api.connected) {\n return Promise.reject(new Error('The API is already connected'));\n }\n return api.connect().then(initialState => {\n if (initialState) {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_10__.setInitialState)(initialState));\n if (initialState.userResponded) {\n dispatch((0,domains_app_slice__WEBPACK_IMPORTED_MODULE_7__.setHasResponded)(initialState.userResponded));\n setVisibility(domains_visibility_constants__WEBPACK_IMPORTED_MODULE_11__.visibilityStates.open);\n }\n }\n }).catch(error => {\n dispatch((0,domains_interrupt_slice__WEBPACK_IMPORTED_MODULE_9__.setInterrupt)({\n name: error?.name,\n message: error?.message,\n langKey: error?.langKey,\n action: error?.action,\n originalEvent: error?.originalEvent,\n originalError: error?.originalError\n }));\n });\n }, [api, dispatch, setVisibility]);\n return {\n connect,\n start,\n sendMessage,\n sendAction,\n sendContext,\n reset,\n emitEvent,\n addMessageBubble,\n addUploadBubble,\n addDivider,\n apiConnected: api.connected,\n apiConfigReady: api.configReady\n };\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (useSeamlyCommands);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/use-seamly-commands.js?");
1852
+ 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 config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! config */ \"./src/javascripts/config.ts\");\n/* harmony import */ var ui_components_core_seamly_api_context__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ui/components/core/seamly-api-context */ \"./src/javascripts/ui/components/core/seamly-api-context.ts\");\n/* harmony import */ var ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.ts\");\n/* harmony import */ var domains_app_actions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! domains/app/actions */ \"./src/javascripts/domains/app/actions.ts\");\n/* harmony import */ var domains_app_hooks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! domains/app/hooks */ \"./src/javascripts/domains/app/hooks.js\");\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_config_hooks__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! domains/config/hooks */ \"./src/javascripts/domains/config/hooks.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_visibility_constants__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! domains/visibility/constants */ \"./src/javascripts/domains/visibility/constants.ts\");\n/* harmony import */ var domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! domains/visibility/hooks */ \"./src/javascripts/domains/visibility/hooks.ts\");\n/* harmony import */ var lib_id__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! lib/id */ \"./src/javascripts/lib/id.js\");\n/* harmony import */ var _seamly_api_hooks__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./seamly-api-hooks */ \"./src/javascripts/ui/hooks/seamly-api-hooks.ts\");\n/* harmony import */ var _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.ts\");\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return typeof key === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (typeof input !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (typeof res !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst useSeamlyCommands = () => {\n const api = (0,_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_14__.useSeamlyApiContext)();\n const appConfig = (0,domains_config_hooks__WEBPACK_IMPORTED_MODULE_8__.useConfig)();\n const dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useDispatch)();\n const eventBus = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useContext)(ui_components_core_seamly_api_context__WEBPACK_IMPORTED_MODULE_3__.SeamlyEventBusContext);\n const userHasResponded = (0,domains_app_hooks__WEBPACK_IMPORTED_MODULE_6__.useUserHasResponded)();\n const hasConversation = (0,_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_14__.useSeamlyHasConversation)();\n const {\n visible: visibility,\n setVisibility\n } = (0,domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_12__.useVisibility)();\n const unreadMessageCount = (0,_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_15__.useSeamlyUnreadCount)();\n const emitEvent = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)((...args) => {\n eventBus.emit(...args);\n }, [eventBus]);\n const start = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n api.sendContext(appConfig.context || {});\n emitEvent('ui.beforeStart', {\n visibility,\n hasConversation: hasConversation(),\n hasResponded: userHasResponded,\n unreadMessageCount\n });\n api.send('start');\n emitEvent('ui.start', {\n visibility,\n hasConversation: hasConversation(),\n hasResponded: userHasResponded,\n unreadMessageCount\n });\n }, [api, appConfig.context, emitEvent, hasConversation, userHasResponded, unreadMessageCount, visibility]);\n const reset = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n dispatch(domains_app_actions__WEBPACK_IMPORTED_MODULE_5__.resetApp());\n }, [dispatch]);\n const getMessageBase = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(type => ({\n type,\n id: (0,lib_id__WEBPACK_IMPORTED_MODULE_13__.randomId)(),\n transactionId: (0,lib_id__WEBPACK_IMPORTED_MODULE_13__.randomId)(),\n participant: config__WEBPACK_IMPORTED_MODULE_2__.userParticipantId,\n fromClient: true,\n occurredAt: Date.now() * 1000,\n meta: {}\n }), []);\n const getTextMessageBase = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(bodyText => {\n const base = getMessageBase('text');\n return _objectSpread(_objectSpread({}, base), {}, {\n body: {\n text: bodyText\n }\n });\n }, [getMessageBase]);\n const sendMessage = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n body,\n config = {}\n }) => {\n if (body.trim() === '') {\n return;\n }\n const message = _objectSpread(_objectSpread({}, getTextMessageBase(body)), config);\n api.send('message', message);\n emitEvent('message', message);\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_10__.addEvent)({\n type: 'message',\n payload: _objectSpread(_objectSpread({}, message), {}, {\n optimisticallyInjected: true\n })\n }));\n }, [api, dispatch, emitEvent, getTextMessageBase]);\n const addMessageBubble = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)((text, transactionId = (0,lib_id__WEBPACK_IMPORTED_MODULE_13__.randomId)()) => {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_10__.addEvent)({\n type: 'message',\n payload: _objectSpread(_objectSpread({}, getTextMessageBase(text)), {}, {\n transactionId\n })\n }));\n }, [dispatch, getTextMessageBase]);\n const addUploadBubble = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)((id, transactionId, occurredAt, contentType, filename, filesize, url) => {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_10__.addEvent)({\n type: 'message',\n payload: {\n type: 'upload',\n id,\n transactionId,\n participant: config__WEBPACK_IMPORTED_MODULE_2__.userParticipantId,\n fromClient: true,\n occurredAt,\n meta: {},\n body: {\n contentType,\n filename,\n filesize,\n url\n }\n }\n }));\n }, [dispatch]);\n const addDivider = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)((subtype, transactionId = (0,lib_id__WEBPACK_IMPORTED_MODULE_13__.randomId)()) => {\n const payload = {\n body: {\n subtype,\n type: 'divider'\n },\n fromClient: false,\n fromHistory: true,\n id: (0,lib_id__WEBPACK_IMPORTED_MODULE_13__.randomId)(),\n transactionId,\n type: 'divider'\n };\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_10__.addEvent)({\n type: 'info',\n payload\n }));\n }, [dispatch]);\n const sendAction = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(body => {\n if (!body) {\n return;\n }\n api.send('action', body);\n const {\n type\n } = body;\n if (type !== ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__.actionTypes.typing && type !== ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__.actionTypes.read) {\n emitEvent(`action.${type}`, body);\n }\n }, [api, emitEvent]);\n const sendContext = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(context => {\n api.sendContext(context);\n }, [api]);\n const connect = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n if (api.connected) {\n return Promise.reject(new Error('The API is already connected'));\n }\n return api.connect().then(initialState => {\n if (initialState) {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_10__.setInitialState)(initialState));\n if (initialState.userResponded) {\n dispatch((0,domains_app_slice__WEBPACK_IMPORTED_MODULE_7__.setHasResponded)(initialState.userResponded));\n setVisibility(domains_visibility_constants__WEBPACK_IMPORTED_MODULE_11__.visibilityStates.open);\n }\n }\n }).catch(error => {\n dispatch((0,domains_interrupt_slice__WEBPACK_IMPORTED_MODULE_9__.setInterrupt)({\n name: error?.name,\n message: error?.message,\n langKey: error?.langKey,\n action: error?.action,\n originalEvent: error?.originalEvent,\n originalError: error?.originalError\n }));\n });\n }, [api, dispatch, setVisibility]);\n return {\n connect,\n start,\n sendMessage,\n sendAction,\n sendContext,\n reset,\n emitEvent,\n addMessageBubble,\n addUploadBubble,\n addDivider,\n apiConnected: api.connected,\n apiConfigReady: api.configReady\n };\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (useSeamlyCommands);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/use-seamly-commands.js?");
1853
1853
 
1854
1854
  /***/ }),
1855
1855
 
@@ -3371,7 +3371,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
3371
3371
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3372
3372
 
3373
3373
  "use strict";
3374
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ FormProvider)\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 react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-redux */ \"./node_modules/react-redux/es/index.js\");\n/* harmony import */ var domains_app_slice__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! domains/app/slice */ \"./src/javascripts/domains/app/slice.ts\");\n/* harmony import */ var domains_forms_context__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! domains/forms/context */ \"./src/javascripts/domains/forms/context.ts\");\n/* harmony import */ var domains_forms_hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! domains/forms/hooks */ \"./src/javascripts/domains/forms/hooks.ts\");\n/* harmony import */ var domains_forms_selectors__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! domains/forms/selectors */ \"./src/javascripts/domains/forms/selectors.ts\");\n/* harmony import */ var domains_forms_slice__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! domains/forms/slice */ \"./src/javascripts/domains/forms/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)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n 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]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\n\n\n\n\n\n\n\n\nfunction FormProvider(_a) {\n var { children, formId, persistData, onError, onSubmit, validationSchema } = _a, props = __rest(_a, [\"children\", \"formId\", \"persistData\", \"onError\", \"onSubmit\", \"validationSchema\"]);\n const dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.useDispatch)();\n const values = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.useSelector)((store) => (0,domains_forms_selectors__WEBPACK_IMPORTED_MODULE_6__.getFormValuesByFormId)(store, { formId }));\n const [isSubmitted, setIsSubmitted] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const [externalErrors, setExternalErrors] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useState)({});\n const { isValid: validationIsValid, errors: validationErrors } = (0,domains_forms_hooks__WEBPACK_IMPORTED_MODULE_5__.useValidations)(values, validationSchema);\n const errors = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useMemo)(() => (Object.assign(Object.assign({}, validationErrors), externalErrors)), [validationErrors, externalErrors]);\n // register\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useLayoutEffect)(() => {\n // register form in redux store\n dispatch((0,domains_forms_slice__WEBPACK_IMPORTED_MODULE_7__.registerForm)({ formId, persistData }));\n }, [formId, persistData, dispatch]);\n // deregister\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {\n return () => {\n // deregister form from redux store\n dispatch((0,domains_forms_slice__WEBPACK_IMPORTED_MODULE_7__.deregisterForm)({ formId }));\n };\n }, [formId, persistData, dispatch]);\n const updateControlValue = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useCallback)((name, value) => {\n dispatch((0,domains_forms_slice__WEBPACK_IMPORTED_MODULE_7__.updateControlValue)({ formId, name, value }));\n }, [formId, dispatch]);\n const updateControlTouched = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useCallback)((name, touched) => {\n dispatch((0,domains_forms_slice__WEBPACK_IMPORTED_MODULE_7__.updateControlTouched)({ formId, name, touched }));\n }, [dispatch, formId]);\n // Function to manually set an error\n const setError = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useCallback)((name, error) => {\n setExternalErrors((val) => {\n return Object.assign(Object.assign({}, val), { [name]: error });\n });\n }, [setExternalErrors]);\n const handleSubmit = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useCallback)((e) => {\n var _a;\n e.preventDefault();\n // If the submitter is set to being aria-disabled, block the submit action\n const ariaDisabled = ((_a = e.submitter) === null || _a === void 0 ? void 0 : _a.ariaDisabled) === 'true';\n setIsSubmitted(!ariaDisabled);\n if (!ariaDisabled && validationIsValid) {\n dispatch((0,domains_app_slice__WEBPACK_IMPORTED_MODULE_3__.setHasResponded)(true));\n onSubmit(values, { updateControlValue, setError });\n }\n }, [\n validationIsValid,\n dispatch,\n onSubmit,\n values,\n updateControlValue,\n setError,\n ]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {\n if (onError) {\n onError({\n errors,\n isSubmitted,\n isValid: Object.keys(errors).length === 0,\n });\n }\n }, [isSubmitted, errors, onError]);\n const contextValue = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useMemo)(() => ({\n formId,\n values,\n errors,\n isValid: Object.keys(errors).length === 0,\n isSubmitted,\n handleSubmit,\n validationSchema,\n updateControlValue,\n updateControlTouched,\n }), [\n formId,\n values,\n errors,\n isSubmitted,\n handleSubmit,\n validationSchema,\n updateControlValue,\n updateControlTouched,\n ]);\n if (!formId) {\n console.error('\"formId\" is required.');\n return null;\n }\n if (!onSubmit) {\n console.error('\"onSubmit\" is required.');\n return null;\n }\n return ((0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(domains_forms_context__WEBPACK_IMPORTED_MODULE_4__.Provider, Object.assign({}, props, { value: contextValue }, { children: children })));\n}\n\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/forms/provider.tsx?");
3374
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ FormProvider)\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 react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-redux */ \"./node_modules/react-redux/es/index.js\");\n/* harmony import */ var domains_app_slice__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! domains/app/slice */ \"./src/javascripts/domains/app/slice.ts\");\n/* harmony import */ var domains_forms_context__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! domains/forms/context */ \"./src/javascripts/domains/forms/context.ts\");\n/* harmony import */ var domains_forms_hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! domains/forms/hooks */ \"./src/javascripts/domains/forms/hooks.ts\");\n/* harmony import */ var domains_forms_selectors__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! domains/forms/selectors */ \"./src/javascripts/domains/forms/selectors.ts\");\n/* harmony import */ var domains_forms_slice__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! domains/forms/slice */ \"./src/javascripts/domains/forms/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)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n 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]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\n\n\n\n\n\n\n\n\nfunction FormProvider(_a) {\n var { children, formId, persistData, onError, onSubmit, validationSchema } = _a, props = __rest(_a, [\"children\", \"formId\", \"persistData\", \"onError\", \"onSubmit\", \"validationSchema\"]);\n const dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.useDispatch)();\n const values = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.useSelector)((store) => (0,domains_forms_selectors__WEBPACK_IMPORTED_MODULE_6__.getFormValuesByFormId)(store, { formId }));\n const [isSubmitted, setIsSubmitted] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const [externalErrors, setExternalErrors] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useState)({});\n const { isValid: validationIsValid, errors: validationErrors } = (0,domains_forms_hooks__WEBPACK_IMPORTED_MODULE_5__.useValidations)(values, validationSchema);\n const errors = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useMemo)(() => (Object.assign(Object.assign({}, validationErrors), externalErrors)), [validationErrors, externalErrors]);\n // register\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useLayoutEffect)(() => {\n // register form in redux store\n dispatch((0,domains_forms_slice__WEBPACK_IMPORTED_MODULE_7__.registerForm)({ formId, persistData }));\n }, [formId, persistData, dispatch]);\n // deregister\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {\n return () => {\n // deregister form from redux store\n dispatch((0,domains_forms_slice__WEBPACK_IMPORTED_MODULE_7__.deregisterForm)({ formId }));\n };\n }, [formId, persistData, dispatch]);\n const updateControlValue = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useCallback)((name, value) => {\n dispatch((0,domains_forms_slice__WEBPACK_IMPORTED_MODULE_7__.updateControlValue)({ formId, name, value }));\n }, [formId, dispatch]);\n const updateControlTouched = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useCallback)((name, touched) => {\n dispatch((0,domains_forms_slice__WEBPACK_IMPORTED_MODULE_7__.updateControlTouched)({ formId, name, touched }));\n }, [dispatch, formId]);\n // Function to manually set an error\n const setError = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useCallback)((name, error) => {\n setExternalErrors((val) => {\n return Object.assign(Object.assign({}, val), { [name]: error });\n });\n }, [setExternalErrors]);\n const handleSubmit = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useCallback)((e) => {\n e.preventDefault();\n // If the submitter is set to being aria-disabled, block the submit action\n const ariaDisabled = e.submitter.getAttribute('aria-disabled') === 'true';\n setIsSubmitted(!ariaDisabled);\n if (!ariaDisabled && validationIsValid) {\n dispatch((0,domains_app_slice__WEBPACK_IMPORTED_MODULE_3__.setHasResponded)(true));\n onSubmit(values, { updateControlValue, setError });\n }\n }, [\n validationIsValid,\n dispatch,\n onSubmit,\n values,\n updateControlValue,\n setError,\n ]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {\n if (onError) {\n onError({\n errors,\n isSubmitted,\n isValid: Object.keys(errors).length === 0,\n });\n }\n }, [isSubmitted, errors, onError]);\n const contextValue = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useMemo)(() => ({\n formId,\n values,\n errors,\n isValid: Object.keys(errors).length === 0,\n isSubmitted,\n handleSubmit,\n validationSchema,\n updateControlValue,\n updateControlTouched,\n }), [\n formId,\n values,\n errors,\n isSubmitted,\n handleSubmit,\n validationSchema,\n updateControlValue,\n updateControlTouched,\n ]);\n if (!formId) {\n console.error('\"formId\" is required.');\n return null;\n }\n if (!onSubmit) {\n console.error('\"onSubmit\" is required.');\n return null;\n }\n return ((0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(domains_forms_context__WEBPACK_IMPORTED_MODULE_4__.Provider, Object.assign({}, props, { value: contextValue }, { children: children })));\n}\n\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/forms/provider.tsx?");
3375
3375
 
3376
3376
  /***/ }),
3377
3377
 
@@ -3558,7 +3558,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
3558
3558
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3559
3559
 
3560
3560
  "use strict";
3561
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AbortTransactionButton)\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 ui_hooks_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ui/hooks/seamly-api-hooks */ \"./src/javascripts/ui/hooks/seamly-api-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 _text_entry_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../text-entry/hooks */ \"./src/javascripts/ui/components/entry/text-entry/hooks.ts\");\n\n\n\n\n\nfunction AbortTransactionButton() {\n const { abortTransaction, clearEntryAbortTransaction } = (0,_text_entry_hooks__WEBPACK_IMPORTED_MODULE_4__.useEntryAbortTransaction)();\n const api = (0,ui_hooks_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyApiContext)();\n if (!abortTransaction)\n return null;\n const handleAbortTransaction = () => {\n api.send('action', {\n type: ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__.actionTypes.setTopic,\n body: {\n name: abortTransaction.topicName,\n fallbackMessage: abortTransaction.topicFallbackMessage,\n },\n });\n clearEntryAbortTransaction();\n };\n return ((0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"li\", Object.assign({ className: (0,lib_css__WEBPACK_IMPORTED_MODULE_3__.className)([\n 'cvco-conversation__item',\n 'cvco-conversation__item--abort-transaction',\n ]) }, { children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"button\", Object.assign({ className: (0,lib_css__WEBPACK_IMPORTED_MODULE_3__.className)([\n 'button',\n 'button--secondary',\n 'abort-transaction__button',\n ]), type: \"button\", onClick: handleAbortTransaction }, { children: abortTransaction.label })) })));\n}\n\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/entry/abort-transaction-button/abort-transaction-button.tsx?");
3561
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AbortTransactionButton)\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 ui_hooks_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ui/hooks/seamly-api-hooks */ \"./src/javascripts/ui/hooks/seamly-api-hooks.ts\");\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 _text_entry_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../text-entry/hooks */ \"./src/javascripts/ui/components/entry/text-entry/hooks.ts\");\n\n\n\n\n\nfunction AbortTransactionButton() {\n const { abortTransaction, clearEntryAbortTransaction } = (0,_text_entry_hooks__WEBPACK_IMPORTED_MODULE_4__.useEntryAbortTransaction)();\n const api = (0,ui_hooks_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyApiContext)();\n if (!abortTransaction)\n return null;\n const handleAbortTransaction = () => {\n api.send('action', {\n type: ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__.actionTypes.setTopic,\n body: {\n name: abortTransaction.topicName,\n fallbackMessage: abortTransaction.topicFallbackMessage,\n },\n });\n clearEntryAbortTransaction();\n };\n return ((0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"li\", Object.assign({ className: (0,lib_css__WEBPACK_IMPORTED_MODULE_3__.className)([\n 'cvco-conversation__item',\n 'cvco-conversation__item--abort-transaction',\n ]) }, { children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"button\", Object.assign({ className: (0,lib_css__WEBPACK_IMPORTED_MODULE_3__.className)([\n 'button',\n 'button--secondary',\n 'abort-transaction__button',\n ]), type: \"button\", onClick: handleAbortTransaction }, { children: abortTransaction.label })) })));\n}\n\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/entry/abort-transaction-button/abort-transaction-button.tsx?");
3562
3562
 
3563
3563
  /***/ }),
3564
3564