@seamly/web-ui 20.8.0-alpha.1 → 20.8.0-beta.2

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 (48) hide show
  1. package/build/dist/lib/index.debug.js +48 -48
  2. package/build/dist/lib/index.debug.min.js +1 -1
  3. package/build/dist/lib/index.debug.min.js.LICENSE.txt +1 -1
  4. package/build/dist/lib/index.js +364 -284
  5. package/build/dist/lib/index.min.js +1 -1
  6. package/build/dist/lib/standalone.js +551 -274
  7. package/build/dist/lib/standalone.min.js +1 -1
  8. package/build/dist/lib/style-guide.js +166 -85
  9. package/build/dist/lib/style-guide.min.js +1 -1
  10. package/build/dist/lib/styles.css +1 -1
  11. package/package.json +1 -1
  12. package/src/javascripts/config.types.ts +1 -0
  13. package/src/javascripts/domains/app/actions.ts +45 -41
  14. package/src/javascripts/domains/config/slice.ts +2 -0
  15. package/src/javascripts/domains/i18n/slice.ts +0 -3
  16. package/src/javascripts/domains/store/slice.ts +23 -15
  17. package/src/javascripts/domains/store/store.types.ts +12 -1
  18. package/src/javascripts/domains/translations/hooks.ts +54 -48
  19. package/src/javascripts/domains/translations/selectors.ts +12 -0
  20. package/src/javascripts/domains/translations/slice.ts +70 -23
  21. package/src/javascripts/domains/translations/translations.types.ts +8 -1
  22. package/src/javascripts/schema.ts +3 -10
  23. package/src/javascripts/style-guide/components/app.js +2 -2
  24. package/src/javascripts/style-guide/states.js +61 -3
  25. package/src/javascripts/ui/components/conversation/conversation.js +7 -3
  26. package/src/javascripts/ui/components/conversation/event/card-message.js +1 -1
  27. package/src/javascripts/ui/components/conversation/event/carousel-message/index.js +1 -1
  28. package/src/javascripts/ui/components/conversation/event/choice-prompt.js +1 -1
  29. package/src/javascripts/ui/components/conversation/event/conversation-suggestions.js +9 -2
  30. package/src/javascripts/ui/components/conversation/event/cta.js +1 -1
  31. package/src/javascripts/ui/components/conversation/event/divider/variants/new-translation.js +39 -3
  32. package/src/javascripts/ui/components/conversation/event/image.js +1 -1
  33. package/src/javascripts/ui/components/conversation/event/participant.js +1 -1
  34. package/src/javascripts/ui/components/conversation/event/splash.js +1 -1
  35. package/src/javascripts/ui/components/conversation/event/text.js +1 -1
  36. package/src/javascripts/ui/components/conversation/event/translation.js +1 -1
  37. package/src/javascripts/ui/components/conversation/event/upload.js +1 -1
  38. package/src/javascripts/ui/components/conversation/event/video.js +1 -1
  39. package/src/javascripts/ui/components/conversation/message-container.js +1 -23
  40. package/src/javascripts/ui/components/core/seamly-event-subscriber.js +3 -2
  41. package/src/javascripts/ui/components/faq/faq.js +3 -1
  42. package/src/javascripts/ui/components/options/options-button.js +3 -1
  43. package/src/javascripts/ui/components/suggestions/index.js +5 -2
  44. package/src/javascripts/ui/hooks/seamly-state-hooks.js +6 -0
  45. package/src/javascripts/ui/hooks/use-seamly-chat.js +3 -9
  46. package/src/stylesheets/5-components/_message-carousel.scss +10 -8
  47. package/CHANGELOG.md +0 -987
  48. package/src/javascripts/domains/translations/selectors.js +0 -11
@@ -201,7 +201,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));
201
201
  /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
202
202
 
203
203
  "use strict";
204
- eval("\n\nvar __awaiter = this && this.__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\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\n function rejected(value) {\n try {\n step(generator[\"throw\"](value));\n } catch (e) {\n reject(e);\n }\n }\n\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\nvar __importDefault = this && this.__importDefault || function (mod) {\n return mod && mod.__esModule ? mod : {\n \"default\": mod\n };\n};\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports.resetApp = exports.initializeApp = void 0;\n\nconst toolkit_1 = __webpack_require__(/*! @reduxjs/toolkit */ \"./node_modules/@reduxjs/toolkit/dist/redux-toolkit.esm.js\");\n\nconst seamly_session_expired_error_1 = __importDefault(__webpack_require__(/*! api/errors/seamly-session-expired-error */ \"./src/javascripts/api/errors/seamly-session-expired-error.js\"));\n\nconst seamly_unavailable_error_1 = __importDefault(__webpack_require__(/*! api/errors/seamly-unavailable-error */ \"./src/javascripts/api/errors/seamly-unavailable-error.js\"));\n\nconst actions_1 = __webpack_require__(/*! domains/config/actions */ \"./src/javascripts/domains/config/actions.ts\");\n\nconst actions_2 = __webpack_require__(/*! domains/visibility/actions */ \"./src/javascripts/domains/visibility/actions.ts\");\n\nconst seamly_utils_1 = __webpack_require__(/*! ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.ts\");\n\nexports.initializeApp = (0, toolkit_1.createAsyncThunk)('initializeApp', (_, {\n extra: {\n api,\n config\n },\n rejectWithValue\n}) => __awaiter(void 0, void 0, void 0, function* () {\n var _a, _b, _c, _d;\n\n let locale = (_a = config === null || config === void 0 ? void 0 : config.context) === null || _a === void 0 ? void 0 : _a.locale;\n\n try {\n if (api.hasConversation()) {\n const initialState = yield api.getConversationIntitialState();\n locale = ((_b = initialState.translation) === null || _b === void 0 ? void 0 : _b.locale) || locale;\n return {\n initialState,\n locale,\n config\n };\n } else {\n if ((_c = config === null || config === void 0 ? void 0 : config.context) === null || _c === void 0 ? void 0 : _c.topic) {\n api.send('action', {\n type: seamly_utils_1.actionTypes.setTopic,\n body: {\n name: config.context.topic,\n // Separate fallback message is not needed here. Only an attached service will use this, but none will\n // be attached before the conversation has started (meaning the fallback message will never be shown).\n fallbackMessage: config.context.topic\n }\n });\n }\n\n if ((_d = config === null || config === void 0 ? void 0 : config.context) === null || _d === void 0 ? void 0 : _d.translationLocale) {\n locale = config.context.translationLocale;\n api.send('action', {\n type: seamly_utils_1.actionTypes.setTranslation,\n body: {\n enabled: true,\n locale\n }\n });\n }\n\n return {\n initialState: undefined,\n locale,\n config\n };\n }\n } catch (e) {\n if (e instanceof seamly_session_expired_error_1.default) {\n const err = new seamly_session_expired_error_1.default();\n return rejectWithValue({\n name: err.name,\n message: err.message,\n originalEvent: err.originalEvent,\n originalError: err.originalError,\n action: err.action\n });\n }\n\n const err = new seamly_unavailable_error_1.default();\n return rejectWithValue({\n name: err.name,\n message: err.message,\n langKey: err.langKey\n });\n }\n}));\nexports.resetApp = (0, toolkit_1.createAsyncThunk)('resetApp', (_, {\n dispatch,\n extra: {\n api\n }\n}) => __awaiter(void 0, void 0, void 0, function* () {\n yield api.disconnect();\n yield api.clearStore();\n dispatch((0, actions_1.resetConfig)());\n yield dispatch((0, actions_1.initializeConfig)());\n yield dispatch((0, exports.initializeApp)());\n dispatch((0, actions_2.initializeVisibility)());\n}));\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/app/actions.ts?");
204
+ eval("\n\nvar __awaiter = this && this.__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\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\n function rejected(value) {\n try {\n step(generator[\"throw\"](value));\n } catch (e) {\n reject(e);\n }\n }\n\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\nvar __importDefault = this && this.__importDefault || function (mod) {\n return mod && mod.__esModule ? mod : {\n \"default\": mod\n };\n};\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports.resetApp = exports.initializeApp = void 0;\n\nconst toolkit_1 = __webpack_require__(/*! @reduxjs/toolkit */ \"./node_modules/@reduxjs/toolkit/dist/redux-toolkit.esm.js\");\n\nconst seamly_session_expired_error_1 = __importDefault(__webpack_require__(/*! api/errors/seamly-session-expired-error */ \"./src/javascripts/api/errors/seamly-session-expired-error.js\"));\n\nconst seamly_unavailable_error_1 = __importDefault(__webpack_require__(/*! api/errors/seamly-unavailable-error */ \"./src/javascripts/api/errors/seamly-unavailable-error.js\"));\n\nconst actions_1 = __webpack_require__(/*! domains/config/actions */ \"./src/javascripts/domains/config/actions.ts\");\n\nconst actions_2 = __webpack_require__(/*! domains/i18n/actions */ \"./src/javascripts/domains/i18n/actions.ts\");\n\nconst actions_3 = __webpack_require__(/*! domains/visibility/actions */ \"./src/javascripts/domains/visibility/actions.ts\");\n\nconst seamly_utils_1 = __webpack_require__(/*! ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.ts\");\n\nexports.initializeApp = (0, toolkit_1.createAsyncThunk)('initializeApp', (_, {\n extra: {\n api,\n config\n },\n rejectWithValue,\n dispatch\n}) => __awaiter(void 0, void 0, void 0, function* () {\n var _a, _b, _c, _d;\n\n let locale = (_a = config === null || config === void 0 ? void 0 : config.context) === null || _a === void 0 ? void 0 : _a.locale;\n\n try {\n if (api.hasConversation()) {\n const initialState = yield api.getConversationIntitialState();\n locale = ((_b = initialState.translation) === null || _b === void 0 ? void 0 : _b.locale) || locale;\n return {\n initialState,\n locale,\n config\n };\n } else {\n if ((_c = config === null || config === void 0 ? void 0 : config.context) === null || _c === void 0 ? void 0 : _c.topic) {\n api.send('action', {\n type: seamly_utils_1.actionTypes.setTopic,\n body: {\n name: config.context.topic,\n // Separate fallback message is not needed here. Only an attached service will use this, but none will\n // be attached before the conversation has started (meaning the fallback message will never be shown).\n fallbackMessage: config.context.topic\n }\n });\n }\n\n if ((_d = config === null || config === void 0 ? void 0 : config.context) === null || _d === void 0 ? void 0 : _d.translationLocale) {\n locale = config.context.translationLocale;\n api.send('action', {\n type: seamly_utils_1.actionTypes.setTranslation,\n body: {\n enabled: true,\n locale\n }\n });\n }\n\n dispatch((0, actions_2.setLocale)(locale));\n return {\n initialState: undefined,\n locale,\n config\n };\n }\n } catch (e) {\n if (e instanceof seamly_session_expired_error_1.default) {\n const err = new seamly_session_expired_error_1.default();\n return rejectWithValue({\n name: err.name,\n message: err.message,\n originalEvent: err.originalEvent,\n originalError: err.originalError,\n action: err.action\n });\n }\n\n const err = new seamly_unavailable_error_1.default();\n return rejectWithValue({\n name: err.name,\n message: err.message,\n langKey: err.langKey\n });\n }\n}));\nexports.resetApp = (0, toolkit_1.createAsyncThunk)('resetApp', (_, {\n dispatch,\n extra: {\n api\n }\n}) => __awaiter(void 0, void 0, void 0, function* () {\n yield api.disconnect();\n yield api.clearStore();\n dispatch((0, actions_1.resetConfig)());\n yield dispatch((0, actions_1.initializeConfig)());\n yield dispatch((0, exports.initializeApp)());\n dispatch((0, actions_3.initializeVisibility)());\n}));\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/app/actions.ts?");
205
205
 
206
206
  /***/ }),
207
207
 
@@ -267,7 +267,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));
267
267
  /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
268
268
 
269
269
  "use strict";
270
- eval("\n\nvar __rest = this && this.__rest || function (s, e) {\n var t = {};\n\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n }\n return t;\n};\n\nvar _a;\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports.setPreChatEvents = exports.updateConfig = exports.setConfig = exports.configSlice = exports.initialConfigState = void 0;\n\nconst toolkit_1 = __webpack_require__(/*! @reduxjs/toolkit */ \"./node_modules/@reduxjs/toolkit/dist/redux-toolkit.esm.js\");\n\nconst config_1 = __webpack_require__(/*! config */ \"./src/javascripts/config.ts\");\n\nconst actions_1 = __webpack_require__(/*! domains/config/actions */ \"./src/javascripts/domains/config/actions.ts\");\n\nconst general_utils_1 = __webpack_require__(/*! ui/utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n\nexports.initialConfigState = Object.assign(Object.assign({}, config_1.defaultConfig), {\n api: {\n domain: '',\n key: '',\n secure: true\n },\n hideOnNoUserResponse: false,\n connectWhenInView: true,\n showDisclaimer: false,\n showFaq: false,\n customComponents: {},\n defaults: {\n visible: null\n },\n preChatEvents: []\n});\nconst configKeys = ['hideOnNoUserResponse', 'connectWhenInView', 'showDisclaimer', 'showFaq', 'namespace', 'customComponents', 'defaults', 'layoutMode', 'api', 'zIndex', 'context', 'appContainerClassNames', 'messages', 'visible', 'visibilityCallback', 'errorCallback', 'agentParticipant', 'userParticipant', 'startChatIcon'];\n\nconst updateState = (state, config) => {\n const _a = (0, general_utils_1.pick)(config, configKeys),\n {\n messages\n } = _a,\n partialConfig = __rest(_a, [\"messages\"]);\n\n let newState = state;\n\n if (Object.keys(partialConfig).length > 0) {\n newState = Object.assign(Object.assign({}, newState), partialConfig);\n }\n\n if (messages) {\n newState = Object.assign(Object.assign({}, newState), {\n messages: Object.assign(Object.assign({}, newState.messages), messages)\n });\n }\n\n return newState;\n};\n\nexports.configSlice = (0, toolkit_1.createSlice)({\n name: 'config',\n initialState: exports.initialConfigState,\n reducers: {\n setConfig: (state, {\n payload\n }) => updateState(state, payload),\n updateConfig: (state, {\n payload\n }) => updateState(state, payload),\n setPreChatEvents: (state, {\n payload: {\n events\n }\n }) => {\n state.preChatEvents = events;\n }\n },\n extraReducers: builder => {\n builder.addCase(actions_1.resetConfig.fulfilled, config => config).addCase(actions_1.initializeConfig.fulfilled, (state, {\n payload: {\n preChat,\n agentParticipant,\n userParticipant,\n startChatIcon\n }\n }) => {\n state.preChatEvents = preChat.map(payload => ({\n type: 'message',\n payload\n }));\n state.agentParticipant = agentParticipant;\n state.userParticipant = userParticipant;\n state.startChatIcon = startChatIcon;\n });\n }\n});\n_a = exports.configSlice.actions, exports.setConfig = _a.setConfig, exports.updateConfig = _a.updateConfig, exports.setPreChatEvents = _a.setPreChatEvents;\nexports[\"default\"] = exports.configSlice.reducer;\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/config/slice.ts?");
270
+ eval("\n\nvar __rest = this && this.__rest || function (s, e) {\n var t = {};\n\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n }\n return t;\n};\n\nvar _a;\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports.setPreChatEvents = exports.updateConfig = exports.setConfig = exports.configSlice = exports.initialConfigState = void 0;\n\nconst toolkit_1 = __webpack_require__(/*! @reduxjs/toolkit */ \"./node_modules/@reduxjs/toolkit/dist/redux-toolkit.esm.js\");\n\nconst config_1 = __webpack_require__(/*! config */ \"./src/javascripts/config.ts\");\n\nconst actions_1 = __webpack_require__(/*! domains/config/actions */ \"./src/javascripts/domains/config/actions.ts\");\n\nconst general_utils_1 = __webpack_require__(/*! ui/utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n\nexports.initialConfigState = Object.assign(Object.assign({}, config_1.defaultConfig), {\n api: {\n domain: '',\n key: '',\n secure: true\n },\n hideOnNoUserResponse: false,\n connectWhenInView: true,\n showDisclaimer: false,\n showFaq: false,\n showSuggestions: true,\n customComponents: {},\n defaults: {\n visible: null\n },\n preChatEvents: []\n});\nconst configKeys = ['hideOnNoUserResponse', 'connectWhenInView', 'showDisclaimer', 'showFaq', 'showSuggestions', 'namespace', 'customComponents', 'defaults', 'layoutMode', 'api', 'zIndex', 'context', 'appContainerClassNames', 'messages', 'visible', 'visibilityCallback', 'errorCallback', 'agentParticipant', 'userParticipant', 'startChatIcon'];\n\nconst updateState = (state, config) => {\n const _a = (0, general_utils_1.pick)(config, configKeys),\n {\n messages\n } = _a,\n partialConfig = __rest(_a, [\"messages\"]);\n\n let newState = state;\n\n if (Object.keys(partialConfig).length > 0) {\n newState = Object.assign(Object.assign({}, newState), partialConfig);\n }\n\n if (messages) {\n newState = Object.assign(Object.assign({}, newState), {\n messages: Object.assign(Object.assign({}, newState.messages), messages)\n });\n }\n\n return newState;\n};\n\nexports.configSlice = (0, toolkit_1.createSlice)({\n name: 'config',\n initialState: exports.initialConfigState,\n reducers: {\n setConfig: (state, {\n payload\n }) => updateState(state, payload),\n updateConfig: (state, {\n payload\n }) => updateState(state, payload),\n setPreChatEvents: (state, {\n payload: {\n events\n }\n }) => {\n state.preChatEvents = events;\n }\n },\n extraReducers: builder => {\n builder.addCase(actions_1.resetConfig.fulfilled, config => config).addCase(actions_1.initializeConfig.fulfilled, (state, {\n payload: {\n preChat,\n agentParticipant,\n userParticipant,\n startChatIcon\n }\n }) => {\n state.preChatEvents = preChat.map(payload => ({\n type: 'message',\n payload\n }));\n state.agentParticipant = agentParticipant;\n state.userParticipant = userParticipant;\n state.startChatIcon = startChatIcon;\n });\n }\n});\n_a = exports.configSlice.actions, exports.setConfig = _a.setConfig, exports.updateConfig = _a.updateConfig, exports.setPreChatEvents = _a.setPreChatEvents;\nexports[\"default\"] = exports.configSlice.reducer;\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/config/slice.ts?");
271
271
 
272
272
  /***/ }),
273
273
 
@@ -366,7 +366,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));
366
366
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
367
367
 
368
368
  "use strict";
369
- eval("\n\nvar _a;\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports.setTranslations = exports.setInitialLocale = exports.i18nSlice = void 0;\n\nconst toolkit_1 = __webpack_require__(/*! @reduxjs/toolkit */ \"./node_modules/@reduxjs/toolkit/dist/redux-toolkit.esm.js\");\n\nconst actions_1 = __webpack_require__(/*! domains/app/actions */ \"./src/javascripts/domains/app/actions.ts\");\n\nconst actions_2 = __webpack_require__(/*! domains/config/actions */ \"./src/javascripts/domains/config/actions.ts\");\n\nconst actions_3 = __webpack_require__(/*! domains/i18n/actions */ \"./src/javascripts/domains/i18n/actions.ts\");\n\nconst initialState = {\n translations: {\n 'errors.configError.message': 'We are sorry this happened, please retry at a later time.',\n 'errors.configError.srText': 'A chat configuration error occurred. Our apologies, please retry at a later time.',\n 'errors.configError.title': 'Chat configuration error.',\n 'errors.general.buttonText': 'Restart chat',\n 'errors.general.message': 'Do you want to start a new chat session?',\n 'errors.general.srText': 'Something went wrong with the chat session. You can restart the chat.',\n 'errors.general.title': 'Something went wrong',\n 'errors.seamlyOffline.message': 'There might be a problem with your or our network connection. The chat session should resume as soon the connection is available again.',\n 'errors.seamlyOffline.srText': 'The chat has connection issues. There might be a problem with your or our network connection. The chat session should resume as soon as the connection is available again.',\n 'errors.seamlyOffline.title': 'Connection issues',\n 'errors.seamlyUnavailable.buttonText': 'Try again',\n 'errors.seamlyUnavailable.message': 'The server could not be reached. Try again in a little while.',\n 'errors.seamlyUnavailable.srText': 'The chat server could not be reached. Try again in a little while.',\n 'errors.seamlyUnavailable.title': 'Server unavailable'\n },\n isLoading: false,\n initialLocale: undefined,\n locale: undefined\n};\nexports.i18nSlice = (0, toolkit_1.createSlice)({\n name: 'app',\n initialState,\n reducers: {\n setInitialLocale: (state, action) => {\n state.initialLocale = action.payload;\n },\n setTranslations: (state, {\n payload\n }) => {\n state.translations = payload;\n }\n },\n extraReducers: builder => {\n // Add reducers for additional action types here, and handle loading state as needed\n builder.addCase(actions_2.initializeConfig.fulfilled, (state, {\n payload\n }) => {\n state.initialLocale = payload.locale;\n }).addCase(actions_1.initializeApp.fulfilled, (state, {\n payload\n }) => {\n state.locale = payload.locale;\n }).addCase(actions_3.setLocale.fulfilled, (state, {\n payload\n }) => {\n if (!(payload === null || payload === void 0 ? void 0 : payload.translations)) {\n state.isLoading = false;\n return;\n }\n\n state.locale = payload.locale;\n state.translations = Object.keys(payload.translations).sort().reduce((accum, key) => Object.assign(Object.assign({}, accum), {\n [key]: payload.translations[key]\n }), {});\n });\n }\n});\n_a = exports.i18nSlice.actions, exports.setInitialLocale = _a.setInitialLocale, exports.setTranslations = _a.setTranslations;\nexports[\"default\"] = exports.i18nSlice.reducer;\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/i18n/slice.ts?");
369
+ eval("\n\nvar _a;\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports.setTranslations = exports.setInitialLocale = exports.i18nSlice = void 0;\n\nconst toolkit_1 = __webpack_require__(/*! @reduxjs/toolkit */ \"./node_modules/@reduxjs/toolkit/dist/redux-toolkit.esm.js\");\n\nconst actions_1 = __webpack_require__(/*! domains/config/actions */ \"./src/javascripts/domains/config/actions.ts\");\n\nconst actions_2 = __webpack_require__(/*! domains/i18n/actions */ \"./src/javascripts/domains/i18n/actions.ts\");\n\nconst initialState = {\n translations: {\n 'errors.configError.message': 'We are sorry this happened, please retry at a later time.',\n 'errors.configError.srText': 'A chat configuration error occurred. Our apologies, please retry at a later time.',\n 'errors.configError.title': 'Chat configuration error.',\n 'errors.general.buttonText': 'Restart chat',\n 'errors.general.message': 'Do you want to start a new chat session?',\n 'errors.general.srText': 'Something went wrong with the chat session. You can restart the chat.',\n 'errors.general.title': 'Something went wrong',\n 'errors.seamlyOffline.message': 'There might be a problem with your or our network connection. The chat session should resume as soon the connection is available again.',\n 'errors.seamlyOffline.srText': 'The chat has connection issues. There might be a problem with your or our network connection. The chat session should resume as soon as the connection is available again.',\n 'errors.seamlyOffline.title': 'Connection issues',\n 'errors.seamlyUnavailable.buttonText': 'Try again',\n 'errors.seamlyUnavailable.message': 'The server could not be reached. Try again in a little while.',\n 'errors.seamlyUnavailable.srText': 'The chat server could not be reached. Try again in a little while.',\n 'errors.seamlyUnavailable.title': 'Server unavailable'\n },\n isLoading: false,\n initialLocale: undefined,\n locale: undefined\n};\nexports.i18nSlice = (0, toolkit_1.createSlice)({\n name: 'app',\n initialState,\n reducers: {\n setInitialLocale: (state, action) => {\n state.initialLocale = action.payload;\n },\n setTranslations: (state, {\n payload\n }) => {\n state.translations = payload;\n }\n },\n extraReducers: builder => {\n // Add reducers for additional action types here, and handle loading state as needed\n builder.addCase(actions_1.initializeConfig.fulfilled, (state, {\n payload\n }) => {\n state.initialLocale = payload.locale;\n }).addCase(actions_2.setLocale.fulfilled, (state, {\n payload\n }) => {\n if (!(payload === null || payload === void 0 ? void 0 : payload.translations)) {\n state.isLoading = false;\n return;\n }\n\n state.locale = payload.locale;\n state.translations = Object.keys(payload.translations).sort().reduce((accum, key) => Object.assign(Object.assign({}, accum), {\n [key]: payload.translations[key]\n }), {});\n });\n }\n});\n_a = exports.i18nSlice.actions, exports.setInitialLocale = _a.setInitialLocale, exports.setTranslations = _a.setTranslations;\nexports[\"default\"] = exports.i18nSlice.reducer;\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/i18n/slice.ts?");
370
370
 
371
371
  /***/ }),
372
372
 
@@ -432,7 +432,7 @@ eval("\n\nvar __importDefault = this && this.__importDefault || function (mod) {
432
432
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
433
433
 
434
434
  "use strict";
435
- eval("\n\nvar _a;\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports.stopIdleDetachCountdownCounter = exports.showOption = exports.setUserSelectedOptions = exports.setUserSelectedOption = exports.setUserEntryType = exports.setUploadProgress = exports.setUploadError = exports.setUploadComplete = exports.setServiceEntryMetadata = exports.setServiceDataItem = exports.setSeamlyContainerElement = exports.setParticipant = exports.setLoadedImageEventIds = exports.setIsLoading = exports.setInitialState = exports.setHistory = exports.setHeaderTitle = exports.setHeaderSubTitle = exports.setFeatures = exports.setFeatureEnabledState = exports.setEventsRead = exports.setBlockAutoEntrySwitch = exports.setActiveService = exports.setActiveEntryType = exports.resetHistoryLoadedFlag = exports.registerUpload = exports.initResumeConversationPrompt = exports.initIdleDetachCountdown = exports.hideOption = exports.decrementIdleDetachCountdownCounter = exports.clearResumeConversationPrompt = exports.clearIdleDetachCountdown = exports.clearFeatures = exports.clearEvents = exports.clearAllUploads = exports.addEvent = exports.ackEvent = exports.storeSlice = exports.initialStoreState = exports.mergeHistory = exports.isUnreadMessage = void 0;\n\nconst toolkit_1 = __webpack_require__(/*! @reduxjs/toolkit */ \"./node_modules/@reduxjs/toolkit/dist/redux-toolkit.esm.js\");\n\nconst actions_1 = __webpack_require__(/*! domains/app/actions */ \"./src/javascripts/domains/app/actions.ts\");\n\nconst actions_2 = __webpack_require__(/*! domains/config/actions */ \"./src/javascripts/domains/config/actions.ts\");\n\nconst id_1 = __webpack_require__(/*! lib/id */ \"./src/javascripts/lib/id.js\");\n\nconst general_utils_1 = __webpack_require__(/*! ui/utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n\nconst seamly_utils_1 = __webpack_require__(/*! ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.ts\");\n\nconst isUnreadMessage = ({\n type,\n payload\n}) => type === seamly_utils_1.eventTypes.message && !payload.fromClient || type === seamly_utils_1.eventTypes.info && payload.type === seamly_utils_1.payloadTypes.text;\n\nexports.isUnreadMessage = isUnreadMessage;\n\nconst orderHistory = events => {\n return events.sort(({\n payload: {\n occurredAt: occurredAtA\n }\n }, {\n payload: {\n occurredAt: occurredAtB\n }\n }) => occurredAtA - occurredAtB);\n};\n\nconst mergeHistory = (stateEvents, historyEvents) => {\n const newStateEvents = stateEvents.filter(stateEvent => // Deduplicate the event streams, giving events in historyEvents\n // precedence so the server is able to push changes to events.\n !historyEvents.some(historyEvent => historyEvent.payload.id === stateEvent.payload.id));\n const newHistoryEvents = historyEvents.filter(historyEvent => // Remove all non displayable participant messages\n !(historyEvent.type === 'participant' && !historyEvent.payload.participant.introduction)) // Reverse is done here because the server sends the history in the order\n // newest to oldest. In the case of exactly the same occurredAt timestamps\n // these messages will be shown in the wrong order if not reversed. For\n // the normal merging logic there is no added effect.\n .reverse();\n return orderHistory([...newHistoryEvents, ...newStateEvents]);\n};\n\nexports.mergeHistory = mergeHistory;\n\nconst participantReducer = (participantInfo, action) => {\n // TODO: a) Styleguide only! b) Should be removed after styleguide overhaul.\n if (!participantInfo) {\n return {\n participants: {},\n currentAgent: ''\n };\n }\n\n const {\n participants\n } = participantInfo || {\n participants: {}\n };\n const {\n id,\n avatar,\n name,\n introduction\n } = action.participant;\n const oldParticipant = participants[id];\n const newParticipants = Object.assign(Object.assign({}, participants), {\n [id]: oldParticipant ? Object.assign(Object.assign(Object.assign(Object.assign({}, oldParticipant), avatar ? {\n avatar\n } : {}), name ? {\n name\n } : {}), introduction ? {\n introduction\n } : {}) : action.participant\n });\n return Object.assign(Object.assign({}, participantInfo), {\n participants: newParticipants,\n currentAgent: participantInfo.currentAgent !== id && !action.fromClient ? id : participantInfo.currentAgent\n });\n};\n\nconst calculateNewEntryMeta = (entryMeta, channelEvent) => {\n const entry = channelEvent.type === 'message' ? channelEvent === null || channelEvent === void 0 ? void 0 : channelEvent.payload.entry : {};\n const {\n blockAutoEntrySwitch\n } = entryMeta;\n\n if (!entry) {\n return Object.assign(Object.assign({}, entryMeta), {\n optionsOverride: {}\n });\n }\n\n const {\n type,\n options\n } = entry;\n let newActive = entryMeta.active;\n\n if (!blockAutoEntrySwitch && type !== entryMeta.userSelected) {\n newActive = type;\n }\n\n return Object.assign(Object.assign({}, entryMeta), {\n active: newActive,\n optionsOverride: Object.assign(Object.assign({}, entryMeta.optionsOverride), {\n [type]: options || {}\n })\n });\n};\n\nexports.initialStoreState = {\n events: [],\n initialState: {\n userResponded: false\n },\n unreadEvents: 0,\n userHasResponded: false,\n loadedImageEventIds: [],\n isLoading: false,\n idleDetachCountdown: {\n hasCountdown: false,\n isActive: false,\n remaining: undefined,\n wasStopped: undefined,\n count: undefined,\n timer: undefined\n },\n resumeConversationPrompt: false,\n serviceInfo: {\n activeServiceSessionId: ''\n },\n participantInfo: {\n participants: {},\n currentAgent: ''\n },\n headerTitles: {\n title: null,\n subTitle: ''\n },\n historyLoaded: false,\n skiplinkTargetId: (0, id_1.randomId)(),\n optionsButtonId: (0, id_1.randomId)(),\n headerCollapseButtonId: (0, id_1.randomId)(),\n serviceData: {},\n options: {\n features: {},\n panelActive: false,\n optionActive: '',\n userSelectedOptions: {}\n },\n showFileUpload: false,\n currentUploads: [],\n entryMeta: {\n default: seamly_utils_1.entryTypes.text,\n active: seamly_utils_1.entryTypes.text,\n userSelected: null,\n blockAutoEntrySwitch: false,\n options: {},\n optionsOverride: {}\n },\n seamlyContainerElement: null\n};\nexports.storeSlice = (0, toolkit_1.createSlice)({\n name: 'store',\n initialState: exports.initialStoreState,\n reducers: {\n addEvent: (state, action) => {\n var _a, _b;\n\n const {\n type: eventType,\n payload\n } = action.payload;\n const accountHasUploads = state.options.features.hasOwnProperty(seamly_utils_1.featureKeys.uploads);\n let newOptions = Object.assign({}, state.options); // This enabled override of the service enabled value for uploads.\n // If a message is sent with entry of type upload it will temporarily\n // override service value and enable uploads.\n\n if (accountHasUploads && (eventType === seamly_utils_1.eventTypes.message || eventType === seamly_utils_1.eventTypes.participant) && !payload.fromClient) {\n const entryType = eventType === 'message' ? (_a = payload.entry) === null || _a === void 0 ? void 0 : _a.type : {};\n newOptions = Object.assign(Object.assign({}, newOptions), {\n features: Object.assign(Object.assign({}, newOptions.features), {\n uploads: Object.assign(Object.assign({}, (_b = newOptions.features) === null || _b === void 0 ? void 0 : _b.uploads), {\n enabledFromEntry: entryType === seamly_utils_1.entryTypes.upload\n })\n })\n });\n }\n\n const incrementUnread = (0, exports.isUnreadMessage)(action.payload); // We check for duplicated and ignore them as in some error of the websocket\n // a duplicate join can be active for a while until the server connection\n // times out.\n\n const eventExists = state.events.find(e => e.payload.id === payload.id);\n\n if (eventExists) {\n return;\n }\n\n const newEntryMeta = calculateNewEntryMeta(state.entryMeta, action.payload);\n state.entryMeta = !accountHasUploads && newEntryMeta.active === seamly_utils_1.entryTypes.upload ? Object.assign({}, state.entryMeta) : newEntryMeta;\n state.options = newOptions;\n\n if (incrementUnread) {\n state.unreadEvents += 1;\n action.payload.payload.messageStatus = payload.fromClient ? seamly_utils_1.readStates.read : seamly_utils_1.readStates.received;\n }\n\n action.payload.payload.key = (0, id_1.randomId)();\n state.events.push(action.payload);\n },\n ackEvent: (state, {\n payload\n }) => {\n // If any ACKs are sent without transactionID the conversation crashes.\n // Ensure that this edge case is handled gracefully.\n if (!payload.transactionId) {\n console.warn('ACK received without transaction ID.');\n return;\n }\n\n const matchedEvent = state.events.find(m => m.payload.transactionId === payload.transactionId);\n const {\n id,\n occurredAt\n } = payload;\n\n if (matchedEvent) {\n state.events = orderHistory(state.events.map(m => m.payload.id === matchedEvent.payload.id ? Object.assign(Object.assign({}, m), {\n payload: Object.assign(Object.assign({}, m.payload), {\n id,\n occurredAt\n })\n }) : m));\n }\n },\n clearEvents: state => {\n state.unreadEvents = 0;\n state.loadedImageEventIds = [];\n state.events = [];\n },\n setEventsRead: (state, {\n payload\n }) => {\n state.unreadEvents = 0;\n state.events.forEach(event => {\n if (payload.indexOf(event.payload.id) !== -1) {\n event.payload = Object.assign(Object.assign({}, event.payload), event.payload.messageStatus === seamly_utils_1.readStates.received && {\n messageStatus: seamly_utils_1.readStates.read\n });\n }\n\n return event;\n });\n },\n setLoadedImageEventIds: (state, {\n payload\n }) => {\n state.loadedImageEventIds.push(payload);\n },\n setHistory: (state, {\n payload: {\n events: history,\n participants,\n activeServiceSessionId,\n activeServiceSettings = {},\n serviceData,\n resumeConversationPrompt\n }\n }) => {\n var _a;\n\n const events = (0, exports.mergeHistory)(state.events, history);\n const mergedParticipants = Object.assign(Object.assign({}, state.participantInfo.participants), participants);\n const lastParticipantEvent = events.slice().reverse().find(m => (m.type === 'message' || m.type === 'participant') && !m.payload.fromClient);\n let lastParticipantId = null;\n\n if (lastParticipantEvent) {\n if (lastParticipantEvent.type === 'message') {\n lastParticipantId = lastParticipantEvent.payload.participant;\n }\n\n if (lastParticipantEvent.type === 'participant') {\n lastParticipantId = lastParticipantEvent.payload.participant.id;\n }\n }\n\n const {\n entry,\n uploads\n } = activeServiceSettings;\n const historyNewEntryMeta = calculateNewEntryMeta(Object.assign(Object.assign(Object.assign({}, state.entryMeta), entry), {\n active: entry.default || seamly_utils_1.payloadTypes.text,\n options: Object.assign({}, entry && entry.options ? entry.options : {})\n }), events[events.length - 1]);\n let newFeatures = Object.assign({}, state.options.features);\n const newFeaturesHasUpload = newFeatures.hasOwnProperty(seamly_utils_1.featureKeys.uploads); // Only set uploads if it was initialised by the account config.\n\n if (newFeaturesHasUpload && lastParticipantEvent.type === 'message') {\n const {\n payload: lastParticipantEventPayload\n } = lastParticipantEvent;\n const entryType = ((_a = lastParticipantEventPayload === null || lastParticipantEventPayload === void 0 ? void 0 : lastParticipantEventPayload.entry) === null || _a === void 0 ? void 0 : _a.type) || {};\n newFeatures = Object.assign(Object.assign({}, newFeatures), {\n uploads: {\n enabled: !!(uploads && uploads.enabled),\n enabledFromEntry: entryType === seamly_utils_1.entryTypes.upload\n }\n });\n }\n\n state.unreadEvents = events.filter(event => event.type === 'message' && event.payload.messageStatus === seamly_utils_1.readStates.received).length;\n state.events = events.filter(e => e.type !== 'participant' || !!e.payload.participant.introduction);\n state.participantInfo = Object.assign(Object.assign(Object.assign({}, state.participantInfo), lastParticipantId ? participantReducer(state.participantInfo, {\n participant: mergedParticipants[lastParticipantId]\n }) : {}), {\n participants: mergedParticipants\n });\n state.historyLoaded = true;\n state.serviceInfo = Object.assign(Object.assign({}, state.serviceInfo), {\n activeServiceSessionId\n });\n state.serviceData = serviceData || {};\n state.options = Object.assign(Object.assign({}, state.options), {\n features: newFeatures || {}\n });\n state.entryMeta = !newFeaturesHasUpload && historyNewEntryMeta.active === seamly_utils_1.entryTypes.upload ? Object.assign({}, state.entryMeta) : historyNewEntryMeta;\n state.resumeConversationPrompt = resumeConversationPrompt || false;\n\n if (lastParticipantId) {\n state.headerTitles.subTitle = mergedParticipants[lastParticipantId].name;\n }\n },\n resetHistoryLoadedFlag: state => {\n state.historyLoaded = false;\n },\n setIsLoading: (state, {\n payload\n }) => {\n state.isLoading = payload;\n },\n initIdleDetachCountdown: (state, {\n payload\n }) => {\n const {\n delaySeconds,\n delayTime\n } = payload;\n state.idleDetachCountdown = {\n hasCountdown: true,\n isActive: true,\n wasStopped: false,\n count: delaySeconds,\n remaining: delaySeconds,\n timer: delayTime\n };\n },\n decrementIdleDetachCountdownCounter: state => {\n const {\n idleDetachCountdown\n } = state;\n const {\n remaining: prevRemaining\n } = idleDetachCountdown;\n const remaining = prevRemaining - 1;\n state.idleDetachCountdown.remaining = remaining;\n state.idleDetachCountdown.timer = (0, general_utils_1.getTimeFromSeconds)(remaining);\n },\n stopIdleDetachCountdownCounter: state => {\n state.idleDetachCountdown.isActive = false;\n state.idleDetachCountdown.wasStopped = true;\n },\n clearIdleDetachCountdown: state => {\n state.idleDetachCountdown.hasCountdown = false;\n state.idleDetachCountdown.isActive = false;\n },\n initResumeConversationPrompt: state => {\n state.resumeConversationPrompt = true;\n },\n clearResumeConversationPrompt: state => {\n state.resumeConversationPrompt = false;\n },\n setParticipant: (state, {\n payload\n }) => {\n state.participantInfo = participantReducer(state.participantInfo, {\n participant: payload.participant,\n fromClient: payload.fromClient\n });\n },\n setActiveService: (state, {\n payload\n }) => {\n if (state.serviceInfo.activeServiceSessionId !== payload.activeServiceSessionId) {\n state.serviceInfo.activeServiceSessionId = payload.activeServiceSessionId;\n }\n },\n setHeaderTitle: (state, {\n payload\n }) => {\n state.headerTitles.title = payload;\n },\n setHeaderSubTitle: (state, {\n payload\n }) => {\n state.headerTitles.subTitle = payload;\n },\n setInitialState: (state, {\n payload\n }) => {\n state.initialState = payload.initialState;\n state.unreadEvents = exports.initialStoreState.unreadEvents;\n },\n setServiceDataItem: (state, {\n payload\n }) => {\n state.serviceData[payload.type] = payload;\n },\n setFeatures: (state, {\n payload\n }) => {\n if (!payload.features) {\n return;\n }\n\n state.options.features = payload.features;\n },\n setFeatureEnabledState: (state, {\n payload\n }) => {\n if (!state.options.features.hasOwnProperty(payload.key)) {\n return;\n }\n\n state.options.features[payload.key].enabled = payload.enabled;\n },\n clearFeatures: state => {\n // case CLEAR_FEATURES:\n state.options.features = {};\n },\n showOption: (state, {\n payload\n }) => {\n state.options.panelActive = true;\n state.options.optionActive = payload;\n },\n hideOption: state => {\n // case HIDE_OPTION:\n state.options.panelActive = false;\n state.options.optionActive = '';\n },\n setUserSelectedOptions: (state, {\n payload\n }) => {\n state.options.userSelectedOptions = payload;\n },\n setUserSelectedOption: (state, {\n payload\n }) => {\n const {\n option,\n value\n } = payload;\n state.options.userSelectedOptions[option] = value;\n },\n setBlockAutoEntrySwitch: (state, {\n payload\n }) => {\n state.entryMeta.blockAutoEntrySwitch = payload;\n },\n setServiceEntryMetadata: (state, {\n payload\n }) => {\n state.entryMeta.active = payload.default;\n state.entryMeta.options = payload.options || {};\n state.entryMeta.optionsOverride = {};\n },\n setActiveEntryType: (state, {\n payload\n }) => {\n state.entryMeta.active = payload;\n },\n setUserEntryType: (state, {\n payload\n }) => {\n state.entryMeta.userSelected = payload;\n },\n registerUpload: (state, {\n payload\n }) => {\n state.currentUploads.push({\n id: payload.fileId,\n name: payload.fileName,\n progress: 1,\n uploading: true,\n complete: false,\n error: '',\n uploadHandle: payload.uploadHandle\n });\n },\n setUploadProgress: (state, {\n payload\n }) => {\n state.currentUploads = state.currentUploads.map(fileUpload => {\n if (fileUpload.id === payload.fileId) {\n return Object.assign(Object.assign({}, fileUpload), {\n progress: payload.progress,\n uploading: payload.progress !== 100,\n uploadHandle: payload.progress === 100 ? null : fileUpload.uploadHandle\n });\n }\n\n return fileUpload;\n });\n },\n setUploadError: (state, {\n payload\n }) => {\n state.currentUploads = state.currentUploads.map(fileUpload => {\n if (fileUpload.id === payload.fileId) {\n return Object.assign(Object.assign({}, fileUpload), {\n error: payload.errorText,\n progress: 0,\n uploading: false,\n uploadHandle: null\n });\n }\n\n return fileUpload;\n });\n },\n setUploadComplete: (state, {\n payload\n }) => {\n state.currentUploads = state.currentUploads.map(fileUpload => {\n if (fileUpload.id === payload) {\n return Object.assign(Object.assign({}, fileUpload), {\n complete: true\n });\n }\n\n return fileUpload;\n });\n },\n clearAllUploads: state => {\n state.currentUploads = [];\n },\n setSeamlyContainerElement: (state, {\n payload\n }) => {\n state.seamlyContainerElement = payload;\n }\n },\n extraReducers: builder => {\n builder.addCase(actions_1.resetApp.pending, () => exports.initialStoreState).addCase(actions_2.initializeConfig.fulfilled, (state, {\n payload\n }) => {\n var _a;\n\n state.headerTitles.subTitle = (_a = payload.agentParticipant) === null || _a === void 0 ? void 0 : _a.name;\n if (!payload.features) return;\n state.options.features = payload.features;\n }).addCase(actions_1.initializeApp.fulfilled, (state, {\n payload\n }) => {\n if (!payload.initialState) return;\n state.initialState = payload.initialState;\n });\n }\n});\n_a = exports.storeSlice.actions, exports.ackEvent = _a.ackEvent, exports.addEvent = _a.addEvent, exports.clearAllUploads = _a.clearAllUploads, exports.clearEvents = _a.clearEvents, exports.clearFeatures = _a.clearFeatures, exports.clearIdleDetachCountdown = _a.clearIdleDetachCountdown, exports.clearResumeConversationPrompt = _a.clearResumeConversationPrompt, exports.decrementIdleDetachCountdownCounter = _a.decrementIdleDetachCountdownCounter, exports.hideOption = _a.hideOption, exports.initIdleDetachCountdown = _a.initIdleDetachCountdown, exports.initResumeConversationPrompt = _a.initResumeConversationPrompt, exports.registerUpload = _a.registerUpload, exports.resetHistoryLoadedFlag = _a.resetHistoryLoadedFlag, exports.setActiveEntryType = _a.setActiveEntryType, exports.setActiveService = _a.setActiveService, exports.setBlockAutoEntrySwitch = _a.setBlockAutoEntrySwitch, exports.setEventsRead = _a.setEventsRead, exports.setFeatureEnabledState = _a.setFeatureEnabledState, exports.setFeatures = _a.setFeatures, exports.setHeaderSubTitle = _a.setHeaderSubTitle, exports.setHeaderTitle = _a.setHeaderTitle, exports.setHistory = _a.setHistory, exports.setInitialState = _a.setInitialState, exports.setIsLoading = _a.setIsLoading, exports.setLoadedImageEventIds = _a.setLoadedImageEventIds, exports.setParticipant = _a.setParticipant, exports.setSeamlyContainerElement = _a.setSeamlyContainerElement, exports.setServiceDataItem = _a.setServiceDataItem, exports.setServiceEntryMetadata = _a.setServiceEntryMetadata, exports.setUploadComplete = _a.setUploadComplete, exports.setUploadError = _a.setUploadError, exports.setUploadProgress = _a.setUploadProgress, exports.setUserEntryType = _a.setUserEntryType, exports.setUserSelectedOption = _a.setUserSelectedOption, exports.setUserSelectedOptions = _a.setUserSelectedOptions, exports.showOption = _a.showOption, exports.stopIdleDetachCountdownCounter = _a.stopIdleDetachCountdownCounter;\nexports[\"default\"] = exports.storeSlice.reducer;\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/store/slice.ts?");
435
+ eval("\n\nvar _a;\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports.stopIdleDetachCountdownCounter = exports.showOption = exports.setUserSelectedOptions = exports.setUserSelectedOption = exports.setUserEntryType = exports.setUploadProgress = exports.setUploadError = exports.setUploadComplete = exports.setServiceEntryMetadata = exports.setServiceDataItem = exports.setSeamlyContainerElement = exports.setParticipant = exports.setLoadedImageEventIds = exports.setIsLoading = exports.setInitialState = exports.setHistory = exports.setHeaderTitle = exports.setHeaderSubTitle = exports.setFeatures = exports.setFeatureEnabledState = exports.setEventsRead = exports.setBlockAutoEntrySwitch = exports.setActiveService = exports.setActiveEntryType = exports.resetHistoryLoadedFlag = exports.registerUpload = exports.initResumeConversationPrompt = exports.initIdleDetachCountdown = exports.hideOption = exports.decrementIdleDetachCountdownCounter = exports.clearResumeConversationPrompt = exports.clearIdleDetachCountdown = exports.clearFeatures = exports.clearEvents = exports.clearAllUploads = exports.addEvent = exports.ackEvent = exports.storeSlice = exports.initialStoreState = exports.mergeHistory = exports.orderHistory = exports.isUnreadMessage = void 0;\n\nconst toolkit_1 = __webpack_require__(/*! @reduxjs/toolkit */ \"./node_modules/@reduxjs/toolkit/dist/redux-toolkit.esm.js\");\n\nconst actions_1 = __webpack_require__(/*! domains/app/actions */ \"./src/javascripts/domains/app/actions.ts\");\n\nconst actions_2 = __webpack_require__(/*! domains/config/actions */ \"./src/javascripts/domains/config/actions.ts\");\n\nconst id_1 = __webpack_require__(/*! lib/id */ \"./src/javascripts/lib/id.js\");\n\nconst general_utils_1 = __webpack_require__(/*! ui/utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n\nconst seamly_utils_1 = __webpack_require__(/*! ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.ts\");\n\nconst isUnreadMessage = ({\n type,\n payload\n}) => type === seamly_utils_1.eventTypes.message && !payload.fromClient || type === seamly_utils_1.eventTypes.info && payload.type === seamly_utils_1.payloadTypes.text;\n\nexports.isUnreadMessage = isUnreadMessage;\n\nconst orderHistory = events => {\n return events.sort(({\n payload: {\n occurredAt: occurredAtA\n }\n }, {\n payload: {\n occurredAt: occurredAtB\n }\n }) => occurredAtA - occurredAtB);\n};\n\nexports.orderHistory = orderHistory;\n\nconst mergeHistory = (stateEvents, historyEvents) => {\n const newStateEvents = stateEvents.filter(stateEvent => // Deduplicate the event streams, giving events in historyEvents\n // precedence so the server is able to push changes to events.\n !historyEvents.some(historyEvent => historyEvent.payload.id === stateEvent.payload.id));\n const newHistoryEvents = historyEvents.filter(historyEvent => // Remove all non displayable participant messages\n !(historyEvent.type === 'participant' && !historyEvent.payload.participant.introduction)) // Reverse is done here because the server sends the history in the order\n // newest to oldest. In the case of exactly the same occurredAt timestamps\n // these messages will be shown in the wrong order if not reversed. For\n // the normal merging logic there is no added effect.\n .reverse();\n return (0, exports.orderHistory)([...newHistoryEvents, ...newStateEvents]);\n};\n\nexports.mergeHistory = mergeHistory;\n\nconst participantReducer = (participantInfo, action) => {\n // TODO: a) Styleguide only! b) Should be removed after styleguide overhaul.\n if (!participantInfo) {\n return {\n participants: {},\n currentAgent: ''\n };\n }\n\n const {\n participants\n } = participantInfo || {\n participants: {}\n };\n const {\n id,\n avatar,\n name,\n introduction\n } = action.participant;\n const oldParticipant = participants[id];\n const newParticipants = Object.assign(Object.assign({}, participants), {\n [id]: oldParticipant ? Object.assign(Object.assign(Object.assign(Object.assign({}, oldParticipant), avatar ? {\n avatar\n } : {}), name ? {\n name\n } : {}), introduction ? {\n introduction\n } : {}) : action.participant\n });\n return Object.assign(Object.assign({}, participantInfo), {\n participants: newParticipants,\n currentAgent: participantInfo.currentAgent !== id && !action.fromClient ? id : participantInfo.currentAgent\n });\n};\n\nconst calculateNewEntryMeta = (entryMeta, channelEvent) => {\n const entry = channelEvent.type === 'message' ? channelEvent === null || channelEvent === void 0 ? void 0 : channelEvent.payload.entry : {};\n const {\n blockAutoEntrySwitch\n } = entryMeta;\n\n if (!entry) {\n return Object.assign(Object.assign({}, entryMeta), {\n optionsOverride: {}\n });\n }\n\n const {\n type,\n options\n } = entry;\n let newActive = entryMeta.active;\n\n if (!blockAutoEntrySwitch && type !== entryMeta.userSelected) {\n newActive = type;\n }\n\n return Object.assign(Object.assign({}, entryMeta), {\n active: newActive,\n optionsOverride: Object.assign(Object.assign({}, entryMeta.optionsOverride), {\n [type]: options || {}\n })\n });\n};\n\nexports.initialStoreState = {\n events: [],\n initialState: {\n userResponded: false\n },\n unreadEvents: 0,\n userHasResponded: false,\n loadedImageEventIds: [],\n isLoading: false,\n idleDetachCountdown: {\n hasCountdown: false,\n isActive: false,\n remaining: undefined,\n wasStopped: undefined,\n count: undefined,\n timer: undefined\n },\n resumeConversationPrompt: false,\n serviceInfo: {\n activeServiceSessionId: ''\n },\n participantInfo: {\n participants: {},\n currentAgent: ''\n },\n headerTitles: {\n title: null,\n subTitle: ''\n },\n historyLoaded: false,\n skiplinkTargetId: (0, id_1.randomId)(),\n optionsButtonId: (0, id_1.randomId)(),\n headerCollapseButtonId: (0, id_1.randomId)(),\n serviceData: {},\n options: {\n features: {},\n panelActive: false,\n optionActive: '',\n userSelectedOptions: {}\n },\n showFileUpload: false,\n currentUploads: [],\n entryMeta: {\n default: seamly_utils_1.entryTypes.text,\n active: seamly_utils_1.entryTypes.text,\n userSelected: null,\n blockAutoEntrySwitch: false,\n options: {},\n optionsOverride: {}\n },\n seamlyContainerElement: null\n};\nexports.storeSlice = (0, toolkit_1.createSlice)({\n name: 'store',\n initialState: exports.initialStoreState,\n reducers: {\n addEvent: (state, action) => {\n var _a, _b;\n\n const {\n type: eventType,\n payload\n } = action.payload;\n const accountHasUploads = state.options.features.hasOwnProperty(seamly_utils_1.featureKeys.uploads);\n let newOptions = Object.assign({}, state.options); // This enabled override of the service enabled value for uploads.\n // If a message is sent with entry of type upload it will temporarily\n // override service value and enable uploads.\n\n if (accountHasUploads && (eventType === seamly_utils_1.eventTypes.message || eventType === seamly_utils_1.eventTypes.participant) && !payload.fromClient) {\n const entryType = eventType === 'message' ? (_a = payload.entry) === null || _a === void 0 ? void 0 : _a.type : {};\n newOptions = Object.assign(Object.assign({}, newOptions), {\n features: Object.assign(Object.assign({}, newOptions.features), {\n uploads: Object.assign(Object.assign({}, (_b = newOptions.features) === null || _b === void 0 ? void 0 : _b.uploads), {\n enabledFromEntry: entryType === seamly_utils_1.entryTypes.upload\n })\n })\n });\n }\n\n const incrementUnread = (0, exports.isUnreadMessage)(action.payload); // We check for duplicated and ignore them as in some error of the websocket\n // a duplicate join can be active for a while until the server connection\n // times out.\n\n const eventExists = state.events.find(e => e.payload.id === payload.id);\n\n if (eventExists) {\n return;\n }\n\n const newEntryMeta = calculateNewEntryMeta(state.entryMeta, action.payload);\n state.entryMeta = !accountHasUploads && newEntryMeta.active === seamly_utils_1.entryTypes.upload ? Object.assign({}, state.entryMeta) : newEntryMeta;\n state.options = newOptions;\n\n if (incrementUnread) {\n state.unreadEvents += 1;\n action.payload.payload.messageStatus = payload.fromClient ? seamly_utils_1.readStates.read : seamly_utils_1.readStates.received;\n }\n\n action.payload.payload.key = (0, id_1.randomId)();\n state.events.push(action.payload);\n },\n ackEvent: (state, {\n payload\n }) => {\n // If any ACKs are sent without transactionID the conversation crashes.\n // Ensure that this edge case is handled gracefully.\n if (!payload.transactionId) {\n console.warn('ACK received without transaction ID.');\n return;\n }\n\n const matchedEvent = state.events.find(m => m.payload.transactionId === payload.transactionId);\n const {\n id,\n occurredAt\n } = payload;\n\n if (matchedEvent) {\n state.events = (0, exports.orderHistory)( //@ts-ignore\n state.events.map(m => m.payload.id === matchedEvent.payload.id ? Object.assign(Object.assign({}, m), {\n payload: Object.assign(Object.assign({}, m.payload), {\n id,\n occurredAt\n })\n }) : m));\n }\n },\n clearEvents: state => {\n state.unreadEvents = 0;\n state.loadedImageEventIds = [];\n state.events = [];\n },\n setEventsRead: (state, {\n payload\n }) => {\n state.unreadEvents = 0;\n state.events.forEach(event => {\n if (payload.indexOf(event.payload.id) !== -1) {\n event.payload = Object.assign(Object.assign({}, event.payload), event.payload.messageStatus === seamly_utils_1.readStates.received && {\n messageStatus: seamly_utils_1.readStates.read\n });\n }\n\n return event;\n });\n },\n setLoadedImageEventIds: (state, {\n payload\n }) => {\n state.loadedImageEventIds.push(payload);\n },\n setHistory: (state, {\n payload: {\n events: history,\n participants,\n activeServiceSessionId,\n activeServiceSettings = {},\n serviceData,\n resumeConversationPrompt\n }\n }) => {\n var _a;\n\n const events = (0, exports.mergeHistory)(state.events, history);\n const mergedParticipants = Object.assign(Object.assign({}, state.participantInfo.participants), participants);\n const lastParticipantEvent = events.slice().reverse().find(m => (m.type === 'message' || m.type === 'participant') && !m.payload.fromClient);\n let lastParticipantId = null;\n\n if (lastParticipantEvent) {\n if (lastParticipantEvent.type === 'message') {\n lastParticipantId = lastParticipantEvent.payload.participant;\n }\n\n if (lastParticipantEvent.type === 'participant') {\n lastParticipantId = lastParticipantEvent.payload.participant.id;\n }\n }\n\n const {\n entry\n } = activeServiceSettings;\n const {\n upload\n } = entry.options;\n const historyNewEntryMeta = calculateNewEntryMeta(Object.assign(Object.assign(Object.assign({}, state.entryMeta), entry), {\n active: entry.default || seamly_utils_1.payloadTypes.text,\n options: Object.assign({}, entry && entry.options ? entry.options : {})\n }), events[events.length - 1]);\n let newFeatures = Object.assign({}, state.options.features);\n const newFeaturesHasUpload = newFeatures.hasOwnProperty(seamly_utils_1.featureKeys.uploads); // Only set uploads if it was initialised by the account config.\n\n if (newFeaturesHasUpload && (lastParticipantEvent === null || lastParticipantEvent === void 0 ? void 0 : lastParticipantEvent.type) === 'message') {\n const {\n payload: lastParticipantEventPayload\n } = lastParticipantEvent;\n const entryType = ((_a = lastParticipantEventPayload === null || lastParticipantEventPayload === void 0 ? void 0 : lastParticipantEventPayload.entry) === null || _a === void 0 ? void 0 : _a.type) || {};\n newFeatures = Object.assign(Object.assign({}, newFeatures), {\n uploads: {\n enabled: !!(upload && upload.enabled),\n enabledFromEntry: entryType === seamly_utils_1.entryTypes.upload\n }\n });\n }\n\n state.unreadEvents = events.filter(event => event.type === 'message' && event.payload.messageStatus === seamly_utils_1.readStates.received).length;\n state.events = events.filter(e => e.type !== 'participant' || !!e.payload.participant.introduction);\n state.participantInfo = Object.assign(Object.assign(Object.assign({}, state.participantInfo), lastParticipantId ? participantReducer(state.participantInfo, {\n participant: mergedParticipants[lastParticipantId]\n }) : {}), {\n participants: mergedParticipants\n });\n state.historyLoaded = true;\n state.serviceInfo = Object.assign(Object.assign({}, state.serviceInfo), {\n activeServiceSessionId\n });\n state.serviceData = Object.assign(Object.assign({}, state.serviceData), serviceData);\n state.options = Object.assign(Object.assign({}, state.options), {\n features: newFeatures || {}\n });\n state.entryMeta = !newFeaturesHasUpload && historyNewEntryMeta.active === seamly_utils_1.entryTypes.upload ? Object.assign({}, state.entryMeta) : historyNewEntryMeta;\n state.resumeConversationPrompt = resumeConversationPrompt || false;\n\n if (lastParticipantId) {\n state.headerTitles.subTitle = mergedParticipants[lastParticipantId].name;\n }\n },\n resetHistoryLoadedFlag: state => {\n state.historyLoaded = false;\n },\n setIsLoading: (state, {\n payload\n }) => {\n state.isLoading = payload;\n },\n initIdleDetachCountdown: (state, {\n payload\n }) => {\n const {\n delaySeconds,\n delayTime\n } = payload;\n state.idleDetachCountdown = {\n hasCountdown: true,\n isActive: true,\n wasStopped: false,\n count: delaySeconds,\n remaining: delaySeconds,\n timer: delayTime\n };\n },\n decrementIdleDetachCountdownCounter: state => {\n const {\n idleDetachCountdown\n } = state;\n const {\n remaining: prevRemaining\n } = idleDetachCountdown;\n const remaining = prevRemaining - 1;\n state.idleDetachCountdown.remaining = remaining;\n state.idleDetachCountdown.timer = (0, general_utils_1.getTimeFromSeconds)(remaining);\n },\n stopIdleDetachCountdownCounter: state => {\n state.idleDetachCountdown.isActive = false;\n state.idleDetachCountdown.wasStopped = true;\n },\n clearIdleDetachCountdown: state => {\n state.idleDetachCountdown.hasCountdown = false;\n state.idleDetachCountdown.isActive = false;\n },\n initResumeConversationPrompt: state => {\n state.resumeConversationPrompt = true;\n },\n clearResumeConversationPrompt: state => {\n state.resumeConversationPrompt = false;\n },\n setParticipant: (state, {\n payload\n }) => {\n state.participantInfo = participantReducer(state.participantInfo, {\n participant: payload.participant,\n fromClient: payload.fromClient\n });\n },\n setActiveService: (state, {\n payload\n }) => {\n if (state.serviceInfo.activeServiceSessionId !== payload) {\n state.serviceInfo.activeServiceSessionId = payload;\n }\n },\n setHeaderTitle: (state, {\n payload\n }) => {\n state.headerTitles.title = payload;\n },\n setHeaderSubTitle: (state, {\n payload\n }) => {\n state.headerTitles.subTitle = payload;\n },\n setInitialState: (state, {\n payload\n }) => {\n state.initialState = payload.initialState;\n state.unreadEvents = exports.initialStoreState.unreadEvents;\n },\n setServiceDataItem: (state, {\n payload\n }) => {\n state.serviceData[payload.type] = payload;\n },\n setFeatures: (state, {\n payload\n }) => {\n if (!payload.features) {\n return;\n }\n\n state.options.features = payload.features;\n },\n setFeatureEnabledState: (state, {\n payload\n }) => {\n if (!state.options.features.hasOwnProperty(payload.key)) {\n return;\n }\n\n state.options.features[payload.key].enabled = payload.enabled;\n },\n clearFeatures: state => {\n // case CLEAR_FEATURES:\n state.options.features = {};\n },\n showOption: (state, {\n payload\n }) => {\n state.options.panelActive = true;\n state.options.optionActive = payload;\n },\n hideOption: state => {\n // case HIDE_OPTION:\n state.options.panelActive = false;\n state.options.optionActive = '';\n },\n setUserSelectedOptions: (state, {\n payload\n }) => {\n state.options.userSelectedOptions = payload;\n },\n setUserSelectedOption: (state, {\n payload\n }) => {\n const {\n option,\n value\n } = payload;\n state.options.userSelectedOptions[option] = value;\n },\n setBlockAutoEntrySwitch: (state, {\n payload\n }) => {\n state.entryMeta.blockAutoEntrySwitch = payload;\n },\n setServiceEntryMetadata: (state, {\n payload\n }) => {\n state.entryMeta.active = payload.default;\n state.entryMeta.options = payload.options || {};\n state.entryMeta.optionsOverride = {};\n },\n setActiveEntryType: (state, {\n payload\n }) => {\n state.entryMeta.active = payload;\n },\n setUserEntryType: (state, {\n payload\n }) => {\n state.entryMeta.userSelected = payload;\n },\n registerUpload: (state, {\n payload\n }) => {\n state.currentUploads.push({\n id: payload.fileId,\n name: payload.fileName,\n progress: 1,\n uploading: true,\n complete: false,\n error: '',\n uploadHandle: payload.uploadHandle\n });\n },\n setUploadProgress: (state, {\n payload\n }) => {\n state.currentUploads = state.currentUploads.map(fileUpload => {\n if (fileUpload.id === payload.fileId) {\n return Object.assign(Object.assign({}, fileUpload), {\n progress: payload.progress,\n uploading: payload.progress !== 100,\n uploadHandle: payload.progress === 100 ? null : fileUpload.uploadHandle\n });\n }\n\n return fileUpload;\n });\n },\n setUploadError: (state, {\n payload\n }) => {\n state.currentUploads = state.currentUploads.map(fileUpload => {\n if (fileUpload.id === payload.fileId) {\n return Object.assign(Object.assign({}, fileUpload), {\n error: payload.errorText,\n progress: 0,\n uploading: false,\n uploadHandle: null\n });\n }\n\n return fileUpload;\n });\n },\n setUploadComplete: (state, {\n payload\n }) => {\n state.currentUploads = state.currentUploads.map(fileUpload => {\n if (fileUpload.id === payload) {\n return Object.assign(Object.assign({}, fileUpload), {\n complete: true\n });\n }\n\n return fileUpload;\n });\n },\n clearAllUploads: state => {\n state.currentUploads = [];\n },\n setSeamlyContainerElement: (state, {\n payload\n }) => {\n state.seamlyContainerElement = payload;\n }\n },\n extraReducers: builder => {\n builder.addCase(actions_1.resetApp.pending, () => exports.initialStoreState).addCase(actions_2.initializeConfig.fulfilled, (state, {\n payload\n }) => {\n var _a;\n\n state.headerTitles.subTitle = (_a = payload.agentParticipant) === null || _a === void 0 ? void 0 : _a.name;\n if (!payload.features) return;\n state.options.features = payload.features;\n }).addCase(actions_1.initializeApp.fulfilled, (state, {\n payload\n }) => {\n if (!payload.initialState) return;\n state.initialState = payload.initialState;\n });\n }\n});\n_a = exports.storeSlice.actions, exports.ackEvent = _a.ackEvent, exports.addEvent = _a.addEvent, exports.clearAllUploads = _a.clearAllUploads, exports.clearEvents = _a.clearEvents, exports.clearFeatures = _a.clearFeatures, exports.clearIdleDetachCountdown = _a.clearIdleDetachCountdown, exports.clearResumeConversationPrompt = _a.clearResumeConversationPrompt, exports.decrementIdleDetachCountdownCounter = _a.decrementIdleDetachCountdownCounter, exports.hideOption = _a.hideOption, exports.initIdleDetachCountdown = _a.initIdleDetachCountdown, exports.initResumeConversationPrompt = _a.initResumeConversationPrompt, exports.registerUpload = _a.registerUpload, exports.resetHistoryLoadedFlag = _a.resetHistoryLoadedFlag, exports.setActiveEntryType = _a.setActiveEntryType, exports.setActiveService = _a.setActiveService, exports.setBlockAutoEntrySwitch = _a.setBlockAutoEntrySwitch, exports.setEventsRead = _a.setEventsRead, exports.setFeatureEnabledState = _a.setFeatureEnabledState, exports.setFeatures = _a.setFeatures, exports.setHeaderSubTitle = _a.setHeaderSubTitle, exports.setHeaderTitle = _a.setHeaderTitle, exports.setHistory = _a.setHistory, exports.setInitialState = _a.setInitialState, exports.setIsLoading = _a.setIsLoading, exports.setLoadedImageEventIds = _a.setLoadedImageEventIds, exports.setParticipant = _a.setParticipant, exports.setSeamlyContainerElement = _a.setSeamlyContainerElement, exports.setServiceDataItem = _a.setServiceDataItem, exports.setServiceEntryMetadata = _a.setServiceEntryMetadata, exports.setUploadComplete = _a.setUploadComplete, exports.setUploadError = _a.setUploadError, exports.setUploadProgress = _a.setUploadProgress, exports.setUserEntryType = _a.setUserEntryType, exports.setUserSelectedOption = _a.setUserSelectedOption, exports.setUserSelectedOptions = _a.setUserSelectedOptions, exports.showOption = _a.showOption, exports.stopIdleDetachCountdownCounter = _a.stopIdleDetachCountdownCounter;\nexports[\"default\"] = exports.storeSlice.reducer;\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/store/slice.ts?");
436
436
 
437
437
  /***/ }),
438
438
 
@@ -443,7 +443,18 @@ eval("\n\nvar _a;\n\nObject.defineProperty(exports, \"__esModule\", ({\n value:
443
443
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
444
444
 
445
445
  "use strict";
446
- eval("\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports.useLocaleNativeName = exports.useTranslationsContainer = exports.useTranslatedEventData = exports.useTranslations = void 0;\n\nconst selectors_1 = __webpack_require__(/*! domains/translations/selectors */ \"./src/javascripts/domains/translations/selectors.js\");\n\nconst slice_1 = __webpack_require__(/*! domains/translations/slice */ \"./src/javascripts/domains/translations/slice.ts\");\n\nconst hooks_1 = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n\nconst react_redux_1 = __webpack_require__(/*! react-redux */ \"./node_modules/react-redux/es/index.js\");\n\nconst seamly_hooks_1 = __webpack_require__(/*! ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n\nconst seamly_utils_1 = __webpack_require__(/*! ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.ts\");\n\nfunction useTranslations() {\n const {\n sendAction\n } = (0, seamly_hooks_1.useSeamlyCommands)();\n const dispatch = (0, react_redux_1.useDispatch)();\n const enableTranslations = (0, seamly_hooks_1.useStableCallback)(locale => {\n sendAction({\n type: seamly_utils_1.actionTypes.setTranslation,\n body: {\n enabled: true,\n locale\n }\n });\n dispatch((0, slice_1.enableTranslation)(locale));\n }, // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n [sendAction, dispatch]);\n const disableTranslations = (0, seamly_hooks_1.useStableCallback)(() => {\n sendAction({\n type: seamly_utils_1.actionTypes.setTranslation,\n body: {\n enabled: false\n }\n });\n dispatch((0, slice_1.disableTranslation)()); // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n }, [sendAction, dispatch]);\n const {\n languages,\n isActive,\n isAvailable,\n currentLocale\n } = (0, react_redux_1.useSelector)(({\n translations\n }) => translations);\n return {\n languages,\n isActive,\n isAvailable,\n currentLocale,\n enableTranslations,\n disableTranslations\n };\n}\n\nexports.useTranslations = useTranslations;\n\nfunction useTranslatedEventData({\n payload\n}) {\n const payloadId = payload === null || payload === void 0 ? void 0 : payload.id;\n let body;\n let translatedBody;\n\n switch (payload === null || payload === void 0 ? void 0 : payload.type) {\n case 'participant':\n body = payload.participant.introduction;\n translatedBody = payload.participant.translatedIntroduction;\n break;\n\n default:\n body = payload === null || payload === void 0 ? void 0 : payload.body;\n translatedBody = payload === null || payload === void 0 ? void 0 : payload.translatedBody;\n }\n\n const hasTranslation = !!translatedBody;\n const isTranslated = (0, react_redux_1.useSelector)(store => // @ts-ignore\n (0, selectors_1.getIsPayloadTranslated)(store, payloadId));\n const dispatch = (0, react_redux_1.useDispatch)();\n const toggleTranslation = (0, seamly_hooks_1.useStableCallback)(() => {\n if (isTranslated) {\n dispatch((0, slice_1.disableEvent)(payloadId));\n } else {\n dispatch((0, slice_1.enableEvent)(payloadId));\n } // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n\n }, [isTranslated, payloadId, dispatch]);\n return [hasTranslation && isTranslated ? translatedBody === null || translatedBody === void 0 ? void 0 : translatedBody.data : body, {\n hasTranslation,\n isTranslated: isTranslated && hasTranslation,\n toggleTranslation,\n translatedBy: translatedBody === null || translatedBody === void 0 ? void 0 : translatedBody.translatedBy,\n locale: translatedBody === null || translatedBody === void 0 ? void 0 : translatedBody.locale\n }];\n}\n\nexports.useTranslatedEventData = useTranslatedEventData;\n\nfunction useTranslationsContainer() {\n const id = (0, react_redux_1.useSelector)(({\n translations\n }) => translations.containerId);\n const focusContainer = (0, seamly_hooks_1.useElementFocusingById)(id);\n return {\n id,\n focusContainer\n };\n}\n\nexports.useTranslationsContainer = useTranslationsContainer;\n\nfunction useLocaleNativeName(locale) {\n const {\n languages\n } = useTranslations();\n return (0, hooks_1.useMemo)(() => {\n var _a;\n\n return (_a = languages === null || languages === void 0 ? void 0 : languages.find(lang => lang.locale === locale)) === null || _a === void 0 ? void 0 : _a.nativeName;\n }, [locale, languages]);\n}\n\nexports.useLocaleNativeName = useLocaleNativeName;\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/translations/hooks.ts?");
446
+ eval("\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports.useLocaleNativeName = exports.useTranslationsContainer = exports.useTranslatedEventData = exports.useTranslations = void 0;\n\nconst selectors_1 = __webpack_require__(/*! domains/translations/selectors */ \"./src/javascripts/domains/translations/selectors.ts\");\n\nconst slice_1 = __webpack_require__(/*! domains/translations/slice */ \"./src/javascripts/domains/translations/slice.ts\");\n\nconst hooks_1 = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n\nconst react_redux_1 = __webpack_require__(/*! react-redux */ \"./node_modules/react-redux/es/index.js\");\n\nconst seamly_hooks_1 = __webpack_require__(/*! ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n\nconst seamly_utils_1 = __webpack_require__(/*! ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.ts\");\n\nfunction useTranslations() {\n const {\n sendAction\n } = (0, seamly_hooks_1.useSeamlyCommands)();\n const dispatch = (0, react_redux_1.useDispatch)();\n const enableTranslations = (0, hooks_1.useCallback)(locale => {\n sendAction({\n type: seamly_utils_1.actionTypes.setTranslation,\n body: {\n enabled: true,\n locale\n }\n });\n dispatch((0, slice_1.enableTranslation)(locale));\n }, [sendAction, dispatch]);\n const disableTranslations = (0, hooks_1.useCallback)(() => {\n sendAction({\n type: seamly_utils_1.actionTypes.setTranslation,\n body: {\n enabled: false\n }\n });\n dispatch((0, slice_1.disableTranslation)());\n }, [sendAction, dispatch]);\n const {\n languages,\n isActive,\n isAvailable,\n currentLocale\n } = (0, react_redux_1.useSelector)(({\n translations\n }) => translations);\n return {\n languages,\n isActive,\n isAvailable,\n currentLocale,\n enableTranslations,\n disableTranslations\n };\n}\n\nexports.useTranslations = useTranslations;\n\nfunction useTranslatedEventData(channelEvent) {\n const getTranslations = () => {\n var _a, _b, _c;\n\n if (!channelEvent.payload) return {\n body: undefined,\n translatedBody: undefined\n };\n\n if (channelEvent.type === 'participant') {\n return {\n body: (_a = channelEvent.payload) === null || _a === void 0 ? void 0 : _a.participant.introduction,\n translatedBody: (_c = (_b = channelEvent.payload) === null || _b === void 0 ? void 0 : _b.participant) === null || _c === void 0 ? void 0 : _c.translatedIntroduction\n };\n }\n\n return {\n body: channelEvent.payload.body,\n translatedBody: channelEvent.payload.translatedBody\n };\n };\n\n const {\n translatedBody,\n body\n } = getTranslations();\n const hasTranslation = !!translatedBody;\n const isTranslated = (0, react_redux_1.useSelector)((0, selectors_1.selectIsTranslated)(channelEvent));\n return {\n body: hasTranslation && isTranslated ? translatedBody === null || translatedBody === void 0 ? void 0 : translatedBody.data : body,\n hasTranslation,\n isTranslated: isTranslated && hasTranslation,\n locale: translatedBody === null || translatedBody === void 0 ? void 0 : translatedBody.locale\n };\n}\n\nexports.useTranslatedEventData = useTranslatedEventData;\n\nfunction useTranslationsContainer() {\n const id = (0, react_redux_1.useSelector)(({\n translations\n }) => translations.containerId);\n const focusContainer = (0, seamly_hooks_1.useElementFocusingById)(id);\n return {\n id,\n focusContainer\n };\n}\n\nexports.useTranslationsContainer = useTranslationsContainer;\n\nfunction useLocaleNativeName(locale) {\n const {\n languages\n } = useTranslations();\n return (0, hooks_1.useMemo)(() => {\n var _a;\n\n return (_a = languages === null || languages === void 0 ? void 0 : languages.find(lang => lang.locale === locale)) === null || _a === void 0 ? void 0 : _a.nativeName;\n }, [locale, languages]);\n}\n\nexports.useLocaleNativeName = useLocaleNativeName;\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/translations/hooks.ts?");
447
+
448
+ /***/ }),
449
+
450
+ /***/ "./src/javascripts/domains/translations/selectors.ts":
451
+ /*!***********************************************************!*\
452
+ !*** ./src/javascripts/domains/translations/selectors.ts ***!
453
+ \***********************************************************/
454
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
455
+
456
+ "use strict";
457
+ eval("\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports.selectIsTranslated = void 0;\n\nconst toolkit_1 = __webpack_require__(/*! @reduxjs/toolkit */ \"./node_modules/@reduxjs/toolkit/dist/redux-toolkit.esm.js\");\n\nconst selectIsTranslated = channelEvent => (0, toolkit_1.createSelector)(store => store.translations.translatedEventGroups, translatedEventGroups => Object.values(translatedEventGroups).every(value => {\n var _a;\n\n return !value.includes((_a = channelEvent === null || channelEvent === void 0 ? void 0 : channelEvent.payload) === null || _a === void 0 ? void 0 : _a.id);\n}));\n\nexports.selectIsTranslated = selectIsTranslated;\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/translations/selectors.ts?");
447
458
 
448
459
  /***/ }),
449
460
 
@@ -454,7 +465,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));
454
465
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
455
466
 
456
467
  "use strict";
457
- eval("\n\nvar _a;\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports.disableEvent = exports.enableEvent = exports.disableTranslation = exports.enableTranslation = exports.translationSlice = exports.translationsInitialState = void 0;\n\nconst toolkit_1 = __webpack_require__(/*! @reduxjs/toolkit */ \"./node_modules/@reduxjs/toolkit/dist/redux-toolkit.esm.js\");\n\nconst actions_1 = __webpack_require__(/*! domains/app/actions */ \"./src/javascripts/domains/app/actions.ts\");\n\nconst actions_2 = __webpack_require__(/*! domains/config/actions */ \"./src/javascripts/domains/config/actions.ts\");\n\nexports.translationsInitialState = {\n isActive: false,\n currentLocale: undefined,\n isAvailable: false,\n languages: [],\n originalPayloadIds: [],\n containerId: (0, toolkit_1.nanoid)()\n};\nexports.translationSlice = (0, toolkit_1.createSlice)({\n name: 'translation',\n initialState: exports.translationsInitialState,\n reducers: {\n enableTranslation: (state, {\n payload\n }) => {\n state.isActive = true;\n state.currentLocale = payload;\n },\n disableTranslation: state => {\n state.isActive = false;\n state.currentLocale = undefined;\n },\n enableEvent: (state, {\n payload\n }) => {\n if (!state.originalPayloadIds.includes(payload)) {\n return;\n }\n\n state.originalPayloadIds = state.originalPayloadIds.filter(id => id !== payload);\n },\n disableEvent: (state, {\n payload\n }) => {\n if (state.originalPayloadIds.includes(payload)) {\n return;\n }\n\n state.originalPayloadIds.push(payload);\n }\n },\n extraReducers: builder => {\n builder.addCase(actions_1.initializeApp.fulfilled, (state, {\n payload\n }) => {\n var _a, _b;\n\n if (!((_b = (_a = payload.config) === null || _a === void 0 ? void 0 : _a.context) === null || _b === void 0 ? void 0 : _b.translationLocale)) return;\n state.isActive = true;\n state.currentLocale = payload.locale;\n }).addCase(actions_2.initializeConfig.fulfilled, (state, {\n payload\n }) => {\n var _a;\n\n const feature = (_a = payload === null || payload === void 0 ? void 0 : payload.features) === null || _a === void 0 ? void 0 : _a.translation;\n if (!feature) return;\n state.isAvailable = feature.enabled === true;\n state.languages = feature.languages;\n });\n }\n});\n_a = exports.translationSlice.actions, exports.enableTranslation = _a.enableTranslation, exports.disableTranslation = _a.disableTranslation, exports.enableEvent = _a.enableEvent, exports.disableEvent = _a.disableEvent;\nexports[\"default\"] = exports.translationSlice.reducer;\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/translations/slice.ts?");
468
+ eval("\n\nvar _a;\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports.disableEventsTranslation = exports.enableEventsTranslation = exports.disableTranslation = exports.enableTranslation = exports.translationSlice = exports.translationsInitialState = void 0;\n\nconst toolkit_1 = __webpack_require__(/*! @reduxjs/toolkit */ \"./node_modules/@reduxjs/toolkit/dist/redux-toolkit.esm.js\");\n\nconst actions_1 = __webpack_require__(/*! domains/config/actions */ \"./src/javascripts/domains/config/actions.ts\");\n\nconst slice_1 = __webpack_require__(/*! domains/store/slice */ \"./src/javascripts/domains/store/slice.ts\");\n\nexports.translationsInitialState = {\n isActive: false,\n currentLocale: undefined,\n isAvailable: false,\n languages: [],\n containerId: (0, toolkit_1.nanoid)(),\n translatedEventGroups: {}\n};\n\nconst getLastGroupId = (events, id) => {\n const eventGroup = [...events].reduce((acc, {\n payload\n }, _index, arr) => {\n var _a;\n\n if (acc[id]) {\n // Splice to break early (make the reducer think we are done)\n // This is needed to avoid events of other groups from being added to the array.\n // @ts-ignore\n if ((payload === null || payload === void 0 ? void 0 : payload.type) === 'divider' && ((_a = payload === null || payload === void 0 ? void 0 : payload.body) === null || _a === void 0 ? void 0 : _a.translationEnabled)) {\n arr.splice(0);\n return acc;\n }\n\n acc[id].push(payload.id);\n }\n\n if (payload.id === id) acc[id] = [];\n return acc;\n }, {});\n const [[groupId, eventIds]] = Object.entries(eventGroup);\n const lastGroupId = events //@ts-ignore\n .filter(event => {\n var _a;\n\n return ((_a = event.payload) === null || _a === void 0 ? void 0 : _a.type) === 'divider';\n }).map(event => event.payload.id).at(-1);\n return {\n lastGroupId,\n groupId,\n eventIds\n };\n};\n\nexports.translationSlice = (0, toolkit_1.createSlice)({\n name: 'translation',\n initialState: exports.translationsInitialState,\n reducers: {\n enableTranslation: (state, {\n payload\n }) => {\n state.isActive = true;\n state.currentLocale = payload;\n },\n disableTranslation: state => {\n state.isActive = false;\n state.currentLocale = undefined;\n },\n enableEventsTranslation: (state, {\n payload: {\n events,\n id\n }\n }) => {\n delete state.translatedEventGroups[id];\n const {\n lastGroupId\n } = getLastGroupId(events, id);\n state.lastGroupId = lastGroupId;\n },\n disableEventsTranslation: (state, {\n payload: {\n events,\n id\n }\n }) => {\n const {\n lastGroupId,\n groupId,\n eventIds\n } = getLastGroupId(events, id);\n state.lastGroupId = lastGroupId;\n state.translatedEventGroups[groupId] = eventIds;\n }\n },\n extraReducers: builder => {\n builder.addCase(actions_1.initializeConfig.fulfilled, (state, {\n payload\n }) => {\n var _a;\n\n const feature = (_a = payload === null || payload === void 0 ? void 0 : payload.features) === null || _a === void 0 ? void 0 : _a.translation;\n if (!feature) return;\n state.isAvailable = feature.enabled === true;\n state.languages = feature.languages;\n }).addCase(slice_1.addEvent, (state, {\n payload\n }) => {\n if (state.translatedEventGroups[state.lastGroupId]) {\n state.translatedEventGroups[state.lastGroupId].push(payload.payload.id);\n }\n });\n }\n});\n_a = exports.translationSlice.actions, exports.enableTranslation = _a.enableTranslation, exports.disableTranslation = _a.disableTranslation, exports.enableEventsTranslation = _a.enableEventsTranslation, exports.disableEventsTranslation = _a.disableEventsTranslation;\nexports[\"default\"] = exports.translationSlice.reducer;\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/translations/slice.ts?");
458
469
 
459
470
  /***/ }),
460
471
 
@@ -531,7 +542,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));
531
542
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
532
543
 
533
544
  "use strict";
534
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ SeamlyBaseError)\n/* harmony export */ });\nclass SeamlyBaseError extends Error {\n constructor(originalError, ...params) {\n super(...params);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, Object.getPrototypeOf(this));\n }\n\n this.originalError = originalError;\n\n if (originalError !== null && originalError !== void 0 && originalError.payload) {\n this.originalEvent = originalError;\n this.originalError = originalError.payload.error;\n this.message = `Event of type ${originalError.payload.type} encountered`;\n }\n\n if (originalError !== null && originalError !== void 0 && originalError.error) {\n this.originalError = originalError.error;\n }\n }\n\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/api/errors/seamly-base-error.js?");
545
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ SeamlyBaseError)\n/* harmony export */ });\nclass SeamlyBaseError extends Error {\n constructor(originalError, ...params) {\n super(...params);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, Object.getPrototypeOf(this));\n }\n\n this.originalError = originalError;\n\n if (originalError?.payload) {\n this.originalEvent = originalError;\n this.originalError = originalError.payload.error;\n this.message = `Event of type ${originalError.payload.type} encountered`;\n }\n\n if (originalError?.error) {\n this.originalError = originalError.error;\n }\n }\n\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/api/errors/seamly-base-error.js?");
535
546
 
536
547
  /***/ }),
537
548
 
@@ -619,7 +630,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
619
630
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
620
631
 
621
632
  "use strict";
622
- 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 xstream__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! xstream */ \"./node_modules/xstream/index.js\");\n/* harmony import */ var xstream__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(xstream__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var superagent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! superagent */ \"./node_modules/superagent/lib/client.js\");\n/* harmony import */ var superagent__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(superagent__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! config */ \"./src/javascripts/config.ts\");\n/* harmony import */ var lib_store_index__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lib/store/index */ \"./src/javascripts/lib/store/index.js\");\n/* harmony import */ var lib_id__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lib/id */ \"./src/javascripts/lib/id.js\");\n/* harmony import */ var lib_store_providers_session_storage__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lib/store/providers/session-storage */ \"./src/javascripts/lib/store/providers/session-storage.js\");\n/* harmony import */ var lib_debug__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! lib/debug */ \"./src/javascripts/lib/debug.js\");\n/* harmony import */ var lib_debug__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(lib_debug__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ui/utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var _producer__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./producer */ \"./src/javascripts/api/producer.js\");\n/* harmony import */ var _event_producer__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./event-producer */ \"./src/javascripts/api/event-producer.js\");\n/* harmony import */ var _errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./errors/seamly-session-expired-error */ \"./src/javascripts/api/errors/seamly-session-expired-error.js\");\n/* harmony import */ var _errors_seamly_configuration_error__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./errors/seamly-configuration-error */ \"./src/javascripts/api/errors/seamly-configuration-error.js\");\n/* harmony import */ var _errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./errors/seamly-general-error */ \"./src/javascripts/api/errors/seamly-general-error.js\");\n/* harmony import */ var _errors_seamly_unauthorized_error__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./errors/seamly-unauthorized-error */ \"./src/javascripts/api/errors/seamly-unauthorized-error.js\");\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; }\n\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; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst log = lib_debug__WEBPACK_IMPORTED_MODULE_6___default()('seamly');\nconst DOMAIN = 'api.seamly-app.com';\nconst TRANSLATIONS_VERSION = 1;\n\nfunction buildPayload(command, payload) {\n if (command !== 'message') {\n return payload;\n }\n\n const {\n type,\n body\n } = payload;\n let {\n transactionId\n } = payload;\n\n if (!transactionId) {\n transactionId = (0,lib_id__WEBPACK_IMPORTED_MODULE_4__.randomId)();\n }\n\n return {\n type,\n body,\n transactionId\n };\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 */\n\n\nfunction getTimeZone() {\n if (!Intl || typeof Intl === 'undefined' || typeof Intl.DateTimeFormat === 'undefined') {\n return null;\n }\n\n const format = Intl.DateTimeFormat();\n\n if (typeof format === 'undefined' || typeof format.resolvedOptions === 'undefined') {\n return null;\n }\n\n const timezone = format.resolvedOptions().timeZone; // Ensure we get a valid timezone\n\n if (timezone && (timezone.indexOf('/') > -1 || timezone === 'UTC')) {\n return timezone;\n } else {\n return null;\n }\n}\n\nclass API {\n /**\n * Creates an instance of API.\n * @param {Object} [config={}]\n * @param {string} config.key Api key\n * @param {string} config.domain Domain to connect to\n * @param {string} config.secure Connect securely\n * @param {string} config.externalId Unique visitor identifier (optional)\n * @param {boolean} config.sendEnvironment\n * @param {string} layoutMode\n * @param {string} namespace\n * @param {Object} [context={ channelName: undefined, variables: undefined, locale: undefined, topic: undefined, translationLocale: undefined }]\n * @param {string} context.channelName\n * @param {object} context.variables\n * @param {string} context.locale\n * @param {string} context.topic\n * @param {string} context.translationLocale\n * @memberof API\n */\n constructor({\n layoutMode,\n namespace,\n config = {},\n context = {}\n }) {\n this.store = (0,lib_store_index__WEBPACK_IMPORTED_MODULE_3__.objectStore)(`${namespace}.connection${context.locale ? `.${context.locale}` : ''}`, config.storageProvider || lib_store_providers_session_storage__WEBPACK_IMPORTED_MODULE_5__[\"default\"]);\n this.connectionInfo = {\n apiKey: config.key,\n domain: config.domain || DOMAIN,\n secure: config.secure !== false ? config.secure || true : false\n };\n this.config = {\n sendEnvironment: config.sendEnvironment ?? true,\n context: _objectSpread(_objectSpread({}, context), {}, {\n channelName: context.channelName || 'web'\n })\n };\n this.connected = false;\n this.configReady = false;\n this.externalId = config.externalId;\n this.layoutMode = layoutMode;\n this.userResponded = false;\n this.internalProducer = new _event_producer__WEBPACK_IMPORTED_MODULE_9__[\"default\"]('API');\n this.internal$ = xstream__WEBPACK_IMPORTED_MODULE_0___default().create(this.internalProducer).flatten();\n this.connection$ = this.internal$.filter(event => event.type === 'connection');\n this.connection$.subscribe({\n next: ({\n connected,\n ready\n }) => {\n this.connected = connected;\n this.ready = ready;\n }\n });\n this.URLS = {}; // 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\n window.addEventListener('pageshow', event => {\n if (event.persisted && this.connected) {\n this.connect();\n }\n });\n }\n\n getAccessToken() {\n return this.store.get('accessToken');\n }\n\n setAccessToken(accessToken) {\n this.store.set('accessToken', accessToken);\n }\n\n getConversationUrl() {\n return this.store.get('conversationUrl');\n }\n\n setConversationUrl(url) {\n this.store.set('conversationUrl', url);\n }\n\n hasConversation() {\n return !!this.getConversationUrl();\n }\n\n 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 }\n\n setChannelTopic(topic) {\n this.store.set('channelTopic', topic);\n }\n\n getLocale = locale => locale || this.locale;\n\n clearStore() {\n this.store.delete('accessToken');\n this.store.delete('conversationUrl'); // TODO: Remove `channelName` when all clients have been upgraded past v20.\n\n this.store.delete('channelName');\n this.store.delete('channelTopic');\n }\n\n getUrlPrefix(protocol) {\n const realProtocol = this.connectionInfo.secure ? `${protocol}s` : protocol;\n return `${realProtocol}://${this.connectionInfo.domain}`;\n }\n\n updateUrls({\n _links: responseLinks\n }) {\n this.URLS = Object.entries(responseLinks).filter(([key]) => key !== 'self').reduce((urls, [key, {\n href\n }]) => {\n return _objectSpread(_objectSpread({}, urls), {}, {\n [key]: href\n });\n }, this.URLS);\n }\n\n async reset() {\n await this.disconnect();\n this.clearStore();\n return this.getConfig();\n }\n\n async disconnect() {\n if (this.conversationProducer) {\n await this.conversationProducer.disconnect();\n }\n\n this.connected = false;\n this.configReady = false;\n }\n\n async createConversation() {\n try {\n var _conversation$transla;\n\n const request = superagent__WEBPACK_IMPORTED_MODULE_1___default().post(`${this.getUrlPrefix('http')}${this.URLS.conversations}`).set('Content-Type', 'application/json').query({\n v: config__WEBPACK_IMPORTED_MODULE_2__.apiVersion\n }) // withCredentials() is necessary to allow browsers to save received\n // cookies in CORS requests.\n .withCredentials().send({\n externalId: this.externalId || undefined\n });\n const {\n body\n } = await request;\n const {\n conversation\n } = body;\n\n const initialState = _objectSpread({}, conversation);\n\n delete initialState.accessToken;\n delete initialState.channelTopic;\n this.setAccessToken(conversation.accessToken);\n this.setChannelTopic(conversation.channelTopic);\n this.updateUrls(body);\n this.setConversationUrl(this.URLS.conversation);\n this.locale = (_conversation$transla = conversation.translation) === null || _conversation$transla === void 0 ? void 0 : _conversation$transla.locale;\n this.userResponded = conversation.userResponded;\n return initialState;\n } catch (error) {\n if (error.status >= 500) {\n throw new _errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_12__[\"default\"](error);\n }\n\n throw error;\n }\n }\n\n getConfig() {\n return superagent__WEBPACK_IMPORTED_MODULE_1___default().post(`${this.getUrlPrefix('http')}/client/${this.connectionInfo.apiKey}/configs`).set('Content-Type', 'application/json').query({\n v: config__WEBPACK_IMPORTED_MODULE_2__.apiVersion\n }).send({\n context: _objectSpread(_objectSpread({}, this.config.context), {}, {\n environment: this.config.sendEnvironment === true ? this.getEnvironment() : this.config.sendEnvironment\n })\n }).then(({\n body\n }) => {\n this.updateUrls(body);\n this.configReady = true;\n return body.config;\n }).catch(error => {\n if (error.status === 404) {\n throw new _errors_seamly_configuration_error__WEBPACK_IMPORTED_MODULE_11__[\"default\"]();\n }\n\n if (error.status >= 500) {\n throw new _errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_12__[\"default\"](error);\n }\n\n throw error;\n });\n }\n\n async getConversation() {\n if (!this.hasConversation()) {\n return null;\n }\n\n try {\n const {\n body\n } = await superagent__WEBPACK_IMPORTED_MODULE_1___default().get(`${this.getUrlPrefix('http')}${this.URLS.history}`).set('Authorization', `Bearer ${this.getAccessToken()}`).query({\n v: config__WEBPACK_IMPORTED_MODULE_2__.apiVersion\n });\n this.updateUrls(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: _objectSpread(_objectSpread({}, 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 translation\n };\n } catch (error) {\n if (error.status === 401) {\n throw new _errors_seamly_unauthorized_error__WEBPACK_IMPORTED_MODULE_13__[\"default\"](error);\n }\n\n if (error.status === 404) {\n throw new _errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_10__[\"default\"](error);\n }\n\n if (error.status >= 500) {\n throw new _errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_12__[\"default\"](error);\n }\n\n throw error;\n }\n }\n\n async connect() {\n this.connected = false;\n let conversationInitialState = null;\n\n if (!this.hasConversation()) {\n conversationInitialState = await this.createConversation();\n }\n\n this.conversationProducer = new _producer__WEBPACK_IMPORTED_MODULE_8__[\"default\"](`${this.getUrlPrefix('ws')}${this.URLS.socket}`, this.config.context.channelName, this.getChannelTopic(), this.getAccessToken());\n this.internalProducer.emit(xstream__WEBPACK_IMPORTED_MODULE_0___default().create(this.conversationProducer)); // Send environment\n\n if (this.config.sendEnvironment) {\n this.send('context', {\n environment: this.config.sendEnvironment === true ? this.getEnvironment() : this.config.sendEnvironment\n }, false);\n }\n\n return conversationInitialState;\n }\n\n uploadFile(file, progressCallback, successCallback, errorCallback) {\n const formData = new FormData();\n formData.append('upload', file);\n const req = superagent__WEBPACK_IMPORTED_MODULE_1___default().post(`${this.getUrlPrefix('http')}${this.URLS.uploads}`).set('Authorization', `Bearer ${this.getAccessToken()}`).send(formData);\n req.on('progress', function (e) {\n const {\n direction,\n percent\n } = e;\n\n if (direction === 'upload' && typeof progressCallback === 'function') {\n progressCallback(percent);\n }\n });\n req.then(uploadResponse => {\n if (successCallback) {\n successCallback(uploadResponse);\n }\n }).catch(err => {\n if (errorCallback) {\n errorCallback(err.response);\n } else {\n throw err;\n }\n });\n return req;\n }\n\n getConversationIntitialState() {\n return superagent__WEBPACK_IMPORTED_MODULE_1___default().get(`${this.getUrlPrefix('http')}${this.getConversationUrl()}`).set('Authorization', `Bearer ${this.getAccessToken()}`).query({\n v: config__WEBPACK_IMPORTED_MODULE_2__.apiVersion\n }).then(({\n body\n }) => {\n this.updateUrls(body);\n this.userResponded = body.conversation.userResponded;\n return (0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.omit)(body.conversation, ['accessToken', 'channelTopic']);\n }).catch(error => {\n if (error.status === 401) {\n throw new _errors_seamly_unauthorized_error__WEBPACK_IMPORTED_MODULE_13__[\"default\"](error);\n }\n\n if (error.status === 404) {\n throw new _errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_10__[\"default\"](error);\n }\n\n if (error.status >= 500) {\n throw new _errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_12__[\"default\"](error);\n }\n\n throw error;\n });\n }\n\n async getTranslations(locale) {\n try {\n const url = `${this.getUrlPrefix('http')}${this.URLS.translations}`.replace('{version}', String(TRANSLATIONS_VERSION)).replace('{locale}', this.getLocale(locale));\n const request = superagent__WEBPACK_IMPORTED_MODULE_1___default().get(url);\n const {\n body\n } = await request;\n return body.translations;\n } catch (error) {\n if (error.status >= 500) {\n throw new _errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_12__[\"default\"](error);\n }\n\n throw error;\n }\n }\n\n send(command, payload, waitForReady = true) {\n if (!this.connected || waitForReady && !this.ready) {\n // Wait for connection\n this.connection$.filter(e => waitForReady ? e.connected && e.ready : e.connected).take(1).subscribe({\n next: () => this.send(command, payload, waitForReady)\n });\n return;\n }\n\n log('[SEND]', command, payload);\n this.conversationProducer.push(command, buildPayload(command, payload), 10000);\n }\n\n sendContext(context = {}) {\n const {\n locale,\n variables\n } = context;\n const payload = {};\n\n if (locale) {\n if (typeof locale !== 'string') {\n throw new Error('Locale must be a string');\n }\n\n payload.locale = locale;\n }\n\n if (variables) {\n if (typeof variables !== 'object') {\n throw new Error('Variables must be an object');\n }\n\n payload.variables = variables;\n } // If we have empty context don't send context message\n\n\n if (Object.keys(payload).length === 0 && payload.constructor === Object) {\n return;\n }\n\n this.send('context', payload, false);\n }\n\n stream() {\n return this.internal$.filter(event => event.type !== 'connection');\n }\n\n getEnvironment() {\n return {\n clientName: \"@seamly/web-ui\",\n clientVariant: this.layoutMode,\n clientVersion: \"20.8.0-alpha.1\",\n currentUrl: window.location.toString(),\n screenResolution: `${window.screen.width}x${window.screen.height}`,\n timezone: getTimeZone(),\n userAgent: navigator.userAgent\n };\n }\n\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/api/index.js?");
633
+ 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 xstream__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! xstream */ \"./node_modules/xstream/index.js\");\n/* harmony import */ var xstream__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(xstream__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var superagent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! superagent */ \"./node_modules/superagent/lib/client.js\");\n/* harmony import */ var superagent__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(superagent__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! config */ \"./src/javascripts/config.ts\");\n/* harmony import */ var lib_store_index__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lib/store/index */ \"./src/javascripts/lib/store/index.js\");\n/* harmony import */ var lib_id__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lib/id */ \"./src/javascripts/lib/id.js\");\n/* harmony import */ var lib_store_providers_session_storage__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lib/store/providers/session-storage */ \"./src/javascripts/lib/store/providers/session-storage.js\");\n/* harmony import */ var lib_debug__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! lib/debug */ \"./src/javascripts/lib/debug.js\");\n/* harmony import */ var lib_debug__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(lib_debug__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ui/utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var _producer__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./producer */ \"./src/javascripts/api/producer.js\");\n/* harmony import */ var _event_producer__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./event-producer */ \"./src/javascripts/api/event-producer.js\");\n/* harmony import */ var _errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./errors/seamly-session-expired-error */ \"./src/javascripts/api/errors/seamly-session-expired-error.js\");\n/* harmony import */ var _errors_seamly_configuration_error__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./errors/seamly-configuration-error */ \"./src/javascripts/api/errors/seamly-configuration-error.js\");\n/* harmony import */ var _errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./errors/seamly-general-error */ \"./src/javascripts/api/errors/seamly-general-error.js\");\n/* harmony import */ var _errors_seamly_unauthorized_error__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./errors/seamly-unauthorized-error */ \"./src/javascripts/api/errors/seamly-unauthorized-error.js\");\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; }\n\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; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst log = lib_debug__WEBPACK_IMPORTED_MODULE_6___default()('seamly');\nconst DOMAIN = 'api.seamly-app.com';\nconst TRANSLATIONS_VERSION = 1;\n\nfunction buildPayload(command, payload) {\n if (command !== 'message') {\n return payload;\n }\n\n const {\n type,\n body\n } = payload;\n let {\n transactionId\n } = payload;\n\n if (!transactionId) {\n transactionId = (0,lib_id__WEBPACK_IMPORTED_MODULE_4__.randomId)();\n }\n\n return {\n type,\n body,\n transactionId\n };\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 */\n\n\nfunction getTimeZone() {\n if (!Intl || typeof Intl === 'undefined' || typeof Intl.DateTimeFormat === 'undefined') {\n return null;\n }\n\n const format = Intl.DateTimeFormat();\n\n if (typeof format === 'undefined' || typeof format.resolvedOptions === 'undefined') {\n return null;\n }\n\n const timezone = format.resolvedOptions().timeZone; // Ensure we get a valid timezone\n\n if (timezone && (timezone.indexOf('/') > -1 || timezone === 'UTC')) {\n return timezone;\n } else {\n return null;\n }\n}\n\nclass API {\n /**\n * Creates an instance of API.\n * @param {Object} [config={}]\n * @param {string} config.key Api key\n * @param {string} config.domain Domain to connect to\n * @param {string} config.secure Connect securely\n * @param {string} config.externalId Unique visitor identifier (optional)\n * @param {boolean} config.sendEnvironment\n * @param {string} layoutMode\n * @param {string} namespace\n * @param {Object} [context={ channelName: undefined, variables: undefined, locale: undefined, topic: undefined, translationLocale: undefined }]\n * @param {string} context.channelName\n * @param {object} context.variables\n * @param {string} context.locale\n * @param {string} context.topic\n * @param {string} context.translationLocale\n * @memberof API\n */\n constructor({\n layoutMode,\n namespace,\n config = {},\n context = {}\n }) {\n this.store = (0,lib_store_index__WEBPACK_IMPORTED_MODULE_3__.objectStore)(`${namespace}.connection${context.locale ? `.${context.locale}` : ''}`, config.storageProvider || lib_store_providers_session_storage__WEBPACK_IMPORTED_MODULE_5__[\"default\"]);\n this.connectionInfo = {\n apiKey: config.key,\n domain: config.domain || DOMAIN,\n secure: config.secure !== false ? config.secure || true : false\n };\n this.config = {\n sendEnvironment: config.sendEnvironment ?? true,\n context: _objectSpread(_objectSpread({}, context), {}, {\n channelName: context.channelName || 'web'\n })\n };\n this.connected = false;\n this.configReady = false;\n this.externalId = config.externalId;\n this.layoutMode = layoutMode;\n this.userResponded = false;\n this.internalProducer = new _event_producer__WEBPACK_IMPORTED_MODULE_9__[\"default\"]('API');\n this.internal$ = xstream__WEBPACK_IMPORTED_MODULE_0___default().create(this.internalProducer).flatten();\n this.connection$ = this.internal$.filter(event => event.type === 'connection');\n this.connection$.subscribe({\n next: ({\n connected,\n ready\n }) => {\n this.connected = connected;\n this.ready = ready;\n }\n });\n this.URLS = {}; // 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\n window.addEventListener('pageshow', event => {\n if (event.persisted && this.connected) {\n this.connect();\n }\n });\n }\n\n getAccessToken() {\n return this.store.get('accessToken');\n }\n\n setAccessToken(accessToken) {\n this.store.set('accessToken', accessToken);\n }\n\n getConversationUrl() {\n return this.store.get('conversationUrl');\n }\n\n setConversationUrl(url) {\n this.store.set('conversationUrl', url);\n }\n\n hasConversation() {\n return !!this.getConversationUrl();\n }\n\n 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 }\n\n setChannelTopic(topic) {\n this.store.set('channelTopic', topic);\n }\n\n getLocale = locale => locale || this.locale;\n\n clearStore() {\n this.store.delete('accessToken');\n this.store.delete('conversationUrl'); // TODO: Remove `channelName` when all clients have been upgraded past v20.\n\n this.store.delete('channelName');\n this.store.delete('channelTopic');\n }\n\n getUrlPrefix(protocol) {\n const realProtocol = this.connectionInfo.secure ? `${protocol}s` : protocol;\n return `${realProtocol}://${this.connectionInfo.domain}`;\n }\n\n updateUrls({\n _links: responseLinks\n }) {\n this.URLS = Object.entries(responseLinks).filter(([key]) => key !== 'self').reduce((urls, [key, {\n href\n }]) => {\n return _objectSpread(_objectSpread({}, urls), {}, {\n [key]: href\n });\n }, this.URLS);\n }\n\n async reset() {\n await this.disconnect();\n this.clearStore();\n return this.getConfig();\n }\n\n async disconnect() {\n if (this.conversationProducer) {\n await this.conversationProducer.disconnect();\n }\n\n this.connected = false;\n this.configReady = false;\n }\n\n async createConversation() {\n try {\n const request = superagent__WEBPACK_IMPORTED_MODULE_1___default().post(`${this.getUrlPrefix('http')}${this.URLS.conversations}`).set('Content-Type', 'application/json').query({\n v: config__WEBPACK_IMPORTED_MODULE_2__.apiVersion\n }) // withCredentials() is necessary to allow browsers to save received\n // cookies in CORS requests.\n .withCredentials().send({\n externalId: this.externalId || undefined\n });\n const {\n body\n } = await request;\n const {\n conversation\n } = body;\n\n const initialState = _objectSpread({}, conversation);\n\n delete initialState.accessToken;\n delete initialState.channelTopic;\n this.setAccessToken(conversation.accessToken);\n this.setChannelTopic(conversation.channelTopic);\n this.updateUrls(body);\n this.setConversationUrl(this.URLS.conversation);\n this.locale = conversation.translation?.locale;\n this.userResponded = conversation.userResponded;\n return initialState;\n } catch (error) {\n if (error.status >= 500) {\n throw new _errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_12__[\"default\"](error);\n }\n\n throw error;\n }\n }\n\n getConfig() {\n return superagent__WEBPACK_IMPORTED_MODULE_1___default().post(`${this.getUrlPrefix('http')}/client/${this.connectionInfo.apiKey}/configs`).set('Content-Type', 'application/json').query({\n v: config__WEBPACK_IMPORTED_MODULE_2__.apiVersion\n }).send({\n context: _objectSpread(_objectSpread({}, this.config.context), {}, {\n environment: this.config.sendEnvironment === true ? this.getEnvironment() : this.config.sendEnvironment\n })\n }).then(({\n body\n }) => {\n this.updateUrls(body);\n this.configReady = true;\n return body.config;\n }).catch(error => {\n if (error.status === 404) {\n throw new _errors_seamly_configuration_error__WEBPACK_IMPORTED_MODULE_11__[\"default\"]();\n }\n\n if (error.status >= 500) {\n throw new _errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_12__[\"default\"](error);\n }\n\n throw error;\n });\n }\n\n async getConversation() {\n if (!this.hasConversation()) {\n return null;\n }\n\n try {\n const {\n body\n } = await superagent__WEBPACK_IMPORTED_MODULE_1___default().get(`${this.getUrlPrefix('http')}${this.URLS.history}`).set('Authorization', `Bearer ${this.getAccessToken()}`).query({\n v: config__WEBPACK_IMPORTED_MODULE_2__.apiVersion\n });\n this.updateUrls(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: _objectSpread(_objectSpread({}, 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 translation\n };\n } catch (error) {\n if (error.status === 401) {\n throw new _errors_seamly_unauthorized_error__WEBPACK_IMPORTED_MODULE_13__[\"default\"](error);\n }\n\n if (error.status === 404) {\n throw new _errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_10__[\"default\"](error);\n }\n\n if (error.status >= 500) {\n throw new _errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_12__[\"default\"](error);\n }\n\n throw error;\n }\n }\n\n async connect() {\n this.connected = false;\n let conversationInitialState = null;\n\n if (!this.hasConversation()) {\n conversationInitialState = await this.createConversation();\n }\n\n this.conversationProducer = new _producer__WEBPACK_IMPORTED_MODULE_8__[\"default\"](`${this.getUrlPrefix('ws')}${this.URLS.socket}`, this.config.context.channelName, this.getChannelTopic(), this.getAccessToken());\n this.internalProducer.emit(xstream__WEBPACK_IMPORTED_MODULE_0___default().create(this.conversationProducer)); // Send environment\n\n if (this.config.sendEnvironment) {\n this.send('context', {\n environment: this.config.sendEnvironment === true ? this.getEnvironment() : this.config.sendEnvironment\n }, false);\n }\n\n return conversationInitialState;\n }\n\n uploadFile(file, progressCallback, successCallback, errorCallback) {\n const formData = new FormData();\n formData.append('upload', file);\n const req = superagent__WEBPACK_IMPORTED_MODULE_1___default().post(`${this.getUrlPrefix('http')}${this.URLS.uploads}`).set('Authorization', `Bearer ${this.getAccessToken()}`).send(formData);\n req.on('progress', function (e) {\n const {\n direction,\n percent\n } = e;\n\n if (direction === 'upload' && typeof progressCallback === 'function') {\n progressCallback(percent);\n }\n });\n req.then(uploadResponse => {\n if (successCallback) {\n successCallback(uploadResponse);\n }\n }).catch(err => {\n if (errorCallback) {\n errorCallback(err.response);\n } else {\n throw err;\n }\n });\n return req;\n }\n\n getConversationIntitialState() {\n return superagent__WEBPACK_IMPORTED_MODULE_1___default().get(`${this.getUrlPrefix('http')}${this.getConversationUrl()}`).set('Authorization', `Bearer ${this.getAccessToken()}`).query({\n v: config__WEBPACK_IMPORTED_MODULE_2__.apiVersion\n }).then(({\n body\n }) => {\n this.updateUrls(body);\n this.userResponded = body.conversation.userResponded;\n return (0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.omit)(body.conversation, ['accessToken', 'channelTopic']);\n }).catch(error => {\n if (error.status === 401) {\n throw new _errors_seamly_unauthorized_error__WEBPACK_IMPORTED_MODULE_13__[\"default\"](error);\n }\n\n if (error.status === 404) {\n throw new _errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_10__[\"default\"](error);\n }\n\n if (error.status >= 500) {\n throw new _errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_12__[\"default\"](error);\n }\n\n throw error;\n });\n }\n\n async getTranslations(locale) {\n try {\n const url = `${this.getUrlPrefix('http')}${this.URLS.translations}`.replace('{version}', String(TRANSLATIONS_VERSION)).replace('{locale}', this.getLocale(locale));\n const request = superagent__WEBPACK_IMPORTED_MODULE_1___default().get(url);\n const {\n body\n } = await request;\n return body.translations;\n } catch (error) {\n if (error.status >= 500) {\n throw new _errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_12__[\"default\"](error);\n }\n\n throw error;\n }\n }\n\n send(command, payload, waitForReady = true) {\n if (!this.connected || waitForReady && !this.ready) {\n // Wait for connection\n this.connection$.filter(e => waitForReady ? e.connected && e.ready : e.connected).take(1).subscribe({\n next: () => this.send(command, payload, waitForReady)\n });\n return;\n }\n\n log('[SEND]', command, payload);\n this.conversationProducer.push(command, buildPayload(command, payload), 10000);\n }\n\n sendContext(context = {}) {\n const {\n locale,\n variables\n } = context;\n const payload = {};\n\n if (locale) {\n if (typeof locale !== 'string') {\n throw new Error('Locale must be a string');\n }\n\n payload.locale = locale;\n }\n\n if (variables) {\n if (typeof variables !== 'object') {\n throw new Error('Variables must be an object');\n }\n\n payload.variables = variables;\n } // If we have empty context don't send context message\n\n\n if (Object.keys(payload).length === 0 && payload.constructor === Object) {\n return;\n }\n\n this.send('context', payload, false);\n }\n\n stream() {\n return this.internal$.filter(event => event.type !== 'connection');\n }\n\n getEnvironment() {\n return {\n clientName: \"@seamly/web-ui\",\n clientVariant: this.layoutMode,\n clientVersion: \"20.7.0\",\n currentUrl: window.location.toString(),\n screenResolution: `${window.screen.width}x${window.screen.height}`,\n timezone: getTimeZone(),\n userAgent: navigator.userAgent\n };\n }\n\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/api/index.js?");
623
634
 
624
635
  /***/ }),
625
636
 
@@ -652,7 +663,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
652
663
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
653
664
 
654
665
  "use strict";
655
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"catchError\": () => (/* binding */ catchError),\n/* harmony export */ \"createErrorsMiddleware\": () => (/* binding */ createErrorsMiddleware)\n/* harmony export */ });\n/* harmony import */ var _reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @reduxjs/toolkit */ \"./node_modules/@reduxjs/toolkit/dist/redux-toolkit.esm.js\");\n/* harmony import */ var domains_config_selectors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! domains/config/selectors */ \"./src/javascripts/domains/config/selectors.ts\");\n\n\nconst catchError = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_1__.createAction)('catch-error', error => ({\n error\n}));\nfunction createErrorsMiddleware({\n api: seamlyApi\n}) {\n return ({\n getState\n }) => {\n const handleError = action => {\n const {\n errorCallback,\n namespace,\n api,\n layoutMode\n } = (0,domains_config_selectors__WEBPACK_IMPORTED_MODULE_0__.selectConfig)(getState());\n errorCallback === null || errorCallback === void 0 ? void 0 : errorCallback(action.error, {\n namespace,\n api,\n layoutMode,\n conversationUrl: seamlyApi.getConversationUrl(),\n action: action.type ? action : undefined\n });\n };\n\n return next => action => {\n try {\n var _action$payload, _action$payload$origi;\n\n if ((_action$payload = action.payload) !== null && _action$payload !== void 0 && (_action$payload$origi = _action$payload.originalEvent) !== null && _action$payload$origi !== void 0 && _action$payload$origi.payload) {\n var _action$payload2, _action$payload2$orig, _action$payload2$orig2;\n\n handleError({\n error: action.payload,\n type: (_action$payload2 = action.payload) === null || _action$payload2 === void 0 ? void 0 : (_action$payload2$orig = _action$payload2.originalEvent) === null || _action$payload2$orig === void 0 ? void 0 : (_action$payload2$orig2 = _action$payload2$orig.payload) === null || _action$payload2$orig2 === void 0 ? void 0 : _action$payload2$orig2.type\n });\n }\n\n return next(action);\n } catch (error) {\n handleError({\n error\n });\n throw error;\n }\n };\n };\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/errors/index.js?");
666
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"catchError\": () => (/* binding */ catchError),\n/* harmony export */ \"createErrorsMiddleware\": () => (/* binding */ createErrorsMiddleware)\n/* harmony export */ });\n/* harmony import */ var _reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @reduxjs/toolkit */ \"./node_modules/@reduxjs/toolkit/dist/redux-toolkit.esm.js\");\n/* harmony import */ var domains_config_selectors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! domains/config/selectors */ \"./src/javascripts/domains/config/selectors.ts\");\n\n\nconst catchError = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_1__.createAction)('catch-error', error => ({\n error\n}));\nfunction createErrorsMiddleware({\n api: seamlyApi\n}) {\n return ({\n getState\n }) => {\n const handleError = action => {\n const {\n errorCallback,\n namespace,\n api,\n layoutMode\n } = (0,domains_config_selectors__WEBPACK_IMPORTED_MODULE_0__.selectConfig)(getState());\n errorCallback?.(action.error, {\n namespace,\n api,\n layoutMode,\n conversationUrl: seamlyApi.getConversationUrl(),\n action: action.type ? action : undefined\n });\n };\n\n return next => action => {\n try {\n if (action.payload?.originalEvent?.payload) {\n handleError({\n error: action.payload,\n type: action.payload?.originalEvent?.payload?.type\n });\n }\n\n return next(action);\n } catch (error) {\n handleError({\n error\n });\n throw error;\n }\n };\n };\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/errors/index.js?");
656
667
 
657
668
  /***/ }),
658
669
 
@@ -718,18 +729,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
718
729
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
719
730
 
720
731
  "use strict";
721
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ createI18nMiddleware)\n/* harmony export */ });\n/* harmony import */ var domains_config_actions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! domains/config/actions */ \"./src/javascripts/domains/config/actions.ts\");\n/* harmony import */ var domains_config_actions__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(domains_config_actions__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var domains_i18n_actions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! domains/i18n/actions */ \"./src/javascripts/domains/i18n/actions.ts\");\n/* harmony import */ var domains_i18n_actions__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(domains_i18n_actions__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var domains_i18n_selectors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/i18n/selectors */ \"./src/javascripts/domains/i18n/selectors.ts\");\n/* harmony import */ var domains_store_slice__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! domains/store/slice */ \"./src/javascripts/domains/store/slice.ts\");\n/* harmony import */ var domains_translations_slice__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! domains/translations/slice */ \"./src/javascripts/domains/translations/slice.ts\");\n\n\n\n\n\nfunction createI18nMiddleware({\n dispatch,\n getState\n}) {\n return next => {\n return action => {\n var _payload$translation, _payload$translation2, _payload$payload, _payload$payload$body;\n\n const result = next(action);\n const {\n payload\n } = action;\n\n switch (action.type) {\n case domains_store_slice__WEBPACK_IMPORTED_MODULE_3__.setHistory.type:\n if (payload !== null && payload !== void 0 && (_payload$translation = payload.translation) !== null && _payload$translation !== void 0 && _payload$translation.enabled) {\n dispatch((0,domains_translations_slice__WEBPACK_IMPORTED_MODULE_4__.enableTranslation)(payload.translation.locale));\n dispatch((0,domains_i18n_actions__WEBPACK_IMPORTED_MODULE_1__.setLocale)(payload.translation.locale));\n }\n\n break;\n\n case domains_config_actions__WEBPACK_IMPORTED_MODULE_0__.initializeConfig.fulfilled.type:\n if (payload.locale) {\n dispatch((0,domains_i18n_actions__WEBPACK_IMPORTED_MODULE_1__.setLocale)(payload.locale));\n }\n\n break;\n\n case domains_store_slice__WEBPACK_IMPORTED_MODULE_3__.setInitialState.type:\n if (payload !== null && payload !== void 0 && (_payload$translation2 = payload.translation) !== null && _payload$translation2 !== void 0 && _payload$translation2.enabled) {\n dispatch((0,domains_translations_slice__WEBPACK_IMPORTED_MODULE_4__.enableTranslation)(payload.translation.locale));\n }\n\n break;\n\n case domains_store_slice__WEBPACK_IMPORTED_MODULE_3__.addEvent.type:\n if (payload.type === 'info' && (payload === null || payload === void 0 ? void 0 : (_payload$payload = payload.payload) === null || _payload$payload === void 0 ? void 0 : (_payload$payload$body = _payload$payload.body) === null || _payload$payload$body === void 0 ? void 0 : _payload$payload$body.subtype) === 'new_translation' && payload.payload.body.translationEnabled) {\n dispatch((0,domains_i18n_actions__WEBPACK_IMPORTED_MODULE_1__.setLocale)(payload.payload.body.translationLocale));\n }\n\n break;\n\n case domains_translations_slice__WEBPACK_IMPORTED_MODULE_4__.disableTranslation.type:\n const initialLocale = (0,domains_i18n_selectors__WEBPACK_IMPORTED_MODULE_2__.selectInitialLocale)(getState());\n dispatch((0,domains_i18n_actions__WEBPACK_IMPORTED_MODULE_1__.setLocale)(initialLocale));\n break;\n }\n\n return result;\n };\n };\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/translations/middleware.js?");
722
-
723
- /***/ }),
724
-
725
- /***/ "./src/javascripts/domains/translations/selectors.js":
726
- /*!***********************************************************!*\
727
- !*** ./src/javascripts/domains/translations/selectors.js ***!
728
- \***********************************************************/
729
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
730
-
731
- "use strict";
732
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getIsPayloadTranslated\": () => (/* binding */ getIsPayloadTranslated),\n/* harmony export */ \"getOriginalPayloadIds\": () => (/* binding */ getOriginalPayloadIds)\n/* harmony export */ });\n/* harmony import */ var _reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @reduxjs/toolkit */ \"./node_modules/reselect/es/index.js\");\n\nconst getOriginalPayloadIds = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__.createSelector)(({\n translations\n}) => translations, ({\n originalPayloadIds\n}) => originalPayloadIds);\nconst getIsPayloadTranslated = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__.createSelector)([getOriginalPayloadIds, (_, payloadId) => payloadId], (payloadIds, payloadId) => !payloadIds.includes(payloadId));\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/translations/selectors.js?");
732
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ createI18nMiddleware)\n/* harmony export */ });\n/* harmony import */ var domains_config_actions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! domains/config/actions */ \"./src/javascripts/domains/config/actions.ts\");\n/* harmony import */ var domains_config_actions__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(domains_config_actions__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var domains_i18n_actions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! domains/i18n/actions */ \"./src/javascripts/domains/i18n/actions.ts\");\n/* harmony import */ var domains_i18n_actions__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(domains_i18n_actions__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var domains_i18n_selectors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/i18n/selectors */ \"./src/javascripts/domains/i18n/selectors.ts\");\n/* harmony import */ var domains_store_slice__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! domains/store/slice */ \"./src/javascripts/domains/store/slice.ts\");\n/* harmony import */ var domains_translations_slice__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! domains/translations/slice */ \"./src/javascripts/domains/translations/slice.ts\");\n\n\n\n\n\nfunction createI18nMiddleware({\n dispatch,\n getState\n}) {\n return next => {\n return action => {\n const result = next(action);\n const {\n payload\n } = action;\n\n switch (action.type) {\n case domains_store_slice__WEBPACK_IMPORTED_MODULE_3__.setHistory.type:\n if (payload?.translation?.enabled) {\n dispatch((0,domains_translations_slice__WEBPACK_IMPORTED_MODULE_4__.enableTranslation)(payload.translation.locale));\n dispatch((0,domains_i18n_actions__WEBPACK_IMPORTED_MODULE_1__.setLocale)(payload.translation.locale));\n }\n\n break;\n\n case domains_config_actions__WEBPACK_IMPORTED_MODULE_0__.initializeConfig.fulfilled.type:\n if (payload.locale) {\n dispatch((0,domains_i18n_actions__WEBPACK_IMPORTED_MODULE_1__.setLocale)(payload.locale));\n }\n\n break;\n\n case domains_store_slice__WEBPACK_IMPORTED_MODULE_3__.setInitialState.type:\n if (payload?.translation?.enabled) {\n dispatch((0,domains_translations_slice__WEBPACK_IMPORTED_MODULE_4__.enableTranslation)(payload.translation.locale));\n }\n\n break;\n\n case domains_store_slice__WEBPACK_IMPORTED_MODULE_3__.addEvent.type:\n if (payload.type === 'info' && payload?.payload?.body?.subtype === 'new_translation' && payload.payload.body.translationEnabled) {\n dispatch((0,domains_i18n_actions__WEBPACK_IMPORTED_MODULE_1__.setLocale)(payload.payload.body.translationLocale));\n }\n\n break;\n\n case domains_translations_slice__WEBPACK_IMPORTED_MODULE_4__.disableTranslation.type:\n const initialLocale = (0,domains_i18n_selectors__WEBPACK_IMPORTED_MODULE_2__.selectInitialLocale)(getState());\n dispatch((0,domains_i18n_actions__WEBPACK_IMPORTED_MODULE_1__.setLocale)(initialLocale));\n break;\n }\n\n return result;\n };\n };\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/translations/middleware.js?");
733
733
 
734
734
  /***/ }),
735
735
 
@@ -794,7 +794,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
794
794
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
795
795
 
796
796
  "use strict";
797
- 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 lib_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lib/engine */ \"./src/javascripts/lib/engine/index.js\");\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; }\n\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; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\nconst isActionObject = actionObj => typeof actionObj === 'object' && 'action' in actionObj;\n\nconst fixActionObjectArgs = actionObj => _objectSpread(_objectSpread({}, actionObj), {}, {\n args: Array.isArray(actionObj.args) ? actionObj.args : [actionObj.args]\n});\n\nclass ExternalApi {\n constructor(appConfig) {\n this._waitingActions = [];\n this._instances = {};\n this.appConfig = appConfig;\n this.context = {};\n }\n\n push(...actionObjects) {\n // eslint-disable-next-line no-param-reassign\n actionObjects = actionObjects.filter(isActionObject).map(fixActionObjectArgs);\n\n if (actionObjects.length) {\n this._waitingActions.push(...actionObjects);\n\n this.handleActions();\n }\n }\n\n handleActions() {\n const actions = this._waitingActions;\n this._waitingActions = [];\n actions.forEach(actionObj => {\n switch (actionObj.action) {\n case 'init':\n this.handleInit(actionObj);\n break;\n\n case 'destroy':\n this.handleDestroy(actionObj);\n break;\n\n default:\n if (!this.handleAction(actionObj) && // Store context properties for the next instance that will be created\n !this.setContext(actionObj.action, ...actionObj.args)) {\n this._waitingActions.push(actionObj);\n }\n\n break;\n }\n });\n }\n\n setContext(action, args) {\n switch (action) {\n case 'setTopic':\n const {\n name\n } = args;\n\n if (name) {\n this.context.topic = name;\n }\n\n return true;\n\n case 'setTranslation':\n const {\n enabled,\n locale\n } = args;\n\n if (!!enabled && locale) {\n this.context.translationLocale = locale;\n }\n\n return true;\n\n case 'setVariables':\n if (Object.keys(args).length > 0) {\n this.context.variables = _objectSpread({}, args);\n }\n\n return true;\n\n default:\n return false;\n }\n }\n\n handleInit(actionObj) {\n const userConfig = this.getUserConfig(...actionObj.args);\n const config = this.getCombinedConfig(userConfig); // if this.appConfig is a function, it might return an invalid configuration (false, null, undefined)\n\n const {\n parentElement,\n namespace\n } = config || userConfig;\n\n if (!namespace) {\n this.destroy();\n } else {\n Object.values(this._instances).forEach(instance => {\n if (instance.parentElement === parentElement || instance.namespace === namespace) {\n this.destroy(instance);\n }\n });\n }\n\n if (config) {\n const instance = this.createInstance(config);\n this._instances[config.namespace] = instance; // Clear the context after creating the instance, so we do not reuse it for the next\n\n this.context = {};\n instance.render();\n }\n }\n\n handleDestroy(actionObj) {\n this.destroy(actionObj.instance);\n }\n\n handleAction(actionObj) {\n const {\n action,\n instance: namespace,\n args\n } = actionObj;\n const instances = Object.values(this._instances);\n\n if (!namespace && instances.length > 1) {\n console.warn(`Multiple instances detected. Due to potential race conditions, it is recommended to target a specific instance with the action: ${action}`);\n } // results will be an array containing the results of wether an instance has\n // handled the action or not\n\n\n const results = instances.map(instance => {\n return !namespace || instance.namespace === namespace ? instance.execFunction(action, ...args) : false;\n }); // test if any of the instances has handled the action\n\n return results.some(Boolean);\n }\n\n createInstance(config) {\n return new lib_engine__WEBPACK_IMPORTED_MODULE_0__[\"default\"](config, this);\n }\n\n destroy(instance) {\n if (!instance) {\n Object.entries(this._instances).forEach(([namespace, _instance]) => {\n _instance.destroy();\n\n delete this._instances[namespace];\n });\n } else {\n if (typeof instance === 'string') {\n // eslint-disable-next-line no-param-reassign\n instance = this._instances[instance];\n }\n\n if (instance) {\n instance.destroy();\n delete this._instances[instance.namespace];\n }\n }\n } // eslint-disable-next-line class-methods-use-this\n\n\n getUserConfig(userConfig = {}) {\n return userConfig;\n }\n\n getCombinedConfig(userConfig) {\n const context = _objectSpread(_objectSpread({}, userConfig.context || this.appConfig.context), this.context); // Key `variables` should only be set if there are any variables\n\n\n const variables = this.getMergedVariables(userConfig);\n\n if (Object.keys(variables).length > 0) {\n context.variables = variables;\n }\n\n const defaults = _objectSpread(_objectSpread({}, this.appConfig.defaults), userConfig.defaults);\n\n const combinedConfig = _objectSpread(_objectSpread(_objectSpread({}, this.appConfig), userConfig), {}, {\n api: _objectSpread(_objectSpread({}, this.appConfig.api), userConfig.api),\n context: Object.keys(context).length ? context : undefined,\n defaults: Object.keys(defaults).length ? defaults : undefined\n });\n\n return typeof this.appConfig === 'function' ? this.appConfig(combinedConfig) : combinedConfig;\n }\n\n getMergedVariables(userConfig) {\n var _this$appConfig$conte, _userConfig$context;\n\n return _objectSpread(_objectSpread(_objectSpread({}, ((_this$appConfig$conte = this.appConfig.context) === null || _this$appConfig$conte === void 0 ? void 0 : _this$appConfig$conte.variables) || {}), ((_userConfig$context = userConfig.context) === null || _userConfig$context === void 0 ? void 0 : _userConfig$context.variables) || {}), this.context.variables || {});\n }\n\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ExternalApi);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/lib/external-api/index.js?");
797
+ 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 lib_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lib/engine */ \"./src/javascripts/lib/engine/index.js\");\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; }\n\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; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\nconst isActionObject = actionObj => typeof actionObj === 'object' && 'action' in actionObj;\n\nconst fixActionObjectArgs = actionObj => _objectSpread(_objectSpread({}, actionObj), {}, {\n args: Array.isArray(actionObj.args) ? actionObj.args : [actionObj.args]\n});\n\nclass ExternalApi {\n constructor(appConfig) {\n this._waitingActions = [];\n this._instances = {};\n this.appConfig = appConfig;\n this.context = {};\n }\n\n push(...actionObjects) {\n // eslint-disable-next-line no-param-reassign\n actionObjects = actionObjects.filter(isActionObject).map(fixActionObjectArgs);\n\n if (actionObjects.length) {\n this._waitingActions.push(...actionObjects);\n\n this.handleActions();\n }\n }\n\n handleActions() {\n const actions = this._waitingActions;\n this._waitingActions = [];\n actions.forEach(actionObj => {\n switch (actionObj.action) {\n case 'init':\n this.handleInit(actionObj);\n break;\n\n case 'destroy':\n this.handleDestroy(actionObj);\n break;\n\n default:\n if (!this.handleAction(actionObj) && // Store context properties for the next instance that will be created\n !this.setContext(actionObj.action, ...actionObj.args)) {\n this._waitingActions.push(actionObj);\n }\n\n break;\n }\n });\n }\n\n setContext(action, args) {\n switch (action) {\n case 'setTopic':\n const {\n name\n } = args;\n\n if (name) {\n this.context.topic = name;\n }\n\n return true;\n\n case 'setTranslation':\n const {\n enabled,\n locale\n } = args;\n\n if (!!enabled && locale) {\n this.context.translationLocale = locale;\n }\n\n return true;\n\n case 'setVariables':\n if (Object.keys(args).length > 0) {\n this.context.variables = _objectSpread({}, args);\n }\n\n return true;\n\n default:\n return false;\n }\n }\n\n handleInit(actionObj) {\n const userConfig = this.getUserConfig(...actionObj.args);\n const config = this.getCombinedConfig(userConfig); // if this.appConfig is a function, it might return an invalid configuration (false, null, undefined)\n\n const {\n parentElement,\n namespace\n } = config || userConfig;\n\n if (!namespace) {\n this.destroy();\n } else {\n Object.values(this._instances).forEach(instance => {\n if (instance.parentElement === parentElement || instance.namespace === namespace) {\n this.destroy(instance);\n }\n });\n }\n\n if (config) {\n const instance = this.createInstance(config);\n this._instances[config.namespace] = instance; // Clear the context after creating the instance, so we do not reuse it for the next\n\n this.context = {};\n instance.render();\n }\n }\n\n handleDestroy(actionObj) {\n this.destroy(actionObj.instance);\n }\n\n handleAction(actionObj) {\n const {\n action,\n instance: namespace,\n args\n } = actionObj;\n const instances = Object.values(this._instances);\n\n if (!namespace && instances.length > 1) {\n console.warn(`Multiple instances detected. Due to potential race conditions, it is recommended to target a specific instance with the action: ${action}`);\n } // results will be an array containing the results of wether an instance has\n // handled the action or not\n\n\n const results = instances.map(instance => {\n return !namespace || instance.namespace === namespace ? instance.execFunction(action, ...args) : false;\n }); // test if any of the instances has handled the action\n\n return results.some(Boolean);\n }\n\n createInstance(config) {\n return new lib_engine__WEBPACK_IMPORTED_MODULE_0__[\"default\"](config, this);\n }\n\n destroy(instance) {\n if (!instance) {\n Object.entries(this._instances).forEach(([namespace, _instance]) => {\n _instance.destroy();\n\n delete this._instances[namespace];\n });\n } else {\n if (typeof instance === 'string') {\n // eslint-disable-next-line no-param-reassign\n instance = this._instances[instance];\n }\n\n if (instance) {\n instance.destroy();\n delete this._instances[instance.namespace];\n }\n }\n } // eslint-disable-next-line class-methods-use-this\n\n\n getUserConfig(userConfig = {}) {\n return userConfig;\n }\n\n getCombinedConfig(userConfig) {\n const context = _objectSpread(_objectSpread({}, userConfig.context || this.appConfig.context), this.context); // Key `variables` should only be set if there are any variables\n\n\n const variables = this.getMergedVariables(userConfig);\n\n if (Object.keys(variables).length > 0) {\n context.variables = variables;\n }\n\n const defaults = _objectSpread(_objectSpread({}, this.appConfig.defaults), userConfig.defaults);\n\n const combinedConfig = _objectSpread(_objectSpread(_objectSpread({}, this.appConfig), userConfig), {}, {\n api: _objectSpread(_objectSpread({}, this.appConfig.api), userConfig.api),\n context: Object.keys(context).length ? context : undefined,\n defaults: Object.keys(defaults).length ? defaults : undefined\n });\n\n return typeof this.appConfig === 'function' ? this.appConfig(combinedConfig) : combinedConfig;\n }\n\n getMergedVariables(userConfig) {\n return _objectSpread(_objectSpread(_objectSpread({}, this.appConfig.context?.variables || {}), userConfig.context?.variables || {}), this.context.variables || {});\n }\n\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ExternalApi);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/lib/external-api/index.js?");
798
798
 
799
799
  /***/ }),
800
800
 
@@ -915,7 +915,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
915
915
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
916
916
 
917
917
  "use strict";
918
- 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 domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! domains/visibility/hooks */ \"./src/javascripts/domains/visibility/hooks.ts\");\n/* harmony import */ var domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var lib_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var ui_components_layout_privacy_disclaimer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ui/components/layout/privacy-disclaimer */ \"./src/javascripts/ui/components/layout/privacy-disclaimer.js\");\n/* harmony import */ var ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ui/hooks/seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.js\");\n/* harmony import */ var _component_filter__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./component-filter */ \"./src/javascripts/ui/components/conversation/component-filter.js\");\n/* harmony import */ var _event_event__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./event/event */ \"./src/javascripts/ui/components/conversation/event/event.js\");\n/* harmony import */ var _loader__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./loader */ \"./src/javascripts/ui/components/conversation/loader.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst Events = () => {\n const events = (0,ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_6__.useEvents)();\n let prevParticipant = null;\n return events.map(event => {\n const {\n type,\n payload\n } = event;\n const {\n participant,\n fromClient\n } = payload;\n let participantChanged = false;\n\n if (type !== 'participant') {\n const currentParticipant = fromClient ? 'seamly-client-participant' : participant;\n\n if (event.type !== 'info' && prevParticipant !== currentParticipant) {\n participantChanged = true;\n }\n\n prevParticipant = currentParticipant;\n }\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_event_event__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n event: event,\n newParticipant: participantChanged\n }, event.payload.key || event.payload.id);\n });\n};\n\nconst Conversation = () => {\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0__.useI18n)();\n const chatBodyContainer = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_3__.useRef)(null);\n const events = (0,ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_6__.useEvents)();\n const isLoading = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_5__.useSeamlyIsLoading)();\n const {\n isOpen\n } = (0,domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_1__.useVisibility)();\n const skiplinkTargetId = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_5__.useSkiplink)();\n const focusSkiplinkTarget = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_5__.useSkiplinkTargetFocusing)();\n const loadedImageEventIds = (0,ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_6__.useLoadedImageEventIds)();\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_3__.useEffect)(() => {\n const containerElement = chatBodyContainer.current;\n\n if (containerElement) {\n containerElement.scrollTop = containerElement.scrollHeight;\n }\n }, [events, isLoading, isOpen, loadedImageEventIds]);\n\n const onClickHandler = e => {\n e.preventDefault();\n focusSkiplinkTarget();\n };\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsxs)(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.Fragment, {\n children: [isOpen && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"a\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('skip-link'),\n href: `#${skiplinkTargetId}`,\n onClick: onClickHandler,\n children: t('skiplinkText')\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"div\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('chat__body'),\n ref: chatBodyContainer,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsxs)(\"div\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('conversation__container'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(ui_components_layout_privacy_disclaimer__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsxs)(\"ol\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('conversation'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_component_filter__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(Events, {})\n }), isLoading && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_loader__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {})]\n })]\n })\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Conversation);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/conversation.js?");
918
+ 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 domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! domains/visibility/hooks */ \"./src/javascripts/domains/visibility/hooks.ts\");\n/* harmony import */ var domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var lib_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var ui_components_layout_privacy_disclaimer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ui/components/layout/privacy-disclaimer */ \"./src/javascripts/ui/components/layout/privacy-disclaimer.js\");\n/* harmony import */ var ui_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ui/hooks/focus-helper-hooks */ \"./src/javascripts/ui/hooks/focus-helper-hooks.js\");\n/* harmony import */ var ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ui/hooks/seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.js\");\n/* harmony import */ var _component_filter__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./component-filter */ \"./src/javascripts/ui/components/conversation/component-filter.js\");\n/* harmony import */ var _event_event__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./event/event */ \"./src/javascripts/ui/components/conversation/event/event.js\");\n/* harmony import */ var _loader__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./loader */ \"./src/javascripts/ui/components/conversation/loader.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst Events = () => {\n const events = (0,ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__.useEvents)();\n let prevParticipant = null;\n return events.map(event => {\n const {\n type,\n payload\n } = event;\n const {\n participant,\n fromClient\n } = payload;\n let participantChanged = false;\n\n if (type !== 'participant') {\n const currentParticipant = fromClient ? 'seamly-client-participant' : participant;\n\n if (event.type !== 'info' && prevParticipant !== currentParticipant) {\n participantChanged = true;\n }\n\n prevParticipant = currentParticipant;\n }\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(_event_event__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n event: event,\n newParticipant: participantChanged\n }, event.payload.key || event.payload.id);\n });\n};\n\nconst Conversation = () => {\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0__.useI18n)();\n const chatBodyContainer = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_3__.useRef)(null);\n const events = (0,ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__.useEvents)();\n const isLoading = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_6__.useSeamlyIsLoading)();\n const {\n isOpen\n } = (0,domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_1__.useVisibility)();\n const skiplinkTargetId = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_6__.useSkiplink)();\n const focusSkiplinkTarget = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_6__.useSkiplinkTargetFocusing)();\n const loadedImageEventIds = (0,ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_7__.useLoadedImageEventIds)();\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_3__.useLayoutEffect)(() => {\n const containerElement = chatBodyContainer.current;\n\n if (containerElement) {\n requestAnimationFrame(async () => {\n await (0,ui_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_5__.timeout)(30); // Wait for next frame tick\n\n containerElement.scrollTop = containerElement.scrollHeight;\n });\n }\n }, [events, isLoading, isOpen, loadedImageEventIds]);\n\n const onClickHandler = e => {\n e.preventDefault();\n focusSkiplinkTarget();\n };\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsxs)(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.Fragment, {\n children: [isOpen && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(\"a\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('skip-link'),\n href: `#${skiplinkTargetId}`,\n onClick: onClickHandler,\n children: t('skiplinkText')\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(\"div\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('chat__body'),\n ref: chatBodyContainer,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsxs)(\"div\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('conversation__container'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(ui_components_layout_privacy_disclaimer__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsxs)(\"ol\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('conversation'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(_component_filter__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(Events, {})\n }), isLoading && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(_loader__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {})]\n })]\n })\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Conversation);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/conversation.js?");
919
919
 
920
920
  /***/ }),
921
921
 
@@ -948,7 +948,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
948
948
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
949
949
 
950
950
  "use strict";
951
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ui/components/conversation/message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var _card_component__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./card-component */ \"./src/javascripts/ui/components/conversation/event/card-component.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__);\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; }\n\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; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\nconst CardMessage = ({\n event\n}) => {\n const [body] = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_2__.useTranslatedEventData)(event);\n const descriptionId = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_0__.useGeneratedId)();\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n type: \"card\",\n event: event,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_card_component__WEBPACK_IMPORTED_MODULE_3__[\"default\"], _objectSpread({\n id: descriptionId\n }, body))\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CardMessage);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/card-message.js?");
951
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ui/components/conversation/message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var _card_component__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./card-component */ \"./src/javascripts/ui/components/conversation/event/card-component.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__);\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; }\n\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; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\nconst CardMessage = ({\n event\n}) => {\n const {\n body\n } = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_2__.useTranslatedEventData)(event);\n const descriptionId = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_0__.useGeneratedId)();\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n type: \"card\",\n event: event,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_card_component__WEBPACK_IMPORTED_MODULE_3__[\"default\"], _objectSpread({\n id: descriptionId\n }, body))\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CardMessage);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/card-message.js?");
952
952
 
953
953
  /***/ }),
954
954
 
@@ -1003,7 +1003,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1003
1003
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1004
1004
 
1005
1005
  "use strict";
1006
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ui/components/conversation/message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var ui_components_conversation_event_carousel_component__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ui/components/conversation/event/carousel-component */ \"./src/javascripts/ui/components/conversation/event/carousel-component/index.js\");\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var _components_slide__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/slide */ \"./src/javascripts/ui/components/conversation/event/carousel-message/components/slide.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__);\n\n\n\n\n\n\nconst getItemKey = (item, idx, prefix = '') => `${prefix}${item.title}:${idx}`;\n\nconst getItemLabel = item => item.title;\n\nconst CarouselMessage = ({\n event\n}) => {\n const [body] = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_2__.useTranslatedEventData)(event);\n const slides = body.cards;\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_0__[\"default\"], {\n event: event,\n modifiers: 'type-carousel',\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(ui_components_conversation_event_carousel_component__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n items: slides,\n ItemComponent: _components_slide__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n getItemKey: getItemKey,\n getItemLabel: getItemLabel\n })\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CarouselMessage);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/carousel-message/index.js?");
1006
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ui/components/conversation/message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var ui_components_conversation_event_carousel_component__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ui/components/conversation/event/carousel-component */ \"./src/javascripts/ui/components/conversation/event/carousel-component/index.js\");\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var _components_slide__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/slide */ \"./src/javascripts/ui/components/conversation/event/carousel-message/components/slide.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__);\n\n\n\n\n\n\nconst getItemKey = (item, idx, prefix = '') => `${prefix}${item.title}:${idx}`;\n\nconst getItemLabel = item => item.title;\n\nconst CarouselMessage = ({\n event\n}) => {\n const {\n body\n } = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_2__.useTranslatedEventData)(event);\n const slides = body.cards;\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_0__[\"default\"], {\n event: event,\n modifiers: 'type-carousel',\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(ui_components_conversation_event_carousel_component__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n items: slides,\n ItemComponent: _components_slide__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n getItemKey: getItemKey,\n getItemLabel: getItemLabel\n })\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CarouselMessage);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/carousel-message/index.js?");
1007
1007
 
1008
1008
  /***/ }),
1009
1009
 
@@ -1014,7 +1014,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1014
1014
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1015
1015
 
1016
1016
  "use strict";
1017
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ \"useChoicePrompt\": () => (/* binding */ useChoicePrompt)\n/* harmony export */ });\n/* harmony import */ var preact__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact */ \"preact\");\n/* harmony import */ var preact__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var lib_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.js\");\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 ui_components_layout_icon__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ui/components/layout/icon */ \"./src/javascripts/ui/components/layout/icon.js\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ui/components/conversation/message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__);\nconst _excluded = [\"event\", \"children\"];\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\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; }\n\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; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst useChoicePrompt = event => {\n const {\n payload\n } = event;\n const [showOptions, setShowOptions] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const {\n sendAction,\n addMessageBubble,\n addDivider\n } = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyCommands)();\n const {\n activeServiceSessionId\n } = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyServiceInfo)();\n const lastEventId = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useLastMessageEventId)();\n const [body] = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_7__.useTranslatedEventData)(event);\n const {\n service\n } = payload;\n const subEvent = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useMemo)(() => {\n var _event$payload$body;\n\n return _objectSpread(_objectSpread({}, event), {}, {\n payload: _objectSpread(_objectSpread({}, event.payload), {}, {\n body: (_event$payload$body = event.payload.body) === null || _event$payload$body === void 0 ? void 0 : _event$payload$body.prompt,\n translatedBody: event.payload.translatedBody && _objectSpread(_objectSpread({}, event.payload.translatedBody), {}, {\n data: event.payload.translatedBody.data.prompt\n })\n })\n });\n }, [event]);\n const chooseAgain = body.chooseAgain && activeServiceSessionId === service.serviceSessionId && payload.id !== lastEventId;\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {\n setShowOptions(payload.id === lastEventId);\n }, [payload, lastEventId]);\n\n const onChoiceClickHandler = choice => {\n if (chooseAgain) {\n addDivider('new_topic');\n }\n\n addMessageBubble(choice.text);\n sendAction({\n type: ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__.actionTypes.pickChoice,\n originMessage: payload.id,\n choice: {\n id: choice.id,\n text: choice.text,\n chooseAgain\n }\n });\n setShowOptions(false);\n };\n\n const onChooseAgainClickHandler = () => {\n setShowOptions(s => !s);\n };\n\n return {\n body,\n subEvent,\n showOptions,\n chooseAgain,\n onChoiceClickHandler,\n onChooseAgainClickHandler\n };\n};\n\nconst ChoicePrompt = _ref => {\n let {\n event,\n children\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\n\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_6__.useI18n)();\n const descriptorId = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useGeneratedId)();\n const {\n body,\n subEvent,\n showOptions,\n chooseAgain,\n onChoiceClickHandler,\n onChooseAgainClickHandler\n } = useChoicePrompt(event);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.Fragment, {\n children: [(0,preact__WEBPACK_IMPORTED_MODULE_0__.toChildArray)(children).map(child => {\n child.props = _objectSpread(_objectSpread({}, child.props), {}, {\n event: subEvent,\n descriptorId,\n showTranslationToggle: false\n });\n return child;\n }), chooseAgain && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)(\"button\", {\n type: \"button\",\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_3__.className)('button', 'button--secondary', 'button--choose-again'),\n \"aria-expanded\": showOptions ? 'true' : 'false',\n onClick: onChooseAgainClickHandler,\n \"aria-describedby\": descriptorId,\n children: [showOptions ? t('message.choicePrompts.cancelChooseAgain') : t('message.choicePrompts.chooseAgain'), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(ui_components_layout_icon__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n name: \"chevronDown\",\n size: \"8\"\n })]\n }), showOptions && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_8__[\"default\"], _objectSpread(_objectSpread({\n type: \"choice-prompt\",\n showParticipant: false,\n event: event\n }, props), {}, {\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"ul\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_3__.className)('choice-prompt', 'choice-prompt--many'),\n children: body.choices.map(choice => (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"li\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_3__.className)('choice-prompt__item', {\n [`choice-prompt__item--${choice.category}`]: choice.category\n }),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"button\", {\n type: \"button\",\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_3__.className)('button', 'button--primary'),\n onClick: () => {\n onChoiceClickHandler(choice);\n },\n children: choice.text\n })\n }, choice.id))\n })\n }))]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ChoicePrompt);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/choice-prompt.js?");
1017
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ \"useChoicePrompt\": () => (/* binding */ useChoicePrompt)\n/* harmony export */ });\n/* harmony import */ var preact__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact */ \"preact\");\n/* harmony import */ var preact__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var lib_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.js\");\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 ui_components_layout_icon__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ui/components/layout/icon */ \"./src/javascripts/ui/components/layout/icon.js\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ui/components/conversation/message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__);\nconst _excluded = [\"event\", \"children\"];\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\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; }\n\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; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst useChoicePrompt = event => {\n const {\n payload\n } = event;\n const [showOptions, setShowOptions] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const {\n sendAction,\n addMessageBubble,\n addDivider\n } = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyCommands)();\n const {\n activeServiceSessionId\n } = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyServiceInfo)();\n const lastEventId = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useLastMessageEventId)();\n const {\n body\n } = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_7__.useTranslatedEventData)(event);\n const {\n service\n } = payload;\n const subEvent = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useMemo)(() => {\n return _objectSpread(_objectSpread({}, event), {}, {\n payload: _objectSpread(_objectSpread({}, event.payload), {}, {\n body: event.payload.body?.prompt,\n translatedBody: event.payload.translatedBody && _objectSpread(_objectSpread({}, event.payload.translatedBody), {}, {\n data: event.payload.translatedBody.data.prompt\n })\n })\n });\n }, [event]);\n const chooseAgain = body.chooseAgain && activeServiceSessionId === service.serviceSessionId && payload.id !== lastEventId;\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {\n setShowOptions(payload.id === lastEventId);\n }, [payload, lastEventId]);\n\n const onChoiceClickHandler = choice => {\n if (chooseAgain) {\n addDivider('new_topic');\n }\n\n addMessageBubble(choice.text);\n sendAction({\n type: ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__.actionTypes.pickChoice,\n originMessage: payload.id,\n choice: {\n id: choice.id,\n text: choice.text,\n chooseAgain\n }\n });\n setShowOptions(false);\n };\n\n const onChooseAgainClickHandler = () => {\n setShowOptions(s => !s);\n };\n\n return {\n body,\n subEvent,\n showOptions,\n chooseAgain,\n onChoiceClickHandler,\n onChooseAgainClickHandler\n };\n};\n\nconst ChoicePrompt = _ref => {\n let {\n event,\n children\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\n\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_6__.useI18n)();\n const descriptorId = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useGeneratedId)();\n const {\n body,\n subEvent,\n showOptions,\n chooseAgain,\n onChoiceClickHandler,\n onChooseAgainClickHandler\n } = useChoicePrompt(event);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.Fragment, {\n children: [(0,preact__WEBPACK_IMPORTED_MODULE_0__.toChildArray)(children).map(child => {\n child.props = _objectSpread(_objectSpread({}, child.props), {}, {\n event: subEvent,\n descriptorId,\n showTranslationToggle: false\n });\n return child;\n }), chooseAgain && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)(\"button\", {\n type: \"button\",\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_3__.className)('button', 'button--secondary', 'button--choose-again'),\n \"aria-expanded\": showOptions ? 'true' : 'false',\n onClick: onChooseAgainClickHandler,\n \"aria-describedby\": descriptorId,\n children: [showOptions ? t('message.choicePrompts.cancelChooseAgain') : t('message.choicePrompts.chooseAgain'), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(ui_components_layout_icon__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n name: \"chevronDown\",\n size: \"8\"\n })]\n }), showOptions && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_8__[\"default\"], _objectSpread(_objectSpread({\n type: \"choice-prompt\",\n showParticipant: false,\n event: event\n }, props), {}, {\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"ul\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_3__.className)('choice-prompt', 'choice-prompt--many'),\n children: body.choices.map(choice => (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"li\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_3__.className)('choice-prompt__item', {\n [`choice-prompt__item--${choice.category}`]: choice.category\n }),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"button\", {\n type: \"button\",\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_3__.className)('button', 'button--primary'),\n onClick: () => {\n onChoiceClickHandler(choice);\n },\n children: choice.text\n })\n }, choice.id))\n })\n }))]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ChoicePrompt);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/choice-prompt.js?");
1018
1018
 
1019
1019
  /***/ }),
1020
1020
 
@@ -1025,7 +1025,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1025
1025
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1026
1026
 
1027
1027
  "use strict";
1028
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ \"useSuggestions\": () => (/* binding */ useSuggestions)\n/* harmony export */ });\n/* harmony import */ var domains_app_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! domains/app/hooks */ \"./src/javascripts/domains/app/hooks.js\");\n/* harmony import */ var domains_app_slice__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! domains/app/slice */ \"./src/javascripts/domains/app/slice.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var lib_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-redux */ \"./node_modules/react-redux/es/index.js\");\n/* harmony import */ var ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ui/components/conversation/message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var ui_components_suggestions_suggestions_list__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ui/components/suggestions/suggestions-list */ \"./src/javascripts/ui/components/suggestions/suggestions-list.js\");\n/* harmony import */ var ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.ts\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__);\nconst _excluded = [\"event\"];\n\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; }\n\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; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst useSuggestions = event => {\n const {\n payload\n } = event;\n const [suggestions] = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_3__.useTranslatedEventData)(event);\n return {\n suggestions,\n payload\n };\n};\n\nconst ConversationSuggestions = _ref => {\n let {\n event\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\n\n const [isExpanded, setIsExpanded] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_5__.useState)(true);\n const dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_6__.useDispatch)();\n const userHasResponded = (0,domains_app_hooks__WEBPACK_IMPORTED_MODULE_0__.useUserHasResponded)();\n const {\n sendAction,\n addMessageBubble\n } = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_9__.useSeamlyCommands)();\n const {\n suggestions,\n payload\n } = useSuggestions(event);\n const events = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_9__.useEvents)();\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_2__.useI18n)();\n const headingText = t('suggestions.headingText');\n const footerText = t('suggestions.footerText'); // We check if there is at least one last transaction\n // to avoid rendering the suggestions before prior events are rendered.\n\n const hasLastTransactionEvent = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_5__.useMemo)(() => events.some(({\n payload: eventPayload\n }) => eventPayload === null || eventPayload === void 0 ? void 0 : eventPayload.transactionLast), [events]);\n const handleClick = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_5__.useCallback)(({\n id,\n question\n }) => {\n setIsExpanded(false);\n dispatch((0,domains_app_slice__WEBPACK_IMPORTED_MODULE_1__.setHasResponded)(true)); // @todo Refactor to 'suggestionclick'\n\n sendAction({\n type: ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_10__.actionTypes.custom,\n originMessage: payload.id,\n body: {\n type: 'faqclick',\n body: {\n faqId: id,\n faqQuestion: question\n }\n }\n });\n addMessageBubble(question);\n }, [dispatch, sendAction, payload.id, addMessageBubble]);\n\n if (!isExpanded || userHasResponded || !hasLastTransactionEvent) {\n return null;\n }\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsxs)(\"div\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_4__.className)('suggestions', 'suggestions--conversation'),\n children: [headingText && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(\"p\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_4__.className)('suggestions__heading'),\n children: headingText\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsxs)(ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_7__[\"default\"], _objectSpread(_objectSpread({\n type: \"suggestions\",\n showParticipant: false,\n event: event\n }, props), {}, {\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(ui_components_suggestions_suggestions_list__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n className: \"suggestions__list--conversation\",\n onClickSuggestion: handleClick,\n suggestions: suggestions\n }), footerText && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(\"p\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_4__.className)('suggestions__footer'),\n children: footerText\n })]\n }))]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ConversationSuggestions);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/conversation-suggestions.js?");
1028
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ \"useSuggestions\": () => (/* binding */ useSuggestions)\n/* harmony export */ });\n/* harmony import */ var domains_app_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! domains/app/hooks */ \"./src/javascripts/domains/app/hooks.js\");\n/* harmony import */ var domains_app_slice__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! domains/app/slice */ \"./src/javascripts/domains/app/slice.ts\");\n/* harmony import */ var domains_config_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/config/hooks */ \"./src/javascripts/domains/config/hooks.ts\");\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_i18n_hooks__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var lib_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react-redux */ \"./node_modules/react-redux/es/index.js\");\n/* harmony import */ var ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ui/components/conversation/message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var ui_components_suggestions_suggestions_list__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ui/components/suggestions/suggestions-list */ \"./src/javascripts/ui/components/suggestions/suggestions-list.js\");\n/* harmony import */ var ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.ts\");\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__);\nconst _excluded = [\"event\"];\n\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; }\n\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; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst useSuggestions = event => {\n const {\n payload\n } = event;\n const {\n body: suggestions\n } = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_4__.useTranslatedEventData)(event);\n return {\n suggestions,\n payload\n };\n};\n\nconst ConversationSuggestions = _ref => {\n let {\n event\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\n\n const [isExpanded, setIsExpanded] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_6__.useState)(true);\n const dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_7__.useDispatch)();\n const userHasResponded = (0,domains_app_hooks__WEBPACK_IMPORTED_MODULE_0__.useUserHasResponded)();\n const {\n sendAction,\n addMessageBubble\n } = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_10__.useSeamlyCommands)();\n const {\n suggestions,\n payload\n } = useSuggestions(event);\n const {\n showSuggestions\n } = (0,domains_config_hooks__WEBPACK_IMPORTED_MODULE_2__.useConfig)();\n const events = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_10__.useEvents)();\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_3__.useI18n)();\n const headingText = t('suggestions.headingText');\n const footerText = t('suggestions.footerText'); // We check if there is at least one last transaction\n // to avoid rendering the suggestions before prior events are rendered.\n\n const hasLastTransactionEvent = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_6__.useMemo)(() => events.some(({\n payload: eventPayload\n }) => eventPayload?.transactionLast), [events]);\n const handleClick = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_6__.useCallback)(({\n id,\n question\n }) => {\n setIsExpanded(false);\n dispatch((0,domains_app_slice__WEBPACK_IMPORTED_MODULE_1__.setHasResponded)(true)); // @todo Refactor to 'suggestionclick'\n\n sendAction({\n type: ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_11__.actionTypes.custom,\n originMessage: payload.id,\n body: {\n type: 'faqclick',\n body: {\n faqId: id,\n faqQuestion: question\n }\n }\n });\n addMessageBubble(question);\n }, [dispatch, sendAction, payload.id, addMessageBubble]);\n\n if (!isExpanded || userHasResponded || !hasLastTransactionEvent || !showSuggestions) {\n return null;\n }\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsxs)(\"div\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_5__.className)('suggestions', 'suggestions--conversation'),\n children: [headingText && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(\"p\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_5__.className)('suggestions__heading'),\n children: headingText\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsxs)(ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_8__[\"default\"], _objectSpread(_objectSpread({\n type: \"suggestions\",\n showParticipant: false,\n event: event\n }, props), {}, {\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(ui_components_suggestions_suggestions_list__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n className: \"suggestions__list--conversation\",\n onClickSuggestion: handleClick,\n suggestions: suggestions\n }), footerText && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(\"p\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_5__.className)('suggestions__footer'),\n children: footerText\n })]\n }))]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ConversationSuggestions);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/conversation-suggestions.js?");
1029
1029
 
1030
1030
  /***/ }),
1031
1031
 
@@ -1036,7 +1036,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1036
1036
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1037
1037
 
1038
1038
  "use strict";
1039
- 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 lib_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.ts\");\n/* harmony import */ var ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ui/components/conversation/message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var _hooks_use_event_link_click_handler__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./hooks/use-event-link-click-handler */ \"./src/javascripts/ui/components/conversation/event/hooks/use-event-link-click-handler.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__);\n\n\n\n\n\n\n\n\n\n\nconst Cta = ({\n event\n}) => {\n const [body] = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_5__.useTranslatedEventData)(event);\n const eventClick = (0,_hooks_use_event_link_click_handler__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(event.payload.id);\n const {\n emitEvent\n } = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyCommands)();\n const descriptionId = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useGeneratedId)();\n const onClickHandler = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => emitEvent(`action.${ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__.actionTypes.clickCta}`, {\n type: ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__.actionTypes.clickCta,\n originMessage: event.payload.id,\n link: {\n url: body.buttonLink\n }\n }), [emitEvent, body, event]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsxs)(ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n type: \"cta\",\n event: event,\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"div\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('cta__content'),\n id: descriptionId,\n dangerouslySetInnerHTML: {\n __html: body.description\n },\n onClick: eventClick\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"a\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('button', 'button--primary'),\n \"aria-describedby\": descriptionId,\n href: body.buttonLink,\n rel: \"noreferrer\",\n target: body.buttonNewTab ? '_blank' : '_self',\n onClick: onClickHandler,\n children: body.buttonText\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Cta);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/cta.js?");
1039
+ 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 lib_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.ts\");\n/* harmony import */ var ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ui/components/conversation/message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var _hooks_use_event_link_click_handler__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./hooks/use-event-link-click-handler */ \"./src/javascripts/ui/components/conversation/event/hooks/use-event-link-click-handler.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__);\n\n\n\n\n\n\n\n\n\n\nconst Cta = ({\n event\n}) => {\n const {\n body\n } = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_5__.useTranslatedEventData)(event);\n const eventClick = (0,_hooks_use_event_link_click_handler__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(event.payload.id);\n const {\n emitEvent\n } = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyCommands)();\n const descriptionId = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useGeneratedId)();\n const onClickHandler = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => emitEvent(`action.${ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__.actionTypes.clickCta}`, {\n type: ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__.actionTypes.clickCta,\n originMessage: event.payload.id,\n link: {\n url: body.buttonLink\n }\n }), [emitEvent, body, event]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsxs)(ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n type: \"cta\",\n event: event,\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"div\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('cta__content'),\n id: descriptionId,\n dangerouslySetInnerHTML: {\n __html: body.description\n },\n onClick: eventClick\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"a\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('button', 'button--primary'),\n \"aria-describedby\": descriptionId,\n href: body.buttonLink,\n rel: \"noreferrer\",\n target: body.buttonNewTab ? '_blank' : '_self',\n onClick: onClickHandler,\n children: body.buttonText\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Cta);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/cta.js?");
1040
1040
 
1041
1041
  /***/ }),
1042
1042
 
@@ -1069,7 +1069,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1069
1069
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1070
1070
 
1071
1071
  "use strict";
1072
- 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 domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var ui_components_conversation_event_divider__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ui/components/conversation/event-divider */ \"./src/javascripts/ui/components/conversation/event-divider.js\");\n/* harmony import */ var lib_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__);\n\n\n\n\n\n\n\nconst NewTranslationDivider = ({\n event\n}) => {\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0__.useI18n)();\n const {\n translationEnabled,\n translationLocale,\n text\n } = event.payload.body;\n const {\n enableTranslations\n } = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_3__.useTranslations)();\n const localeNativeName = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_3__.useLocaleNativeName)(translationLocale);\n\n const handleRestartButtonclick = () => {\n enableTranslations(translationLocale);\n };\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(ui_components_conversation_event_divider__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n iconName: \"newTranslation\",\n dividerType: \"newtranslation\",\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"p\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('divider__title'),\n children: t(translationEnabled ? 'translations.divider.startText' : 'translations.divider.stopText', {\n language: localeNativeName\n })\n }), translationEnabled ? (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"p\", {\n children: text\n }) : (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"button\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('button', 'button--secondary'),\n onClick: handleRestartButtonclick,\n children: t('translations.divider.restartButtonText')\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (NewTranslationDivider);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/divider/variants/new-translation.js?");
1072
+ 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 domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var ui_components_conversation_event_divider__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ui/components/conversation/event-divider */ \"./src/javascripts/ui/components/conversation/event-divider.js\");\n/* harmony import */ var lib_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-redux */ \"./node_modules/react-redux/es/index.js\");\n/* harmony import */ var domains_translations_slice__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! domains/translations/slice */ \"./src/javascripts/domains/translations/slice.ts\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__);\n\n\n\n\n\n\n\n\n\n\n\n\nconst NewTranslationDivider = ({\n event\n}) => {\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0__.useI18n)();\n const events = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_7__.useEvents)();\n const {\n body: {\n translationEnabled,\n translationLocale,\n text\n },\n id\n } = event.payload;\n const {\n enableTranslations\n } = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_3__.useTranslations)();\n const localeNativeName = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_3__.useLocaleNativeName)(translationLocale);\n const translatedEventGroups = (0,react_redux__WEBPACK_IMPORTED_MODULE_4__.useSelector)(state => state.translations.translatedEventGroups);\n const dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_4__.useDispatch)();\n const toggleTranslations = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_6__.useCallback)(() => {\n if (!translatedEventGroups[id]) {\n dispatch((0,domains_translations_slice__WEBPACK_IMPORTED_MODULE_5__.disableEventsTranslation)({\n events,\n id\n }));\n return;\n }\n\n dispatch((0,domains_translations_slice__WEBPACK_IMPORTED_MODULE_5__.enableEventsTranslation)({\n events,\n id\n }));\n }, [dispatch, events, id, translatedEventGroups]);\n\n const handleRestartButtonclick = () => {\n enableTranslations(translationLocale);\n };\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsxs)(ui_components_conversation_event_divider__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n iconName: \"newTranslation\",\n dividerType: \"newtranslation\",\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)(\"p\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('divider__title'),\n children: t(translationEnabled ? 'translations.divider.startText' : 'translations.divider.stopText', {\n language: localeNativeName\n })\n }), translationEnabled ? (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsxs)(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.Fragment, {\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)(\"p\", {\n children: text\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)(\"button\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('button', 'button--secondary'),\n onClick: toggleTranslations,\n children: t(!translatedEventGroups[id] ? 'translations.toggle.hideTranslationsButtonText' : 'translations.toggle.showTranslationsButtonText')\n })]\n }) : (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)(\"button\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('button', 'button--secondary'),\n \"data-testid\": \"restartTranslationButton\",\n onClick: handleRestartButtonclick,\n children: t('translations.divider.restartButtonText')\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (NewTranslationDivider);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/divider/variants/new-translation.js?");
1073
1073
 
1074
1074
  /***/ }),
1075
1075
 
@@ -1124,7 +1124,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1124
1124
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1125
1125
 
1126
1126
  "use strict";
1127
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useFormattedDate\": () => (/* binding */ useFormattedDate)\n/* harmony export */ });\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ui/utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var domains_config_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/config/hooks */ \"./src/javascripts/domains/config/hooks.ts\");\n\n\n\nconst dateFormatOptions = {\n month: 'long',\n day: 'numeric',\n year: 'numeric'\n};\nconst timeFormatOptions = {\n hour: 'numeric',\n minute: 'numeric'\n};\nconst useFormattedDate = date => {\n var _config$context;\n\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0__.useI18n)();\n const config = (0,domains_config_hooks__WEBPACK_IMPORTED_MODULE_2__.useConfig)();\n const locale = (config === null || config === void 0 ? void 0 : (_config$context = config.context) === null || _config$context === void 0 ? void 0 : _config$context.locale) ?? [];\n const eventDate = new Date(date);\n const currentDate = new Date();\n const midnight = new Date(currentDate);\n midnight.setHours(24, 0, 0, 0);\n const timeUntilMidnight = midnight - currentDate;\n const fullDateTime = eventDate.toString();\n const time = new Intl.DateTimeFormat(locale, timeFormatOptions).format(eventDate);\n let relativeDate = (0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_1__.getRelativeDate)(eventDate, currentDate);\n\n switch (relativeDate) {\n case 'today':\n relativeDate = t('dateTime.today');\n break;\n\n case 'yesterday':\n relativeDate = t('dateTime.yesterday');\n break;\n\n default:\n relativeDate = new Intl.DateTimeFormat(locale, dateFormatOptions).format(eventDate);\n }\n\n const srText = t('dateTime.srText', {\n date: relativeDate,\n time\n });\n return {\n date: relativeDate,\n srText,\n time,\n fullDateTime,\n timeUntilMidnight\n };\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/hooks/use-formatted-date.js?");
1127
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useFormattedDate\": () => (/* binding */ useFormattedDate)\n/* harmony export */ });\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ui/utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var domains_config_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/config/hooks */ \"./src/javascripts/domains/config/hooks.ts\");\n\n\n\nconst dateFormatOptions = {\n month: 'long',\n day: 'numeric',\n year: 'numeric'\n};\nconst timeFormatOptions = {\n hour: 'numeric',\n minute: 'numeric'\n};\nconst useFormattedDate = date => {\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0__.useI18n)();\n const config = (0,domains_config_hooks__WEBPACK_IMPORTED_MODULE_2__.useConfig)();\n const locale = config?.context?.locale ?? [];\n const eventDate = new Date(date);\n const currentDate = new Date();\n const midnight = new Date(currentDate);\n midnight.setHours(24, 0, 0, 0);\n const timeUntilMidnight = midnight - currentDate;\n const fullDateTime = eventDate.toString();\n const time = new Intl.DateTimeFormat(locale, timeFormatOptions).format(eventDate);\n let relativeDate = (0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_1__.getRelativeDate)(eventDate, currentDate);\n\n switch (relativeDate) {\n case 'today':\n relativeDate = t('dateTime.today');\n break;\n\n case 'yesterday':\n relativeDate = t('dateTime.yesterday');\n break;\n\n default:\n relativeDate = new Intl.DateTimeFormat(locale, dateFormatOptions).format(eventDate);\n }\n\n const srText = t('dateTime.srText', {\n date: relativeDate,\n time\n });\n return {\n date: relativeDate,\n srText,\n time,\n fullDateTime,\n timeUntilMidnight\n };\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/hooks/use-formatted-date.js?");
1128
1128
 
1129
1129
  /***/ }),
1130
1130
 
@@ -1146,7 +1146,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1146
1146
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1147
1147
 
1148
1148
  "use strict";
1149
- 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 domains_store_slice__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! domains/store/slice */ \"./src/javascripts/domains/store/slice.ts\");\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-redux */ \"./node_modules/react-redux/es/index.js\");\n/* harmony import */ var ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ui/components/conversation/message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var _image_lightbox__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./image-lightbox */ \"./src/javascripts/ui/components/conversation/event/image-lightbox.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__);\nconst _excluded = [\"event\", \"descriptorId\"];\n\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; }\n\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; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\n\n\n\nconst Image = _ref => {\n let {\n event,\n descriptorId\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\n\n const [body] = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_1__.useTranslatedEventData)(event);\n const {\n description,\n url,\n isZoomable\n } = body;\n const [showLighbox, setShowLightbox] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_2__.useState)(false);\n const dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_3__.useDispatch)();\n\n const handleOnLoad = () => {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_0__.setLoadedImageEventIds)(event.payload.id));\n setShowLightbox(true);\n };\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_4__[\"default\"], _objectSpread(_objectSpread({\n event: event,\n type: \"image\"\n }, props), {}, {\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"img\", {\n src: url,\n id: descriptorId,\n alt: description,\n onLoad: handleOnLoad\n }), isZoomable && showLighbox && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_image_lightbox__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n description: description,\n url: url\n })]\n }));\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Image);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/image.js?");
1149
+ 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 domains_store_slice__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! domains/store/slice */ \"./src/javascripts/domains/store/slice.ts\");\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-redux */ \"./node_modules/react-redux/es/index.js\");\n/* harmony import */ var ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ui/components/conversation/message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var _image_lightbox__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./image-lightbox */ \"./src/javascripts/ui/components/conversation/event/image-lightbox.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__);\nconst _excluded = [\"event\", \"descriptorId\"];\n\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; }\n\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; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\n\n\n\nconst Image = _ref => {\n let {\n event,\n descriptorId\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\n\n const {\n body\n } = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_1__.useTranslatedEventData)(event);\n const {\n description,\n url,\n isZoomable\n } = body;\n const [showLighbox, setShowLightbox] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_2__.useState)(false);\n const dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_3__.useDispatch)();\n\n const handleOnLoad = () => {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_0__.setLoadedImageEventIds)(event.payload.id));\n setShowLightbox(true);\n };\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_4__[\"default\"], _objectSpread(_objectSpread({\n event: event,\n type: \"image\"\n }, props), {}, {\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"img\", {\n src: url,\n id: descriptorId,\n alt: description,\n onLoad: handleOnLoad\n }), isZoomable && showLighbox && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_image_lightbox__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n description: description,\n url: url\n })]\n }));\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Image);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/image.js?");
1150
1150
 
1151
1151
  /***/ }),
1152
1152
 
@@ -1157,7 +1157,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1157
1157
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1158
1158
 
1159
1159
  "use strict";
1160
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var ui_components_conversation_event_divider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ui/components/conversation/event-divider */ \"./src/javascripts/ui/components/conversation/event-divider.js\");\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__);\n\n\n\n\nconst Participant = ({\n event\n}) => {\n const {\n participant\n } = event.payload;\n const [introduction] = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_1__.useTranslatedEventData)(event);\n\n if (!introduction) {\n return null;\n }\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(ui_components_conversation_event_divider__WEBPACK_IMPORTED_MODULE_0__[\"default\"], {\n graphicSrc: participant.avatar,\n graphicType: participant.avatar ? 'avatar' : undefined,\n iconName: !participant.avatar ? 'balloon' : undefined,\n childrenHTML: introduction,\n dividerType: \"participant\"\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Participant);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/participant.js?");
1160
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var ui_components_conversation_event_divider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ui/components/conversation/event-divider */ \"./src/javascripts/ui/components/conversation/event-divider.js\");\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__);\n\n\n\n\nconst Participant = ({\n event\n}) => {\n const {\n participant\n } = event.payload;\n const {\n body: introduction\n } = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_1__.useTranslatedEventData)(event);\n\n if (!introduction) {\n return null;\n }\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(ui_components_conversation_event_divider__WEBPACK_IMPORTED_MODULE_0__[\"default\"], {\n graphicSrc: participant.avatar,\n graphicType: participant.avatar ? 'avatar' : undefined,\n iconName: !participant.avatar ? 'balloon' : undefined,\n childrenHTML: introduction,\n dividerType: \"participant\"\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Participant);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/participant.js?");
1161
1161
 
1162
1162
  /***/ }),
1163
1163
 
@@ -1168,7 +1168,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1168
1168
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1169
1169
 
1170
1170
  "use strict";
1171
- 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 domains_translations_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var ui_components_conversation_event_hooks_use_event_link_click_handler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ui/components/conversation/event/hooks/use-event-link-click-handler */ \"./src/javascripts/ui/components/conversation/event/hooks/use-event-link-click-handler.js\");\n/* harmony import */ var ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ui/components/conversation/message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__);\nconst _excluded = [\"event\"];\n\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; }\n\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; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\nconst Splash = _ref => {\n let {\n event\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\n\n const {\n payload\n } = event;\n const [body] = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_0__.useTranslatedEventData)(event);\n const eventClick = (0,ui_components_conversation_event_hooks_use_event_link_click_handler__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(payload.id);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_2__[\"default\"], _objectSpread(_objectSpread({\n type: \"splash\",\n event: event,\n onClick: eventClick\n }, props), {}, {\n bodyProps: {\n dangerouslySetInnerHTML: {\n __html: body.text\n }\n }\n }));\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Splash);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/splash.js?");
1171
+ 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 domains_translations_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var ui_components_conversation_event_hooks_use_event_link_click_handler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ui/components/conversation/event/hooks/use-event-link-click-handler */ \"./src/javascripts/ui/components/conversation/event/hooks/use-event-link-click-handler.js\");\n/* harmony import */ var ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ui/components/conversation/message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__);\nconst _excluded = [\"event\"];\n\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; }\n\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; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\nconst Splash = _ref => {\n let {\n event\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\n\n const {\n payload\n } = event;\n const {\n body\n } = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_0__.useTranslatedEventData)(event);\n const eventClick = (0,ui_components_conversation_event_hooks_use_event_link_click_handler__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(payload.id);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_2__[\"default\"], _objectSpread(_objectSpread({\n type: \"splash\",\n event: event,\n onClick: eventClick\n }, props), {}, {\n bodyProps: {\n dangerouslySetInnerHTML: {\n __html: body.text\n }\n }\n }));\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Splash);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/splash.js?");
1172
1172
 
1173
1173
  /***/ }),
1174
1174
 
@@ -1179,7 +1179,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1179
1179
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1180
1180
 
1181
1181
  "use strict";
1182
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ui/components/conversation/message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var _hooks_use_event_link_click_handler__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./hooks/use-event-link-click-handler */ \"./src/javascripts/ui/components/conversation/event/hooks/use-event-link-click-handler.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__);\nconst _excluded = [\"event\"];\n\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; }\n\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; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\nconst Text = _ref => {\n let {\n event\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\n\n const [body] = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_2__.useTranslatedEventData)(event);\n const eventClick = (0,_hooks_use_event_link_click_handler__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(event.payload.id);\n const containerProps = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n if (event.payload.optimisticallyInjected) {\n return {\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"p\", {\n children: body.text\n })\n };\n }\n\n return {\n bodyProps: {\n dangerouslySetInnerHTML: {\n __html: body.text\n }\n }\n };\n }, [body, event]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_1__[\"default\"], _objectSpread(_objectSpread({\n type: \"text\",\n event: event,\n onClick: eventClick\n }, props), containerProps));\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Text);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/text.js?");
1182
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ui/components/conversation/message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var _hooks_use_event_link_click_handler__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./hooks/use-event-link-click-handler */ \"./src/javascripts/ui/components/conversation/event/hooks/use-event-link-click-handler.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__);\nconst _excluded = [\"event\"];\n\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; }\n\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; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\nconst Text = _ref => {\n let {\n event\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\n\n const {\n body\n } = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_2__.useTranslatedEventData)(event);\n const eventClick = (0,_hooks_use_event_link_click_handler__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(event.payload.id);\n const containerProps = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n if (event.payload.optimisticallyInjected) {\n return {\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"p\", {\n children: body.text\n })\n };\n }\n\n return {\n bodyProps: {\n dangerouslySetInnerHTML: {\n __html: body.text\n }\n }\n };\n }, [body, event]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_1__[\"default\"], _objectSpread(_objectSpread({\n type: \"text\",\n event: event,\n onClick: eventClick\n }, props), containerProps));\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Text);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/text.js?");
1183
1183
 
1184
1184
  /***/ }),
1185
1185
 
@@ -1190,7 +1190,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1190
1190
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1191
1191
 
1192
1192
  "use strict";
1193
- 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 domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ui/components/conversation/message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__);\nconst _excluded = [\"event\"];\n\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; }\n\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; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\nconst Translation = _ref => {\n let {\n event\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\n\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0__.useI18n)();\n const [body] = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_2__.useTranslatedEventData)(event);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_1__[\"default\"], _objectSpread(_objectSpread({\n type: \"text\",\n event: event\n }, props), {}, {\n children: t(body.key.join('.'), body.variables)\n }));\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Translation);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/translation.js?");
1193
+ 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 domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ui/components/conversation/message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__);\nconst _excluded = [\"event\"];\n\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; }\n\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; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\nconst Translation = _ref => {\n let {\n event\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\n\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0__.useI18n)();\n const {\n body\n } = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_2__.useTranslatedEventData)(event);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_1__[\"default\"], _objectSpread(_objectSpread({\n type: \"text\",\n event: event\n }, props), {}, {\n children: t(body.key.join('.'), body.variables)\n }));\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Translation);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/translation.js?");
1194
1194
 
1195
1195
  /***/ }),
1196
1196
 
@@ -1201,7 +1201,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1201
1201
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1202
1202
 
1203
1203
  "use strict";
1204
- 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 lib_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.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 domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ui/components/conversation/message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__);\nconst _excluded = [\"event\"];\n\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; }\n\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; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\n\n\n\nconst UploadContent = ({\n children,\n url,\n target\n}) => url ? (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"a\", {\n href: url,\n download: true,\n target: target || undefined,\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)(['download', 'download-link']),\n children: children\n}) : (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"span\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('download'),\n children: children\n});\n\nconst Upload = _ref => {\n let {\n event\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\n\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_3__.useI18n)();\n const [body] = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_5__.useTranslatedEventData)(event);\n const {\n fromClient\n } = event.payload;\n const {\n filename,\n url\n } = body;\n const srText = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => url ? t('fileUpload.srFileDownloadText', {\n fileName: filename\n }) : t('fileUpload.srFileUploadedText', {\n fileName: filename\n }), [url, filename, t]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_4__[\"default\"], _objectSpread(_objectSpread({\n event: event,\n type: \"upload\"\n }, props), {}, {\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(UploadContent, {\n url: url,\n target: !fromClient ? '_blank' : undefined,\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(ui_components_layout_icon__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n name: \"download\",\n size: \"16\"\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"span\", {\n \"aria-hidden\": \"true\",\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('file-download'),\n children: filename\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"span\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('visually-hidden'),\n children: srText\n })]\n })\n }));\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Upload);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/upload.js?");
1204
+ 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 lib_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.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 domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ui/components/conversation/message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__);\nconst _excluded = [\"event\"];\n\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; }\n\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; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\n\n\n\nconst UploadContent = ({\n children,\n url,\n target\n}) => url ? (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"a\", {\n href: url,\n download: true,\n target: target || undefined,\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)(['download', 'download-link']),\n children: children\n}) : (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"span\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('download'),\n children: children\n});\n\nconst Upload = _ref => {\n let {\n event\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\n\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_3__.useI18n)();\n const {\n body\n } = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_5__.useTranslatedEventData)(event);\n const {\n fromClient\n } = event.payload;\n const {\n filename,\n url\n } = body;\n const srText = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => url ? t('fileUpload.srFileDownloadText', {\n fileName: filename\n }) : t('fileUpload.srFileUploadedText', {\n fileName: filename\n }), [url, filename, t]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_4__[\"default\"], _objectSpread(_objectSpread({\n event: event,\n type: \"upload\"\n }, props), {}, {\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(UploadContent, {\n url: url,\n target: !fromClient ? '_blank' : undefined,\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(ui_components_layout_icon__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n name: \"download\",\n size: \"16\"\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"span\", {\n \"aria-hidden\": \"true\",\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('file-download'),\n children: filename\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"span\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('visually-hidden'),\n children: srText\n })]\n })\n }));\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Upload);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/upload.js?");
1205
1205
 
1206
1206
  /***/ }),
1207
1207
 
@@ -1212,7 +1212,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1212
1212
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1213
1213
 
1214
1214
  "use strict";
1215
- 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 lib_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ui/components/conversation/message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__);\nconst _excluded = [\"event\", \"descriptorId\"];\n\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; }\n\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; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\n\nconst Video = _ref => {\n let {\n event,\n descriptorId\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\n\n const [body] = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_2__.useTranslatedEventData)(event);\n const {\n description,\n url\n } = body;\n const classNames = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyMessageContainerClassNames)(event);\n classNames.push('message--type-video');\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_3__[\"default\"], _objectSpread(_objectSpread({\n event: event,\n type: \"video\"\n }, props), {}, {\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"div\", {\n id: descriptorId,\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('visually-hidden'),\n children: description\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"iframe\", {\n title: description,\n src: url,\n allow: \"autoplay; encrypted-media\",\n allowFullScreen: true\n })]\n }));\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Video);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/video.js?");
1215
+ 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 lib_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ui/components/conversation/message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__);\nconst _excluded = [\"event\", \"descriptorId\"];\n\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; }\n\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; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\n\nconst Video = _ref => {\n let {\n event,\n descriptorId\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\n\n const {\n body\n } = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_2__.useTranslatedEventData)(event);\n const {\n description,\n url\n } = body;\n const classNames = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyMessageContainerClassNames)(event);\n classNames.push('message--type-video');\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_3__[\"default\"], _objectSpread(_objectSpread({\n event: event,\n type: \"video\"\n }, props), {}, {\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"div\", {\n id: descriptorId,\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('visually-hidden'),\n children: description\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"iframe\", {\n title: description,\n src: url,\n allow: \"autoplay; encrypted-media\",\n allowFullScreen: true\n })]\n }));\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Video);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/video.js?");
1216
1216
 
1217
1217
  /***/ }),
1218
1218
 
@@ -1234,7 +1234,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1234
1234
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1235
1235
 
1236
1236
  "use strict";
1237
- 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 lib_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var ui_hooks_component_helper_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ui/hooks/component-helper-hooks */ \"./src/javascripts/ui/hooks/component-helper-hooks.js\");\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _event_event_participant__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./event/event-participant */ \"./src/javascripts/ui/components/conversation/event/event-participant.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__);\nconst _excluded = [\"showParticipant\", \"showTranslationToggle\", \"event\", \"type\", \"modifiers\", \"children\", \"bodyProps\", \"info\"];\n\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; }\n\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; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\n\n\n\nfunction MessageContainer(_ref) {\n let {\n showParticipant = true,\n showTranslationToggle = true,\n event,\n type,\n modifiers,\n children,\n bodyProps = {},\n info\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\n\n const classNames = (0,ui_hooks_component_helper_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyMessageContainerClassNames)(event);\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_3__.useI18n)();\n const [, {\n hasTranslation,\n isTranslated,\n toggleTranslation,\n locale\n }] = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_2__.useTranslatedEventData)(event);\n\n if (type) {\n classNames.push(`message--type-${type}`);\n }\n\n if (modifiers) {\n if (typeof modifiers === 'string') {\n // eslint-disable-next-line no-param-reassign\n modifiers = modifiers.split(' ').filter(v => v.length);\n }\n\n modifiers.forEach(modifier => {\n classNames.push(`message--${modifier}`);\n });\n }\n\n if (isTranslated) {\n classNames.push('message--is-translated');\n }\n\n if (hasTranslation) {\n classNames.push('message--has-translation');\n }\n\n if (isTranslated) {\n // eslint-disable-next-line no-param-reassign\n bodyProps = _objectSpread(_objectSpread({}, bodyProps), {}, {\n lang: locale\n });\n }\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.Fragment, {\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(\"div\", _objectSpread(_objectSpread({\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_0__.className)(classNames)\n }, props), {}, {\n children: [showParticipant && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_event_event_participant__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n eventPayload: event.payload\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"div\", _objectSpread(_objectSpread({\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('message__body')\n }, bodyProps), {}, {\n children: children\n })), info && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"div\", {\n \"aria-hidden\": \"true\",\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('message__info'),\n children: info\n }), showTranslationToggle && hasTranslation && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"div\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('message__translation-info'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"button\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('message__translation-toggle', 'button', 'button--secondary'),\n onClick: toggleTranslation,\n children: t(isTranslated ? 'translations.toggle.hideButtonText' : 'translations.toggle.showButtonText')\n })\n })]\n }))\n });\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MessageContainer);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/message-container.js?");
1237
+ 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 lib_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var ui_hooks_component_helper_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ui/hooks/component-helper-hooks */ \"./src/javascripts/ui/hooks/component-helper-hooks.js\");\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var _event_event_participant__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./event/event-participant */ \"./src/javascripts/ui/components/conversation/event/event-participant.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__);\nconst _excluded = [\"showParticipant\", \"event\", \"type\", \"modifiers\", \"children\", \"bodyProps\", \"info\"];\n\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; }\n\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; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\n\n\nfunction MessageContainer(_ref) {\n let {\n showParticipant = true,\n event,\n type,\n modifiers,\n children,\n bodyProps = {},\n info\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\n\n const classNames = (0,ui_hooks_component_helper_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyMessageContainerClassNames)(event);\n const {\n hasTranslation,\n isTranslated,\n locale\n } = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_2__.useTranslatedEventData)(event);\n\n if (type) {\n classNames.push(`message--type-${type}`);\n }\n\n if (modifiers) {\n if (typeof modifiers === 'string') {\n // eslint-disable-next-line no-param-reassign\n modifiers = modifiers.split(' ').filter(v => v.length);\n }\n\n modifiers.forEach(modifier => {\n classNames.push(`message--${modifier}`);\n });\n }\n\n if (isTranslated) {\n classNames.push('message--is-translated');\n }\n\n if (hasTranslation) {\n classNames.push('message--has-translation');\n }\n\n if (isTranslated) {\n // eslint-disable-next-line no-param-reassign\n bodyProps = _objectSpread(_objectSpread({}, bodyProps), {}, {\n lang: locale\n });\n }\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.Fragment, {\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(\"div\", _objectSpread(_objectSpread({\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_0__.className)(classNames)\n }, props), {}, {\n children: [showParticipant && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_event_event_participant__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n eventPayload: event.payload\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"div\", _objectSpread(_objectSpread({\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('message__body')\n }, bodyProps), {}, {\n children: children\n })), info && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"div\", {\n \"aria-hidden\": \"true\",\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('message__info'),\n children: info\n })]\n }))\n });\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MessageContainer);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/message-container.js?");
1238
1238
 
1239
1239
  /***/ }),
1240
1240
 
@@ -1289,7 +1289,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1289
1289
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1290
1290
 
1291
1291
  "use strict";
1292
- 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 api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! api/errors/seamly-general-error */ \"./src/javascripts/api/errors/seamly-general-error.js\");\n/* harmony import */ var api_errors_seamly_offline_error__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! api/errors/seamly-offline-error */ \"./src/javascripts/api/errors/seamly-offline-error.js\");\n/* harmony import */ var api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! api/errors/seamly-session-expired-error */ \"./src/javascripts/api/errors/seamly-session-expired-error.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_interrupt_slice__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! domains/interrupt/slice */ \"./src/javascripts/domains/interrupt/slice.ts\");\n/* harmony import */ var domains_store_slice__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! domains/store/slice */ \"./src/javascripts/domains/store/slice.ts\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react-redux */ \"./node_modules/react-redux/es/index.js\");\n/* harmony import */ var ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.ts\");\nconst _excluded = [\"serviceSettings\"];\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\n\n\n\n\nconst EMITTABLE_MESSAGE_TYPES = ['text', 'choice_prompt', 'image', 'video'];\n\nconst SeamlyEventSubscriber = ({\n eventBus\n}) => {\n const api = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_8__.useSeamlyApiContext)();\n const dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_7__.useDispatch)();\n const events = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_8__.useEvents)();\n const prevEmittedEventId = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_6__.useRef)(null);\n const {\n initCountdown,\n endCountdown\n } = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_8__.useSeamlyIdleDetachCountdown)();\n const {\n emitEvent\n } = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_8__.useSeamlyCommands)();\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_6__.useEffect)(() => {\n if (api.connectionInfo) {\n const updateParticipant = event => {\n const {\n payload\n } = event;\n\n if (!payload || !payload.participant) {\n return;\n }\n\n const {\n fromClient,\n participant\n } = payload;\n\n if (!fromClient && participant.name) {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_5__.setHeaderSubTitle)(participant.name));\n }\n\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_5__.setParticipant)({\n participant,\n fromClient\n }));\n\n if (participant.introduction) {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_5__.addEvent)(event));\n }\n };\n\n const subscription = api.stream().subscribe({\n next: event => {\n const {\n type,\n payload\n } = event;\n\n switch (type) {\n case 'ui':\n if (payload.state && payload.state.hasOwnProperty('loading')) {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_5__.setIsLoading)(payload.state.loading));\n }\n\n switch (payload.type) {\n case 'idle_detach_countdown':\n initCountdown(payload.body.duration);\n break;\n\n case 'idle_detach_countdown_elapsed':\n endCountdown(undefined, true);\n break;\n\n case 'resume_conversation_prompt':\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_5__.initResumeConversationPrompt)());\n break;\n\n case 'user_first_response':\n dispatch((0,domains_app_slice__WEBPACK_IMPORTED_MODULE_3__.setHasResponded)(true));\n eventBus.emit('system.userFirstResponse', payload.body);\n break;\n }\n\n break;\n\n case 'message':\n updateParticipant(payload);\n\n switch (payload.type) {\n case 'text':\n case 'choice_prompt':\n case 'splash':\n case 'image':\n case 'upload':\n case 'video':\n case 'cta':\n case 'custom':\n case 'carousel':\n case 'card':\n if (payload.service && payload.service.serviceSessionId) {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_5__.setActiveService)(payload.service.serviceSessionId));\n }\n\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_5__.addEvent)(event));\n break;\n }\n\n break;\n\n case 'participant':\n updateParticipant(event);\n break;\n\n case 'service_data':\n if (payload.persist) {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_5__.setServiceDataItem)(payload));\n }\n\n break;\n\n case 'ack':\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_5__.ackEvent)(event.payload));\n break;\n\n case 'system':\n if (payload.type === 'service_changed') {\n const {\n serviceSettings\n } = payload,\n eventPayload = _objectWithoutProperties(payload, _excluded);\n\n const {\n uploads,\n entry\n } = serviceSettings;\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_5__.setFeatureEnabledState)({\n key: ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_9__.featureKeys.uploads,\n enabled: !!(uploads && uploads.enabled)\n }));\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_5__.setServiceEntryMetadata)(entry));\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_5__.setActiveService)(payload.serviceSessionId));\n emitEvent('system.serviceChanged', eventPayload);\n }\n\n break;\n\n case 'info':\n if (payload.type === 'divider' || payload.type === 'text' || payload.type === 'translation') {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_5__.addEvent)(event));\n }\n\n break;\n\n case 'error':\n switch (payload.type) {\n case 'find_conversation_erred':\n const seamlySessionExpiredError = new api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_2__[\"default\"](event);\n dispatch((0,domains_interrupt_slice__WEBPACK_IMPORTED_MODULE_4__.setInterrupt)({\n name: seamlySessionExpiredError.name,\n action: seamlySessionExpiredError.action,\n message: seamlySessionExpiredError.message,\n originalEvent: seamlySessionExpiredError.originalEvent,\n originalError: seamlySessionExpiredError.originalError\n }));\n break;\n\n case 'seamly_offline':\n const seamlyOfflineError = new api_errors_seamly_offline_error__WEBPACK_IMPORTED_MODULE_1__[\"default\"](event);\n dispatch((0,domains_interrupt_slice__WEBPACK_IMPORTED_MODULE_4__.setInterrupt)({\n name: seamlyOfflineError.name,\n message: seamlyOfflineError.message,\n langKey: seamlyOfflineError.langKey,\n originalEvent: seamlyOfflineError.originalEvent,\n originalError: seamlyOfflineError.originalError\n }));\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_5__.clearEvents)());\n break;\n\n default:\n const seamlyGeneralError = new api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_0__[\"default\"](event);\n dispatch((0,domains_interrupt_slice__WEBPACK_IMPORTED_MODULE_4__.setInterrupt)({\n name: seamlyGeneralError.name,\n message: seamlyGeneralError.message,\n langKey: seamlyGeneralError.langKey,\n originalEvent: seamlyGeneralError.originalEvent,\n originalError: seamlyGeneralError.originalError,\n action: seamlyGeneralError.action\n }));\n break;\n }\n\n break;\n\n case 'socket_opened':\n dispatch((0,domains_interrupt_slice__WEBPACK_IMPORTED_MODULE_4__.clearInterrupt)());\n break;\n }\n }\n });\n api.stream().filter(e => e.type === 'message' && EMITTABLE_MESSAGE_TYPES.includes(e.payload.type)).subscribe({\n next: ({\n payload\n }) => {\n // This check dedupes the sending of messages via\n // the bus if a duplicate connection exists in an\n // error situation.\n if (payload.id !== prevEmittedEventId.current) {\n eventBus.emit('message', payload);\n }\n\n prevEmittedEventId.current = payload.id;\n }\n });\n return () => {\n subscription.unsubscribe();\n };\n }\n\n return () => undefined;\n }, [dispatch, api, eventBus, initCountdown, endCountdown, emitEvent]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_6__.useEffect)(() => {\n const subscribe = () => {\n return api.stream().filter(e => e.type === 'sync').subscribe({\n next: event => {\n const {\n payload\n } = event;\n const lastEvent = events[events.length - 1];\n const {\n id: payloadLastEventId\n } = payload.lastEvent;\n\n if (lastEvent && payloadLastEventId === lastEvent.payload.id) {\n return;\n }\n\n api.getConversation().then(history => {\n if (!history) {\n return;\n }\n\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_5__.setHistory)(history));\n }).catch(error => {\n dispatch((0,domains_interrupt_slice__WEBPACK_IMPORTED_MODULE_4__.setInterrupt)({\n name: error.name,\n message: error.message,\n langKey: error.langKey,\n originalEvent: error.originalEvent,\n originalError: error.originalError\n }));\n });\n }\n });\n };\n\n if (api.stream) {\n const subscription = subscribe();\n return () => {\n subscription.unsubscribe();\n };\n }\n\n return () => undefined;\n }, [api, events, dispatch]);\n return null;\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SeamlyEventSubscriber);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/core/seamly-event-subscriber.js?");
1292
+ 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 api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! api/errors/seamly-general-error */ \"./src/javascripts/api/errors/seamly-general-error.js\");\n/* harmony import */ var api_errors_seamly_offline_error__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! api/errors/seamly-offline-error */ \"./src/javascripts/api/errors/seamly-offline-error.js\");\n/* harmony import */ var api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! api/errors/seamly-session-expired-error */ \"./src/javascripts/api/errors/seamly-session-expired-error.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_interrupt_slice__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! domains/interrupt/slice */ \"./src/javascripts/domains/interrupt/slice.ts\");\n/* harmony import */ var domains_store_slice__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! domains/store/slice */ \"./src/javascripts/domains/store/slice.ts\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react-redux */ \"./node_modules/react-redux/es/index.js\");\n/* harmony import */ var ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.ts\");\nconst _excluded = [\"serviceSettings\"];\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\n\n\n\n\nconst EMITTABLE_MESSAGE_TYPES = ['text', 'choice_prompt', 'image', 'video'];\n\nconst SeamlyEventSubscriber = ({\n eventBus\n}) => {\n const api = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_8__.useSeamlyApiContext)();\n const dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_7__.useDispatch)();\n const events = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_8__.useEvents)();\n const prevEmittedEventId = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_6__.useRef)(null);\n const {\n initCountdown,\n endCountdown\n } = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_8__.useSeamlyIdleDetachCountdown)();\n const {\n emitEvent\n } = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_8__.useSeamlyCommands)();\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_6__.useEffect)(() => {\n if (api.connectionInfo) {\n const updateParticipant = event => {\n const {\n payload\n } = event;\n\n if (!payload || !payload.participant) {\n return;\n }\n\n const {\n fromClient,\n participant\n } = payload;\n\n if (!fromClient && participant.name) {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_5__.setHeaderSubTitle)(participant.name));\n }\n\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_5__.setParticipant)({\n participant,\n fromClient\n }));\n\n if (participant.introduction) {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_5__.addEvent)(event));\n }\n };\n\n const subscription = api.stream().subscribe({\n next: event => {\n const {\n type,\n payload\n } = event;\n\n switch (type) {\n case 'ui':\n if (payload.state && payload.state.hasOwnProperty('loading')) {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_5__.setIsLoading)(payload.state.loading));\n }\n\n switch (payload.type) {\n case 'idle_detach_countdown':\n initCountdown(payload.body.duration);\n break;\n\n case 'idle_detach_countdown_elapsed':\n endCountdown(undefined, true);\n break;\n\n case 'resume_conversation_prompt':\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_5__.initResumeConversationPrompt)());\n break;\n\n case 'user_first_response':\n dispatch((0,domains_app_slice__WEBPACK_IMPORTED_MODULE_3__.setHasResponded)(true));\n eventBus.emit('system.userFirstResponse', payload.body);\n break;\n }\n\n break;\n\n case 'message':\n updateParticipant(payload);\n\n switch (payload.type) {\n case 'text':\n case 'choice_prompt':\n case 'splash':\n case 'image':\n case 'upload':\n case 'video':\n case 'cta':\n case 'custom':\n case 'carousel':\n case 'card':\n if (payload.service && payload.service.serviceSessionId) {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_5__.setActiveService)(payload.service.serviceSessionId));\n }\n\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_5__.addEvent)(event));\n break;\n }\n\n break;\n\n case 'participant':\n updateParticipant(event);\n break;\n\n case 'service_data':\n if (payload.persist) {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_5__.setServiceDataItem)(payload));\n }\n\n break;\n\n case 'ack':\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_5__.ackEvent)(event.payload));\n break;\n\n case 'system':\n if (payload.type === 'service_changed') {\n const {\n serviceSettings\n } = payload,\n eventPayload = _objectWithoutProperties(payload, _excluded);\n\n const {\n entry\n } = serviceSettings;\n const {\n upload\n } = entry.options;\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_5__.setFeatureEnabledState)({\n key: ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_9__.featureKeys.uploads,\n enabled: !!(upload && upload.enabled)\n }));\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_5__.setServiceEntryMetadata)(entry));\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_5__.setActiveService)(payload.serviceSessionId));\n emitEvent('system.serviceChanged', eventPayload);\n }\n\n break;\n\n case 'info':\n if (payload.type === 'divider' || payload.type === 'text' || payload.type === 'translation') {\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_5__.addEvent)(event));\n }\n\n break;\n\n case 'error':\n switch (payload.type) {\n case 'find_conversation_erred':\n const seamlySessionExpiredError = new api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_2__[\"default\"](event);\n dispatch((0,domains_interrupt_slice__WEBPACK_IMPORTED_MODULE_4__.setInterrupt)({\n name: seamlySessionExpiredError.name,\n action: seamlySessionExpiredError.action,\n message: seamlySessionExpiredError.message,\n originalEvent: seamlySessionExpiredError.originalEvent,\n originalError: seamlySessionExpiredError.originalError\n }));\n break;\n\n case 'seamly_offline':\n const seamlyOfflineError = new api_errors_seamly_offline_error__WEBPACK_IMPORTED_MODULE_1__[\"default\"](event);\n dispatch((0,domains_interrupt_slice__WEBPACK_IMPORTED_MODULE_4__.setInterrupt)({\n name: seamlyOfflineError.name,\n message: seamlyOfflineError.message,\n langKey: seamlyOfflineError.langKey,\n originalEvent: seamlyOfflineError.originalEvent,\n originalError: seamlyOfflineError.originalError\n }));\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_5__.clearEvents)());\n break;\n\n default:\n const seamlyGeneralError = new api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_0__[\"default\"](event);\n dispatch((0,domains_interrupt_slice__WEBPACK_IMPORTED_MODULE_4__.setInterrupt)({\n name: seamlyGeneralError.name,\n message: seamlyGeneralError.message,\n langKey: seamlyGeneralError.langKey,\n originalEvent: seamlyGeneralError.originalEvent,\n originalError: seamlyGeneralError.originalError,\n action: seamlyGeneralError.action\n }));\n break;\n }\n\n break;\n\n case 'socket_opened':\n dispatch((0,domains_interrupt_slice__WEBPACK_IMPORTED_MODULE_4__.clearInterrupt)());\n break;\n }\n }\n });\n api.stream().filter(e => e.type === 'message' && EMITTABLE_MESSAGE_TYPES.includes(e.payload.type)).subscribe({\n next: ({\n payload\n }) => {\n // This check dedupes the sending of messages via\n // the bus if a duplicate connection exists in an\n // error situation.\n if (payload.id !== prevEmittedEventId.current) {\n eventBus.emit('message', payload);\n }\n\n prevEmittedEventId.current = payload.id;\n }\n });\n return () => {\n subscription.unsubscribe();\n };\n }\n\n return () => undefined;\n }, [dispatch, api, eventBus, initCountdown, endCountdown, emitEvent]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_6__.useEffect)(() => {\n const subscribe = () => {\n return api.stream().filter(e => e.type === 'sync').subscribe({\n next: event => {\n const {\n payload\n } = event;\n const lastEvent = events[events.length - 1];\n const {\n id: payloadLastEventId\n } = payload.lastEvent;\n\n if (lastEvent && payloadLastEventId === lastEvent.payload.id) {\n return;\n }\n\n api.getConversation().then(history => {\n if (!history) {\n return;\n }\n\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_5__.setHistory)(history));\n }).catch(error => {\n dispatch((0,domains_interrupt_slice__WEBPACK_IMPORTED_MODULE_4__.setInterrupt)({\n name: error.name,\n message: error.message,\n langKey: error.langKey,\n originalEvent: error.originalEvent,\n originalError: error.originalError\n }));\n });\n }\n });\n };\n\n if (api.stream) {\n const subscription = subscribe();\n return () => {\n subscription.unsubscribe();\n };\n }\n\n return () => undefined;\n }, [api, events, dispatch]);\n return null;\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SeamlyEventSubscriber);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/core/seamly-event-subscriber.js?");
1293
1293
 
1294
1294
  /***/ }),
1295
1295
 
@@ -1344,7 +1344,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1344
1344
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1345
1345
 
1346
1346
  "use strict";
1347
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.ts\");\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! domains/interrupt/hooks */ \"./src/javascripts/domains/interrupt/hooks.ts\");\n/* harmony import */ var domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var domains_config_hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! domains/config/hooks */ \"./src/javascripts/domains/config/hooks.ts\");\n/* harmony import */ var domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! domains/visibility/hooks */ \"./src/javascripts/domains/visibility/hooks.ts\");\n/* harmony import */ var domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var domains_visibility_constants__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! domains/visibility/constants */ \"./src/javascripts/domains/visibility/constants.js\");\n/* harmony import */ var _seamly_api_context__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./seamly-api-context */ \"./src/javascripts/ui/components/core/seamly-api-context.js\");\n\n\n\n\n\n\n\n\n\n\nfunction useSeamlyInstanceFunction(functionName, fn, deps = []) {\n const eventBus = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useContext)(_seamly_api_context__WEBPACK_IMPORTED_MODULE_8__.SeamlyEventBusContext);\n const callbackRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)();\n callbackRef.current = fn;\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!deps.every(Boolean)) {\n return undefined;\n }\n\n const callback = (...args) => {\n var _callbackRef$current;\n\n return (_callbackRef$current = callbackRef.current) === null || _callbackRef$current === void 0 ? void 0 : _callbackRef$current.call(callbackRef, ...args);\n };\n\n eventBus.emit('function.register', functionName, callback);\n return () => eventBus.emit('function.unregister', functionName, callback); // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [eventBus, functionName, ...deps]);\n}\n\nconst SeamlyInstanceFunctionsLoader = () => {\n const config = (0,domains_config_hooks__WEBPACK_IMPORTED_MODULE_5__.useConfig)();\n const {\n sendMessage,\n sendContext,\n sendAction\n } = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyCommands)();\n const {\n setVisibility,\n visible\n } = (0,domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_6__.useVisibility)();\n const currentVisibility = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(visible);\n const eventBus = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useContext)(_seamly_api_context__WEBPACK_IMPORTED_MODULE_8__.SeamlyEventBusContext);\n const api = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyApiContext)();\n const unreadCount = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyUnreadCount)();\n const previousUnreadCount = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const previousVisibilityState = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const {\n isInline,\n isResolving\n } = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyLayoutMode)();\n const {\n hasInterrupt\n } = (0,domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_4__.useInterrupt)();\n const currentConversationUrl = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyConversationUrl)();\n const prevConversationUrl = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const onActivityHandler = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyActivityEventHandler)();\n const {\n enableTranslations,\n disableTranslations\n } = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_3__.useTranslations)();\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n currentVisibility.current = visible;\n }, [visible]);\n useSeamlyInstanceFunction('askText', text => {\n sendMessage({\n body: text\n });\n }, [api === null || api === void 0 ? void 0 : api.send]);\n useSeamlyInstanceFunction('setVariables', variables => {\n sendContext({\n variables\n });\n }, [api === null || api === void 0 ? void 0 : api.send]);\n useSeamlyInstanceFunction('getVisibility', callback => {\n if (callback) {\n callback(currentVisibility.current);\n } else {\n console.warn('A callback function is required for the getVisibility action.');\n }\n });\n useSeamlyInstanceFunction('setVisibility', visibilityState => {\n if (!Object.values(domains_visibility_constants__WEBPACK_IMPORTED_MODULE_7__.visibilityStates).includes(visibilityState)) {\n console.error('Requested visibility states should be \"open\", \"minimized\" ,\"hidden\" or null.');\n return;\n }\n\n onActivityHandler();\n setVisibility(visibilityState);\n }, [config === null || config === void 0 ? void 0 : config.api]);\n useSeamlyInstanceFunction('sendCustomAction', (actionType, body) => {\n sendAction({\n type: 'custom',\n body: {\n type: actionType,\n body\n }\n });\n }, [api.send]);\n useSeamlyInstanceFunction('setTopic', ({\n name,\n fallbackMessage\n }) => {\n if (name && fallbackMessage) {\n sendAction({\n type: ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__.actionTypes.setTopic,\n body: {\n name,\n fallbackMessage\n }\n });\n } else {\n console.warn('A name and a fallbackMessage are required for the setTopic action.');\n }\n }, [api.send]);\n useSeamlyInstanceFunction('setTranslation', ({\n enabled,\n locale\n }) => {\n if (enabled) {\n enableTranslations(locale);\n } else {\n disableTranslations();\n }\n }, [api.send]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!isResolving && !hasInterrupt) {\n // Check for app reset\n if (prevConversationUrl.current && prevConversationUrl.current !== currentConversationUrl) {\n eventBus.emit('unreadMessageCount', unreadCount);\n } // Broadcast once on window open\n\n\n if (visible === domains_visibility_constants__WEBPACK_IMPORTED_MODULE_7__.visibilityStates.open && visible !== previousVisibilityState.current) {\n if (previousUnreadCount.current !== 0) {\n eventBus.emit('unreadMessageCount', 0);\n }\n }\n\n if (visible !== domains_visibility_constants__WEBPACK_IMPORTED_MODULE_7__.visibilityStates.open && unreadCount !== previousUnreadCount.current) {\n eventBus.emit('unreadMessageCount', unreadCount);\n }\n\n previousVisibilityState.current = visible;\n previousUnreadCount.current = unreadCount;\n prevConversationUrl.current = currentConversationUrl;\n }\n }, [unreadCount, visible, eventBus, isInline, isResolving, hasInterrupt, currentConversationUrl]);\n return null;\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SeamlyInstanceFunctionsLoader);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/core/seamly-instance-functions-loader.js?");
1347
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.ts\");\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! domains/interrupt/hooks */ \"./src/javascripts/domains/interrupt/hooks.ts\");\n/* harmony import */ var domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var domains_config_hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! domains/config/hooks */ \"./src/javascripts/domains/config/hooks.ts\");\n/* harmony import */ var domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! domains/visibility/hooks */ \"./src/javascripts/domains/visibility/hooks.ts\");\n/* harmony import */ var domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var domains_visibility_constants__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! domains/visibility/constants */ \"./src/javascripts/domains/visibility/constants.js\");\n/* harmony import */ var _seamly_api_context__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./seamly-api-context */ \"./src/javascripts/ui/components/core/seamly-api-context.js\");\n\n\n\n\n\n\n\n\n\n\nfunction useSeamlyInstanceFunction(functionName, fn, deps = []) {\n const eventBus = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useContext)(_seamly_api_context__WEBPACK_IMPORTED_MODULE_8__.SeamlyEventBusContext);\n const callbackRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)();\n callbackRef.current = fn;\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!deps.every(Boolean)) {\n return undefined;\n }\n\n const callback = (...args) => callbackRef.current?.(...args);\n\n eventBus.emit('function.register', functionName, callback);\n return () => eventBus.emit('function.unregister', functionName, callback); // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [eventBus, functionName, ...deps]);\n}\n\nconst SeamlyInstanceFunctionsLoader = () => {\n const config = (0,domains_config_hooks__WEBPACK_IMPORTED_MODULE_5__.useConfig)();\n const {\n sendMessage,\n sendContext,\n sendAction\n } = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyCommands)();\n const {\n setVisibility,\n visible\n } = (0,domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_6__.useVisibility)();\n const currentVisibility = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(visible);\n const eventBus = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useContext)(_seamly_api_context__WEBPACK_IMPORTED_MODULE_8__.SeamlyEventBusContext);\n const api = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyApiContext)();\n const unreadCount = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyUnreadCount)();\n const previousUnreadCount = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const previousVisibilityState = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const {\n isInline,\n isResolving\n } = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyLayoutMode)();\n const {\n hasInterrupt\n } = (0,domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_4__.useInterrupt)();\n const currentConversationUrl = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyConversationUrl)();\n const prevConversationUrl = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const onActivityHandler = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyActivityEventHandler)();\n const {\n enableTranslations,\n disableTranslations\n } = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_3__.useTranslations)();\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n currentVisibility.current = visible;\n }, [visible]);\n useSeamlyInstanceFunction('askText', text => {\n sendMessage({\n body: text\n });\n }, [api?.send]);\n useSeamlyInstanceFunction('setVariables', variables => {\n sendContext({\n variables\n });\n }, [api?.send]);\n useSeamlyInstanceFunction('getVisibility', callback => {\n if (callback) {\n callback(currentVisibility.current);\n } else {\n console.warn('A callback function is required for the getVisibility action.');\n }\n });\n useSeamlyInstanceFunction('setVisibility', visibilityState => {\n if (!Object.values(domains_visibility_constants__WEBPACK_IMPORTED_MODULE_7__.visibilityStates).includes(visibilityState)) {\n console.error('Requested visibility states should be \"open\", \"minimized\" ,\"hidden\" or null.');\n return;\n }\n\n onActivityHandler();\n setVisibility(visibilityState);\n }, [config?.api]);\n useSeamlyInstanceFunction('sendCustomAction', (actionType, body) => {\n sendAction({\n type: 'custom',\n body: {\n type: actionType,\n body\n }\n });\n }, [api.send]);\n useSeamlyInstanceFunction('setTopic', ({\n name,\n fallbackMessage\n }) => {\n if (name && fallbackMessage) {\n sendAction({\n type: ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__.actionTypes.setTopic,\n body: {\n name,\n fallbackMessage\n }\n });\n } else {\n console.warn('A name and a fallbackMessage are required for the setTopic action.');\n }\n }, [api.send]);\n useSeamlyInstanceFunction('setTranslation', ({\n enabled,\n locale\n }) => {\n if (enabled) {\n enableTranslations(locale);\n } else {\n disableTranslations();\n }\n }, [api.send]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!isResolving && !hasInterrupt) {\n // Check for app reset\n if (prevConversationUrl.current && prevConversationUrl.current !== currentConversationUrl) {\n eventBus.emit('unreadMessageCount', unreadCount);\n } // Broadcast once on window open\n\n\n if (visible === domains_visibility_constants__WEBPACK_IMPORTED_MODULE_7__.visibilityStates.open && visible !== previousVisibilityState.current) {\n if (previousUnreadCount.current !== 0) {\n eventBus.emit('unreadMessageCount', 0);\n }\n }\n\n if (visible !== domains_visibility_constants__WEBPACK_IMPORTED_MODULE_7__.visibilityStates.open && unreadCount !== previousUnreadCount.current) {\n eventBus.emit('unreadMessageCount', unreadCount);\n }\n\n previousVisibilityState.current = visible;\n previousUnreadCount.current = unreadCount;\n prevConversationUrl.current = currentConversationUrl;\n }\n }, [unreadCount, visible, eventBus, isInline, isResolving, hasInterrupt, currentConversationUrl]);\n return null;\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SeamlyInstanceFunctionsLoader);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/core/seamly-instance-functions-loader.js?");
1348
1348
 
1349
1349
  /***/ }),
1350
1350
 
@@ -1487,7 +1487,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1487
1487
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1488
1488
 
1489
1489
  "use strict";
1490
- 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 lib_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.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_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.ts\");\n/* harmony import */ var ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ui/utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var ui_hooks_use_seamly_commands__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ui/hooks/use-seamly-commands */ \"./src/javascripts/ui/hooks/use-seamly-commands.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.js\");\n/* harmony import */ var ui_hooks_utility_hooks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ui/hooks/utility-hooks */ \"./src/javascripts/ui/hooks/utility-hooks.js\");\n/* harmony import */ var ui_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ui/hooks/focus-helper-hooks */ \"./src/javascripts/ui/hooks/focus-helper-hooks.js\");\n/* harmony import */ var ui_hooks_live_region_hooks__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ui/hooks/live-region-hooks */ \"./src/javascripts/ui/hooks/live-region-hooks.js\");\n/* harmony import */ var ui_hooks_use_seamly_idle_detach_countdown__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ui/hooks/use-seamly-idle-detach-countdown */ \"./src/javascripts/ui/hooks/use-seamly-idle-detach-countdown.js\");\n/* harmony import */ var ui_hooks_use_seamly_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ui/hooks/use-seamly-resume-conversation-prompt */ \"./src/javascripts/ui/hooks/use-seamly-resume-conversation-prompt.js\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ui/components/widgets/in-out-transition */ \"./src/javascripts/ui/components/widgets/in-out-transition.js\");\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! domains/interrupt/hooks */ \"./src/javascripts/domains/interrupt/hooks.ts\");\n/* harmony import */ var domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var domains_app_hooks__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! domains/app/hooks */ \"./src/javascripts/domains/app/hooks.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_17___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__);\nconst _excluded = [\"categories\"];\n\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; }\n\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; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst Faq = () => {\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_12__.useI18n)();\n const {\n sendAction,\n addMessageBubble\n } = (0,ui_hooks_use_seamly_commands__WEBPACK_IMPORTED_MODULE_5__[\"default\"])();\n const sectionId = (0,ui_hooks_utility_hooks__WEBPACK_IMPORTED_MODULE_7__.useGeneratedId)();\n const focusSkiplinkTarget = (0,ui_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_8__.useSkiplinkTargetFocusing)();\n const {\n sendPolite\n } = (0,ui_hooks_live_region_hooks__WEBPACK_IMPORTED_MODULE_9__.useLiveRegion)();\n const {\n hasInterrupt\n } = (0,domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_15__.useInterrupt)();\n const {\n hasCountdown,\n endCountdown\n } = (0,ui_hooks_use_seamly_idle_detach_countdown__WEBPACK_IMPORTED_MODULE_10__[\"default\"])();\n const {\n hasPrompt,\n continueChat\n } = (0,ui_hooks_use_seamly_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_11__[\"default\"])();\n const lastFaqEventPayload = (0,ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_6__.useSeamlyServiceData)('suggestion');\n const [eventBody] = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_14__.useTranslatedEventData)({\n payload: lastFaqEventPayload\n });\n const faqs = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n const newFaqs = lastFaqEventPayload && !hasInterrupt ? eventBody : [];\n const itemBaseClass = `faqs__item`;\n return newFaqs.map(_ref => {\n let {\n categories = []\n } = _ref,\n faqRest = _objectWithoutProperties(_ref, _excluded);\n\n return _objectSpread(_objectSpread({}, faqRest), {}, {\n categories,\n classNames: [itemBaseClass, ...categories.map(cat => `faqs__item--${String(cat).toLowerCase().replace(/[^a-z0-9_\\\\-]/, '')}`)]\n });\n });\n }, [lastFaqEventPayload, hasInterrupt, eventBody]);\n const prevFaqs = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const prevHasFaqs = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(false);\n const {\n isInline\n } = (0,ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_6__.useSeamlyLayoutMode)();\n const userHasResponded = (0,domains_app_hooks__WEBPACK_IMPORTED_MODULE_16__.useUserHasResponded)();\n const hideForWindow = !isInline && userHasResponded;\n const prevHideForWindow = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(hideForWindow);\n const hasFaqs = !!faqs.length;\n const showFaqContainer = hasFaqs && !hideForWindow;\n const previousRenderedFaqList = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)([]);\n const renderedFaqList = hasFaqs ? faqs : previousRenderedFaqList.current;\n previousRenderedFaqList.current = renderedFaqList;\n const containerRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (prevFaqs.current !== faqs && !hideForWindow) {\n if (hasFaqs) {\n const politeText = prevHasFaqs.current ? t('faq.srUpdatedText') : t('faq.srAvailableText');\n setTimeout(() => {\n sendPolite(politeText);\n }, 30);\n } else if (prevHasFaqs.current) {\n sendPolite(t('faq.srUnavailableText'));\n }\n\n prevFaqs.current = faqs;\n }\n\n if (!prevHideForWindow.current && hideForWindow) {\n (0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_4__.runIfElementContainsOrHasFocus)(containerRef.current, focusSkiplinkTarget);\n sendPolite(t('faq.srUnavailableText'));\n } else if (!hasFaqs && prevHasFaqs.current) {\n (0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_4__.runIfElementContainsOrHasFocus)(containerRef.current, focusSkiplinkTarget);\n }\n\n prevHasFaqs.current = hasFaqs;\n prevHideForWindow.current = hideForWindow;\n }, [hasFaqs, faqs, hideForWindow, focusSkiplinkTarget, sendPolite, t]);\n\n const onFaqClickHandler = ({\n id,\n question\n }) => {\n if (hasCountdown) {\n endCountdown(true);\n }\n\n if (hasPrompt) {\n continueChat();\n }\n\n sendAction({\n type: ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__.actionTypes.custom,\n originMessage: lastFaqEventPayload.id,\n body: {\n type: 'faqclick',\n body: {\n faqId: id,\n faqQuestion: question\n }\n }\n });\n addMessageBubble(question);\n focusSkiplinkTarget();\n };\n\n const headingText = t('faq.headingText');\n const ContainerElement = headingText ? 'section' : 'div';\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n isActive: showFaqContainer,\n transitionStartState: ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_13__.transitionStartStates.notRendered,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsxs)(ContainerElement, {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('faqs'),\n \"aria-labelledby\": headingText ? sectionId : null,\n ref: containerRef,\n children: [headingText && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(\"h2\", {\n id: sectionId,\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('faqs__heading'),\n children: headingText\n }), !!renderedFaqList.length && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(\"ul\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('faqs__list'),\n children: renderedFaqList.map(faq => (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(\"li\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)(faq.classNames),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsxs)(\"button\", {\n type: \"button\",\n onClick: () => {\n onFaqClickHandler(faq);\n },\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('button', 'button--secondary'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(ui_components_layout_icon__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n name: \"chevronRight\",\n size: \"8\"\n }), faq.question]\n })\n }, faq.id.toString()))\n })]\n })\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Faq);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/faq/faq.js?");
1490
+ 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 lib_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.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_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.ts\");\n/* harmony import */ var ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ui/utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var ui_hooks_use_seamly_commands__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ui/hooks/use-seamly-commands */ \"./src/javascripts/ui/hooks/use-seamly-commands.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.js\");\n/* harmony import */ var ui_hooks_utility_hooks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ui/hooks/utility-hooks */ \"./src/javascripts/ui/hooks/utility-hooks.js\");\n/* harmony import */ var ui_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ui/hooks/focus-helper-hooks */ \"./src/javascripts/ui/hooks/focus-helper-hooks.js\");\n/* harmony import */ var ui_hooks_live_region_hooks__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ui/hooks/live-region-hooks */ \"./src/javascripts/ui/hooks/live-region-hooks.js\");\n/* harmony import */ var ui_hooks_use_seamly_idle_detach_countdown__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ui/hooks/use-seamly-idle-detach-countdown */ \"./src/javascripts/ui/hooks/use-seamly-idle-detach-countdown.js\");\n/* harmony import */ var ui_hooks_use_seamly_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ui/hooks/use-seamly-resume-conversation-prompt */ \"./src/javascripts/ui/hooks/use-seamly-resume-conversation-prompt.js\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ui/components/widgets/in-out-transition */ \"./src/javascripts/ui/components/widgets/in-out-transition.js\");\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! domains/interrupt/hooks */ \"./src/javascripts/domains/interrupt/hooks.ts\");\n/* harmony import */ var domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var domains_app_hooks__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! domains/app/hooks */ \"./src/javascripts/domains/app/hooks.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_17___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__);\nconst _excluded = [\"categories\"];\n\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; }\n\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; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst Faq = () => {\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_12__.useI18n)();\n const {\n sendAction,\n addMessageBubble\n } = (0,ui_hooks_use_seamly_commands__WEBPACK_IMPORTED_MODULE_5__[\"default\"])();\n const sectionId = (0,ui_hooks_utility_hooks__WEBPACK_IMPORTED_MODULE_7__.useGeneratedId)();\n const focusSkiplinkTarget = (0,ui_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_8__.useSkiplinkTargetFocusing)();\n const {\n sendPolite\n } = (0,ui_hooks_live_region_hooks__WEBPACK_IMPORTED_MODULE_9__.useLiveRegion)();\n const {\n hasInterrupt\n } = (0,domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_15__.useInterrupt)();\n const {\n hasCountdown,\n endCountdown\n } = (0,ui_hooks_use_seamly_idle_detach_countdown__WEBPACK_IMPORTED_MODULE_10__[\"default\"])();\n const {\n hasPrompt,\n continueChat\n } = (0,ui_hooks_use_seamly_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_11__[\"default\"])();\n const lastFaqEventPayload = (0,ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_6__.useSeamlyServiceData)('suggestion');\n const {\n body: eventBody\n } = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_14__.useTranslatedEventData)({\n payload: lastFaqEventPayload\n });\n const faqs = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n const newFaqs = lastFaqEventPayload && !hasInterrupt ? eventBody : [];\n const itemBaseClass = `faqs__item`;\n return newFaqs.map(_ref => {\n let {\n categories = []\n } = _ref,\n faqRest = _objectWithoutProperties(_ref, _excluded);\n\n return _objectSpread(_objectSpread({}, faqRest), {}, {\n categories,\n classNames: [itemBaseClass, ...categories.map(cat => `faqs__item--${String(cat).toLowerCase().replace(/[^a-z0-9_\\\\-]/, '')}`)]\n });\n });\n }, [lastFaqEventPayload, hasInterrupt, eventBody]);\n const prevFaqs = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const prevHasFaqs = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(false);\n const {\n isInline\n } = (0,ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_6__.useSeamlyLayoutMode)();\n const userHasResponded = (0,domains_app_hooks__WEBPACK_IMPORTED_MODULE_16__.useUserHasResponded)();\n const hideForWindow = !isInline && userHasResponded;\n const prevHideForWindow = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(hideForWindow);\n const hasFaqs = !!faqs.length;\n const showFaqContainer = hasFaqs && !hideForWindow;\n const previousRenderedFaqList = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)([]);\n const renderedFaqList = hasFaqs ? faqs : previousRenderedFaqList.current;\n previousRenderedFaqList.current = renderedFaqList;\n const containerRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (prevFaqs.current !== faqs && !hideForWindow) {\n if (hasFaqs) {\n const politeText = prevHasFaqs.current ? t('faq.srUpdatedText') : t('faq.srAvailableText');\n setTimeout(() => {\n sendPolite(politeText);\n }, 30);\n } else if (prevHasFaqs.current) {\n sendPolite(t('faq.srUnavailableText'));\n }\n\n prevFaqs.current = faqs;\n }\n\n if (!prevHideForWindow.current && hideForWindow) {\n (0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_4__.runIfElementContainsOrHasFocus)(containerRef.current, focusSkiplinkTarget);\n sendPolite(t('faq.srUnavailableText'));\n } else if (!hasFaqs && prevHasFaqs.current) {\n (0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_4__.runIfElementContainsOrHasFocus)(containerRef.current, focusSkiplinkTarget);\n }\n\n prevHasFaqs.current = hasFaqs;\n prevHideForWindow.current = hideForWindow;\n }, [hasFaqs, faqs, hideForWindow, focusSkiplinkTarget, sendPolite, t]);\n\n const onFaqClickHandler = ({\n id,\n question\n }) => {\n if (hasCountdown) {\n endCountdown(true);\n }\n\n if (hasPrompt) {\n continueChat();\n }\n\n sendAction({\n type: ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__.actionTypes.custom,\n originMessage: lastFaqEventPayload.id,\n body: {\n type: 'faqclick',\n body: {\n faqId: id,\n faqQuestion: question\n }\n }\n });\n addMessageBubble(question);\n focusSkiplinkTarget();\n };\n\n const headingText = t('faq.headingText');\n const ContainerElement = headingText ? 'section' : 'div';\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n isActive: showFaqContainer,\n transitionStartState: ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_13__.transitionStartStates.notRendered,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsxs)(ContainerElement, {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('faqs'),\n \"aria-labelledby\": headingText ? sectionId : null,\n ref: containerRef,\n children: [headingText && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(\"h2\", {\n id: sectionId,\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('faqs__heading'),\n children: headingText\n }), !!renderedFaqList.length && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(\"ul\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('faqs__list'),\n children: renderedFaqList.map(faq => (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(\"li\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)(faq.classNames),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsxs)(\"button\", {\n type: \"button\",\n onClick: () => {\n onFaqClickHandler(faq);\n },\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('button', 'button--secondary'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(ui_components_layout_icon__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n name: \"chevronRight\",\n size: \"8\"\n }), faq.question]\n })\n }, faq.id.toString()))\n })]\n })\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Faq);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/faq/faq.js?");
1491
1491
 
1492
1492
  /***/ }),
1493
1493
 
@@ -1564,7 +1564,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1564
1564
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1565
1565
 
1566
1566
  "use strict";
1567
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var lib_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! domains/interrupt/hooks */ \"./src/javascripts/domains/interrupt/hooks.ts\");\n/* harmony import */ var domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var domains_config_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! domains/config/hooks */ \"./src/javascripts/domains/config/hooks.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_hooks__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./icon */ \"./src/javascripts/ui/components/layout/icon.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__);\n\n\n\n\n\n\n\n\n\n\nconst AgentInfo = () => {\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_2__.useI18n)();\n const {\n title,\n subTitle\n } = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_0__.useSeamlyHeaderData)();\n const unreadMessageCount = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_0__.useSeamlyUnreadCount)();\n const {\n isOpen\n } = (0,domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_5__.useVisibility)();\n const currentAgent = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_0__.useSeamlyCurrentAgent)();\n const {\n hasInterrupt\n } = (0,domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_3__.useInterrupt)();\n const startChatIcon = (0,domains_config_hooks__WEBPACK_IMPORTED_MODULE_4__.useStartChatIcon)();\n const src = (currentAgent === null || currentAgent === void 0 ? void 0 : currentAgent.avatar) ?? startChatIcon;\n const displaySubtitle = hasInterrupt ? '' : subTitle;\n const classNames = ['message-count'];\n\n if (isOpen) {\n classNames.push('message-count__hide');\n }\n\n if (unreadMessageCount === 0) {\n classNames.push('message-count__empty');\n }\n\n return (displaySubtitle || !isOpen) && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsxs)(\"div\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('agent-info'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsxs)(\"div\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('agent-info__graphic'),\n children: [src ? (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"img\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)(currentAgent !== null && currentAgent !== void 0 && currentAgent.avatar ? 'avatar' : 'icon'),\n src: src,\n alt: \"\"\n }) : (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(_icon__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n name: \"avatar\",\n size: \"32\"\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"span\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)(classNames),\n \"aria-hidden\": \"true\",\n children: unreadMessageCount\n })]\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsxs)(\"div\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('agent-info__body'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"p\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('agent-info__heading'),\n children: title ?? t('header.title')\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"p\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('agent-info__text'),\n children: displaySubtitle\n })]\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AgentInfo);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/layout/agent-info.js?");
1567
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var lib_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! domains/interrupt/hooks */ \"./src/javascripts/domains/interrupt/hooks.ts\");\n/* harmony import */ var domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var domains_config_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! domains/config/hooks */ \"./src/javascripts/domains/config/hooks.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_hooks__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./icon */ \"./src/javascripts/ui/components/layout/icon.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__);\n\n\n\n\n\n\n\n\n\n\nconst AgentInfo = () => {\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_2__.useI18n)();\n const {\n title,\n subTitle\n } = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_0__.useSeamlyHeaderData)();\n const unreadMessageCount = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_0__.useSeamlyUnreadCount)();\n const {\n isOpen\n } = (0,domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_5__.useVisibility)();\n const currentAgent = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_0__.useSeamlyCurrentAgent)();\n const {\n hasInterrupt\n } = (0,domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_3__.useInterrupt)();\n const startChatIcon = (0,domains_config_hooks__WEBPACK_IMPORTED_MODULE_4__.useStartChatIcon)();\n const src = currentAgent?.avatar ?? startChatIcon;\n const displaySubtitle = hasInterrupt ? '' : subTitle;\n const classNames = ['message-count'];\n\n if (isOpen) {\n classNames.push('message-count__hide');\n }\n\n if (unreadMessageCount === 0) {\n classNames.push('message-count__empty');\n }\n\n return (displaySubtitle || !isOpen) && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsxs)(\"div\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('agent-info'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsxs)(\"div\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('agent-info__graphic'),\n children: [src ? (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"img\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)(currentAgent?.avatar ? 'avatar' : 'icon'),\n src: src,\n alt: \"\"\n }) : (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(_icon__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n name: \"avatar\",\n size: \"32\"\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"span\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)(classNames),\n \"aria-hidden\": \"true\",\n children: unreadMessageCount\n })]\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsxs)(\"div\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('agent-info__body'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"p\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('agent-info__heading'),\n children: title ?? t('header.title')\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"p\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('agent-info__text'),\n children: displaySubtitle\n })]\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AgentInfo);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/layout/agent-info.js?");
1568
1568
 
1569
1569
  /***/ }),
1570
1570
 
@@ -1641,7 +1641,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1641
1641
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1642
1642
 
1643
1643
  "use strict";
1644
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"PreChatMessageEvent\": () => (/* binding */ PreChatMessageEvent),\n/* harmony export */ \"default\": () => (/* binding */ PreChatMessages)\n/* harmony export */ });\n/* harmony import */ var domains_config_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! domains/config/hooks */ \"./src/javascripts/domains/config/hooks.ts\");\n/* harmony import */ var domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! domains/interrupt/hooks */ \"./src/javascripts/domains/interrupt/hooks.ts\");\n/* harmony import */ var domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/visibility/hooks */ \"./src/javascripts/domains/visibility/hooks.ts\");\n/* harmony import */ var domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var lib_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var ui_hooks_use_event_component_mapping__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ui/hooks/use-event-component-mapping */ \"./src/javascripts/ui/hooks/use-event-component-mapping.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__);\n\n\n\n\n\n\nfunction PreChatMessageEvent({\n event\n}) {\n const [Component] = (0,ui_hooks_use_event_component_mapping__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(event);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(Component, {\n event: event\n });\n}\nfunction PreChatMessages() {\n const {\n preChatEvents,\n layoutMode\n } = (0,domains_config_hooks__WEBPACK_IMPORTED_MODULE_0__.useConfig)();\n const {\n hasInterrupt\n } = (0,domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_1__.useInterrupt)();\n const {\n isOpen\n } = (0,domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_2__.useVisibility)();\n const isVisible = !(hasInterrupt || !(preChatEvents !== null && preChatEvents !== void 0 && preChatEvents.length) || isOpen);\n return isVisible && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"ul\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_3__.className)('pre-chat-messages', `pre-chat-messages--${layoutMode}`),\n \"aria-hidden\": !isVisible,\n children: preChatEvents.map(event => (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"li\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_3__.className)('pre-chat-messages__message'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(PreChatMessageEvent, {\n event: event\n })\n }, event.payload.id))\n });\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/layout/pre-chat-messages.js?");
1644
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"PreChatMessageEvent\": () => (/* binding */ PreChatMessageEvent),\n/* harmony export */ \"default\": () => (/* binding */ PreChatMessages)\n/* harmony export */ });\n/* harmony import */ var domains_config_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! domains/config/hooks */ \"./src/javascripts/domains/config/hooks.ts\");\n/* harmony import */ var domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! domains/interrupt/hooks */ \"./src/javascripts/domains/interrupt/hooks.ts\");\n/* harmony import */ var domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/visibility/hooks */ \"./src/javascripts/domains/visibility/hooks.ts\");\n/* harmony import */ var domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var lib_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var ui_hooks_use_event_component_mapping__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ui/hooks/use-event-component-mapping */ \"./src/javascripts/ui/hooks/use-event-component-mapping.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__);\n\n\n\n\n\n\nfunction PreChatMessageEvent({\n event\n}) {\n const [Component] = (0,ui_hooks_use_event_component_mapping__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(event);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(Component, {\n event: event\n });\n}\nfunction PreChatMessages() {\n const {\n preChatEvents,\n layoutMode\n } = (0,domains_config_hooks__WEBPACK_IMPORTED_MODULE_0__.useConfig)();\n const {\n hasInterrupt\n } = (0,domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_1__.useInterrupt)();\n const {\n isOpen\n } = (0,domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_2__.useVisibility)();\n const isVisible = !(hasInterrupt || !preChatEvents?.length || isOpen);\n return isVisible && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"ul\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_3__.className)('pre-chat-messages', `pre-chat-messages--${layoutMode}`),\n \"aria-hidden\": !isVisible,\n children: preChatEvents.map(event => (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"li\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_3__.className)('pre-chat-messages__message'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(PreChatMessageEvent, {\n event: event\n })\n }, event.payload.id))\n });\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/layout/pre-chat-messages.js?");
1645
1645
 
1646
1646
  /***/ }),
1647
1647
 
@@ -1663,7 +1663,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1663
1663
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1664
1664
 
1665
1665
  "use strict";
1666
- 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__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact */ \"preact\");\n/* harmony import */ var preact__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact__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 lib_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var ui_components_layout_icon__WEBPACK_IMPORTED_MODULE_5__ = __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_6__ = __webpack_require__(/*! ui/components/widgets/in-out-transition */ \"./src/javascripts/ui/components/widgets/in-out-transition.js\");\n/* harmony import */ var ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ui/utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var ui_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ui/hooks/focus-helper-hooks */ \"./src/javascripts/ui/hooks/focus-helper-hooks.js\");\n/* harmony import */ var _options__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./options */ \"./src/javascripts/ui/components/options/options.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__);\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst OptionsButton = () => {\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_4__.useI18n)();\n const {\n menuOptions,\n showOption,\n panelActive,\n hideOption\n } = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyOptions)();\n const {\n id\n } = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useOptionButton)();\n const focusOutDelayTimeoutID = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);\n const [menuIsOpen, setMenuIsOpen] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const toggleButton = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);\n const optionsLength = menuOptions.length;\n const menuItemButtons = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useRef)(Array.from({\n length: optionsLength\n }, () => (0,preact__WEBPACK_IMPORTED_MODULE_0__.createRef)()));\n const prevMenuIsOpen = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useRef)(false);\n const multiMenu = optionsLength > 1;\n const firstOption = menuOptions[0];\n const firstOptionName = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useMemo)(() => {\n var _firstOption$name;\n\n return firstOption === null || firstOption === void 0 ? void 0 : (_firstOption$name = firstOption.name) === null || _firstOption$name === void 0 ? void 0 : _firstOption$name.trim().replace(/\\s+/g, '');\n }, [firstOption]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {\n return () => {\n clearTimeout(focusOutDelayTimeoutID.current);\n };\n }, []);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {\n if (menuIsOpen && !prevMenuIsOpen.current) {\n requestAnimationFrame(async () => {\n await (0,ui_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_8__.timeout)(180); // Wait for next 3 frame ticks\n\n const firstActiveOptionIndex = menuOptions.findIndex(option => option.available);\n const focusIndex = firstActiveOptionIndex === -1 ? 0 : firstActiveOptionIndex;\n (0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.focusElement)(menuItemButtons.current[focusIndex]);\n });\n }\n\n prevMenuIsOpen.current = menuIsOpen;\n }, [menuIsOpen, menuOptions]);\n\n const onClickHandler = () => {\n if (panelActive) {\n hideOption();\n }\n\n if (multiMenu) {\n setMenuIsOpen(o => !o);\n } else if (firstOption.available) {\n showOption(firstOption.name);\n }\n };\n\n const onMainKeyDownHandler = e => {\n if (!menuIsOpen) {\n return;\n }\n\n if ((0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.getKey)(e) === ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.keyNames.Escape) {\n setMenuIsOpen(false);\n (0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.focusElement)(toggleButton.current);\n }\n\n if ((0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.getKey)(e) === ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.keyNames.Home) {\n (0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.focusElement)(menuItemButtons.current[0]);\n e.preventDefault();\n }\n\n if ((0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.getKey)(e) === ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.keyNames.End) {\n (0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.focusElement)(menuItemButtons.current[optionsLength - 1]);\n e.preventDefault();\n }\n };\n\n const onButtonKeyDownHandler = e => {\n if ((0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.getKey)(e) === ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.keyNames.ArrowDown) {\n setMenuIsOpen(true);\n e.preventDefault();\n }\n };\n\n const onMenuItemKeyDownHandler = (e, index) => {\n if ((0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.getKey)(e) === ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.keyNames.ArrowDown) {\n const newIndex = Math.min(optionsLength - 1, index + 1);\n (0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.focusElement)(menuItemButtons.current[index === newIndex ? 0 : newIndex]);\n e.preventDefault();\n }\n\n if ((0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.getKey)(e) === ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.keyNames.ArrowUp) {\n const newIndex = Math.max(0, index - 1);\n (0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.focusElement)(menuItemButtons.current[index === newIndex ? optionsLength - 1 : newIndex]);\n e.preventDefault();\n }\n };\n\n const onFocusOutHandler = () => {\n if (multiMenu) {\n focusOutDelayTimeoutID.current = setTimeout(() => {\n setMenuIsOpen(false);\n }, 200);\n }\n };\n\n const onFocusInHandler = () => {\n clearTimeout(focusOutDelayTimeoutID.current);\n };\n\n const onKeyPressHandler = (e, index) => {\n const char = String.fromCharCode(e.charCode);\n const isPrintableChar = !!(char.length === 1 && char.match(/\\S/));\n\n if (!isPrintableChar) {\n return;\n }\n\n let foundIndex = -1;\n menuOptions.forEach((option, i) => {\n if (i > index && option.title.charAt(0).toLowerCase() === char.toLowerCase() && foundIndex === -1) {\n foundIndex = i;\n }\n });\n\n if (foundIndex !== -1) {\n (0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.focusElement)(menuItemButtons.current[foundIndex]);\n }\n };\n\n const onMenuItemClickHandler = (name, available) => {\n if (available) {\n setMenuIsOpen(false);\n showOption(name);\n }\n };\n\n if (!optionsLength) {\n return null;\n }\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsxs)(\"div\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('options__container'),\n onKeyDown: onMainKeyDownHandler // eslint-disable-next-line react/no-unknown-property\n ,\n onfocusout: onFocusOutHandler // eslint-disable-next-line react/no-unknown-property\n ,\n onfocusin: onFocusInHandler,\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n transitionStartState: ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_6__.transitionStartStates.notRendered,\n isActive: panelActive,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"div\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('options__dialog'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_options__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {})\n })\n }), multiMenu && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n isActive: menuIsOpen,\n transitionStartState: ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_6__.transitionStartStates.notRendered,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"ul\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)(['options__menu']),\n role: \"menu\",\n tabIndex: \"-1\",\n \"aria-labelledby\": id,\n children: menuOptions.map(({\n name,\n title,\n available\n }, i) => (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"li\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('options__menu__item'),\n role: \"menuitem\",\n \"data-testid\": name,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsxs)(\"button\", {\n type: \"button\",\n ref: item => {\n menuItemButtons.current[i] = item;\n },\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)(['button', 'button--secondary']),\n onKeyDown: e => onMenuItemKeyDownHandler(e, i),\n onKeyPress: e => onKeyPressHandler(e, i),\n onClick: () => onMenuItemClickHandler(name, available),\n \"aria-disabled\": !available ? 'true' : null,\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsxs)(\"span\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('button__text'),\n children: [title, !available && ' ']\n }), !available && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"span\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('button__state'),\n children: t('options.unavailableText')\n })]\n })\n }, name))\n })\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsxs)(\"button\", {\n type: \"button\",\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)(['button', 'button--secondary', 'chat__options__button', ...(!multiMenu && firstOptionName ? [`chat__options__button--${firstOptionName}`] : [])]),\n id: id,\n onClick: onClickHandler,\n onKeyDown: multiMenu ? onButtonKeyDownHandler : null,\n ref: toggleButton,\n \"aria-haspopup\": multiMenu ? 'menu' : null,\n \"aria-expanded\": multiMenu ? menuIsOpen.toString() : null,\n \"aria-disabled\": !multiMenu && !firstOption.available ? 'true' : null,\n children: [multiMenu && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(ui_components_layout_icon__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n name: \"options\",\n size: \"32\"\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"span\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('button__text'),\n children: multiMenu ? t('options.openButtonText') : `${firstOption.title}${!firstOption.available ? ' ' : ''}`\n }), !multiMenu && !firstOption.available && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"span\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('button__state'),\n children: t('options.unavailableText')\n })]\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (OptionsButton);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/options/options-button.js?");
1666
+ 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__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact */ \"preact\");\n/* harmony import */ var preact__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact__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 lib_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var ui_components_layout_icon__WEBPACK_IMPORTED_MODULE_5__ = __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_6__ = __webpack_require__(/*! ui/components/widgets/in-out-transition */ \"./src/javascripts/ui/components/widgets/in-out-transition.js\");\n/* harmony import */ var ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ui/utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var ui_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ui/hooks/focus-helper-hooks */ \"./src/javascripts/ui/hooks/focus-helper-hooks.js\");\n/* harmony import */ var _options__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./options */ \"./src/javascripts/ui/components/options/options.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__);\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst OptionsButton = () => {\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_4__.useI18n)();\n const {\n menuOptions,\n showOption,\n panelActive,\n hideOption\n } = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyOptions)();\n const {\n id\n } = (0,ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useOptionButton)();\n const focusOutDelayTimeoutID = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);\n const [menuIsOpen, setMenuIsOpen] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const toggleButton = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);\n const optionsLength = menuOptions.length;\n const menuItemButtons = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useRef)(Array.from({\n length: optionsLength\n }, () => (0,preact__WEBPACK_IMPORTED_MODULE_0__.createRef)()));\n const prevMenuIsOpen = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useRef)(false);\n const multiMenu = optionsLength > 1;\n const firstOption = menuOptions[0];\n const firstOptionName = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useMemo)(() => firstOption?.name?.trim().replace(/\\s+/g, ''), [firstOption]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {\n return () => {\n clearTimeout(focusOutDelayTimeoutID.current);\n };\n }, []);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {\n if (menuIsOpen && !prevMenuIsOpen.current) {\n requestAnimationFrame(async () => {\n await (0,ui_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_8__.timeout)(60); // Wait for next frame tick\n\n const firstActiveOptionIndex = menuOptions.findIndex(option => option.available);\n const focusIndex = firstActiveOptionIndex === -1 ? 0 : firstActiveOptionIndex;\n (0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.focusElement)(menuItemButtons.current[focusIndex]);\n });\n }\n\n prevMenuIsOpen.current = menuIsOpen;\n }, [menuIsOpen, menuOptions]);\n\n const onClickHandler = () => {\n if (panelActive) {\n hideOption();\n }\n\n if (multiMenu) {\n setMenuIsOpen(o => !o);\n } else if (firstOption.available) {\n showOption(firstOption.name);\n }\n };\n\n const onMainKeyDownHandler = e => {\n if (!menuIsOpen) {\n return;\n }\n\n if ((0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.getKey)(e) === ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.keyNames.Escape) {\n setMenuIsOpen(false);\n (0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.focusElement)(toggleButton.current);\n }\n\n if ((0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.getKey)(e) === ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.keyNames.Home) {\n (0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.focusElement)(menuItemButtons.current[0]);\n e.preventDefault();\n }\n\n if ((0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.getKey)(e) === ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.keyNames.End) {\n (0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.focusElement)(menuItemButtons.current[optionsLength - 1]);\n e.preventDefault();\n }\n };\n\n const onButtonKeyDownHandler = e => {\n if ((0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.getKey)(e) === ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.keyNames.ArrowDown) {\n setMenuIsOpen(true);\n e.preventDefault();\n }\n };\n\n const onMenuItemKeyDownHandler = (e, index) => {\n if ((0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.getKey)(e) === ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.keyNames.ArrowDown) {\n const newIndex = Math.min(optionsLength - 1, index + 1);\n (0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.focusElement)(menuItemButtons.current[index === newIndex ? 0 : newIndex]);\n e.preventDefault();\n }\n\n if ((0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.getKey)(e) === ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.keyNames.ArrowUp) {\n const newIndex = Math.max(0, index - 1);\n (0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.focusElement)(menuItemButtons.current[index === newIndex ? optionsLength - 1 : newIndex]);\n e.preventDefault();\n }\n };\n\n const onFocusOutHandler = () => {\n if (multiMenu) {\n focusOutDelayTimeoutID.current = setTimeout(() => {\n setMenuIsOpen(false);\n }, 200);\n }\n };\n\n const onFocusInHandler = () => {\n clearTimeout(focusOutDelayTimeoutID.current);\n };\n\n const onKeyPressHandler = (e, index) => {\n const char = String.fromCharCode(e.charCode);\n const isPrintableChar = !!(char.length === 1 && char.match(/\\S/));\n\n if (!isPrintableChar) {\n return;\n }\n\n let foundIndex = -1;\n menuOptions.forEach((option, i) => {\n if (i > index && option.title.charAt(0).toLowerCase() === char.toLowerCase() && foundIndex === -1) {\n foundIndex = i;\n }\n });\n\n if (foundIndex !== -1) {\n (0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.focusElement)(menuItemButtons.current[foundIndex]);\n }\n };\n\n const onMenuItemClickHandler = (name, available) => {\n if (available) {\n setMenuIsOpen(false);\n showOption(name);\n }\n };\n\n if (!optionsLength) {\n return null;\n }\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsxs)(\"div\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('options__container'),\n onKeyDown: onMainKeyDownHandler // eslint-disable-next-line react/no-unknown-property\n ,\n onfocusout: onFocusOutHandler // eslint-disable-next-line react/no-unknown-property\n ,\n onfocusin: onFocusInHandler,\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n transitionStartState: ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_6__.transitionStartStates.notRendered,\n isActive: panelActive,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"div\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('options__dialog'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_options__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {})\n })\n }), multiMenu && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n isActive: menuIsOpen,\n transitionStartState: ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_6__.transitionStartStates.notRendered,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"ul\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)(['options__menu']),\n role: \"menu\",\n tabIndex: \"-1\",\n \"aria-labelledby\": id,\n children: menuOptions.map(({\n name,\n title,\n available\n }, i) => (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"li\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('options__menu__item'),\n role: \"menuitem\",\n \"data-testid\": name,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsxs)(\"button\", {\n type: \"button\",\n ref: item => {\n menuItemButtons.current[i] = item;\n },\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)(['button', 'button--secondary']),\n onKeyDown: e => onMenuItemKeyDownHandler(e, i),\n onKeyPress: e => onKeyPressHandler(e, i),\n onClick: () => onMenuItemClickHandler(name, available),\n \"aria-disabled\": !available ? 'true' : null,\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsxs)(\"span\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('button__text'),\n children: [title, !available && ' ']\n }), !available && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"span\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('button__state'),\n children: t('options.unavailableText')\n })]\n })\n }, name))\n })\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsxs)(\"button\", {\n type: \"button\",\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)(['button', 'button--secondary', 'chat__options__button', ...(!multiMenu && firstOptionName ? [`chat__options__button--${firstOptionName}`] : [])]),\n id: id,\n onClick: onClickHandler,\n onKeyDown: multiMenu ? onButtonKeyDownHandler : null,\n ref: toggleButton,\n \"aria-haspopup\": multiMenu ? 'menu' : null,\n \"aria-expanded\": multiMenu ? menuIsOpen.toString() : null,\n \"aria-disabled\": !multiMenu && !firstOption.available ? 'true' : null,\n children: [multiMenu && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(ui_components_layout_icon__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n name: \"options\",\n size: \"32\"\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"span\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('button__text'),\n children: multiMenu ? t('options.openButtonText') : `${firstOption.title}${!firstOption.available ? ' ' : ''}`\n }), !multiMenu && !firstOption.available && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"span\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('button__state'),\n children: t('options.unavailableText')\n })]\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (OptionsButton);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/options/options-button.js?");
1667
1667
 
1668
1668
  /***/ }),
1669
1669
 
@@ -1718,7 +1718,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1718
1718
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1719
1719
 
1720
1720
  "use strict";
1721
- 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 domains_app_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! domains/app/hooks */ \"./src/javascripts/domains/app/hooks.js\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/interrupt/hooks */ \"./src/javascripts/domains/interrupt/hooks.ts\");\n/* harmony import */ var domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var domains_visibility_constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! domains/visibility/constants */ \"./src/javascripts/domains/visibility/constants.js\");\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_hooks__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var lib_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var ui_components_suggestions_suggestions_list__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ui/components/suggestions/suggestions-list */ \"./src/javascripts/ui/components/suggestions/suggestions-list.js\");\n/* harmony import */ var ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ui/components/widgets/in-out-transition */ \"./src/javascripts/ui/components/widgets/in-out-transition.js\");\n/* harmony import */ var ui_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ui/hooks/focus-helper-hooks */ \"./src/javascripts/ui/hooks/focus-helper-hooks.js\");\n/* harmony import */ var ui_hooks_live_region_hooks__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ui/hooks/live-region-hooks */ \"./src/javascripts/ui/hooks/live-region-hooks.js\");\n/* harmony import */ var ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ui/hooks/seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.js\");\n/* harmony import */ var ui_hooks_use_seamly_commands__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ui/hooks/use-seamly-commands */ \"./src/javascripts/ui/hooks/use-seamly-commands.js\");\n/* harmony import */ var ui_hooks_use_seamly_idle_detach_countdown__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ui/hooks/use-seamly-idle-detach-countdown */ \"./src/javascripts/ui/hooks/use-seamly-idle-detach-countdown.js\");\n/* harmony import */ var ui_hooks_use_seamly_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ui/hooks/use-seamly-resume-conversation-prompt */ \"./src/javascripts/ui/hooks/use-seamly-resume-conversation-prompt.js\");\n/* harmony import */ var ui_hooks_utility_hooks__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ui/hooks/utility-hooks */ \"./src/javascripts/ui/hooks/utility-hooks.js\");\n/* harmony import */ var ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ui/utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.ts\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_19___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_19__);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst Suggestions = ({\n isAside = false\n}) => {\n // generic hooks\n const {\n isInline\n } = (0,ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_12__.useSeamlyLayoutMode)();\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_1__.useI18n)();\n const {\n sendAction,\n addMessageBubble\n } = (0,ui_hooks_use_seamly_commands__WEBPACK_IMPORTED_MODULE_13__[\"default\"])();\n const {\n isOpen,\n setVisibility\n } = (0,domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_5__.useVisibility)(); // a11y hooks\n\n const sectionId = (0,ui_hooks_utility_hooks__WEBPACK_IMPORTED_MODULE_16__.useGeneratedId)();\n const focusSkiplinkTarget = (0,ui_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_10__.useSkiplinkTargetFocusing)();\n const containerRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_7__.useRef)(null);\n const {\n sendPolite\n } = (0,ui_hooks_live_region_hooks__WEBPACK_IMPORTED_MODULE_11__.useLiveRegion)(); // interrupt & countdown hooks\n\n const {\n hasInterrupt\n } = (0,domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_2__.useInterrupt)();\n const {\n hasCountdown,\n endCountdown\n } = (0,ui_hooks_use_seamly_idle_detach_countdown__WEBPACK_IMPORTED_MODULE_14__[\"default\"])();\n const {\n hasPrompt,\n continueChat\n } = (0,ui_hooks_use_seamly_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_15__[\"default\"])(); // data hooks\n\n const userHasResponded = (0,domains_app_hooks__WEBPACK_IMPORTED_MODULE_0__.useUserHasResponded)();\n const payload = (0,ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_12__.useSeamlyServiceData)('suggestion');\n const [eventBody] = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_3__.useTranslatedEventData)({\n payload\n });\n const suggestions = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_7__.useMemo)(() => payload && !hasInterrupt ? eventBody : [], [payload, hasInterrupt, eventBody]);\n const prevSuggestions = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_7__.useRef)(null);\n const prevHasSuggestions = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_7__.useRef)(false);\n const previousRenderedSuggestions = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_7__.useRef)([]);\n const hasSuggestions = !!suggestions.length;\n const hideSuggestions = isInline ? (userHasResponded || isOpen) && !isAside : userHasResponded;\n const prevHideSuggestions = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_7__.useRef)(hideSuggestions);\n const showSuggestionsContainer = hasSuggestions && !hideSuggestions;\n const renderedSuggestions = hasSuggestions ? suggestions : previousRenderedSuggestions.current;\n previousRenderedSuggestions.current = renderedSuggestions;\n const suggestionsClassNames = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_7__.useMemo)(() => {\n const classNames = ['suggestions'];\n\n if (isAside) {\n classNames.push('suggestions--aside');\n }\n\n return (0,lib_css__WEBPACK_IMPORTED_MODULE_6__.className)(classNames);\n }, [isAside]); // click handler\n\n const handleClick = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_7__.useCallback)(({\n id,\n question\n }) => {\n if (hasCountdown) {\n endCountdown(true);\n }\n\n if (hasPrompt) {\n continueChat();\n } // @todo Refactor to 'suggestionclick'\n\n\n sendAction({\n type: ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_18__.actionTypes.custom,\n originMessage: payload.id,\n body: {\n type: 'faqclick',\n body: {\n faqId: id,\n faqQuestion: question\n }\n }\n });\n addMessageBubble(question);\n\n if (!isOpen) {\n setVisibility(domains_visibility_constants__WEBPACK_IMPORTED_MODULE_4__.visibilityStates.open);\n }\n\n focusSkiplinkTarget();\n }, [addMessageBubble, continueChat, endCountdown, focusSkiplinkTarget, hasCountdown, hasPrompt, payload, sendAction, setVisibility, isOpen]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_7__.useEffect)(() => {\n if (prevSuggestions.current !== suggestions && !hideSuggestions) {\n if (hasSuggestions) {\n const politeText = prevHasSuggestions.current ? t('suggestions.srUpdatedText') : t('suggestions.srAvailableText');\n setTimeout(() => {\n sendPolite(politeText);\n }, 30);\n } else if (prevHasSuggestions.current) {\n sendPolite(t('suggestions.srUnavailableText'));\n }\n\n prevSuggestions.current = suggestions;\n }\n\n if (!prevHideSuggestions.current && hideSuggestions) {\n (0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_17__.runIfElementContainsOrHasFocus)(containerRef.current, focusSkiplinkTarget);\n sendPolite(t('suggestions.srUnavailableText'));\n } else if (!hasSuggestions && prevHasSuggestions.current) {\n (0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_17__.runIfElementContainsOrHasFocus)(containerRef.current, focusSkiplinkTarget);\n }\n\n prevHasSuggestions.current = hasSuggestions;\n prevHideSuggestions.current = hideSuggestions;\n }, [suggestions, hasSuggestions, hideSuggestions, focusSkiplinkTarget, sendPolite, t]);\n const headingText = t('suggestions.headingText');\n const footerText = t('suggestions.footerText');\n const ContainerElement = headingText ? 'section' : 'div';\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_19__.jsx)(ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n isActive: showSuggestionsContainer,\n transitionStartState: ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_9__.transitionStartStates.notRendered,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_19__.jsxs)(ContainerElement, {\n className: suggestionsClassNames,\n \"aria-labelledby\": headingText ? sectionId : null,\n ref: containerRef,\n children: [headingText && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_19__.jsx)(\"p\", {\n id: sectionId,\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_6__.className)('suggestions__heading'),\n children: headingText\n }), !!renderedSuggestions.length && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_19__.jsx)(ui_components_suggestions_suggestions_list__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n suggestions: renderedSuggestions,\n onClickSuggestion: handleClick\n }), footerText && !isOpen && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_19__.jsx)(\"p\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_6__.className)('suggestions__footer'),\n children: footerText\n })]\n })\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Suggestions);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/suggestions/index.js?");
1721
+ 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 domains_app_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! domains/app/hooks */ \"./src/javascripts/domains/app/hooks.js\");\n/* harmony import */ var domains_config_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! domains/config/hooks */ \"./src/javascripts/domains/config/hooks.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! domains/interrupt/hooks */ \"./src/javascripts/domains/interrupt/hooks.ts\");\n/* harmony import */ var domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var domains_translations_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! domains/translations/hooks */ \"./src/javascripts/domains/translations/hooks.ts\");\n/* harmony import */ var domains_visibility_constants__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! domains/visibility/constants */ \"./src/javascripts/domains/visibility/constants.js\");\n/* harmony import */ var domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! domains/visibility/hooks */ \"./src/javascripts/domains/visibility/hooks.ts\");\n/* harmony import */ var domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var lib_css__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var ui_components_suggestions_suggestions_list__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ui/components/suggestions/suggestions-list */ \"./src/javascripts/ui/components/suggestions/suggestions-list.js\");\n/* harmony import */ var ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ui/components/widgets/in-out-transition */ \"./src/javascripts/ui/components/widgets/in-out-transition.js\");\n/* harmony import */ var ui_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ui/hooks/focus-helper-hooks */ \"./src/javascripts/ui/hooks/focus-helper-hooks.js\");\n/* harmony import */ var ui_hooks_live_region_hooks__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ui/hooks/live-region-hooks */ \"./src/javascripts/ui/hooks/live-region-hooks.js\");\n/* harmony import */ var ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ui/hooks/seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.js\");\n/* harmony import */ var ui_hooks_use_seamly_commands__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ui/hooks/use-seamly-commands */ \"./src/javascripts/ui/hooks/use-seamly-commands.js\");\n/* harmony import */ var ui_hooks_use_seamly_idle_detach_countdown__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ui/hooks/use-seamly-idle-detach-countdown */ \"./src/javascripts/ui/hooks/use-seamly-idle-detach-countdown.js\");\n/* harmony import */ var ui_hooks_use_seamly_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ui/hooks/use-seamly-resume-conversation-prompt */ \"./src/javascripts/ui/hooks/use-seamly-resume-conversation-prompt.js\");\n/* harmony import */ var ui_hooks_utility_hooks__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ui/hooks/utility-hooks */ \"./src/javascripts/ui/hooks/utility-hooks.js\");\n/* harmony import */ var ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ui/utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.ts\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_20___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_20__);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst Suggestions = ({\n isAside = false\n}) => {\n // generic hooks\n const {\n isInline\n } = (0,ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_13__.useSeamlyLayoutMode)();\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_2__.useI18n)();\n const {\n sendAction,\n addMessageBubble\n } = (0,ui_hooks_use_seamly_commands__WEBPACK_IMPORTED_MODULE_14__[\"default\"])();\n const {\n isOpen,\n setVisibility\n } = (0,domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_6__.useVisibility)();\n const {\n showSuggestions\n } = (0,domains_config_hooks__WEBPACK_IMPORTED_MODULE_1__.useConfig)(); // a11y hooks\n\n const sectionId = (0,ui_hooks_utility_hooks__WEBPACK_IMPORTED_MODULE_17__.useGeneratedId)();\n const focusSkiplinkTarget = (0,ui_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_11__.useSkiplinkTargetFocusing)();\n const containerRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_8__.useRef)(null);\n const {\n sendPolite\n } = (0,ui_hooks_live_region_hooks__WEBPACK_IMPORTED_MODULE_12__.useLiveRegion)(); // interrupt & countdown hooks\n\n const {\n hasInterrupt\n } = (0,domains_interrupt_hooks__WEBPACK_IMPORTED_MODULE_3__.useInterrupt)();\n const {\n hasCountdown,\n endCountdown\n } = (0,ui_hooks_use_seamly_idle_detach_countdown__WEBPACK_IMPORTED_MODULE_15__[\"default\"])();\n const {\n hasPrompt,\n continueChat\n } = (0,ui_hooks_use_seamly_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_16__[\"default\"])(); // data hooks\n\n const userHasResponded = (0,domains_app_hooks__WEBPACK_IMPORTED_MODULE_0__.useUserHasResponded)();\n const payload = (0,ui_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_13__.useSeamlyServiceData)('suggestion');\n const {\n body: eventBody\n } = (0,domains_translations_hooks__WEBPACK_IMPORTED_MODULE_4__.useTranslatedEventData)({\n payload\n });\n const suggestions = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_8__.useMemo)(() => payload && !hasInterrupt ? eventBody : [], [payload, hasInterrupt, eventBody]);\n const prevSuggestions = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_8__.useRef)(null);\n const prevHasSuggestions = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_8__.useRef)(false);\n const previousRenderedSuggestions = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_8__.useRef)([]);\n const hasSuggestions = !!suggestions.length;\n const hideSuggestions = isInline ? (userHasResponded || isOpen) && !isAside : userHasResponded;\n const prevHideSuggestions = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_8__.useRef)(hideSuggestions);\n const showSuggestionsContainer = hasSuggestions && !hideSuggestions && showSuggestions;\n const renderedSuggestions = hasSuggestions ? suggestions : previousRenderedSuggestions.current;\n previousRenderedSuggestions.current = renderedSuggestions;\n const suggestionsClassNames = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_8__.useMemo)(() => {\n const classNames = ['suggestions'];\n\n if (isAside) {\n classNames.push('suggestions--aside');\n }\n\n return (0,lib_css__WEBPACK_IMPORTED_MODULE_7__.className)(classNames);\n }, [isAside]); // click handler\n\n const handleClick = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_8__.useCallback)(({\n id,\n question\n }) => {\n if (hasCountdown) {\n endCountdown(true);\n }\n\n if (hasPrompt) {\n continueChat();\n } // @todo Refactor to 'suggestionclick'\n\n\n sendAction({\n type: ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_19__.actionTypes.custom,\n originMessage: payload.id,\n body: {\n type: 'faqclick',\n body: {\n faqId: id,\n faqQuestion: question\n }\n }\n });\n addMessageBubble(question);\n\n if (!isOpen) {\n setVisibility(domains_visibility_constants__WEBPACK_IMPORTED_MODULE_5__.visibilityStates.open);\n }\n\n focusSkiplinkTarget();\n }, [addMessageBubble, continueChat, endCountdown, focusSkiplinkTarget, hasCountdown, hasPrompt, payload, sendAction, setVisibility, isOpen]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_8__.useEffect)(() => {\n if (prevSuggestions.current !== suggestions && !hideSuggestions) {\n if (hasSuggestions) {\n const politeText = prevHasSuggestions.current ? t('suggestions.srUpdatedText') : t('suggestions.srAvailableText');\n setTimeout(() => {\n sendPolite(politeText);\n }, 30);\n } else if (prevHasSuggestions.current) {\n sendPolite(t('suggestions.srUnavailableText'));\n }\n\n prevSuggestions.current = suggestions;\n }\n\n if (!prevHideSuggestions.current && hideSuggestions) {\n (0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_18__.runIfElementContainsOrHasFocus)(containerRef.current, focusSkiplinkTarget);\n sendPolite(t('suggestions.srUnavailableText'));\n } else if (!hasSuggestions && prevHasSuggestions.current) {\n (0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_18__.runIfElementContainsOrHasFocus)(containerRef.current, focusSkiplinkTarget);\n }\n\n prevHasSuggestions.current = hasSuggestions;\n prevHideSuggestions.current = hideSuggestions;\n }, [suggestions, hasSuggestions, hideSuggestions, focusSkiplinkTarget, sendPolite, t]);\n const headingText = t('suggestions.headingText');\n const footerText = t('suggestions.footerText');\n const ContainerElement = headingText ? 'section' : 'div';\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_20__.jsx)(ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n isActive: showSuggestionsContainer,\n transitionStartState: ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_10__.transitionStartStates.notRendered,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_20__.jsxs)(ContainerElement, {\n className: suggestionsClassNames,\n \"aria-labelledby\": headingText ? sectionId : null,\n ref: containerRef,\n children: [headingText && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_20__.jsx)(\"p\", {\n id: sectionId,\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_7__.className)('suggestions__heading'),\n children: headingText\n }), !!renderedSuggestions.length && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_20__.jsx)(ui_components_suggestions_suggestions_list__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n suggestions: renderedSuggestions,\n onClickSuggestion: handleClick\n }), footerText && !isOpen && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_20__.jsx)(\"p\", {\n className: (0,lib_css__WEBPACK_IMPORTED_MODULE_7__.className)('suggestions__footer'),\n children: footerText\n })]\n })\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Suggestions);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/suggestions/index.js?");
1722
1722
 
1723
1723
  /***/ }),
1724
1724
 
@@ -1993,7 +1993,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1993
1993
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1994
1994
 
1995
1995
  "use strict";
1996
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"selectEvents\": () => (/* binding */ selectEvents),\n/* harmony export */ \"selectEventsWithSuggestion\": () => (/* binding */ selectEventsWithSuggestion),\n/* harmony export */ \"selectState\": () => (/* binding */ selectState),\n/* harmony export */ \"useEntryTextLimit\": () => (/* binding */ useEntryTextLimit),\n/* harmony export */ \"useEvents\": () => (/* binding */ useEvents),\n/* harmony export */ \"useLastMessageEventId\": () => (/* binding */ useLastMessageEventId),\n/* harmony export */ \"useLoadedImageEventIds\": () => (/* binding */ useLoadedImageEventIds),\n/* harmony export */ \"useSeamlyCurrentAgent\": () => (/* binding */ useSeamlyCurrentAgent),\n/* harmony export */ \"useSeamlyHeaderData\": () => (/* binding */ useSeamlyHeaderData),\n/* harmony export */ \"useSeamlyIsHistoryLoaded\": () => (/* binding */ useSeamlyIsHistoryLoaded),\n/* harmony export */ \"useSeamlyIsLoading\": () => (/* binding */ useSeamlyIsLoading),\n/* harmony export */ \"useSeamlyLayoutMode\": () => (/* binding */ useSeamlyLayoutMode),\n/* harmony export */ \"useSeamlyParticipant\": () => (/* binding */ useSeamlyParticipant),\n/* harmony export */ \"useSeamlyServiceData\": () => (/* binding */ useSeamlyServiceData),\n/* harmony export */ \"useSeamlyServiceInfo\": () => (/* binding */ useSeamlyServiceInfo),\n/* harmony export */ \"useSeamlyStateContext\": () => (/* binding */ useSeamlyStateContext),\n/* harmony export */ \"useSeamlyUnreadCount\": () => (/* binding */ useSeamlyUnreadCount),\n/* harmony export */ \"useSkiplink\": () => (/* binding */ useSkiplink)\n/* harmony export */ });\n/* harmony import */ var domains_config_selectors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! domains/config/selectors */ \"./src/javascripts/domains/config/selectors.ts\");\n/* harmony import */ var ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ui/utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var _reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @reduxjs/toolkit */ \"./node_modules/reselect/es/index.js\");\n/* harmony import */ var domains_app_selectors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/app/selectors */ \"./src/javascripts/domains/app/selectors.ts\");\n/* harmony import */ var domains_config_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! domains/config/hooks */ \"./src/javascripts/domains/config/hooks.ts\");\n/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-redux */ \"./node_modules/react-redux/es/index.js\");\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; }\n\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; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\nconst selectState = ({\n state\n}) => state;\nconst useSeamlyStateContext = () => (0,react_redux__WEBPACK_IMPORTED_MODULE_4__.useSelector)(selectState);\nconst selectEventsWithSuggestion = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_5__.createSelector)(selectState, domains_config_selectors__WEBPACK_IMPORTED_MODULE_0__.selectConfig, domains_app_selectors__WEBPACK_IMPORTED_MODULE_2__.selectUserHasResponded, ({\n events,\n serviceData\n}, config, hasUserResponded) => {\n var _serviceData$suggesti;\n\n if (hasUserResponded || config.layoutMode === 'inline' || !(serviceData !== null && serviceData !== void 0 && serviceData.suggestion) || !(serviceData !== null && serviceData !== void 0 && (_serviceData$suggesti = serviceData.suggestion) !== null && _serviceData$suggesti !== void 0 && _serviceData$suggesti.body.length)) {\n return events;\n }\n\n const suggestionsEvent = {\n type: 'service_data',\n payload: serviceData.suggestion\n };\n return [...events, suggestionsEvent];\n});\nconst selectEvents = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_5__.createSelector)(selectEventsWithSuggestion, domains_config_selectors__WEBPACK_IMPORTED_MODULE_0__.selectConfig, (events, config) => {\n var _config$messages;\n\n const {\n enabled,\n threshold\n } = (config === null || config === void 0 ? void 0 : (_config$messages = config.messages) === null || _config$messages === void 0 ? void 0 : _config$messages.timeIndicator) ?? {};\n\n if (!enabled) {\n return events;\n }\n\n const mappedEvents = [];\n let previousEvent = null;\n events.forEach((event, idx) => {\n // always add timeIndicator to first message\n if (idx === 0) {\n mappedEvents.push(_objectSpread(_objectSpread({}, event), {}, {\n timeIndicator: event.payload.occurredAt\n })); // else check if diff is greater than threshold\n } else {\n const timeIndicator = previousEvent && (0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_1__.microsecondsToMilliseconds)(event.payload.occurredAt - previousEvent.payload.occurredAt) >= threshold ? event.payload.occurredAt : undefined;\n mappedEvents.push(_objectSpread(_objectSpread({}, event), {}, {\n timeIndicator\n }));\n }\n\n previousEvent = event;\n });\n return mappedEvents;\n});\nconst useEvents = () => (0,react_redux__WEBPACK_IMPORTED_MODULE_4__.useSelector)(selectEvents);\nconst useSeamlyIsLoading = () => useSeamlyStateContext().isLoading;\nconst useSeamlyHeaderData = () => useSeamlyStateContext().headerTitles;\nconst useSeamlyUnreadCount = () => useSeamlyStateContext().unreadEvents;\nconst useLoadedImageEventIds = () => useSeamlyStateContext().loadedImageEventIds;\nconst useSkiplink = () => useSeamlyStateContext().skiplinkTargetId;\nconst useSeamlyParticipant = participantId => useSeamlyStateContext().participantInfo.participants[participantId];\nconst useSeamlyServiceInfo = () => useSeamlyStateContext().serviceInfo;\nconst selectLastMessageEventId = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_5__.createSelector)(selectEvents, events => {\n var _filteredEvents;\n\n const filteredEvents = events.filter(event => event.type === 'message');\n return (_filteredEvents = filteredEvents[filteredEvents.length - 1]) === null || _filteredEvents === void 0 ? void 0 : _filteredEvents.payload.id;\n});\nconst useLastMessageEventId = () => (0,react_redux__WEBPACK_IMPORTED_MODULE_4__.useSelector)(selectLastMessageEventId);\nconst useSeamlyIsHistoryLoaded = () => useSeamlyStateContext().historyLoaded;\nconst useSeamlyCurrentAgent = () => {\n const {\n participants,\n currentAgent\n } = useSeamlyStateContext().participantInfo;\n return currentAgent ? participants[currentAgent] : null;\n};\nconst useSeamlyServiceData = key => {\n return useSeamlyStateContext().serviceData[key];\n};\nconst useEntryTextLimit = () => {\n const {\n entryMeta: {\n options: {\n text\n },\n optionsOverride: {\n text: overrideText\n }\n }\n } = useSeamlyStateContext();\n const {\n limit\n } = overrideText || text || {\n limit: null\n };\n return {\n hasLimit: limit !== null,\n limit: limit !== null ? limit : null\n };\n};\nconst useSeamlyLayoutMode = () => {\n const {\n layoutMode\n } = (0,domains_config_hooks__WEBPACK_IMPORTED_MODULE_3__.useConfig)();\n return {\n isInline: layoutMode === 'inline',\n isWindow: layoutMode === 'window',\n isResolving: !layoutMode\n };\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/seamly-state-hooks.js?");
1996
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"selectEventIds\": () => (/* binding */ selectEventIds),\n/* harmony export */ \"selectEvents\": () => (/* binding */ selectEvents),\n/* harmony export */ \"selectEventsWithSuggestion\": () => (/* binding */ selectEventsWithSuggestion),\n/* harmony export */ \"selectState\": () => (/* binding */ selectState),\n/* harmony export */ \"useEntryTextLimit\": () => (/* binding */ useEntryTextLimit),\n/* harmony export */ \"useEvents\": () => (/* binding */ useEvents),\n/* harmony export */ \"useEventsIds\": () => (/* binding */ useEventsIds),\n/* harmony export */ \"useLastMessageEventId\": () => (/* binding */ useLastMessageEventId),\n/* harmony export */ \"useLoadedImageEventIds\": () => (/* binding */ useLoadedImageEventIds),\n/* harmony export */ \"useSeamlyCurrentAgent\": () => (/* binding */ useSeamlyCurrentAgent),\n/* harmony export */ \"useSeamlyHeaderData\": () => (/* binding */ useSeamlyHeaderData),\n/* harmony export */ \"useSeamlyIsHistoryLoaded\": () => (/* binding */ useSeamlyIsHistoryLoaded),\n/* harmony export */ \"useSeamlyIsLoading\": () => (/* binding */ useSeamlyIsLoading),\n/* harmony export */ \"useSeamlyLayoutMode\": () => (/* binding */ useSeamlyLayoutMode),\n/* harmony export */ \"useSeamlyParticipant\": () => (/* binding */ useSeamlyParticipant),\n/* harmony export */ \"useSeamlyServiceData\": () => (/* binding */ useSeamlyServiceData),\n/* harmony export */ \"useSeamlyServiceInfo\": () => (/* binding */ useSeamlyServiceInfo),\n/* harmony export */ \"useSeamlyStateContext\": () => (/* binding */ useSeamlyStateContext),\n/* harmony export */ \"useSeamlyUnreadCount\": () => (/* binding */ useSeamlyUnreadCount),\n/* harmony export */ \"useSkiplink\": () => (/* binding */ useSkiplink)\n/* harmony export */ });\n/* harmony import */ var domains_config_selectors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! domains/config/selectors */ \"./src/javascripts/domains/config/selectors.ts\");\n/* harmony import */ var ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ui/utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var _reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @reduxjs/toolkit */ \"./node_modules/reselect/es/index.js\");\n/* harmony import */ var domains_app_selectors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/app/selectors */ \"./src/javascripts/domains/app/selectors.ts\");\n/* harmony import */ var domains_config_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! domains/config/hooks */ \"./src/javascripts/domains/config/hooks.ts\");\n/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-redux */ \"./node_modules/react-redux/es/index.js\");\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; }\n\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; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\nconst selectState = ({\n state\n}) => state;\nconst useSeamlyStateContext = () => (0,react_redux__WEBPACK_IMPORTED_MODULE_4__.useSelector)(selectState);\nconst selectEventsWithSuggestion = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_5__.createSelector)(selectState, domains_config_selectors__WEBPACK_IMPORTED_MODULE_0__.selectConfig, domains_app_selectors__WEBPACK_IMPORTED_MODULE_2__.selectUserHasResponded, ({\n events,\n serviceData\n}, config, hasUserResponded) => {\n if (hasUserResponded || config.layoutMode === 'inline' || !serviceData?.suggestion || !serviceData?.suggestion?.body.length) {\n return events;\n }\n\n const suggestionsEvent = {\n type: 'service_data',\n payload: serviceData.suggestion\n };\n return [...events, suggestionsEvent];\n});\nconst selectEvents = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_5__.createSelector)(selectEventsWithSuggestion, domains_config_selectors__WEBPACK_IMPORTED_MODULE_0__.selectConfig, (events, config) => {\n const {\n enabled,\n threshold\n } = config?.messages?.timeIndicator ?? {};\n\n if (!enabled) {\n return events;\n }\n\n const mappedEvents = [];\n let previousEvent = null;\n events.forEach((event, idx) => {\n // always add timeIndicator to first message\n if (idx === 0) {\n mappedEvents.push(_objectSpread(_objectSpread({}, event), {}, {\n timeIndicator: event.payload.occurredAt\n })); // else check if diff is greater than threshold\n } else {\n const timeIndicator = previousEvent && (0,ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_1__.microsecondsToMilliseconds)(event.payload.occurredAt - previousEvent.payload.occurredAt) >= threshold ? event.payload.occurredAt : undefined;\n mappedEvents.push(_objectSpread(_objectSpread({}, event), {}, {\n timeIndicator\n }));\n }\n\n previousEvent = event;\n });\n return mappedEvents;\n});\nconst useEvents = () => (0,react_redux__WEBPACK_IMPORTED_MODULE_4__.useSelector)(selectEvents);\nconst selectEventIds = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_5__.createSelector)(selectEvents, events => {\n return events.map(event => event.payload.id);\n});\nconst useEventsIds = () => (0,react_redux__WEBPACK_IMPORTED_MODULE_4__.useSelector)(selectEventIds);\nconst useSeamlyIsLoading = () => useSeamlyStateContext().isLoading;\nconst useSeamlyHeaderData = () => useSeamlyStateContext().headerTitles;\nconst useSeamlyUnreadCount = () => useSeamlyStateContext().unreadEvents;\nconst useLoadedImageEventIds = () => useSeamlyStateContext().loadedImageEventIds;\nconst useSkiplink = () => useSeamlyStateContext().skiplinkTargetId;\nconst useSeamlyParticipant = participantId => useSeamlyStateContext().participantInfo.participants[participantId];\nconst useSeamlyServiceInfo = () => useSeamlyStateContext().serviceInfo;\nconst selectLastMessageEventId = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_5__.createSelector)(selectEvents, events => {\n const filteredEvents = events.filter(event => event.type === 'message');\n return filteredEvents[filteredEvents.length - 1]?.payload.id;\n});\nconst useLastMessageEventId = () => (0,react_redux__WEBPACK_IMPORTED_MODULE_4__.useSelector)(selectLastMessageEventId);\nconst useSeamlyIsHistoryLoaded = () => useSeamlyStateContext().historyLoaded;\nconst useSeamlyCurrentAgent = () => {\n const {\n participants,\n currentAgent\n } = useSeamlyStateContext().participantInfo;\n return currentAgent ? participants[currentAgent] : null;\n};\nconst useSeamlyServiceData = key => {\n return useSeamlyStateContext().serviceData[key];\n};\nconst useEntryTextLimit = () => {\n const {\n entryMeta: {\n options: {\n text\n },\n optionsOverride: {\n text: overrideText\n }\n }\n } = useSeamlyStateContext();\n const {\n limit\n } = overrideText || text || {\n limit: null\n };\n return {\n hasLimit: limit !== null,\n limit: limit !== null ? limit : null\n };\n};\nconst useSeamlyLayoutMode = () => {\n const {\n layoutMode\n } = (0,domains_config_hooks__WEBPACK_IMPORTED_MODULE_3__.useConfig)();\n return {\n isInline: layoutMode === 'inline',\n isWindow: layoutMode === 'window',\n isResolving: !layoutMode\n };\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/seamly-state-hooks.js?");
1997
1997
 
1998
1998
  /***/ }),
1999
1999
 
@@ -2037,7 +2037,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
2037
2037
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2038
2038
 
2039
2039
  "use strict";
2040
- 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 domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var domains_store_slice__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! domains/store/slice */ \"./src/javascripts/domains/store/slice.ts\");\n/* harmony import */ var domains_visibility_constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/visibility/constants */ \"./src/javascripts/domains/visibility/constants.js\");\n/* harmony import */ var domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! domains/visibility/hooks */ \"./src/javascripts/domains/visibility/hooks.ts\");\n/* harmony import */ var domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-redux */ \"./node_modules/react-redux/es/index.js\");\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.js\");\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\n\n\n\n\n\n\n\n\n\n\n\nconst useSeamlyChat = () => {\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0__.useI18n)();\n const {\n isInline,\n isWindow\n } = (0,_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_9__.useSeamlyLayoutMode)();\n const {\n isOpen,\n isVisible,\n setVisibility\n } = (0,domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_3__.useVisibility)();\n const showInlineView = (0,react_redux__WEBPACK_IMPORTED_MODULE_5__.useSelector)(_domains_visibility_selectors__WEBPACK_IMPORTED_MODULE_6__.selectShowInlineView);\n const dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_5__.useDispatch)();\n const events = (0,_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_9__.useEvents)();\n const spinnerTimeout = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_4__.useRef)(null);\n const {\n start,\n connect,\n apiConfigReady,\n apiConnected\n } = (0,_use_seamly_commands__WEBPACK_IMPORTED_MODULE_10__[\"default\"])();\n const hasConversation = (0,_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_8__.useSeamlyHasConversation)();\n const prevIsOpen = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_4__.useRef)(null);\n const prevIsVisible = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_4__.useRef)(null);\n const startCalled = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_4__.useRef)(false);\n const {\n sendAssertive\n } = (0,_live_region_hooks__WEBPACK_IMPORTED_MODULE_7__.useLiveRegion)();\n const hasEvents = events.length > 0;\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_4__.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_4__.useEffect)(() => {\n if (isVisible !== prevIsVisible.current) {\n prevIsOpen.current = isOpen;\n prevIsVisible.current = isVisible;\n return;\n }\n\n if (prevIsOpen.current !== null) {\n if (isOpen) {\n sendAssertive(t('window.srTexts.onOpen'));\n } else {\n sendAssertive(t('window.srTexts.onClose'));\n }\n }\n\n prevIsOpen.current = isOpen;\n prevIsVisible.current = isVisible;\n }, [isOpen, isVisible, sendAssertive, t]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_4__.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_1__.setIsLoading)(true));\n }, 500);\n }, [dispatch]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_4__.useEffect)(() => {\n if (hasEvents) {\n clearTimeout(spinnerTimeout.current);\n dispatch((0,domains_store_slice__WEBPACK_IMPORTED_MODULE_1__.setIsLoading)(false));\n }\n }, [hasEvents, dispatch]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_4__.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 startCalled.current = false;\n }\n }, [apiConfigReady, apiConnected]);\n const connectAndStart = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_4__.useCallback)(async () => {\n // We don't connect if we are already connected to the api to avoid multiple in-flight connection processes.\n if (!apiConnected) {\n await connect();\n } // We only start a conversation when the chat interface is either 'open' or if using the inline view if it's 'open' or 'minimized'.\n\n\n if (isOpen || isVisible && isInline) {\n start();\n startCalled.current = true;\n }\n }, [apiConnected, connect, isInline, isOpen, isVisible, start]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_4__.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 || startCalled.current || isWindow && !isOpen && !hasConversation() || isInline && !showInlineView) {\n return;\n }\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_1__.setIsLoading)(false));\n }\n\n connectAndStart();\n }, [apiConfigReady, connectAndStart, dispatch, hasConversation, isInline, isOpen, isWindow, showInlineView]);\n\n const openChat = () => {\n setVisibility(domains_visibility_constants__WEBPACK_IMPORTED_MODULE_2__.visibilityStates.open);\n };\n\n const closeChat = () => {\n setVisibility(domains_visibility_constants__WEBPACK_IMPORTED_MODULE_2__.visibilityStates.minimized);\n };\n\n return {\n openChat,\n closeChat\n };\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (useSeamlyChat);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/use-seamly-chat.js?");
2040
+ 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 domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! domains/i18n/hooks */ \"./src/javascripts/domains/i18n/hooks.ts\");\n/* harmony import */ var domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var domains_store_slice__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! domains/store/slice */ \"./src/javascripts/domains/store/slice.ts\");\n/* harmony import */ var domains_visibility_constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! domains/visibility/constants */ \"./src/javascripts/domains/visibility/constants.js\");\n/* harmony import */ var domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! domains/visibility/hooks */ \"./src/javascripts/domains/visibility/hooks.ts\");\n/* harmony import */ var domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-redux */ \"./node_modules/react-redux/es/index.js\");\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.js\");\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\n\n\n\n\n\n\n\n\n\n\n\nconst useSeamlyChat = () => {\n const {\n t\n } = (0,domains_i18n_hooks__WEBPACK_IMPORTED_MODULE_0__.useI18n)();\n const {\n isInline,\n isWindow\n } = (0,_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_9__.useSeamlyLayoutMode)();\n const {\n isOpen,\n isVisible,\n setVisibility\n } = (0,domains_visibility_hooks__WEBPACK_IMPORTED_MODULE_3__.useVisibility)();\n const showInlineView = (0,react_redux__WEBPACK_IMPORTED_MODULE_5__.useSelector)(_domains_visibility_selectors__WEBPACK_IMPORTED_MODULE_6__.selectShowInlineView);\n const dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_5__.useDispatch)();\n const spinnerTimeout = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_4__.useRef)(null);\n const {\n start,\n connect,\n apiConfigReady,\n apiConnected\n } = (0,_use_seamly_commands__WEBPACK_IMPORTED_MODULE_10__[\"default\"])();\n const hasConversation = (0,_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_8__.useSeamlyHasConversation)();\n const prevIsOpen = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_4__.useRef)(null);\n const prevIsVisible = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_4__.useRef)(null);\n const startCalled = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_4__.useRef)(false);\n const {\n sendAssertive\n } = (0,_live_region_hooks__WEBPACK_IMPORTED_MODULE_7__.useLiveRegion)();\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_4__.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_4__.useEffect)(() => {\n if (isVisible !== prevIsVisible.current) {\n prevIsOpen.current = isOpen;\n prevIsVisible.current = isVisible;\n return;\n }\n\n if (prevIsOpen.current !== null) {\n if (isOpen) {\n sendAssertive(t('window.srTexts.onOpen'));\n } else {\n sendAssertive(t('window.srTexts.onClose'));\n }\n }\n\n prevIsOpen.current = isOpen;\n prevIsVisible.current = isVisible;\n }, [isOpen, isVisible, sendAssertive, t]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_4__.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_1__.setIsLoading)(true));\n }, 500);\n return () => {\n clearTimeout(spinnerTimeout.current);\n };\n }, [dispatch]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_4__.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 startCalled.current = false;\n }\n }, [apiConfigReady, apiConnected]);\n const connectAndStart = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_4__.useCallback)(async () => {\n // We don't connect if we are already connected to the api to avoid multiple in-flight connection processes.\n if (!apiConnected) {\n await connect();\n } // We only start a conversation when the chat interface is either 'open' or if using the inline view if it's 'open' or 'minimized'.\n\n\n if (isOpen || isVisible && isInline) {\n start();\n startCalled.current = true;\n }\n }, [apiConnected, connect, isInline, isOpen, isVisible, start]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_4__.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 || startCalled.current || isWindow && !isOpen && !hasConversation() || isInline && !showInlineView) {\n return;\n }\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_1__.setIsLoading)(false));\n }\n\n connectAndStart();\n }, [apiConfigReady, connectAndStart, dispatch, hasConversation, isInline, isOpen, isWindow, showInlineView]);\n\n const openChat = () => {\n setVisibility(domains_visibility_constants__WEBPACK_IMPORTED_MODULE_2__.visibilityStates.open);\n };\n\n const closeChat = () => {\n setVisibility(domains_visibility_constants__WEBPACK_IMPORTED_MODULE_2__.visibilityStates.minimized);\n };\n\n return {\n openChat,\n closeChat\n };\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (useSeamlyChat);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/use-seamly-chat.js?");
2041
2041
 
2042
2042
  /***/ }),
2043
2043
 
@@ -2125,7 +2125,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
2125
2125
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2126
2126
 
2127
2127
  "use strict";
2128
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"fileListObjectIsNotEmpty\": () => (/* binding */ fileListObjectIsNotEmpty),\n/* harmony export */ \"isEmailString\": () => (/* binding */ isEmailString),\n/* harmony export */ \"isNotEmptyString\": () => (/* binding */ isNotEmptyString),\n/* harmony export */ \"validateFileSize\": () => (/* binding */ validateFileSize)\n/* harmony export */ });\nconst validateFileSize = (fileList, maxSize) => {\n let isValid = true;\n\n for (let i = 0; i < fileList.length; i++) {\n if (fileList[i].size > maxSize) {\n isValid = false;\n }\n }\n\n return isValid;\n};\nconst fileListObjectIsNotEmpty = fileListObj => !!(fileListObj !== null && fileListObj !== void 0 && fileListObj.length) > 0;\n/* eslint-disable no-control-regex */\n\nconst isEmailString = val => {\n const regex = /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/i;\n const trimmedVal = val && val.trim();\n return !!(trimmedVal && trimmedVal.match(regex));\n};\n/* eslint-enable no-control-regex */\n\nconst isNotEmptyString = val => !!val;\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/utils/validations.js?");
2128
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"fileListObjectIsNotEmpty\": () => (/* binding */ fileListObjectIsNotEmpty),\n/* harmony export */ \"isEmailString\": () => (/* binding */ isEmailString),\n/* harmony export */ \"isNotEmptyString\": () => (/* binding */ isNotEmptyString),\n/* harmony export */ \"validateFileSize\": () => (/* binding */ validateFileSize)\n/* harmony export */ });\nconst validateFileSize = (fileList, maxSize) => {\n let isValid = true;\n\n for (let i = 0; i < fileList.length; i++) {\n if (fileList[i].size > maxSize) {\n isValid = false;\n }\n }\n\n return isValid;\n};\nconst fileListObjectIsNotEmpty = fileListObj => !!fileListObj?.length > 0;\n/* eslint-disable no-control-regex */\n\nconst isEmailString = val => {\n const regex = /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/i;\n const trimmedVal = val && val.trim();\n return !!(trimmedVal && trimmedVal.match(regex));\n};\n/* eslint-enable no-control-regex */\n\nconst isNotEmptyString = val => !!val;\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/utils/validations.js?");
2129
2129
 
2130
2130
  /***/ }),
2131
2131