@telia-ace/widget-conversation 1.0.41 → 1.1.1-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{dist/components → components}/conversation/ui/styles.d.ts +3 -3
- package/conversation-78019545.mjs +1388 -0
- package/conversation-905bdeb3.js +569 -0
- package/{dist/conversation-controller.d.ts → conversation-controller.d.ts} +2 -2
- package/index-1180f4a4.js +1212 -0
- package/index-bfc77c45.mjs +11311 -0
- package/index.js +1 -0
- package/index.mjs +15 -0
- package/package.json +19 -41
- package/return-button-7560bd06.js +93 -0
- package/{dist/return-button-17ecf4af.js → return-button-f3f52295.mjs} +39 -49
- package/use-dispatch-7cf7db21.js +1 -0
- package/use-dispatch-86019505.mjs +24 -0
- package/LICENSE.txt +0 -6
- package/README.md +0 -485
- package/dist/conversation-5f8374bf.js +0 -1376
- package/dist/conversation-5f8374bf.js.map +0 -1
- package/dist/conversation-form-adapter.d.ts +0 -7
- package/dist/index.js +0 -960
- package/dist/index.js.map +0 -1
- package/dist/resolve-entity-value.d.ts +0 -10
- package/dist/return-button-17ecf4af.js.map +0 -1
- /package/{dist/agent.d.ts → agent.d.ts} +0 -0
- /package/{dist/components → components}/conversation/conversation.d.ts +0 -0
- /package/{dist/components → components}/conversation/plugin.d.ts +0 -0
- /package/{dist/components → components}/conversation/ui/content.d.ts +0 -0
- /package/{dist/components → components}/conversation/ui/input.d.ts +0 -0
- /package/{dist/components → components}/conversation/ui/loader.d.ts +0 -0
- /package/{dist/components → components}/conversation/ui/message-list-items/button-list.d.ts +0 -0
- /package/{dist/components → components}/conversation/ui/message-list-items/custom.d.ts +0 -0
- /package/{dist/components → components}/conversation/ui/message-list-items/html.d.ts +0 -0
- /package/{dist/components → components}/conversation/ui/message-list-items/item-list.d.ts +0 -0
- /package/{dist/components → components}/conversation/ui/message-list-items/link-list.d.ts +0 -0
- /package/{dist/components → components}/conversation/ui/message-list-items/separator.d.ts +0 -0
- /package/{dist/components → components}/conversation/ui/message-list-items/text.d.ts +0 -0
- /package/{dist/components → components}/conversation/ui/message-list-items/video-request.d.ts +0 -0
- /package/{dist/components → components}/conversation/ui/message-types/agent.d.ts +0 -0
- /package/{dist/components → components}/conversation/ui/message-types/index.d.ts +0 -0
- /package/{dist/components → components}/conversation/ui/message-types/message-list.d.ts +0 -0
- /package/{dist/components → components}/conversation/ui/message-types/system.d.ts +0 -0
- /package/{dist/components → components}/conversation/ui/message-types/timestamp.d.ts +0 -0
- /package/{dist/components → components}/conversation/ui/message-types/user.d.ts +0 -0
- /package/{dist/components → components}/conversation/ui/message.d.ts +0 -0
- /package/{dist/components → components}/conversation/ui/overlay-outlets.d.ts +0 -0
- /package/{dist/components → components}/return-button/plugin.d.ts +0 -0
- /package/{dist/components → components}/return-button/return-button.d.ts +0 -0
- /package/{dist/conversation-history.d.ts → conversation-history.d.ts} +0 -0
- /package/{dist/conversation-platform.d.ts → conversation-platform.d.ts} +0 -0
- /package/{dist/conversation-provider.d.ts → conversation-provider.d.ts} +0 -0
- /package/{dist/index.d.ts → index.d.ts} +0 -0
- /package/{dist/store.d.ts → store.d.ts} +0 -0
- /package/{dist/types.d.ts → types.d.ts} +0 -0
- /package/{dist/user.d.ts → user.d.ts} +0 -0
- /package/{dist/utils → utils}/custom-message.d.ts +0 -0
- /package/{dist/utils → utils}/index.d.ts +0 -0
- /package/{dist/utils → utils}/map-actions.d.ts +0 -0
- /package/{dist/utils → utils}/open-chat-widget.d.ts +0 -0
- /package/{dist/utils → utils}/swap-provider.d.ts +0 -0
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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 let actions = [];\n\n if (Array.isArray(data?.actions)) {\n actions = data.actions;\n } else if (typeof data?.actions === 'object') {\n actions = Object.entries(data.actions).map(([key, value]) => {\n return {\n actionKey: key,\n label: value,\n };\n });\n }\n\n if (actions.length) {\n options = 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 ItemList = 'item-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 ItemListProperties = {\n header?: string;\n actions: { [key: string]: string } | { label: string; actionKey: string; data: any }[];\n};\n\ntype ItemListItem = [ConversationMessageListItemType.ItemList, ItemListProperties];\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 | ItemListItem;\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","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","actions","value","option","target","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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"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { EventSubscriptionCancellation, Widget } from '@webprovisions/platform';
|
|
2
|
-
export type EntityValueResolver = (value: any) => void;
|
|
3
|
-
export type ResolveEntityValueHandler = (resolve: EntityValueResolver, originalValue: any) => any | Promise<any>;
|
|
4
|
-
/**
|
|
5
|
-
* Registers a handler to resolve entity values initiated by the backend service.
|
|
6
|
-
* @param widget Widget to resolve the entity value for.
|
|
7
|
-
* @param name Name of entity to resolve.
|
|
8
|
-
* @param handler Handler for resolving value.
|
|
9
|
-
*/
|
|
10
|
-
export declare const resolveEntityValue: (widget: Widget, name: string, handler: ResolveEntityValueHandler) => EventSubscriptionCancellation;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"return-button-17ecf4af.js","sources":["../src/components/return-button/return-button.tsx"],"sourcesContent":["// import { Component } from '@telia-ace/widget-types-grid';\nimport { css, keyframes } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport { Theme } from '@telia-ace/widget-core';\nimport {\n borderTabStyle,\n Button,\n SymbolBadge,\n useDispatch,\n useProperties,\n} from '@telia-ace/widget-ui';\nimport React from 'react';\nimport { ReturnButtonProps } from './plugin';\n\ntype Props = {\n className: string;\n};\n\nconst ReturnButton: React.FC<Props> = ({ className, ...other }) => {\n const { label, active, mode = 'flat', alert = {} } = useProperties<ReturnButtonProps>();\n const { symbol, label: alertLabel, show: showAlert } = alert;\n // const [showAlert, setShowAlert] = useState(show);\n const dispatch = useDispatch();\n\n if (!active) {\n return null;\n }\n\n return (\n <StyledHighlightedButton\n className={className}\n mode={mode}\n aria-label={label}\n onClick={() => {\n dispatch('toggle');\n }}\n >\n <StyledLabel>{label}</StyledLabel>\n {symbol && (\n <StyledIconHolder showAlert={showAlert}>\n <SymbolBadge symbol={symbol} title={alertLabel} size={20}></SymbolBadge>\n </StyledIconHolder>\n )}\n </StyledHighlightedButton>\n );\n};\n\nconst FlashingColorAnimation = (props: any) => keyframes`\n 0% {\n background-color: ${props.theme.colors?.primary};\n }\n 50% {\n background-color: ${props.theme.colors?.accent};\n }\n 100 {\n background-color: ${props.theme.colors?.primary};\n }\n`;\n\nconst ScrollingGradientAnimation = keyframes`\n 0% {\n background-position:0% 51%\n }\n 50% {\n background-position:100% 0%\n }\n 100% {\n background-position:0% 51%\n }\n`;\n\nconst PulsatingIcon = keyframes`\n 0% {\n transform: rotate(0deg) scale(1.00);\n }\n 50% {\n transform: rotate(0deg) scale(1.00);\n }\n 55% {\n transform: rotate(-3deg) scale(0.80);\n }\n 60% {\n transform: rotate(-3deg) scale(0.80);\n }\n 65% {\n transform: rotate(3deg) scale(1.20);\n }\n 70% {\n transform: rotate(-3deg) scale(1.20);\n }\n 75% {\n transform: rotate(3deg) scale(1.20);\n }\n 80% {\n transform: rotate(-3deg) scale(1.20);\n }\n 85% {\n transform: rotate(3deg) scale(1.20);\n }\n 90% {\n transform: rotate(-3deg) scale(1.20);\n }\n 95% {\n transform: rotate(3deg) scale(1.20);\n }\n 100% {\n transform: rotate(0deg) scale(1);\n }\n`;\n\nconst StyledIconHolder = styled.span<any>`\n flex-grow: 0;\n transform: translateX(${(p) => (p.showAlert ? '0px' : '50px')});\n opacity: ${(p) => (p.showAlert ? 1 : 0)};\n transition: transform 0.5s ease, opacity 0.3s ease;\n`;\n\nconst StyledLabel = styled.span<any>`\n flex: 1;\n font-weight: 300;\n`;\n\nconst flashingStyle = (p: { theme: Theme }) => css`\n animation: ${FlashingColorAnimation(p)} 1s ease infinite;\n`;\n\nconst flashingGradientStyle = (p: { theme: Theme }) => css`\n background: linear-gradient(155deg, ${p.theme.colors?.primary}, ${p.theme.colors?.accent});\n background-position: 0px 0px;\n background-size: 200% 200%;\n animation: ${ScrollingGradientAnimation} 1.5s ease infinite;\n`;\n\nconst StyledHighlightedButton = styled(Button)<any>`\n overflow: hidden;\n padding: ${(p) => p.theme.sizes?.large};\n border-radius: ${(p) => p.theme.borderRadius};\n color: ${(p) => p.theme.colors?.text};\n ${(p) =>\n p.mode === 'flashing'\n ? flashingStyle\n : p.mode === 'flashingGradient'\n ? flashingGradientStyle\n : ''}\n background-color: ${(p) => p.theme.colors?.primary};\n display: flex;\n align-items: center;\n justify-content: center;\n i,\n svg {\n animation: ${PulsatingIcon} 3s ease infinite;\n }\n\n &:focus-visible {\n ${(p) => borderTabStyle(p)}\n background: ${(p) => p.theme.colors?.text};\n color: ${(p) => p.theme.colors?.primary};\n }\n`;\n\nexport default ReturnButton;\n"],"names":["ReturnButton","_a","_b","className","other","__objRest","label","active","mode","alert","useProperties","symbol","alertLabel","showAlert","dispatch","useDispatch","React","StyledHighlightedButton","StyledLabel","StyledIconHolder","SymbolBadge","FlashingColorAnimation","props","keyframes","_c","ScrollingGradientAnimation","PulsatingIcon","styled","p","flashingStyle","css","flashingGradientStyle","Button","borderTabStyle"],"mappings":"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"}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/{dist/components → components}/conversation/ui/message-list-items/video-request.d.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|