@telia-ace/widget-conversation 1.0.34-experimental.9 → 1.0.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/agent.ts","../src/conversation-provider.ts","../src/store.ts","../src/user.ts","../src/utils/swap-provider.ts","../src/conversation-controller.ts","../src/utils/open-chat-widget.ts","../src/conversation-platform.ts","../src/components/conversation/plugin.ts","../src/components/return-button/plugin.ts","../src/types.ts","../src/utils/custom-message.ts"],"sourcesContent":["import { Symbol } from '@telia-ace/widget-ui';\nimport { uuid } from '@telia-ace/widget-utilities';\nimport {\n ConversationEntry,\n ConversationMessageType,\n getNormalizedMessageSettings,\n} from './conversation-controller';\nimport { ConversationProvider } from './conversation-provider';\nimport {\n ConversationMessageSender,\n ConversationMessageSettings,\n ConverstationMessageItem,\n} from './types';\n\nexport type AgentSettings = {\n id?: string;\n name?: string;\n avatar?: string | Symbol;\n};\n\nexport class Agent {\n id: string;\n name?: string;\n avatar?: string | Symbol;\n\n constructor(private provider: ConversationProvider, settings: AgentSettings) {\n this.id = settings.id || uuid();\n this.name = settings.name;\n this.avatar = settings.avatar;\n }\n\n print = (\n settings:\n | string\n | ConversationMessageSettings\n | ConverstationMessageItem<any>\n | ConverstationMessageItem<any>[],\n options?: {\n key?: string;\n }\n ): ConversationEntry | undefined => {\n const sender: ConversationMessageSender = {\n name: this.name,\n avatar: this.avatar,\n id: this.id,\n };\n const normalized = getNormalizedMessageSettings(settings, options);\n\n return this.provider.createEntry(\n normalized.key,\n normalized.content,\n ConversationMessageType.Agent,\n sender,\n normalized.timestamp\n );\n };\n typing = () => {\n return this.provider.setTypingState({ name: this.name, avatar: this.avatar });\n };\n\n update(settings: AgentSettings): void {\n const { name, avatar } = settings;\n if (avatar === null) {\n this.avatar = undefined;\n } else if (avatar) {\n this.avatar = avatar;\n }\n\n if (name === null) {\n this.name = undefined;\n } else if (name) {\n this.name = name;\n }\n\n this.provider.controller?.events.dispatch('conversation:agent-updated', {\n agent: this,\n });\n }\n}\n","import {\n Container,\n EventListener,\n EventObject,\n EventSubscriptionCancellation,\n} from '@webprovisions/platform';\nimport { Agent, AgentSettings } from './agent';\nimport {\n CancelLoaderDelegate,\n ConversationController,\n ConversationEntry,\n ConversationMessageType,\n ConversationOptions,\n} from './conversation-controller';\nimport {\n ConversationMessageContent,\n ConversationMessageSender,\n ConversationMessageSettings,\n} from './types';\n\nexport class ConversationProvider {\n private subscriptions: EventSubscriptionCancellation[] = [];\n public options: ConversationOptions;\n public user: any;\n\n private constructor(\n public name: string,\n private container: Container,\n public controller: ConversationController | null\n ) {\n this.user = controller?.user;\n this.options = {\n silent: false,\n };\n }\n\n static create(name: string, container: Container, controller: ConversationController) {\n return new ConversationProvider(name, container, controller);\n }\n\n createAgent(settings: AgentSettings = {}): Agent | undefined {\n if (this.controller) {\n const storedAgent = this.controller.getAgentById(settings.id);\n\n const agent = storedAgent\n ? new Agent(this, { ...storedAgent, ...settings })\n : new Agent(this, settings);\n if (!storedAgent) {\n this.controller?.events.dispatch('conversation:agent-created', {\n agent,\n });\n }\n return agent;\n }\n }\n\n print(settings: string | ConversationMessageSettings): ConversationEntry | undefined {\n return this.controller?.print(settings);\n }\n\n setTypingState(sender: ConversationMessageSender, type?: ConversationMessageType) {\n return this.controller?.setTypingState(sender, type);\n }\n\n loading(): CancelLoaderDelegate {\n if (!this.controller) {\n return () => () => {};\n }\n return this.controller.loader();\n }\n\n createEntry(\n key: string,\n content: ConversationMessageContent,\n type: ConversationMessageType,\n sender?: ConversationMessageSender,\n timestamp?: number | null\n ) {\n return this.controller?.createEntry(key, content, type, sender, timestamp);\n }\n\n dispose() {\n if (process.env.NODE_ENV !== 'production') {\n console.log(`conversation-provider: dispose (${this.name})`);\n }\n this.controller?.disposeProvider(this);\n this.controller = null;\n this.subscriptions.forEach((unsub) => unsub());\n }\n\n isRehydrated() {\n return this.controller?.isRehydrated() || Promise.resolve(false);\n }\n\n complete() {\n this.controller?.onCompleteProvider();\n }\n\n setOptions(options: ConversationOptions = { silent: false }) {\n this.options = options;\n }\n\n onUnreadMessage(fn: EventListener): EventSubscriptionCancellation | void {\n if (this.controller) {\n const unsubscribe = this.controller?.onUnreadMessage(fn);\n this.subscriptions.push(unsubscribe);\n return () => {\n unsubscribe();\n };\n }\n }\n\n onMounted(fn: EventListener): EventSubscriptionCancellation | void {\n if (this.controller) {\n const unsubscribe = this.controller?.events.subscribe(\n 'conversation:component-mount-changed',\n fn\n );\n this.subscriptions.push(unsubscribe);\n fn({} as EventObject, this.controller.getComponentMountedState());\n return () => {\n unsubscribe();\n };\n }\n }\n}\n\nexport default ConversationProvider;\n","import { createStorageWriter, readStorage, StorageCategory } from '@telia-ace/widget-services';\nimport { Container } from '@webprovisions/platform';\nimport { Agent, AgentSettings } from './agent';\nimport { ConversationController } from './conversation-controller';\n\ntype StoredConversationAgent = {\n id: string;\n name: string;\n avatar?: string;\n providerName: string;\n};\ntype StoredConversationMessage = any;\n\ntype StoredConversation = {\n agents: StoredConversationAgent[];\n messages: StoredConversationMessage[];\n};\n\nexport const createSessionStorageKey = (id: string) => {\n return `conversation-${id}`;\n};\n\nclass Locker {\n private _locking: Promise<void> = Promise.resolve();\n private _locks: number = 0;\n\n isLocked() {\n return this._locks > 0;\n }\n\n lock() {\n this._locks += 1;\n\n let unlockNext: () => void;\n\n let willLock = new Promise<void>(\n (resolve) =>\n (unlockNext = () => {\n this._locks -= 1;\n\n resolve();\n })\n );\n\n let willUnlock = this._locking.then(() => unlockNext);\n\n this._locking = this._locking.then(() => willLock);\n\n return willUnlock;\n }\n}\n\nclass Store {\n private sessionStorageKey: string;\n private locker = new Locker();\n private initialStoredAgents: StoredConversationAgent[] = [];\n\n constructor(\n private container: Container,\n private conversation: ConversationController,\n private enabled: boolean // whether or not to store data\n ) {\n this.sessionStorageKey = createSessionStorageKey(conversation.id);\n\n conversation.onStarted(async () => {\n if (conversation.messages.length > 0) {\n // if the conversation already contains messages\n // for example when re-opening a minimized widget,\n // we do not want to do anything\n return;\n }\n const { agents: storedAgents } = await this.read();\n\n const agents: Agent[] = [];\n\n if (storedAgents) {\n storedAgents.forEach((a) => {\n const providerIndex = conversation.providerIndex(a.providerName);\n const provider =\n providerIndex > -1\n ? conversation.registeredProviders[providerIndex]\n : conversation.createProvider(a.providerName);\n\n const agent = new Agent(provider, { name: a.name, avatar: a.avatar, id: a.id });\n agents.push(agent);\n });\n }\n\n const { messages: storedMessages } = await this.read();\n storedMessages.forEach((message) => {\n switch (message.type) {\n case 'agent': {\n const agent = agents.find((a) => a.id === message.sender?.id);\n if (agent) {\n agent.print(message.content.items || message.content, {\n key: message.key,\n });\n }\n return;\n }\n case 'user': {\n conversation.user.print(message.content.items || message.content, {\n key: message.key,\n });\n return;\n }\n case 'system':\n default: {\n conversation.print(message.content.items || message.content);\n }\n }\n });\n });\n conversation.onMessageCreated(async (_, data) => {\n this.write(data.message, 'messages');\n });\n\n conversation.events.subscribe('conversation:agent-created', async (_, data) => {\n const agent = {\n id: data.agent.id,\n name: data.agent.name,\n avatar: data.agent.avatar,\n providerName: data.agent.provider.name,\n };\n await this.write(agent, 'agents');\n });\n\n conversation.events.subscribe('conversation:agent-updated', async (_, data) => {\n const { agents } = await this.read();\n\n await this.write(\n [\n ...agents.map((a) => {\n if (a.id === data.agent.id) {\n return {\n ...a,\n name: data.agent.name,\n avatar: data.agent.avatar,\n };\n }\n return a;\n }),\n ],\n 'agents',\n 'update'\n );\n });\n }\n\n setInitialData(data: { agents: AgentSettings[] }) {\n this.initialStoredAgents = data.agents as StoredConversationAgent[];\n }\n\n async isRehydrated() {\n const { messages } = await this.read();\n return messages.length > 0;\n }\n\n getStoredAgent(agentId: string) {\n if (!this.enabled) {\n return;\n }\n return this.initialStoredAgents.find((a) => a.id === agentId);\n }\n\n async write(data: any, type: 'messages' | 'agents', action: 'add' | 'update' = 'add') {\n if (!this.enabled) {\n return;\n }\n\n const unlock = await this.locker.lock();\n return createStorageWriter(\n this.container,\n this.sessionStorageKey,\n StorageCategory.Necessary\n ).then(async (write) => {\n if (action === 'add') {\n const prev = await this.read();\n\n // ensure that we don't duplicate messages by looking at their unqiue keys\n if (\n type === 'messages' &&\n prev.messages.findIndex((m) => m.key === data.key) > -1\n ) {\n unlock();\n return;\n }\n\n let newData = {\n ...prev,\n };\n\n if (type === 'messages') {\n newData.messages = [...newData.messages, data];\n } else if (type === 'agents') {\n newData.agents = [...newData.agents, data];\n }\n\n return write({\n ...prev,\n ...newData,\n }).then(() => {\n unlock();\n });\n }\n\n if (action === 'update') {\n if (type === 'agents') {\n const prev = await this.read();\n\n return write({\n ...prev,\n agents: data,\n }).then(() => {\n unlock();\n });\n }\n }\n\n return write(data).then(() => {\n unlock();\n });\n });\n }\n\n async read() {\n return readStorage(this.container, this.sessionStorageKey).then((data) => {\n if (!data) {\n return {\n messages: [],\n agents: [],\n };\n }\n return data as StoredConversation;\n });\n }\n}\n\nexport default Store;\n","import {\n ConversationController,\n ConversationEntry,\n ConversationMessageType,\n getNormalizedMessageSettings,\n} from './conversation-controller';\nimport { ConversationMessageSettings } from './types';\n\nexport class User {\n constructor(private controller: ConversationController) {}\n\n print = (\n settings: string | ConversationMessageSettings,\n options?: {\n key?: string;\n }\n ): ConversationEntry => {\n const normalized = getNormalizedMessageSettings(settings, options);\n return this.controller.createEntry(\n normalized.key,\n normalized.content,\n ConversationMessageType.User,\n undefined,\n normalized.timestamp\n );\n };\n}\n","import { ComponentPlatform } from '@telia-ace/widget-core';\nimport { Container } from '@webprovisions/platform';\nimport { ConversationPlatform } from '../conversation-platform';\n\n/**\n * This will put the current provider(s) in a queue and\n * swap current provider to another one based on the providerName.\n * When ConversationProvider.complete() is called, the provider(s) in the\n * queue will become active again\n */\nexport const swapProvider = async (\n container: Container,\n conversationId: string,\n providerName: string\n) => {\n const conversation: ConversationPlatform = await container.getAsync('conversation');\n const components: ComponentPlatform = await container.getAsync('components');\n const currentInstance = conversation.controllers.find((c) => {\n return c.conversation.id === conversationId;\n });\n\n if (currentInstance) {\n const toQueue = [...currentInstance.conversation.providers];\n toQueue.forEach((name) => {\n currentInstance.conversation.setProviderOptions(name, { silent: true });\n });\n currentInstance.conversation.queueProviders(toQueue);\n currentInstance.conversation.setProviders([providerName]);\n const conversationQuery = components.components().ofType('conversation');\n components.write({\n key: 'setConversationProvider',\n attributes: {\n properties: { providers: [providerName] },\n },\n target: conversationQuery,\n provider: 'localStorage',\n });\n }\n};\n","import { FormBuilder } from '@telia-ace/widget-forms';\nimport { uuid } from '@telia-ace/widget-utilities';\nimport { Container, EventListener, EventManager, Widget } from '@webprovisions/platform';\nimport { AgentSettings } from './agent';\nimport { ConversationProvider } from './conversation-provider';\nimport Store from './store';\nimport {\n ConversationMessageContent,\n ConversationMessageSender,\n ConversationMessageSettings,\n ConversationMessageUpdateSettings,\n ConverstationMessageItem,\n NormalizedMessageSettings,\n} from './types';\nimport { User } from './user';\nimport { swapProvider } from './utils/swap-provider';\nexport type ValidateHandler = (formValues: { [key: string]: any }) => Promise<any>;\n\nexport type SubmitHandler = (formValues: { [key: string]: any }) => Promise<any>;\n\nexport type ConversationOptions = { silent: boolean };\n\nexport type Print = (content: string | ConversationMessageContent) => ConversationEntry;\n\nexport type FormHandlers = { [key: string]: FormHandler };\nexport type FormHandler = { validate?: ValidateHandler; submit: SubmitHandler };\n\nexport type CancelLoaderDelegate = () => void;\n\nexport class ConversationEntry {\n constructor(private writer: EntryWriter) {}\n\n update(\n content:\n | string\n | ConversationMessageUpdateSettings\n | ConverstationMessageItem<any>\n | ConverstationMessageItem<any>[]\n ) {\n const normalized = this.getNormalizedSettings(content);\n // const normalized = typeof content === 'string' ? { body: content } : content;\n this.writer(<ConversationMessageUpdateSettings>normalized);\n }\n\n remove() {\n this.writer(null);\n }\n\n private getNormalizedSettings(\n content:\n | string\n | ConversationMessageUpdateSettings\n | ConverstationMessageItem<any>\n | ConverstationMessageItem<any>[]\n ) {\n if (typeof content === 'string') return { body: content };\n else if (content.length > -1 && typeof content === 'object') return { items: content };\n else return content;\n }\n}\n\nexport enum ConversationMessageType {\n User = 'user',\n Agent = 'agent',\n System = 'system',\n}\n\nexport type ConversationMessage = {\n key: string;\n timestamp: number | null;\n content: ConversationMessageContent | null;\n sender: ConversationMessageSender | null;\n type: ConversationMessageType;\n};\n\nexport type EntryWriter = (content: ConversationMessageUpdateSettings | null) => void;\n\nexport const getNormalizedMessageSettings = (\n settings:\n | string\n | ConversationMessageSettings\n | ConverstationMessageItem<any>\n | ConverstationMessageItem<any>[],\n options?: {\n key?: string;\n }\n): NormalizedMessageSettings => {\n let content: ConversationMessageContent;\n let key = options?.key || uuid();\n let timestamp: number | null = Date.now();\n\n if (Array.isArray(settings) && settings.length > -1) {\n if (typeof settings[0] === 'string') {\n content = { items: [<ConverstationMessageItem<any>>settings] };\n } else {\n content = { items: <ConverstationMessageItem<any>[]>settings };\n }\n } else if (typeof settings === 'string') {\n content = { body: settings };\n } else {\n settings = <ConversationMessageSettings>settings || {};\n\n if (settings.type) {\n content = {\n ...(<any>settings),\n };\n } else {\n content = {\n body: settings.body,\n actions: settings.actions,\n title: settings.title,\n };\n if (settings.key) {\n key = settings.key;\n }\n if (settings.timestamp) {\n timestamp = settings.timestamp;\n }\n if (typeof settings.form === 'function') {\n const builder = FormBuilder.create(key);\n settings.form(builder);\n const builtForm = builder.get();\n content.form = builtForm;\n }\n if (settings.timestamp === null) {\n timestamp = null;\n }\n }\n }\n return { content, key, timestamp };\n};\n\nconst removeTypingState = (\n typingActors: ConversationMessageSender[],\n sender?: ConversationMessageSender\n) => {\n if (!sender) {\n return;\n }\n const senderString = JSON.stringify(sender);\n const indexToRemove = typingActors.findIndex((item) => {\n return senderString === JSON.stringify(item);\n });\n if (indexToRemove > -1) {\n return typingActors.splice(indexToRemove, 1);\n }\n};\n\n/**\n * Manages the stream of messages inside a `ConversationComponent` and provides external read-write\n * access to it as well as exposing emitted actions.\n */\nexport class ConversationController {\n formHandlers: FormHandlers = {};\n\n /**\n * Represents the current end user.\n */\n user: User = new User(this);\n\n events: EventManager;\n\n providers: string[] = [];\n\n active: boolean = false;\n\n queuedProviders: string[] = [];\n\n registeredProviders: ConversationProvider[] = [];\n\n private loaders: number = 0;\n private componentMounted: boolean = false;\n\n private store: Store;\n\n messages: ConversationMessage[] = [];\n private typingActors: ConversationMessageSender[] = [];\n\n constructor(public container: Container, public id: string, options: { rehydrate: boolean }) {\n const widget: Widget = container.get('$widget');\n this.events = widget.events.createChild(this);\n this.store = new Store(container, this, options.rehydrate);\n }\n\n setInitialStorage(data: { agents: AgentSettings[] }) {\n this.store.setInitialData(data);\n }\n\n setProviders(providers: string[]) {\n const removed: string[] = [];\n const added: string[] = [];\n\n // remove\n this.providers\n .reduce<string[]>((acc, provider) => {\n if (providers.indexOf(provider) === -1) {\n acc.push(provider);\n }\n return acc;\n }, [])\n .forEach((providerToRemove) => {\n const indexToRemove = this.providers.indexOf(providerToRemove);\n if (indexToRemove > -1) {\n removed.push(providerToRemove);\n this.providers.splice(indexToRemove, 1);\n }\n });\n\n // add\n providers.forEach((provider) => {\n if (this.providers.indexOf(provider) === -1) {\n added.push(provider);\n this.providers.push(provider);\n }\n });\n\n if (added.length || removed.length) {\n this.events.dispatch('conversation:providers-changed', { added, removed });\n }\n }\n\n createProvider(name: string): ConversationProvider {\n const index = this.providerIndex(name);\n if (index > -1) {\n return this.registeredProviders[index];\n }\n const provider = ConversationProvider.create(name, this.container, this);\n this.registeredProviders.push(provider);\n return provider;\n }\n\n providerIndex(name: string) {\n return this.registeredProviders.findIndex((p) => p.name === name);\n }\n\n getAgentById(id?: string) {\n if (!id) {\n return;\n }\n return this.store.getStoredAgent(id);\n }\n\n dispose() {\n this.registeredProviders.forEach((provider) => provider.dispose());\n this.messages = [];\n this.events.dispatch('conversation:controller-disposed', this);\n this.active = false;\n }\n\n onDispose(fn: EventListener) {\n return this.events.subscribe('conversation:controller-disposed', fn);\n }\n\n onStarted(fn: EventListener) {\n return this.events.subscribe('conversation:started', fn);\n }\n\n onMessageCreated(fn: EventListener) {\n return this.events.subscribe('conversation:message-created', fn);\n }\n\n isRehydrated() {\n return this.store.isRehydrated();\n }\n\n disposeProvider(target: ConversationProvider) {\n const index = this.providerIndex(target.name);\n index > -1 && this.registeredProviders.splice(index, 1);\n this.events.dispatch('conversation:providers-changed', { removed: [target.name] });\n if (!this.registeredProviders.length) {\n this.dispose();\n }\n }\n\n onProvidersChange(fn: EventListener) {\n return this.events.subscribe('conversation:providers-changed', fn);\n }\n\n setComponentMountedState(mounted: boolean) {\n if (this.componentMounted === mounted) {\n return;\n }\n this.componentMounted = mounted;\n if (mounted) {\n this.events.dispatch('conversation:unread-message', false);\n this.events.dispatch('conversation:started', true);\n this.active = true;\n }\n this.events.dispatch('conversation:component-mount-changed', mounted);\n }\n\n setProviderOptions(providerName: string, options: ConversationOptions) {\n const index = this.providerIndex(providerName);\n\n if (index > -1) {\n this.registeredProviders[index].setOptions(options);\n }\n }\n\n changeProvider(providerName: string) {\n const provider = this.registeredProviders.find((p) => p.name === providerName);\n\n if (provider) {\n swapProvider(this.container, this.id, providerName);\n }\n }\n\n queueProviders(providers: string[]) {\n this.queuedProviders = providers;\n }\n\n onCompleteProvider() {\n const nextProvider = this.queuedProviders.pop();\n\n if (nextProvider) {\n swapProvider(this.container, this.id, nextProvider);\n }\n }\n\n getComponentMountedState() {\n return this.componentMounted;\n }\n\n onUnreadMessage(fn: EventListener) {\n return this.events.subscribe('conversation:unread-message', fn);\n }\n\n createEntry(\n key: string,\n content: ConversationMessageContent,\n type: ConversationMessageType,\n sender?: ConversationMessageSender,\n timestamp?: number | null\n ): ConversationEntry {\n const message: ConversationMessage = {\n key,\n content,\n type,\n sender: sender || null,\n timestamp: timestamp || timestamp === null ? timestamp : Date.now(),\n };\n this.messages.push(message);\n message.type === ConversationMessageType.Agent &&\n removeTypingState(this.typingActors, sender);\n const entry = new ConversationEntry((updated) => {\n if (updated !== null) {\n const { timestamp: updatedTimestamp = undefined, ...content } = updated;\n message.content = content;\n if (updatedTimestamp) {\n message.timestamp = updatedTimestamp;\n }\n } else {\n const indexToRemove = this.messages.indexOf(message);\n message.content = null;\n if (indexToRemove > -1) {\n this.messages.splice(indexToRemove, 1);\n }\n }\n this.events.dispatch('conversation:message-updated', { message });\n this.update();\n });\n this.events.dispatch('conversation:message-created', { message });\n this.update();\n if (!this.componentMounted) {\n this.events.dispatch('conversation:unread-message', true);\n }\n return entry;\n }\n\n print = (settings: string | ConversationMessageSettings): ConversationEntry => {\n const normalized = getNormalizedMessageSettings(settings);\n\n return this.createEntry(\n normalized.key,\n normalized.content,\n ConversationMessageType.System,\n undefined,\n normalized.timestamp\n );\n };\n\n update() {\n this.events.dispatch('conversation:updated', {\n messages: this.messages,\n loading: this.loaders > 0,\n typingActors: this.typingActors,\n });\n }\n\n getMessageStream() {\n return {\n messages: this.messages,\n loading: this.loaders > 0,\n typingActors: this.typingActors,\n };\n }\n\n setTypingState(sender: ConversationMessageSender, type?: ConversationMessageType) {\n if (this.typingActors.indexOf(sender) === -1) {\n this.typingActors.push(sender);\n this.update();\n }\n\n return () => {\n removeTypingState(this.typingActors, sender);\n this.update();\n };\n }\n\n /**\n * Displays a loader in the conversation.\n */\n loader(): CancelLoaderDelegate {\n this.loaders = this.loaders + 1;\n let dismissed = false;\n if (this.loaders === 1) {\n this.update();\n }\n return () => {\n if (!dismissed) {\n dismissed = true;\n this.loaders = this.loaders - 1;\n if (this.loaders === 0) {\n this.update();\n }\n }\n };\n }\n\n submitForm(key: string, handler: SubmitHandler) {\n this.formHandlers[key] = { ...this.formHandlers[key], submit: handler };\n }\n\n validateForm(key: string, handler: ValidateHandler) {\n this.formHandlers[key] = { ...this.formHandlers[key], validate: handler };\n }\n}\n","import { ComponentPlatform, WidgetSettings } from '@telia-ace/widget-core';\nimport { closeAllModals } from '@telia-ace/widget-plugins';\nimport {\n createStorageWriter,\n StorageCategory,\n StorageMedium,\n StorageScope,\n} from '@telia-ace/widget-services';\nimport { Container, Implementation, Widget } from '@webprovisions/platform';\nimport { ConversationEndedBehavior, ConversationPlatform } from '../';\n\nconst getParentWidget = (widgetName: string, implementation: Implementation) => {\n const mainWidgetName = widgetName.split('_contact');\n return implementation.widgets.get(mainWidgetName[0]);\n};\n\nconst getSeparateWidget = (container: Container) => {\n const originWidget = container.get('$widget');\n const { name, implementation }: Widget = container.get('$widget');\n\n const mainWidget =\n name.indexOf('_contact') > -1 ? getParentWidget(name, implementation) : originWidget;\n const { data }: WidgetSettings = container.get('$settings');\n const { trigger }: WidgetSettings = mainWidget.container.get('$settings');\n const chatWidgetName = `${name\n .replace('_contact-method', '')\n .replace('_contact', '')}_contact-method`;\n\n const chatWidget = implementation.widgets.get(chatWidgetName);\n if (chatWidget && !trigger) {\n return { chatWidget, mainWidget, data };\n }\n return { mainWidget, data };\n};\n\nexport const shouldPreventDefault = (container: Container) => {\n const { chatWidget } = getSeparateWidget(container);\n return !!chatWidget;\n};\n\nexport const openChatWidget = (\n container: Container,\n contactMethod: any /*ContactMethodType*/,\n triggerDOMTarget?: HTMLElement\n) => {\n const { mainWidget, data, chatWidget } = getSeparateWidget(container);\n\n if (chatWidget) {\n if (chatWidget.state === 'activated') {\n return chatWidget.invoke('open').then(() => {\n chatWidget.container.getAsync('conversation').then((conversation) => {\n conversation\n .navigateToConversationIfActive(contactMethod.id)\n .then(() => closeAllModals(container));\n });\n });\n }\n return chatWidget\n .activate()\n .then(() => {\n const { trigger } = chatWidget.container.get('$settings');\n trigger.action = 'hide'; // could be default in configuration\n return chatWidget\n .invoke('setSettings', () => ({\n data,\n trigger,\n activate: true,\n }))\n .then(() => {\n return chatWidget.container\n .getAsync('components')\n .then((components: ComponentPlatform) => {\n /**\n * Could cause issues if target widget is no longer as specific for this use case\n */\n const contactMethodsQuery = components\n .components()\n .ofType('contact-method');\n components.write({\n key: 'setContactMethodId',\n attributes: {\n properties: {\n id: contactMethod.id,\n guideId: contactMethod.guideId,\n },\n },\n target: contactMethodsQuery,\n provider: 'localStorage',\n });\n const conversationsQuery = components\n .components()\n .ofType('conversation');\n components.write({\n key: 'setConversationProvider',\n attributes: {\n properties: { providers: [contactMethod.clientName] },\n },\n target: conversationsQuery,\n provider: 'localStorage',\n });\n });\n });\n })\n .then(() => {\n return chatWidget.invoke('attach', {\n key: 'contact-method',\n triggerDOMElement: triggerDOMTarget,\n withRenderState: 'open',\n });\n })\n .then(() => {\n createStorageWriter(\n chatWidget.container,\n 'activeStickyWidget',\n StorageCategory.Necessary,\n {\n medium: StorageMedium.Local,\n scope: StorageScope.Implementation,\n }\n ).then((write) => write(chatWidget.name));\n\n return chatWidget.container\n .getAsync('conversation')\n .then((platform) => {\n platform.setConversationEndedBehavior(ConversationEndedBehavior.Deactivate);\n })\n .then(() => closeAllModals(container))\n .then(() => false);\n });\n }\n mainWidget.container.getAsync('conversation').then((platform: ConversationPlatform) => {\n return platform\n .navigateToConversationIfActive(contactMethod.id)\n .then(() => platform.setConversationEndedBehavior(ConversationEndedBehavior.Navigate));\n });\n return chatWidget ? false : true;\n};\n\nexport const navigateToConversation = (\n container: Container,\n contactMethod: any /*ContactMethodType*/,\n routeName = 'conversation'\n) => {\n const { mainWidget, chatWidget } = getSeparateWidget(container);\n if (chatWidget) {\n return chatWidget.container.getAsync('router').then((router: any) => {\n router.navigate(routeName, { id: contactMethod.id });\n });\n }\n\n return mainWidget.container.getAsync('conversation').then((platform: ConversationPlatform) => {\n platform.setConversationEndedBehavior(ConversationEndedBehavior.Navigate)?.then(() => {\n mainWidget.container.getAsync('router').then((router: any) => {\n mainWidget.container\n .getAsync('components')\n .then((components: ComponentPlatform) => {\n const conversationQuery = components.components().ofType('conversation');\n components.write({\n key: 'setConversationProvider',\n attributes: { properties: { providers: [contactMethod.clientName] } },\n target: conversationQuery,\n provider: 'localStorage',\n });\n })\n .then(() => {\n router.navigate(routeName, { id: contactMethod.id });\n });\n });\n });\n });\n};\n","import { ComponentNodeController, ComponentPlatform, ComponentQuery } from '@telia-ace/widget-core';\nimport { RouteData, RoutingService } from '@telia-ace/widget-routing';\nimport {\n createStorageWriter,\n readStorage,\n StorageCategory,\n StorageMedium,\n StorageWriter,\n} from '@telia-ace/widget-services';\nimport { lock } from '@telia-ace/widget-utilities';\nimport {\n Container,\n EventManager,\n EventSubscriptionCancellation,\n Widget,\n} from '@webprovisions/platform';\nimport { AgentSettings } from './agent';\nimport { ConversationController } from './conversation-controller';\nimport { ConversationProvider } from './conversation-provider';\nimport { createSessionStorageKey } from './store';\nimport { navigateToConversation, openChatWidget, shouldPreventDefault } from './utils';\nimport { swapProvider } from './utils/swap-provider';\n\nconst STORAGE_KEY = 'conversations';\n\nexport type ConversationHandler = (\n conversation: ConversationProvider,\n component: ComponentNodeController\n) => void | (() => void);\n\nexport type UnregisterControllerDelegate = () => void;\n\nexport type ConversationProviderRegistration = {\n name: string;\n handler: ConversationHandler;\n};\n\nexport enum ConversationEndedBehavior {\n Deactivate = 'deactivate',\n Navigate = 'navigate',\n None = 'none',\n}\n\nexport type SessionInfo = {\n id?: string;\n route?: RouteData;\n conversationEndedBehavior?: ConversationEndedBehavior;\n};\n\nexport class ConversationPlatform {\n events: EventManager;\n public controllers: {\n conversation: ConversationController;\n component: ComponentNodeController;\n }[] = [];\n private providers: ConversationProviderRegistration[] = [];\n private disposeProviders: { [providerKey: string]: (() => void)[] } = {};\n private subscriptions: EventSubscriptionCancellation[] = [];\n private storageWriter: StorageWriter | null = null;\n private router: RoutingService | null = null;\n private buttonQuery: ComponentQuery | null = null;\n private sessionInfo: SessionInfo | null = null;\n\n constructor(private container: Container, private components: ComponentPlatform) {\n const widget: Widget = container.get('$widget');\n this.events = widget.events.createChild(this);\n }\n\n initialize() {\n createStorageWriter(this.container, STORAGE_KEY, StorageCategory.Necessary, {\n medium: StorageMedium.Local,\n }).then((writer) => (this.storageWriter = writer));\n\n readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\n (storedSession) => {\n this.buttonQuery = this.components\n .components()\n .ofType('conversation-return-button');\n if (storedSession) {\n this.sessionInfo = storedSession;\n if (storedSession.id && storedSession.route) {\n this.writeToComponents({ active: true, alert: { show: false } });\n }\n }\n }\n );\n this.container.getAsync('router').then((router) => (this.router = router));\n this.events.subscribe('conversation:ended', (event, data) => {\n switch (this.sessionInfo?.conversationEndedBehavior) {\n case ConversationEndedBehavior.Deactivate:\n const widget: Widget = this.container.get('$widget');\n widget.deactivate();\n break;\n case ConversationEndedBehavior.Navigate:\n const initialRoute = this.router?.getInitialRoute();\n if (initialRoute) {\n this.router?.navigate(initialRoute.name);\n }\n break;\n case ConversationEndedBehavior.None:\n default:\n break;\n }\n this.writeToComponents({ active: false });\n this.sessionInfo = null;\n this.storageWriter && this.storageWriter();\n });\n }\n\n addSubscription(sub: EventSubscriptionCancellation) {\n this.subscriptions.push(sub);\n }\n\n static getInstance(\n container: Container,\n key: string = 'conversation'\n ): Promise<ConversationPlatform> {\n return lock(container)(() => {\n return container.getAsync(key).then((value: ConversationPlatform) => {\n let conversation = value;\n if (!conversation) {\n return ComponentPlatform.getInstance(container).then((components) => {\n conversation = new ConversationPlatform(container, components);\n conversation.initialize();\n container.registerAsync(key, () => conversation);\n return conversation;\n });\n }\n return conversation;\n });\n });\n }\n\n navigateToConversationIfActive(id: string): Promise<void> {\n return readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\n (storedSession) => {\n if (storedSession && storedSession.id === id) {\n if (storedSession.route) {\n const { name, params } = storedSession.route;\n this.router?.navigate(name, params);\n }\n }\n }\n );\n }\n\n setConversationEndedBehavior(behavior: ConversationEndedBehavior) {\n return readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\n (stored) => {\n let storedSession = stored;\n if (storedSession) {\n storedSession.conversationEndedBehavior = behavior;\n } else {\n storedSession = { conversationEndedBehavior: behavior };\n }\n this.sessionInfo = storedSession;\n return (\n (this.storageWriter && this.storageWriter(this.sessionInfo)) ||\n Promise.resolve()\n );\n }\n );\n }\n\n async createController(id: string, options: { rehydrate: boolean }) {\n const storageKey = createSessionStorageKey(id);\n const { agents: storedAgents } = (await readStorage<{ agents: AgentSettings[] }>(\n this.container,\n storageKey\n )) || { agents: [] };\n\n const index = this.controllers.findIndex((c) => c.conversation.id === id);\n let controller;\n if (index > -1) {\n controller = this.controllers[index].conversation;\n } else {\n controller = new ConversationController(this.container, id, options);\n }\n\n controller.setInitialStorage({ agents: storedAgents || [] });\n return controller;\n }\n\n registerProvider(name: string, handler: ConversationHandler): void {\n const provider = {\n name,\n handler,\n };\n this.providers.push(provider);\n // execute provider for all matching controllers\n this.controllers\n .filter((controller) => controller.conversation.providers.indexOf(name) > -1)\n .forEach((controller) => {\n this.invokeHandler(provider, controller);\n });\n }\n\n registerController(\n conversation: ConversationController,\n component: ComponentNodeController\n ): boolean {\n const index = this.controllers.findIndex((c) => c.conversation.id === conversation.id);\n let controller: any;\n if (index < 0) {\n controller = { conversation, component };\n this.controllers.push(controller);\n const invokeHandlers = (providers: string[]) => {\n if (providers) {\n this.providers\n .filter((provider) => providers.indexOf(provider.name) > -1)\n .forEach((provider) => {\n this.invokeHandler(provider, controller);\n });\n }\n };\n\n this.subscriptions.push(\n conversation.onDispose((event, data) => {\n const index = this.controllers.findIndex((c) => c.conversation === data);\n index > -1 && this.controllers.splice(index, 1);\n this.components\n .components()\n .ofType('conversation-return-button')\n .select()\n .writeProperties({ active: false });\n\n this.events.dispatch('conversation:ended', {}, { bubbles: true });\n })\n );\n this.subscriptions.push(\n conversation.onProvidersChange((event, data) => {\n const { added, removed = [] }: { added: string[]; removed: string[] } = data;\n removed.forEach((removedProvider) => {\n (this.disposeProviders[removedProvider] || []).forEach((dispose) => {\n dispose();\n });\n });\n invokeHandlers(added);\n })\n );\n\n this.subscriptions.push(\n conversation.onStarted((event, isActive) => {\n const session: SessionInfo = {\n id: conversation.id,\n route: this.router?.getRouteData(),\n conversationEndedBehavior: this.sessionInfo?.conversationEndedBehavior,\n };\n this.sessionInfo = session;\n this.storageWriter && this.storageWriter(session);\n\n this.writeToComponents({ active: isActive });\n })\n );\n\n this.subscriptions.push(\n conversation.onUnreadMessage((event, data) => {\n this.events.dispatch('conversation:unread-message', data);\n this.writeToComponents({ alert: { show: data } });\n })\n );\n\n invokeHandlers(conversation.providers);\n return true;\n }\n controller = this.controllers[index];\n return false;\n }\n\n private writeToComponents(properties: any, key: string = 'conversationReturnButtonState') {\n if (this.buttonQuery) {\n this.components.write({\n key: 'conversationReturnButtonState',\n attributes: { properties },\n target: this.buttonQuery,\n provider: 'localStorage',\n });\n }\n }\n\n private invokeHandler(provider: ConversationProviderRegistration, controller: any) {\n const dispose = provider.handler(\n controller.conversation.createProvider(provider.name),\n controller.component\n );\n if (dispose) {\n if (!this.disposeProviders[provider.name]) {\n this.disposeProviders[provider.name] = [];\n }\n this.disposeProviders[provider.name].push(dispose);\n }\n }\n\n getComponentRoute() {\n return readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\n (stored) => stored?.route\n );\n }\n\n dispose() {\n Object.keys(this.disposeProviders).forEach((key) => {\n this.disposeProviders[key].forEach((dispose) => {\n dispose();\n });\n });\n this.subscriptions.forEach((unsubscribe) => {\n unsubscribe();\n });\n this.controllers = [];\n this.providers = [];\n }\n\n public static async handleContactMethodClick(\n event: any,\n container: Container,\n contactMethod: any,\n callback?: Function\n ) {\n if (shouldPreventDefault(container)) {\n event.preventDefault();\n let triggerEl = document.getElementById('humany-dynamic-anchor');\n if (!triggerEl) {\n triggerEl = document.createElement('a');\n triggerEl.setAttribute('href', '#');\n triggerEl.id = 'humany-dynamic-anchor';\n document.body.appendChild(triggerEl);\n }\n openChatWidget(container, contactMethod, triggerEl);\n }\n openChatWidget(container, contactMethod);\n }\n\n public static async handleContactMethodSubmit(container: Container, contactMethod: any) {\n if (contactMethod?.body.form.meta?.conversation?.id) {\n // if we already are in a conversational context, we always want to swap\n // the current provider instead of a route navigation\n return swapProvider(\n container,\n contactMethod.body.form.meta.conversation.id,\n contactMethod.clientName\n );\n }\n\n return navigateToConversation(container, contactMethod);\n }\n}\n","import { RoutingService } from '@telia-ace/widget-routing';\nimport { createReactComponent } from '@telia-ace/widget-ui';\nimport { Container } from '@webprovisions/platform';\nimport { ConversationMessage, ConversationMessageType } from '../../conversation-controller';\nimport { ConversationPlatform } from '../../conversation-platform';\nimport { ConversationMessageContent, ConversationMessageSender } from '../../types';\n\nexport type BundledConversationMessage = {\n timestamp: number;\n content: [BundledMessageContent];\n sender: ConversationMessageSender;\n type: ConversationMessageType;\n};\n\ntype BundledMessageContent = {\n key: string;\n} & ConversationMessageContent;\n\nexport type ConversationContent = {\n loading: boolean;\n typingActors: ConversationMessageSender[];\n messages: ConversationMessage[];\n};\n\n/**\n * Group items by sender, type and time. Current grouping threshold is 2000 ms.\n * Put this as a property on either the component or on the provider?\n * Could possibly be implemented directly in the createEntry method\n * of the conversation controller to avoid iterating over the entire array on\n * each update.\n */\nconst groupedMessages = (\n messages: ConversationMessage[],\n timeout?: number\n): BundledConversationMessage[] => {\n return messages.reduce((acc: any[], current: any, index: number) => {\n const newItem = {\n ...current,\n content: [{ ...current.content, key: current.key }],\n };\n if (acc.length > 0 && current.type !== ConversationMessageType.System) {\n const previous = acc[acc.length - 1];\n if (\n (!timeout && timeout !== 0) ||\n Math.abs(previous.timestamp - current.timestamp) < timeout\n ) {\n if (\n previous.sender?.name === current.sender?.name &&\n previous.type === current.type\n ) {\n previous.timestamp = current.timestamp;\n previous.content.push({ ...current.content, key: current.key });\n return acc;\n }\n }\n }\n acc.push(newItem);\n return acc;\n }, []);\n};\n\nexport type ConversationComponentProperties = {\n providers: string[];\n messages: BundledConversationMessage[]; // internal\n overlay?: { conversation: boolean; secondary: boolean }; // internal\n overlayConversationHeader?: string;\n overlayConversationCloseLabel?: string;\n loading: boolean;\n inputPlaceholder: string;\n inputDisabled: boolean;\n inputHidden: boolean;\n inputMultiline: boolean;\n rehydrate?: boolean;\n userLabel: string;\n avatarSize: string;\n typingActors: any[]; // internal\n conversationControllerId?: string; // internal\n sendButtonLabel: string;\n secondaryAction?: { icon?: string; action: string; label: string };\n};\n\nexport const ConversationComponent = (container: Container) => {\n return Promise.all([\n ConversationPlatform.getInstance(container),\n container.getAsync('router'),\n ]).then(([platform, router]: [ConversationPlatform, RoutingService]) => {\n return createReactComponent(\n container,\n 'conversation',\n import('./conversation'),\n async (component) => {\n const { rehydrate = false } =\n component.properties<ConversationComponentProperties>();\n const routeData = router.getRouteData();\n const name = routeData.params.id || component.node.name || 'component';\n const conversation = await platform.createController(name, { rehydrate });\n const isNewController = platform.registerController(conversation, component);\n\n const messageGroupingTimeout = 3 * 60 * 1000;\n\n const setProperties = (properties: ConversationComponentProperties) => {\n const { providers = [] } = properties;\n if (providers) {\n const providerKeys = Array.isArray(providers) ? providers : [providers];\n conversation.setProviders(providerKeys);\n return providerKeys;\n }\n };\n setProperties(component.properties<ConversationComponentProperties>(setProperties));\n\n conversation.setComponentMountedState(true);\n\n const writeMessages = (messageStream: any) => {\n const { loading, typingActors, messages } = messageStream;\n component.writeProperties({\n loading,\n typingActors,\n messages: groupedMessages(messages, messageGroupingTimeout),\n });\n };\n\n writeMessages(conversation.getMessageStream());\n\n if (isNewController) {\n component.writeProperties({ conversationControllerId: conversation.id });\n // todo: dont create actions here, there will be duplicates due to reuseController = true\n component.actions.create('user-submit', (data, options) => {\n if (options) {\n const { preventDefault, validationPromise } = options;\n if (preventDefault) {\n if (validationPromise) {\n validationPromise().then((text: string) => {\n if (text) {\n conversation.user.print(text);\n }\n });\n }\n return;\n }\n }\n conversation.user.print(data.text);\n });\n\n component.actions.create('user-typing', (data, options) => {});\n\n component.actions.create('form', (data, options) => {});\n\n component.actions.create('action', (data, options) => {});\n\n component.actions.create('overlay-mounted', (data, options) => {});\n\n component.actions.create('show-overlay', (data, options) => {\n component.writeProperties({\n overlay: { conversation: false, secondary: false },\n });\n });\n\n component.actions.create('hide-overlay', (data, options) => {\n component.writeProperties({\n overlay: null,\n });\n });\n\n component.actions.create('show-overlay-conversation', (data, options) => {\n component.writeProperties({\n overlay: { conversation: true, secondary: false },\n });\n });\n\n component.actions.create('hide-overlay-conversation', (data, options) => {\n component.writeProperties({\n overlay: { conversation: false, secondary: false },\n });\n });\n }\n\n const unsubscribe = conversation.events.subscribe(\n 'conversation:updated',\n (e: any, conversationData: ConversationContent) => {\n writeMessages(conversationData);\n }\n );\n\n return () => {\n conversation.setComponentMountedState(false);\n unsubscribe();\n if (!conversation.active) {\n // unregisterController();\n // todo: add possibility to dispose this through extendComponent()\n // component.dispose();\n writeMessages({ messages: [], typingActors: [], loading: false });\n }\n };\n },\n { reuseController: true }\n );\n });\n};\n","import { ComponentPlatform } from '@telia-ace/widget-core';\nimport { RoutingService } from '@telia-ace/widget-routing';\nimport { createReactComponent, Symbol } from '@telia-ace/widget-ui';\nimport { Container } from '@webprovisions/platform';\nimport { ConversationPlatform } from '../..';\n\nexport enum ButtonMode {\n flat = 'flat',\n flashing = 'flashing',\n flashingGradient = 'flashingGradient',\n}\n\nexport type ReturnButtonProps = {\n label: string;\n active: boolean;\n mode: ButtonMode;\n alert?: {\n symbol?: Symbol;\n show?: boolean;\n label?: string;\n };\n};\n\nexport const ConversationReturnButtonComponent = (container: Container) => {\n return Promise.all([\n ComponentPlatform.getInstance(container),\n ConversationPlatform.getInstance(container),\n container.getAsync('router'),\n ]).then(\n ([components, platform, router]: [\n ComponentPlatform,\n ConversationPlatform,\n RoutingService\n ]) => {\n return createReactComponent(\n container,\n 'conversation-return-button',\n import('./return-button'),\n (component) => {\n component.actions.create('toggle', (options = {}) => {\n platform.getComponentRoute()?.then((route) => {\n route && router.navigate(route.name, route.params);\n });\n });\n }\n );\n }\n );\n};\n","import { Form, FormBuilder } from '@telia-ace/widget-forms';\nimport { Symbol } from '@telia-ace/widget-ui';\n\nexport type ConversationMessageSettings = {\n key?: string;\n timestamp?: number;\n title?: string;\n body?: string;\n actions?: { [actionKey: string]: any };\n form?: (builder: FormBuilder) => void;\n type?: string;\n items?: ConversationMessageList[];\n [key: string]: any;\n};\n\nexport type NormalizedMessageSettings = {\n content: ConversationMessageContent;\n key: string;\n timestamp: number | null;\n};\n\nexport type ConversationMessageList = {\n header?: string;\n itemKey: string;\n type?: ConversationMessageListType;\n items: ConversationMessageListItem[];\n};\n\nexport type ConversationMessageListItem = {\n icon?: string;\n type?: ConversationMessageListItemType;\n actions?: { [actionKey: string]: any };\n form?: Form;\n body?: string;\n key: string;\n [key: string]: any;\n};\n\nexport type ConversationMessageContent = {\n title?: string;\n body?: string;\n actions?: { [actionKey: string]: any };\n items?: ConverstationMessageItem<any>[];\n form?: Form;\n [key: string]: any;\n};\n\nexport type ConverstationMessageItem<T, R = ItemPayload> = R extends [T, any] ? R : never;\n\nexport type ConversationMessageUpdateSettings = ConversationMessageContent & {\n timestamp?: number;\n};\n\nexport type ConversationMessageSender = {\n name?: string;\n avatar?: string | Symbol;\n id?: string;\n};\n\nexport enum ConversationMessageListType {\n Ordinary = 'ordinary',\n Seperator = 'seperator',\n}\n\nexport enum ConversationMessageListItemType {\n LinkList = 'link-list',\n Separator = 'separator',\n ButtonList = 'button-list',\n Text = 'text',\n HTML = 'html',\n VideoRequest = 'video-request',\n}\n\nexport type LinkListProperties = {\n header?: string;\n actions: { [key: string]: string } | { label: string; actionKey: string; data: any }[];\n};\n\ntype LinkListItem = [ConversationMessageListItemType.LinkList, LinkListProperties];\n\ntype TextItem = [ConversationMessageListItemType.Text, string];\ntype SeparatorItem = [ConversationMessageListItemType.Separator, undefined];\n\nexport type ButtonListProperties = {\n header?: string;\n actions: { [key: string]: string } | { label: string; actionKey: string; data: any }[];\n};\n\ntype ButtonListItem = [ConversationMessageListItemType.ButtonList, ButtonListProperties];\n\nexport type VideoRequestProperties = {\n header?: string;\n acceptLabel: string;\n declineLabel: string;\n};\n\ntype VideoRequestItem = [ConversationMessageListItemType.VideoRequest, VideoRequestProperties];\n\nexport type HtmlProperties = {\n body: string;\n};\n\ntype HtmlItem = [ConversationMessageListItemType.HTML, HtmlProperties];\n\ntype ItemPayload =\n | LinkListItem\n | TextItem\n | SeparatorItem\n | ButtonListItem\n | HtmlItem\n | VideoRequestItem;\n","import { ComponentResolver, ReactComponent } from '@telia-ace/widget-core';\nimport { Container } from '@webprovisions/platform';\nimport { lazy } from 'react';\nimport { ConversationPlatform } from '..';\n\nexport const registerCustomMessageComponent = (\n container: Container,\n type: string,\n component: ReactComponent\n) => {\n return container.getAsync('componentResolver').then(async (o: ComponentResolver) => {\n const platform = await ConversationPlatform.getInstance(container);\n platform.addSubscription(\n o.registerComponent(\n type,\n lazy(() => component)\n )\n );\n });\n};\n"],"names":["Agent","provider","settings","options","sender","normalized","getNormalizedMessageSettings","ConversationMessageType","uuid","name","avatar","_a","ConversationProvider","container","controller","storedAgent","agent","__spreadValues","type","key","content","timestamp","unsub","fn","unsubscribe","createSessionStorageKey","id","Locker","unlockNext","willLock","resolve","willUnlock","Store","conversation","enabled","__async","storedAgents","agents","a","providerIndex","storedMessages","message","_","data","__spreadProps","messages","agentId","action","unlock","createStorageWriter","StorageCategory","write","prev","m","newData","readStorage","Store$1","User","swapProvider","conversationId","providerName","components","currentInstance","c","toQueue","conversationQuery","ConversationEntry","writer","builder","FormBuilder","builtForm","removeTypingState","typingActors","senderString","indexToRemove","item","ConversationController","widget","providers","removed","added","acc","providerToRemove","index","p","target","mounted","nextProvider","entry","updated","updatedTimestamp","dismissed","handler","getParentWidget","widgetName","implementation","mainWidgetName","getSeparateWidget","originWidget","mainWidget","trigger","chatWidgetName","chatWidget","shouldPreventDefault","openChatWidget","contactMethod","triggerDOMTarget","closeAllModals","contactMethodsQuery","conversationsQuery","StorageMedium","StorageScope","platform","ConversationEndedBehavior","navigateToConversation","routeName","router","STORAGE_KEY","ConversationPlatform","storedSession","event","initialRoute","_b","_c","sub","lock","value","ComponentPlatform","params","behavior","stored","storageKey","component","invokeHandlers","removedProvider","dispose","isActive","session","properties","callback","triggerEl","groupedMessages","timeout","current","newItem","previous","ConversationComponent","createReactComponent","rehydrate","isNewController","messageGroupingTimeout","setProperties","providerKeys","writeMessages","messageStream","loading","preventDefault","validationPromise","text","e","conversationData","ConversationReturnButtonComponent","route","ConversationMessageListItemType","registerCustomMessageComponent","o","lazy"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/agent.ts","../src/conversation-provider.ts","../src/store.ts","../src/user.ts","../src/utils/swap-provider.ts","../src/conversation-controller.ts","../src/utils/open-chat-widget.ts","../src/conversation-platform.ts","../src/components/conversation/plugin.ts","../src/components/return-button/plugin.ts","../src/types.ts","../src/utils/custom-message.ts"],"sourcesContent":["import { Symbol } from '@telia-ace/widget-ui';\nimport { uuid } from '@telia-ace/widget-utilities';\nimport {\n ConversationEntry,\n ConversationMessageType,\n getNormalizedMessageSettings,\n} from './conversation-controller';\nimport { ConversationProvider } from './conversation-provider';\nimport {\n ConversationMessageSender,\n ConversationMessageSettings,\n ConverstationMessageItem,\n} from './types';\n\nexport type AgentSettings = {\n id?: string;\n name?: string;\n avatar?: string | Symbol;\n};\n\nexport class Agent {\n id: string;\n name?: string;\n avatar?: string | Symbol;\n\n constructor(private provider: ConversationProvider, settings: AgentSettings) {\n this.id = settings.id || uuid();\n this.name = settings.name;\n this.avatar = settings.avatar;\n }\n\n print = (\n settings:\n | string\n | ConversationMessageSettings\n | ConverstationMessageItem<any>\n | ConverstationMessageItem<any>[],\n options?: {\n key?: string;\n }\n ): ConversationEntry | undefined => {\n const sender: ConversationMessageSender = {\n name: this.name,\n avatar: this.avatar,\n id: this.id,\n };\n const normalized = getNormalizedMessageSettings(settings, options);\n\n return this.provider.createEntry(\n normalized.key,\n normalized.content,\n ConversationMessageType.Agent,\n sender,\n normalized.timestamp\n );\n };\n typing = () => {\n return this.provider.setTypingState({ name: this.name, avatar: this.avatar });\n };\n\n update(settings: AgentSettings): void {\n const { name, avatar } = settings;\n if (avatar === null) {\n this.avatar = undefined;\n } else if (avatar) {\n this.avatar = avatar;\n }\n\n if (name === null) {\n this.name = undefined;\n } else if (name) {\n this.name = name;\n }\n\n this.provider.controller?.events.dispatch('conversation:agent-updated', {\n agent: this,\n });\n }\n}\n","import {\n Container,\n EventListener,\n EventObject,\n EventSubscriptionCancellation,\n} from '@webprovisions/platform';\nimport { Agent, AgentSettings } from './agent';\nimport {\n CancelLoaderDelegate,\n ConversationController,\n ConversationEntry,\n ConversationMessageType,\n ConversationOptions,\n} from './conversation-controller';\nimport {\n ConversationMessageContent,\n ConversationMessageSender,\n ConversationMessageSettings,\n} from './types';\n\nexport class ConversationProvider {\n private subscriptions: EventSubscriptionCancellation[] = [];\n public options: ConversationOptions;\n public user: any;\n\n private constructor(\n public name: string,\n private container: Container,\n public controller: ConversationController | null\n ) {\n this.user = controller?.user;\n this.options = {\n silent: false,\n };\n }\n\n static create(name: string, container: Container, controller: ConversationController) {\n return new ConversationProvider(name, container, controller);\n }\n\n createAgent(settings: AgentSettings = {}): Agent | undefined {\n if (this.controller) {\n const storedAgent = this.controller.getAgentById(settings.id);\n\n const agent = storedAgent\n ? new Agent(this, { ...storedAgent, ...settings })\n : new Agent(this, settings);\n if (!storedAgent) {\n this.controller?.events.dispatch('conversation:agent-created', {\n agent,\n });\n }\n return agent;\n }\n }\n\n print(settings: string | ConversationMessageSettings): ConversationEntry | undefined {\n return this.controller?.print(settings);\n }\n\n setTypingState(sender: ConversationMessageSender, type?: ConversationMessageType) {\n return this.controller?.setTypingState(sender, type);\n }\n\n loading(): CancelLoaderDelegate {\n if (!this.controller) {\n return () => () => {};\n }\n return this.controller.loader();\n }\n\n createEntry(\n key: string,\n content: ConversationMessageContent,\n type: ConversationMessageType,\n sender?: ConversationMessageSender,\n timestamp?: number | null\n ) {\n return this.controller?.createEntry(key, content, type, sender, timestamp);\n }\n\n dispose() {\n if (process.env.NODE_ENV !== 'production') {\n console.log(`conversation-provider: dispose (${this.name})`);\n }\n this.controller?.disposeProvider(this);\n this.controller = null;\n this.subscriptions.forEach((unsub) => unsub());\n }\n\n isRehydrated() {\n return this.controller?.isRehydrated() || Promise.resolve(false);\n }\n\n complete() {\n this.controller?.onCompleteProvider();\n }\n\n setOptions(options: ConversationOptions = { silent: false }) {\n this.options = options;\n }\n\n onUnreadMessage(fn: EventListener): EventSubscriptionCancellation | void {\n if (this.controller) {\n const unsubscribe = this.controller?.onUnreadMessage(fn);\n this.subscriptions.push(unsubscribe);\n return () => {\n unsubscribe();\n };\n }\n }\n\n onMounted(fn: EventListener): EventSubscriptionCancellation | void {\n if (this.controller) {\n const unsubscribe = this.controller?.events.subscribe(\n 'conversation:component-mount-changed',\n fn\n );\n this.subscriptions.push(unsubscribe);\n fn({} as EventObject, this.controller.getComponentMountedState());\n return () => {\n unsubscribe();\n };\n }\n }\n}\n\nexport default ConversationProvider;\n","import { createStorageWriter, readStorage, StorageCategory } from '@telia-ace/widget-services';\nimport { Container } from '@webprovisions/platform';\nimport { Agent, AgentSettings } from './agent';\nimport { ConversationController } from './conversation-controller';\n\ntype StoredConversationAgent = {\n id: string;\n name: string;\n avatar?: string;\n providerName: string;\n};\ntype StoredConversationMessage = any;\n\ntype StoredConversation = {\n agents: StoredConversationAgent[];\n messages: StoredConversationMessage[];\n};\n\nexport const createSessionStorageKey = (id: string) => {\n return `conversation-${id}`;\n};\n\nclass Locker {\n private _locking: Promise<void> = Promise.resolve();\n private _locks: number = 0;\n\n isLocked() {\n return this._locks > 0;\n }\n\n lock() {\n this._locks += 1;\n\n let unlockNext: () => void;\n\n let willLock = new Promise<void>(\n (resolve) =>\n (unlockNext = () => {\n this._locks -= 1;\n\n resolve();\n })\n );\n\n let willUnlock = this._locking.then(() => unlockNext);\n\n this._locking = this._locking.then(() => willLock);\n\n return willUnlock;\n }\n}\n\nclass Store {\n private sessionStorageKey: string;\n private locker = new Locker();\n private initialStoredAgents: StoredConversationAgent[] = [];\n\n constructor(\n private container: Container,\n private conversation: ConversationController,\n private enabled: boolean // whether or not to store data\n ) {\n this.sessionStorageKey = createSessionStorageKey(conversation.id);\n\n conversation.onStarted(async () => {\n if (conversation.messages.length > 0) {\n // if the conversation already contains messages\n // for example when re-opening a minimized widget,\n // we do not want to do anything\n return;\n }\n const { agents: storedAgents } = await this.read();\n\n const agents: Agent[] = [];\n\n if (storedAgents) {\n storedAgents.forEach((a) => {\n const providerIndex = conversation.providerIndex(a.providerName);\n const provider =\n providerIndex > -1\n ? conversation.registeredProviders[providerIndex]\n : conversation.createProvider(a.providerName);\n\n const agent = new Agent(provider, { name: a.name, avatar: a.avatar, id: a.id });\n agents.push(agent);\n });\n }\n\n const { messages: storedMessages } = await this.read();\n storedMessages.forEach((message) => {\n switch (message.type) {\n case 'agent': {\n const agent = agents.find((a) => a.id === message.sender?.id);\n if (agent) {\n agent.print(message.content.items || message.content, {\n key: message.key,\n });\n }\n return;\n }\n case 'user': {\n conversation.user.print(message.content.items || message.content, {\n key: message.key,\n });\n return;\n }\n case 'system':\n default: {\n conversation.print(message.content.items || message.content);\n }\n }\n });\n });\n conversation.onMessageCreated(async (_, data) => {\n this.write(data.message, 'messages');\n });\n\n conversation.events.subscribe('conversation:agent-created', async (_, data) => {\n const agent = {\n id: data.agent.id,\n name: data.agent.name,\n avatar: data.agent.avatar,\n providerName: data.agent.provider.name,\n };\n await this.write(agent, 'agents');\n });\n\n conversation.events.subscribe('conversation:agent-updated', async (_, data) => {\n const { agents } = await this.read();\n\n await this.write(\n [\n ...agents.map((a) => {\n if (a.id === data.agent.id) {\n return {\n ...a,\n name: data.agent.name,\n avatar: data.agent.avatar,\n };\n }\n return a;\n }),\n ],\n 'agents',\n 'update'\n );\n });\n }\n\n setInitialData(data: { agents: AgentSettings[] }) {\n this.initialStoredAgents = data.agents as StoredConversationAgent[];\n }\n\n async isRehydrated() {\n const { messages } = await this.read();\n return messages.length > 0;\n }\n\n getStoredAgent(agentId: string) {\n if (!this.enabled) {\n return;\n }\n return this.initialStoredAgents.find((a) => a.id === agentId);\n }\n\n async write(data: any, type: 'messages' | 'agents', action: 'add' | 'update' = 'add') {\n if (!this.enabled) {\n return;\n }\n\n const unlock = await this.locker.lock();\n return createStorageWriter(\n this.container,\n this.sessionStorageKey,\n StorageCategory.Necessary\n ).then(async (write) => {\n if (action === 'add') {\n const prev = await this.read();\n\n // ensure that we don't duplicate messages by looking at their unqiue keys\n if (\n type === 'messages' &&\n prev.messages.findIndex((m) => m.key === data.key) > -1\n ) {\n unlock();\n return;\n }\n\n let newData = {\n ...prev,\n };\n\n if (type === 'messages') {\n newData.messages = [...newData.messages, data];\n } else if (type === 'agents') {\n newData.agents = [...newData.agents, data];\n }\n\n return write({\n ...prev,\n ...newData,\n }).then(() => {\n unlock();\n });\n }\n\n if (action === 'update') {\n if (type === 'agents') {\n const prev = await this.read();\n\n return write({\n ...prev,\n agents: data,\n }).then(() => {\n unlock();\n });\n }\n }\n\n return write(data).then(() => {\n unlock();\n });\n });\n }\n\n async read() {\n return readStorage(this.container, this.sessionStorageKey).then((data) => {\n if (!data) {\n return {\n messages: [],\n agents: [],\n };\n }\n return data as StoredConversation;\n });\n }\n}\n\nexport default Store;\n","import {\n ConversationController,\n ConversationEntry,\n ConversationMessageType,\n getNormalizedMessageSettings,\n} from './conversation-controller';\nimport { ConversationMessageSettings } from './types';\n\nexport class User {\n constructor(private controller: ConversationController) {}\n\n print = (\n settings: string | ConversationMessageSettings,\n options?: {\n key?: string;\n }\n ): ConversationEntry => {\n const normalized = getNormalizedMessageSettings(settings, options);\n return this.controller.createEntry(\n normalized.key,\n normalized.content,\n ConversationMessageType.User,\n undefined,\n normalized.timestamp\n );\n };\n}\n","import { ComponentPlatform } from '@telia-ace/widget-core';\nimport { Container } from '@webprovisions/platform';\nimport { ConversationPlatform } from '../conversation-platform';\n\n/**\n * This will put the current provider(s) in a queue and\n * swap current provider to another one based on the providerName.\n * When ConversationProvider.complete() is called, the provider(s) in the\n * queue will become active again\n */\nexport const swapProvider = async (\n container: Container,\n conversationId: string,\n providerName: string\n) => {\n const conversation: ConversationPlatform = await container.getAsync('conversation');\n const components: ComponentPlatform = await container.getAsync('components');\n const currentInstance = conversation.controllers.find((c) => {\n return c.conversation.id === conversationId;\n });\n\n if (currentInstance) {\n const toQueue = [...currentInstance.conversation.providers];\n toQueue.forEach((name) => {\n currentInstance.conversation.setProviderOptions(name, { silent: true });\n });\n currentInstance.conversation.queueProviders(toQueue);\n currentInstance.conversation.setProviders([providerName]);\n const conversationQuery = components.components().ofType('conversation');\n components.write({\n key: 'setConversationProvider',\n attributes: {\n properties: { providers: [providerName] },\n },\n target: conversationQuery,\n provider: 'localStorage',\n });\n }\n};\n","import { FormBuilder } from '@telia-ace/widget-forms';\nimport { uuid } from '@telia-ace/widget-utilities';\nimport { Container, EventListener, EventManager, Widget } from '@webprovisions/platform';\nimport { AgentSettings } from './agent';\nimport { ConversationProvider } from './conversation-provider';\nimport Store from './store';\nimport {\n ConversationMessageContent,\n ConversationMessageSender,\n ConversationMessageSettings,\n ConversationMessageUpdateSettings,\n ConverstationMessageItem,\n NormalizedMessageSettings,\n} from './types';\nimport { User } from './user';\nimport { swapProvider } from './utils/swap-provider';\nexport type ValidateHandler = (formValues: { [key: string]: any }) => Promise<any>;\n\nexport type SubmitHandler = (formValues: { [key: string]: any }) => Promise<any>;\n\nexport type ConversationOptions = { silent: boolean };\n\nexport type Print = (content: string | ConversationMessageContent) => ConversationEntry;\n\nexport type FormHandlers = { [key: string]: FormHandler };\nexport type FormHandler = { validate?: ValidateHandler; submit: SubmitHandler };\n\nexport type CancelLoaderDelegate = () => void;\n\nexport class ConversationEntry {\n constructor(private writer: EntryWriter) {}\n\n update(\n content:\n | string\n | ConversationMessageUpdateSettings\n | ConverstationMessageItem<any>\n | ConverstationMessageItem<any>[]\n ) {\n const normalized = this.getNormalizedSettings(content);\n // const normalized = typeof content === 'string' ? { body: content } : content;\n this.writer(<ConversationMessageUpdateSettings>normalized);\n }\n\n remove() {\n this.writer(null);\n }\n\n private getNormalizedSettings(\n content:\n | string\n | ConversationMessageUpdateSettings\n | ConverstationMessageItem<any>\n | ConverstationMessageItem<any>[]\n ) {\n if (typeof content === 'string') return { body: content };\n else if (content.length > -1 && typeof content === 'object') return { items: content };\n else return content;\n }\n}\n\nexport enum ConversationMessageType {\n User = 'user',\n Agent = 'agent',\n System = 'system',\n}\n\nexport type ConversationMessage = {\n key: string;\n timestamp: number | null;\n content: ConversationMessageContent | null;\n sender: ConversationMessageSender | null;\n type: ConversationMessageType;\n};\n\nexport type EntryWriter = (content: ConversationMessageUpdateSettings | null) => void;\n\nexport const getNormalizedMessageSettings = (\n settings:\n | string\n | ConversationMessageSettings\n | ConverstationMessageItem<any>\n | ConverstationMessageItem<any>[],\n options?: {\n key?: string;\n }\n): NormalizedMessageSettings => {\n let content: ConversationMessageContent;\n let key = options?.key || uuid();\n let timestamp: number | null = Date.now();\n\n if (Array.isArray(settings) && settings.length > -1) {\n if (typeof settings[0] === 'string') {\n content = { items: [<ConverstationMessageItem<any>>settings] };\n } else {\n content = { items: <ConverstationMessageItem<any>[]>settings };\n }\n } else if (typeof settings === 'string') {\n content = { body: settings };\n } else {\n settings = <ConversationMessageSettings>settings || {};\n\n if (settings.type) {\n content = {\n ...(<any>settings),\n };\n } else {\n content = {\n body: settings.body,\n actions: settings.actions,\n title: settings.title,\n };\n if (settings.key) {\n key = settings.key;\n }\n if (settings.timestamp) {\n timestamp = settings.timestamp;\n }\n if (typeof settings.form === 'function') {\n const builder = FormBuilder.create(key);\n settings.form(builder);\n const builtForm = builder.get();\n content.form = builtForm;\n }\n if (settings.timestamp === null) {\n timestamp = null;\n }\n }\n }\n return { content, key, timestamp };\n};\n\nconst removeTypingState = (\n typingActors: ConversationMessageSender[],\n sender?: ConversationMessageSender\n) => {\n if (!sender) {\n return;\n }\n const senderString = JSON.stringify(sender);\n const indexToRemove = typingActors.findIndex((item) => {\n return senderString === JSON.stringify(item);\n });\n if (indexToRemove > -1) {\n return typingActors.splice(indexToRemove, 1);\n }\n};\n\n/**\n * Manages the stream of messages inside a `ConversationComponent` and provides external read-write\n * access to it as well as exposing emitted actions.\n */\nexport class ConversationController {\n formHandlers: FormHandlers = {};\n\n /**\n * Represents the current end user.\n */\n user: User = new User(this);\n\n events: EventManager;\n\n providers: string[] = [];\n\n active: boolean = false;\n\n queuedProviders: string[] = [];\n\n registeredProviders: ConversationProvider[] = [];\n\n private loaders: number = 0;\n private componentMounted: boolean = false;\n\n private store: Store;\n\n messages: ConversationMessage[] = [];\n private typingActors: ConversationMessageSender[] = [];\n\n constructor(public container: Container, public id: string, options: { rehydrate: boolean }) {\n const widget: Widget = container.get('$widget');\n this.events = widget.events.createChild(this);\n this.store = new Store(container, this, options.rehydrate);\n }\n\n setInitialStorage(data: { agents: AgentSettings[] }) {\n this.store.setInitialData(data);\n }\n\n setProviders(providers: string[]) {\n const removed: string[] = [];\n const added: string[] = [];\n\n // remove\n this.providers\n .reduce<string[]>((acc, provider) => {\n if (providers.indexOf(provider) === -1) {\n acc.push(provider);\n }\n return acc;\n }, [])\n .forEach((providerToRemove) => {\n const indexToRemove = this.providers.indexOf(providerToRemove);\n if (indexToRemove > -1) {\n removed.push(providerToRemove);\n this.providers.splice(indexToRemove, 1);\n }\n });\n\n // add\n providers.forEach((provider) => {\n if (this.providers.indexOf(provider) === -1) {\n added.push(provider);\n this.providers.push(provider);\n }\n });\n\n if (added.length || removed.length) {\n this.events.dispatch('conversation:providers-changed', { added, removed });\n }\n }\n\n createProvider(name: string): ConversationProvider {\n const index = this.providerIndex(name);\n if (index > -1) {\n return this.registeredProviders[index];\n }\n const provider = ConversationProvider.create(name, this.container, this);\n this.registeredProviders.push(provider);\n return provider;\n }\n\n providerIndex(name: string) {\n return this.registeredProviders.findIndex((p) => p.name === name);\n }\n\n getAgentById(id?: string) {\n if (!id) {\n return;\n }\n return this.store.getStoredAgent(id);\n }\n\n dispose() {\n this.registeredProviders.forEach((provider) => provider.dispose());\n this.messages = [];\n this.events.dispatch('conversation:controller-disposed', this);\n this.active = false;\n }\n\n onDispose(fn: EventListener) {\n return this.events.subscribe('conversation:controller-disposed', fn);\n }\n\n onStarted(fn: EventListener) {\n return this.events.subscribe('conversation:started', fn);\n }\n\n onMessageCreated(fn: EventListener) {\n return this.events.subscribe('conversation:message-created', fn);\n }\n\n isRehydrated() {\n return this.store.isRehydrated();\n }\n\n disposeProvider(target: ConversationProvider) {\n const index = this.providerIndex(target.name);\n index > -1 && this.registeredProviders.splice(index, 1);\n this.events.dispatch('conversation:providers-changed', { removed: [target.name] });\n if (!this.registeredProviders.length) {\n this.dispose();\n }\n }\n\n onProvidersChange(fn: EventListener) {\n return this.events.subscribe('conversation:providers-changed', fn);\n }\n\n setComponentMountedState(mounted: boolean) {\n if (this.componentMounted === mounted) {\n return;\n }\n this.componentMounted = mounted;\n if (mounted) {\n this.events.dispatch('conversation:unread-message', false);\n this.events.dispatch('conversation:started', true);\n this.active = true;\n }\n this.events.dispatch('conversation:component-mount-changed', mounted);\n }\n\n setProviderOptions(providerName: string, options: ConversationOptions) {\n const index = this.providerIndex(providerName);\n\n if (index > -1) {\n this.registeredProviders[index].setOptions(options);\n }\n }\n\n changeProvider(providerName: string) {\n const provider = this.registeredProviders.find((p) => p.name === providerName);\n\n if (provider) {\n swapProvider(this.container, this.id, providerName);\n }\n }\n\n queueProviders(providers: string[]) {\n this.queuedProviders = providers;\n }\n\n onCompleteProvider() {\n const nextProvider = this.queuedProviders.pop();\n\n if (nextProvider) {\n swapProvider(this.container, this.id, nextProvider);\n }\n }\n\n getComponentMountedState() {\n return this.componentMounted;\n }\n\n onUnreadMessage(fn: EventListener) {\n return this.events.subscribe('conversation:unread-message', fn);\n }\n\n createEntry(\n key: string,\n content: ConversationMessageContent,\n type: ConversationMessageType,\n sender?: ConversationMessageSender,\n timestamp?: number | null\n ): ConversationEntry {\n const message: ConversationMessage = {\n key,\n content,\n type,\n sender: sender || null,\n timestamp: timestamp || timestamp === null ? timestamp : Date.now(),\n };\n this.messages.push(message);\n message.type === ConversationMessageType.Agent &&\n removeTypingState(this.typingActors, sender);\n const entry = new ConversationEntry((updated) => {\n if (updated !== null) {\n const { timestamp: updatedTimestamp = undefined, ...content } = updated;\n message.content = content;\n if (updatedTimestamp) {\n message.timestamp = updatedTimestamp;\n }\n } else {\n const indexToRemove = this.messages.indexOf(message);\n message.content = null;\n if (indexToRemove > -1) {\n this.messages.splice(indexToRemove, 1);\n }\n }\n this.events.dispatch('conversation:message-updated', { message });\n this.update();\n });\n this.events.dispatch('conversation:message-created', { message });\n this.update();\n if (!this.componentMounted) {\n this.events.dispatch('conversation:unread-message', true);\n }\n return entry;\n }\n\n print = (settings: string | ConversationMessageSettings): ConversationEntry => {\n const normalized = getNormalizedMessageSettings(settings);\n\n return this.createEntry(\n normalized.key,\n normalized.content,\n ConversationMessageType.System,\n undefined,\n normalized.timestamp\n );\n };\n\n update() {\n this.events.dispatch('conversation:updated', {\n messages: this.messages,\n loading: this.loaders > 0,\n typingActors: this.typingActors,\n });\n }\n\n getMessageStream() {\n return {\n messages: this.messages,\n loading: this.loaders > 0,\n typingActors: this.typingActors,\n };\n }\n\n setTypingState(sender: ConversationMessageSender, type?: ConversationMessageType) {\n if (this.typingActors.indexOf(sender) === -1) {\n this.typingActors.push(sender);\n this.update();\n }\n\n return () => {\n removeTypingState(this.typingActors, sender);\n this.update();\n };\n }\n\n /**\n * Displays a loader in the conversation.\n */\n loader(): CancelLoaderDelegate {\n this.loaders = this.loaders + 1;\n let dismissed = false;\n if (this.loaders === 1) {\n this.update();\n }\n return () => {\n if (!dismissed) {\n dismissed = true;\n this.loaders = this.loaders - 1;\n if (this.loaders === 0) {\n this.update();\n }\n }\n };\n }\n\n submitForm(key: string, handler: SubmitHandler) {\n this.formHandlers[key] = { ...this.formHandlers[key], submit: handler };\n }\n\n validateForm(key: string, handler: ValidateHandler) {\n this.formHandlers[key] = { ...this.formHandlers[key], validate: handler };\n }\n}\n","import { ComponentPlatform, WidgetSettings } from '@telia-ace/widget-core';\nimport { closeAllModals } from '@telia-ace/widget-plugins';\nimport {\n createStorageWriter,\n StorageCategory,\n StorageMedium,\n StorageScope,\n} from '@telia-ace/widget-services';\nimport { Container, Implementation, Widget } from '@webprovisions/platform';\nimport { ConversationEndedBehavior, ConversationPlatform } from '../';\n\nconst getParentWidget = (widgetName: string, implementation: Implementation) => {\n const mainWidgetName = widgetName.split('_contact');\n return implementation.widgets.get(mainWidgetName[0]);\n};\n\nconst getSeparateWidget = (container: Container) => {\n const originWidget = container.get('$widget');\n const { name, implementation }: Widget = container.get('$widget');\n\n const mainWidget =\n name.indexOf('_contact') > -1 ? getParentWidget(name, implementation) : originWidget;\n const { data }: WidgetSettings = container.get('$settings');\n const { trigger }: WidgetSettings = mainWidget.container.get('$settings');\n const chatWidgetName = `${name\n .replace('_contact-method', '')\n .replace('_contact', '')}_contact-method`;\n\n const chatWidget = implementation.widgets.get(chatWidgetName);\n if (chatWidget && !trigger) {\n return { chatWidget, mainWidget, data };\n }\n return { mainWidget, data };\n};\n\nexport const shouldPreventDefault = (container: Container) => {\n const { chatWidget } = getSeparateWidget(container);\n return !!chatWidget;\n};\n\nexport const openChatWidget = (\n container: Container,\n contactMethod: any /*ContactMethodType*/,\n triggerDOMTarget?: HTMLElement\n) => {\n const { mainWidget, data, chatWidget } = getSeparateWidget(container);\n\n if (chatWidget) {\n if (chatWidget.state === 'activated') {\n return chatWidget.invoke('open').then(() => {\n chatWidget.container.getAsync('conversation').then((conversation) => {\n conversation\n .navigateToConversationIfActive(contactMethod.id)\n .then(() => closeAllModals(container));\n });\n });\n }\n return chatWidget\n .activate()\n .then(() => {\n const { trigger } = chatWidget.container.get('$settings');\n trigger.action = 'hide'; // could be default in configuration\n return chatWidget\n .invoke('setSettings', () => ({\n data,\n trigger,\n activate: true,\n }))\n .then(() => {\n return chatWidget.container\n .getAsync('components')\n .then((components: ComponentPlatform) => {\n /**\n * Could cause issues if target widget is no longer as specific for this use case\n */\n const contactMethodsQuery = components\n .components()\n .ofType('contact-method');\n components.write({\n key: 'setContactMethodId',\n attributes: {\n properties: {\n id: contactMethod.id,\n guideId: contactMethod.guideId,\n },\n },\n target: contactMethodsQuery,\n provider: 'localStorage',\n });\n const conversationsQuery = components\n .components()\n .ofType('conversation');\n components.write({\n key: 'setConversationProvider',\n attributes: {\n properties: { providers: [contactMethod.clientName] },\n },\n target: conversationsQuery,\n provider: 'localStorage',\n });\n });\n });\n })\n .then(() => {\n return chatWidget.invoke('attach', {\n key: 'contact-method',\n triggerDOMElement: triggerDOMTarget,\n withRenderState: 'open',\n });\n })\n .then(() => {\n createStorageWriter(\n chatWidget.container,\n 'activeStickyWidget',\n StorageCategory.Necessary,\n {\n medium: StorageMedium.Local,\n scope: StorageScope.Implementation,\n }\n ).then((write) => write(chatWidget.name));\n\n return chatWidget.container\n .getAsync('conversation')\n .then((platform) => {\n platform.setConversationEndedBehavior(ConversationEndedBehavior.Deactivate);\n })\n .then(() => closeAllModals(container))\n .then(() => false);\n });\n }\n mainWidget.container.getAsync('conversation').then((platform: ConversationPlatform) => {\n return platform\n .navigateToConversationIfActive(contactMethod.id)\n .then(() => platform.setConversationEndedBehavior(ConversationEndedBehavior.Navigate));\n });\n return chatWidget ? false : true;\n};\n\nexport const navigateToConversation = (\n container: Container,\n contactMethod: any /*ContactMethodType*/,\n routeName = 'conversation'\n) => {\n const { mainWidget, chatWidget } = getSeparateWidget(container);\n if (chatWidget) {\n return chatWidget.container.getAsync('router').then((router: any) => {\n router.navigate(routeName, { id: contactMethod.id });\n });\n }\n\n return mainWidget.container.getAsync('conversation').then((platform: ConversationPlatform) => {\n platform.setConversationEndedBehavior(ConversationEndedBehavior.Navigate)?.then(() => {\n mainWidget.container.getAsync('router').then((router: any) => {\n mainWidget.container\n .getAsync('components')\n .then((components: ComponentPlatform) => {\n const conversationQuery = components.components().ofType('conversation');\n components.write({\n key: 'setConversationProvider',\n attributes: { properties: { providers: [contactMethod.clientName] } },\n target: conversationQuery,\n provider: 'localStorage',\n });\n })\n .then(() => {\n router.navigate(routeName, { id: contactMethod.id });\n });\n });\n });\n });\n};\n","import { ComponentNodeController, ComponentPlatform, ComponentQuery } from '@telia-ace/widget-core';\nimport { RouteData, RoutingService } from '@telia-ace/widget-routing';\nimport {\n createStorageWriter,\n readStorage,\n StorageCategory,\n StorageMedium,\n StorageWriter,\n} from '@telia-ace/widget-services';\nimport { lock } from '@telia-ace/widget-utilities';\nimport {\n Container,\n EventManager,\n EventSubscriptionCancellation,\n Widget,\n} from '@webprovisions/platform';\nimport { AgentSettings } from './agent';\nimport { ConversationController } from './conversation-controller';\nimport { ConversationProvider } from './conversation-provider';\nimport { createSessionStorageKey } from './store';\nimport { navigateToConversation, openChatWidget, shouldPreventDefault } from './utils';\nimport { swapProvider } from './utils/swap-provider';\n\nconst STORAGE_KEY = 'conversations';\n\nexport type ConversationHandler = (\n conversation: ConversationProvider,\n component: ComponentNodeController\n) => void | (() => void);\n\nexport type UnregisterControllerDelegate = () => void;\n\nexport type ConversationProviderRegistration = {\n name: string;\n handler: ConversationHandler;\n};\n\nexport enum ConversationEndedBehavior {\n Deactivate = 'deactivate',\n Navigate = 'navigate',\n None = 'none',\n}\n\nexport type SessionInfo = {\n id?: string;\n route?: RouteData;\n conversationEndedBehavior?: ConversationEndedBehavior;\n};\n\nexport class ConversationPlatform {\n events: EventManager;\n public controllers: {\n conversation: ConversationController;\n component: ComponentNodeController;\n }[] = [];\n private providers: ConversationProviderRegistration[] = [];\n private disposeProviders: { [providerKey: string]: (() => void)[] } = {};\n private subscriptions: EventSubscriptionCancellation[] = [];\n private storageWriter: StorageWriter | null = null;\n private router: RoutingService | null = null;\n private buttonQuery: ComponentQuery | null = null;\n private sessionInfo: SessionInfo | null = null;\n\n constructor(private container: Container, private components: ComponentPlatform) {\n const widget: Widget = container.get('$widget');\n this.events = widget.events.createChild(this);\n }\n\n initialize() {\n createStorageWriter(this.container, STORAGE_KEY, StorageCategory.Necessary, {\n medium: StorageMedium.Local,\n }).then((writer) => (this.storageWriter = writer));\n\n readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\n (storedSession) => {\n this.buttonQuery = this.components\n .components()\n .ofType('conversation-return-button');\n if (storedSession) {\n this.sessionInfo = storedSession;\n if (storedSession.id && storedSession.route) {\n this.writeToComponents({ active: true, alert: { show: false } });\n }\n }\n }\n );\n this.container.getAsync('router').then((router) => (this.router = router));\n this.events.subscribe('conversation:ended', (event, data) => {\n switch (this.sessionInfo?.conversationEndedBehavior) {\n case ConversationEndedBehavior.Deactivate:\n const widget: Widget = this.container.get('$widget');\n widget.deactivate();\n break;\n case ConversationEndedBehavior.Navigate:\n const initialRoute = this.router?.getInitialRoute();\n if (initialRoute) {\n this.router?.navigate(initialRoute.name);\n }\n break;\n case ConversationEndedBehavior.None:\n default:\n break;\n }\n this.writeToComponents({ active: false });\n this.sessionInfo = null;\n this.storageWriter && this.storageWriter();\n });\n }\n\n addSubscription(sub: EventSubscriptionCancellation) {\n this.subscriptions.push(sub);\n }\n\n static getInstance(\n container: Container,\n key: string = 'conversation'\n ): Promise<ConversationPlatform> {\n return lock(container)(() => {\n return container.getAsync(key).then((value: ConversationPlatform) => {\n let conversation = value;\n if (!conversation) {\n return ComponentPlatform.getInstance(container).then((components) => {\n conversation = new ConversationPlatform(container, components);\n conversation.initialize();\n container.registerAsync(key, () => conversation);\n return conversation;\n });\n }\n return conversation;\n });\n });\n }\n\n navigateToConversationIfActive(id: string): Promise<void> {\n return readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\n (storedSession) => {\n if (storedSession && storedSession.id === id) {\n if (storedSession.route) {\n const { name, params } = storedSession.route;\n this.router?.navigate(name, params);\n }\n }\n }\n );\n }\n\n setConversationEndedBehavior(behavior: ConversationEndedBehavior) {\n return readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\n (stored) => {\n let storedSession = stored;\n if (storedSession) {\n storedSession.conversationEndedBehavior = behavior;\n } else {\n storedSession = { conversationEndedBehavior: behavior };\n }\n this.sessionInfo = storedSession;\n return (\n (this.storageWriter && this.storageWriter(this.sessionInfo)) ||\n Promise.resolve()\n );\n }\n );\n }\n\n async createController(id: string, options: { rehydrate: boolean }) {\n const storageKey = createSessionStorageKey(id);\n const { agents: storedAgents } = (await readStorage<{ agents: AgentSettings[] }>(\n this.container,\n storageKey\n )) || { agents: [] };\n\n const index = this.controllers.findIndex((c) => c.conversation.id === id);\n let controller;\n if (index > -1) {\n controller = this.controllers[index].conversation;\n } else {\n controller = new ConversationController(this.container, id, options);\n }\n\n controller.setInitialStorage({ agents: storedAgents || [] });\n return controller;\n }\n\n registerProvider(name: string, handler: ConversationHandler): void {\n const provider = {\n name,\n handler,\n };\n this.providers.push(provider);\n // execute provider for all matching controllers\n this.controllers\n .filter((controller) => controller.conversation.providers.indexOf(name) > -1)\n .forEach((controller) => {\n this.invokeHandler(provider, controller);\n });\n }\n\n registerController(\n conversation: ConversationController,\n component: ComponentNodeController\n ): boolean {\n const index = this.controllers.findIndex((c) => c.conversation.id === conversation.id);\n let controller: any;\n if (index < 0) {\n controller = { conversation, component };\n this.controllers.push(controller);\n const invokeHandlers = (providers: string[]) => {\n if (providers) {\n this.providers\n .filter((provider) => providers.indexOf(provider.name) > -1)\n .forEach((provider) => {\n this.invokeHandler(provider, controller);\n });\n }\n };\n\n this.subscriptions.push(\n conversation.onDispose((event, data) => {\n const index = this.controllers.findIndex((c) => c.conversation === data);\n index > -1 && this.controllers.splice(index, 1);\n this.components\n .components()\n .ofType('conversation-return-button')\n .select()\n .writeProperties({ active: false });\n\n this.events.dispatch('conversation:ended', {}, { bubbles: true });\n })\n );\n this.subscriptions.push(\n conversation.onProvidersChange((event, data) => {\n const { added, removed = [] }: { added: string[]; removed: string[] } = data;\n removed.forEach((removedProvider) => {\n (this.disposeProviders[removedProvider] || []).forEach((dispose) => {\n dispose();\n });\n });\n invokeHandlers(added);\n })\n );\n\n this.subscriptions.push(\n conversation.onStarted((event, isActive) => {\n const session: SessionInfo = {\n id: conversation.id,\n route: this.router?.getRouteData(),\n conversationEndedBehavior: this.sessionInfo?.conversationEndedBehavior,\n };\n this.sessionInfo = session;\n this.storageWriter && this.storageWriter(session);\n\n this.writeToComponents({ active: isActive });\n })\n );\n\n this.subscriptions.push(\n conversation.onUnreadMessage((event, data) => {\n this.events.dispatch('conversation:unread-message', data);\n this.writeToComponents({ alert: { show: data } });\n })\n );\n\n invokeHandlers(conversation.providers);\n return true;\n }\n controller = this.controllers[index];\n return false;\n }\n\n private writeToComponents(properties: any, key: string = 'conversationReturnButtonState') {\n if (this.buttonQuery) {\n this.components.write({\n key: 'conversationReturnButtonState',\n attributes: { properties },\n target: this.buttonQuery,\n provider: 'localStorage',\n });\n }\n }\n\n private invokeHandler(provider: ConversationProviderRegistration, controller: any) {\n const dispose = provider.handler(\n controller.conversation.createProvider(provider.name),\n controller.component\n );\n if (dispose) {\n if (!this.disposeProviders[provider.name]) {\n this.disposeProviders[provider.name] = [];\n }\n this.disposeProviders[provider.name].push(dispose);\n }\n }\n\n getComponentRoute() {\n return readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\n (stored) => stored?.route\n );\n }\n\n dispose() {\n Object.keys(this.disposeProviders).forEach((key) => {\n this.disposeProviders[key].forEach((dispose) => {\n dispose();\n });\n });\n this.subscriptions.forEach((unsubscribe) => {\n unsubscribe();\n });\n this.controllers = [];\n this.providers = [];\n }\n\n public static async handleContactMethodClick(\n event: any,\n container: Container,\n contactMethod: any,\n callback?: Function\n ) {\n if (shouldPreventDefault(container)) {\n event.preventDefault();\n let triggerEl = document.getElementById('humany-dynamic-anchor');\n if (!triggerEl) {\n triggerEl = document.createElement('a');\n triggerEl.setAttribute('href', '#');\n triggerEl.id = 'humany-dynamic-anchor';\n document.body.appendChild(triggerEl);\n }\n openChatWidget(container, contactMethod, triggerEl);\n }\n openChatWidget(container, contactMethod);\n }\n\n public static async handleContactMethodSubmit(container: Container, contactMethod: any) {\n if (contactMethod?.body.form.meta?.conversation?.id) {\n // if we already are in a conversational context, we always want to swap\n // the current provider instead of a route navigation\n return swapProvider(\n container,\n contactMethod.body.form.meta.conversation.id,\n contactMethod.clientName\n );\n }\n\n return navigateToConversation(container, contactMethod);\n }\n}\n","import { RoutingService } from '@telia-ace/widget-routing';\nimport { createReactComponent } from '@telia-ace/widget-ui';\nimport { Container } from '@webprovisions/platform';\nimport { ConversationMessage, ConversationMessageType } from '../../conversation-controller';\nimport { ConversationPlatform } from '../../conversation-platform';\nimport { ConversationMessageContent, ConversationMessageSender } from '../../types';\n\nexport type BundledConversationMessage = {\n timestamp: number;\n content: [BundledMessageContent];\n sender: ConversationMessageSender;\n type: ConversationMessageType;\n};\n\ntype BundledMessageContent = {\n key: string;\n} & ConversationMessageContent;\n\nexport type ConversationContent = {\n loading: boolean;\n typingActors: ConversationMessageSender[];\n messages: ConversationMessage[];\n};\n\n/**\n * Group items by sender, type and time. Current grouping threshold is 2000 ms.\n * Put this as a property on either the component or on the provider?\n * Could possibly be implemented directly in the createEntry method\n * of the conversation controller to avoid iterating over the entire array on\n * each update.\n */\nconst groupedMessages = (\n messages: ConversationMessage[],\n timeout?: number\n): BundledConversationMessage[] => {\n return messages.reduce((acc: any[], current: any, index: number) => {\n const newItem = {\n ...current,\n content: [{ ...current.content, key: current.key }],\n };\n if (acc.length > 0 && current.type !== ConversationMessageType.System) {\n const previous = acc[acc.length - 1];\n if (\n (!timeout && timeout !== 0) ||\n Math.abs(previous.timestamp - current.timestamp) < timeout\n ) {\n if (\n previous.sender?.name === current.sender?.name &&\n previous.type === current.type\n ) {\n previous.timestamp = current.timestamp;\n previous.content.push({ ...current.content, key: current.key });\n return acc;\n }\n }\n }\n acc.push(newItem);\n return acc;\n }, []);\n};\n\nexport type ConversationComponentProperties = {\n providers: string[];\n messages: BundledConversationMessage[]; // internal\n overlay?: { conversation: boolean; secondary: boolean }; // internal\n overlayConversationHeader?: string;\n overlayConversationCloseLabel?: string;\n loading: boolean;\n inputPlaceholder: string;\n inputDisabled: boolean;\n inputHidden: boolean;\n inputMultiline: boolean;\n rehydrate?: boolean;\n userLabel: string;\n avatarSize: string;\n typingActors: any[]; // internal\n conversationControllerId?: string; // internal\n sendButtonLabel: string;\n secondaryAction?: { icon?: string; action: string; label: string };\n};\n\nexport const ConversationComponent = (container: Container) => {\n return Promise.all([\n ConversationPlatform.getInstance(container),\n container.getAsync('router'),\n ]).then(([platform, router]: [ConversationPlatform, RoutingService]) => {\n return createReactComponent(\n container,\n 'conversation',\n import('./conversation'),\n async (component) => {\n const { rehydrate = false } =\n component.properties<ConversationComponentProperties>();\n const routeData = router.getRouteData();\n const name = routeData.params.id || component.node.name || 'component';\n const conversation = await platform.createController(name, { rehydrate });\n const isNewController = platform.registerController(conversation, component);\n\n const messageGroupingTimeout = 3 * 60 * 1000;\n\n const setProperties = (properties: ConversationComponentProperties) => {\n const { providers = [] } = properties;\n if (providers) {\n const providerKeys = Array.isArray(providers) ? providers : [providers];\n conversation.setProviders(providerKeys);\n return providerKeys;\n }\n };\n setProperties(component.properties<ConversationComponentProperties>(setProperties));\n\n conversation.setComponentMountedState(true);\n\n const writeMessages = (messageStream: any) => {\n const { loading, typingActors, messages } = messageStream;\n component.writeProperties({\n loading,\n typingActors,\n messages: groupedMessages(messages, messageGroupingTimeout),\n });\n };\n\n writeMessages(conversation.getMessageStream());\n\n if (isNewController) {\n component.writeProperties({ conversationControllerId: conversation.id });\n // todo: dont create actions here, there will be duplicates due to reuseController = true\n component.actions.create('user-submit', (data, options) => {\n if (options) {\n const { preventDefault, validationPromise } = options;\n if (preventDefault) {\n if (validationPromise) {\n validationPromise().then((text: string) => {\n if (text) {\n conversation.user.print(text);\n }\n });\n }\n return;\n }\n }\n conversation.user.print(data.text);\n });\n\n component.actions.create('user-typing', (data, options) => {});\n\n component.actions.create('form', (data, options) => {});\n\n component.actions.create('action', (data, options) => {});\n\n component.actions.create('overlay-mounted', (data, options) => {});\n\n component.actions.create('show-overlay', (data, options) => {\n component.writeProperties({\n overlay: { conversation: false, secondary: false },\n });\n });\n\n component.actions.create('hide-overlay', (data, options) => {\n component.writeProperties({\n overlay: null,\n });\n });\n\n component.actions.create('show-overlay-conversation', (data, options) => {\n component.writeProperties({\n overlay: { conversation: true, secondary: false },\n });\n });\n\n component.actions.create('hide-overlay-conversation', (data, options) => {\n component.writeProperties({\n overlay: { conversation: false, secondary: false },\n });\n });\n }\n\n const unsubscribe = conversation.events.subscribe(\n 'conversation:updated',\n (e: any, conversationData: ConversationContent) => {\n writeMessages(conversationData);\n }\n );\n\n return () => {\n conversation.setComponentMountedState(false);\n unsubscribe();\n if (!conversation.active) {\n // unregisterController();\n // todo: add possibility to dispose this through extendComponent()\n // component.dispose();\n writeMessages({ messages: [], typingActors: [], loading: false });\n }\n };\n },\n { reuseController: true }\n );\n });\n};\n","import { ComponentPlatform } from '@telia-ace/widget-core';\nimport { RoutingService } from '@telia-ace/widget-routing';\nimport { createReactComponent, Symbol } from '@telia-ace/widget-ui';\nimport { Container } from '@webprovisions/platform';\nimport { ConversationPlatform } from '../..';\n\nexport enum ButtonMode {\n flat = 'flat',\n flashing = 'flashing',\n flashingGradient = 'flashingGradient',\n}\n\nexport type ReturnButtonProps = {\n label: string;\n active: boolean;\n mode: ButtonMode;\n alert?: {\n symbol?: Symbol;\n show?: boolean;\n label?: string;\n };\n};\n\nexport const ConversationReturnButtonComponent = (container: Container) => {\n return Promise.all([\n ComponentPlatform.getInstance(container),\n ConversationPlatform.getInstance(container),\n container.getAsync('router'),\n ]).then(\n ([components, platform, router]: [\n ComponentPlatform,\n ConversationPlatform,\n RoutingService\n ]) => {\n return createReactComponent(\n container,\n 'conversation-return-button',\n import('./return-button'),\n (component) => {\n component.actions.create('toggle', (options = {}) => {\n platform.getComponentRoute()?.then((route) => {\n route && router.navigate(route.name, route.params);\n });\n });\n }\n );\n }\n );\n};\n","import { Form, FormBuilder } from '@telia-ace/widget-forms';\nimport { Symbol } from '@telia-ace/widget-ui';\n\nexport type ConversationMessageSettings = {\n key?: string;\n timestamp?: number;\n title?: string;\n body?: string;\n actions?: { [actionKey: string]: any };\n form?: (builder: FormBuilder) => void;\n type?: string;\n items?: ConversationMessageList[];\n [key: string]: any;\n};\n\nexport type NormalizedMessageSettings = {\n content: ConversationMessageContent;\n key: string;\n timestamp: number | null;\n};\n\nexport type ConversationMessageList = {\n header?: string;\n itemKey: string;\n type?: ConversationMessageListType;\n items: ConversationMessageListItem[];\n};\n\nexport type ConversationMessageListItem = {\n icon?: string;\n type?: ConversationMessageListItemType;\n actions?: { [actionKey: string]: any };\n form?: Form;\n body?: string;\n key: string;\n [key: string]: any;\n};\n\nexport type ConversationMessageContent = {\n title?: string;\n body?: string;\n actions?: { [actionKey: string]: any };\n items?: ConverstationMessageItem<any>[];\n form?: Form;\n [key: string]: any;\n};\n\nexport type ConverstationMessageItem<T, R = ItemPayload> = R extends [T, any] ? R : never;\n\nexport type ConversationMessageUpdateSettings = ConversationMessageContent & {\n timestamp?: number;\n};\n\nexport type ConversationMessageSender = {\n name?: string;\n avatar?: string | Symbol;\n id?: string;\n};\n\nexport enum ConversationMessageListType {\n Ordinary = 'ordinary',\n Seperator = 'seperator',\n}\n\nexport enum ConversationMessageListItemType {\n LinkList = 'link-list',\n Separator = 'separator',\n ButtonList = 'button-list',\n Text = 'text',\n HTML = 'html',\n VideoRequest = 'video-request',\n}\n\nexport type LinkListProperties = {\n header?: string;\n actions: { [key: string]: string } | { label: string; actionKey: string; data: any }[];\n};\n\ntype LinkListItem = [ConversationMessageListItemType.LinkList, LinkListProperties];\n\ntype TextItem = [ConversationMessageListItemType.Text, string];\ntype SeparatorItem = [ConversationMessageListItemType.Separator, undefined];\n\nexport type ButtonListProperties = {\n header?: string;\n actions: { [key: string]: string } | { label: string; actionKey: string; data: any }[];\n};\n\ntype ButtonListItem = [ConversationMessageListItemType.ButtonList, ButtonListProperties];\n\nexport type VideoRequestProperties = {\n header?: string;\n acceptLabel: string;\n declineLabel: string;\n};\n\ntype VideoRequestItem = [ConversationMessageListItemType.VideoRequest, VideoRequestProperties];\n\nexport type HtmlProperties = {\n body: string;\n};\n\ntype HtmlItem = [ConversationMessageListItemType.HTML, HtmlProperties];\n\ntype ItemPayload =\n | LinkListItem\n | TextItem\n | SeparatorItem\n | ButtonListItem\n | HtmlItem\n | VideoRequestItem;\n","import { ComponentResolver, ReactComponent } from '@telia-ace/widget-core';\nimport { Container } from '@webprovisions/platform';\nimport { lazy } from 'react';\nimport { ConversationPlatform } from '..';\n\nexport const registerCustomMessageComponent = (\n container: Container,\n type: string,\n component: ReactComponent\n) => {\n return container.getAsync('componentResolver').then(async (o: ComponentResolver) => {\n const platform = await ConversationPlatform.getInstance(container);\n platform.addSubscription(\n o.registerComponent(\n type,\n lazy(() => component)\n )\n );\n });\n};\n"],"names":["Agent","provider","settings","__publicField","options","sender","normalized","getNormalizedMessageSettings","ConversationMessageType","uuid","name","avatar","_a","ConversationProvider","container","controller","storedAgent","agent","__spreadValues","type","key","content","timestamp","unsub","fn","unsubscribe","createSessionStorageKey","id","Locker","unlockNext","willLock","resolve","willUnlock","Store","conversation","enabled","__async","storedAgents","agents","a","providerIndex","storedMessages","message","_","data","__spreadProps","messages","agentId","action","unlock","createStorageWriter","StorageCategory","write","prev","m","newData","readStorage","Store$1","User","swapProvider","conversationId","providerName","components","currentInstance","c","toQueue","conversationQuery","ConversationEntry","writer","builder","FormBuilder","builtForm","removeTypingState","typingActors","senderString","indexToRemove","item","ConversationController","widget","providers","removed","added","acc","providerToRemove","index","p","target","mounted","nextProvider","entry","updated","updatedTimestamp","dismissed","handler","getParentWidget","widgetName","implementation","mainWidgetName","getSeparateWidget","originWidget","mainWidget","trigger","chatWidgetName","chatWidget","shouldPreventDefault","openChatWidget","contactMethod","triggerDOMTarget","closeAllModals","contactMethodsQuery","conversationsQuery","StorageMedium","StorageScope","platform","ConversationEndedBehavior","navigateToConversation","routeName","router","STORAGE_KEY","ConversationPlatform","storedSession","event","initialRoute","_b","_c","sub","lock","value","ComponentPlatform","params","behavior","stored","storageKey","component","invokeHandlers","removedProvider","dispose","isActive","session","properties","callback","triggerEl","groupedMessages","timeout","current","newItem","previous","ConversationComponent","createReactComponent","rehydrate","isNewController","messageGroupingTimeout","setProperties","providerKeys","writeMessages","messageStream","loading","preventDefault","validationPromise","text","e","conversationData","ConversationReturnButtonComponent","route","ConversationMessageListItemType","registerCustomMessageComponent","o","lazy"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@telia-ace/widget-conversation",
3
- "version": "1.0.34-experimental.9",
3
+ "version": "1.0.34",
4
4
  "description": "ACE Widget Conversation Platform",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
6
  "author": "Telia Company AB",
@@ -21,20 +21,20 @@
21
21
  },
22
22
  "sideEffects": false,
23
23
  "dependencies": {
24
- "@telia-ace/widget-core": "1.0.21-experimental.9",
25
- "@telia-ace/widget-forms": "1.0.28-experimental.9",
26
- "@telia-ace/widget-plugins": "1.0.22-experimental.9",
27
- "@telia-ace/widget-routing": "1.0.22-experimental.9",
28
- "@telia-ace/widget-services": "1.0.21-experimental.9",
29
- "@telia-ace/widget-ui": "1.0.28-experimental.9",
30
- "@telia-ace/widget-utilities": "1.0.10-experimental.9",
24
+ "@telia-ace/widget-core": "1.0.21",
25
+ "@telia-ace/widget-forms": "1.0.28",
26
+ "@telia-ace/widget-plugins": "1.0.22",
27
+ "@telia-ace/widget-routing": "1.0.22",
28
+ "@telia-ace/widget-services": "1.0.21",
29
+ "@telia-ace/widget-ui": "1.0.28",
30
+ "@telia-ace/widget-utilities": "1.0.10",
31
31
  "@webprovisions/platform": "^1.1.2"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@emotion/react": "^11.10.5",
35
35
  "@emotion/styled": "^11.10.5",
36
- "@telia-ace/widget-developer-tools": "1.0.16-experimental.9",
37
- "@types/react": "^18.0.26",
36
+ "@telia-ace/widget-developer-tools": "1.0.16",
37
+ "@types/react": "^18.0.27",
38
38
  "react": "^18.2.0"
39
39
  },
40
40
  "peerDependencies": {