@telia-ace/widget-conversation 1.0.36 → 1.0.37-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -0
- package/dist/conversation-controller.d.ts +8 -0
- package/dist/conversation-history.d.ts +26 -0
- package/dist/conversation-provider.d.ts +7 -0
- package/dist/{conversation.bc31361a.js → conversation.d6cacfa5.js} +1 -1
- package/dist/{conversation.bc31361a.js.map → conversation.d6cacfa5.js.map} +1 -1
- package/dist/index.js +332 -233
- package/dist/index.js.map +1 -1
- package/package.json +9 -9
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","__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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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/conversation-history.ts","../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 { EventSubscriptionCancellation, Widget } from '@webprovisions/platform';\nimport {\n ConversationController,\n ConversationMessageType,\n getNormalizedMessageSettings,\n} from './conversation-controller';\nimport { ConversationMessageContent, ConversationMessageSender } from './types';\n\ntype ConversationLogMessage = {\n message?: string;\n options?: string[];\n alias: string;\n source: string;\n timestamp: number | null;\n};\n\nexport class ConversationHistory {\n private cache: Map<string, any> = new Map();\n\n private subscriptions: EventSubscriptionCancellation[] = [];\n\n constructor(private controller: ConversationController) {\n const { events } = controller.container.get('$widget') as Widget;\n\n const unsubscribe = events.subscribe('data-client:fetched', (e, data) => {\n if (data.type === 'contact-method') {\n this.cache.set(data.response.id, data.response);\n }\n });\n this.subscriptions.push(unsubscribe);\n }\n\n getConversationLogs(): ConversationLogMessage[] {\n const logs = this.controller.messages.reduce<ConversationLogMessage[]>((acc, message) => {\n const normalized = getNormalizedMessageSettings(message as any);\n const { key, content, type, sender, timestamp } = normalized.content;\n\n const parsed = this.parseEntry(content, type, sender, timestamp);\n\n if (parsed) {\n acc.push(parsed);\n }\n\n return acc;\n }, []);\n\n return logs;\n }\n\n parseEntry(\n content: ConversationMessageContent,\n type: ConversationMessageType,\n sender?: ConversationMessageSender,\n timestamp?: any | null\n ) {\n const handle = (body: any | any[]) => {\n let options: string[] = [];\n let messagesAsList: string[] = [];\n\n let messageData: any;\n\n // the actual content could also be an array,\n if (Array.isArray(body)) {\n const [_type, data] = body;\n messageData = data;\n } else {\n messageData = body;\n }\n\n const message = this.createMessageContent(messageData);\n if (message.length) {\n messagesAsList = [...messagesAsList, this.createMessageContent(messageData)];\n }\n options = [...options, ...this.createMessageOptions(messageData)];\n\n return {\n messagesAsList,\n options,\n };\n };\n\n let options: string[] = [];\n let messagesAsList: string[] = [];\n\n // a message could be either an array or just the content itself\n if (Array.isArray(content.items)) {\n const { items } = content;\n items.forEach((item) => {\n const res = handle(item);\n options = [...options, ...res.options];\n messagesAsList = [...messagesAsList, ...res.messagesAsList];\n });\n } else {\n const res = handle(content);\n options = [...options, ...res.options];\n messagesAsList = [...messagesAsList, ...res.messagesAsList];\n }\n\n const result: ConversationLogMessage = {\n options: options,\n message: messagesAsList.length ? messagesAsList.join('\\n') : undefined,\n source: this.createMessageSource(type),\n alias: this.createAlias(type, sender),\n timestamp,\n };\n\n return result;\n }\n\n private createMessageSource(type: ConversationMessageType) {\n return type;\n }\n\n private createAlias(type: ConversationMessageType, sender?: ConversationMessageSender) {\n if (type === ConversationMessageType.System) {\n return 'system';\n }\n return sender?.name || 'Me';\n }\n\n private handleContactMethod(contactMethodId: string) {\n if (!this.cache.has(contactMethodId)) {\n return;\n }\n\n const method = this.cache.get(contactMethodId);\n\n let result = '';\n\n result = this.appendText(result, `${method.clientName}:`);\n result = this.appendText(result, method.title);\n if (method.description) {\n result = this.appendText(result, method.title);\n }\n\n return result;\n }\n\n private getDetails(item: any, linebreak = true) {\n if (!item) {\n return '';\n }\n\n const { header, title, label, description, text, html, body, contactMethodId } = item;\n let result = '';\n\n if (contactMethodId) {\n const text = this.handleContactMethod(contactMethodId.toString());\n if (text) {\n result = this.appendText(result, text, linebreak);\n }\n }\n\n if (header) {\n result = this.appendText(result, header, linebreak);\n }\n if (title) {\n result = this.appendText(result, title, linebreak);\n }\n if (description) {\n result = this.appendText(result, description, linebreak);\n }\n if (text) {\n result = this.appendText(result, text, linebreak);\n }\n if (label) {\n result = this.appendText(result, label, linebreak);\n }\n if (html) {\n result = this.appendText(result, html, linebreak);\n }\n if (body) {\n if (typeof body === 'string') {\n result = this.appendText(result, body, linebreak);\n }\n }\n return result;\n }\n\n private createMessageContent(data: any) {\n let message = '';\n\n message = this.getDetails(data);\n\n return message;\n }\n\n private createMessageOptions(data: any): any[] {\n let options = [];\n\n if (data?.actions) {\n options = data.actions.map((option: any) => {\n return this.getDetails(option, false);\n });\n }\n return options;\n }\n\n private appendText(target: string, value: string, linebreak = true) {\n if (linebreak) {\n if (target.length) {\n return `${target}\\n${value}`;\n }\n }\n return target.length ? `${target} ${value}` : value;\n }\n\n dispose() {\n this.subscriptions.forEach((unsubscribe) => {\n unsubscribe();\n });\n }\n}\n","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 getHistory() {\n return this.controller?.getHistory() || [];\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 { ConversationHistory } from './conversation-history';\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 private conversationHistory: ConversationHistory;\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 this.conversationHistory = new ConversationHistory(this);\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.conversationHistory.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 getHistory() {\n return this.conversationHistory.getConversationLogs();\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":["ConversationHistory","controller","__publicField","events","unsubscribe","e","data","acc","message","normalized","getNormalizedMessageSettings","key","content","type","sender","timestamp","parsed","handle","body","options","messagesAsList","messageData","_type","items","item","res","ConversationMessageType","contactMethodId","method","result","linebreak","header","title","label","description","text","html","option","target","value","Agent","provider","settings","uuid","name","avatar","_a","ConversationProvider","container","storedAgent","agent","__spreadValues","unsub","fn","createSessionStorageKey","id","Locker","unlockNext","willLock","resolve","willUnlock","Store","conversation","enabled","__async","storedAgents","agents","a","providerIndex","storedMessages","_","__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","ConversationController","widget","providers","removed","added","providerToRemove","index","p","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","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","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.
|
|
3
|
+
"version": "1.0.37-next.1",
|
|
4
4
|
"description": "ACE Widget Conversation Platform",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.txt",
|
|
6
6
|
"author": "Telia Company AB",
|
|
@@ -21,19 +21,19 @@
|
|
|
21
21
|
},
|
|
22
22
|
"sideEffects": false,
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@telia-ace/widget-core": "1.0.
|
|
25
|
-
"@telia-ace/widget-forms": "1.0.
|
|
26
|
-
"@telia-ace/widget-plugins": "1.0.
|
|
27
|
-
"@telia-ace/widget-routing": "1.0.
|
|
28
|
-
"@telia-ace/widget-services": "1.0.
|
|
29
|
-
"@telia-ace/widget-ui": "1.0.
|
|
30
|
-
"@telia-ace/widget-utilities": "1.0.
|
|
24
|
+
"@telia-ace/widget-core": "1.0.24-next.1",
|
|
25
|
+
"@telia-ace/widget-forms": "1.0.31-next.1",
|
|
26
|
+
"@telia-ace/widget-plugins": "1.0.25-next.1",
|
|
27
|
+
"@telia-ace/widget-routing": "1.0.25-next.1",
|
|
28
|
+
"@telia-ace/widget-services": "1.0.24-next.1",
|
|
29
|
+
"@telia-ace/widget-ui": "1.0.31-next.1",
|
|
30
|
+
"@telia-ace/widget-utilities": "1.0.13-next.1",
|
|
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.
|
|
36
|
+
"@telia-ace/widget-developer-tools": "1.0.19-next.1",
|
|
37
37
|
"@types/react": "^18.0.27",
|
|
38
38
|
"react": "^18.2.0"
|
|
39
39
|
},
|