@telia-ace/widget-conversation 1.0.15 → 1.0.16
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/LICENSE.txt +5 -5
- package/README.md +307 -256
- package/dist/agent.d.ts +17 -17
- package/dist/conversation-controller.d.ts +88 -88
- package/dist/conversation-form-adapter.d.ts +7 -7
- package/dist/conversation-platform.d.ts +50 -50
- package/dist/conversation-provider.d.ts +22 -22
- package/dist/conversation.js +783 -5
- package/dist/conversation.js.map +1 -1
- package/dist/index.d.ts +9 -9
- package/dist/index.js +868 -9
- package/dist/index.js.map +1 -1
- package/dist/resolve-entity-value.d.ts +10 -10
- package/dist/return-button.js.map +1 -1
- package/dist/types.d.ts +95 -110
- package/dist/ui/conversation/conversation-component.d.ts +37 -37
- package/dist/ui/conversation/conversation-content.d.ts +11 -12
- package/dist/ui/conversation/conversation-input.d.ts +6 -6
- package/dist/ui/conversation/conversation-loader.d.ts +8 -8
- package/dist/ui/conversation/conversation-message.d.ts +7 -7
- package/dist/ui/conversation/conversation-styles.d.ts +11 -11
- package/dist/ui/conversation/conversation.d.ts +6 -6
- package/dist/ui/conversation/index.d.ts +2 -3
- package/dist/ui/conversation/message-types/agent.d.ts +11 -11
- package/dist/ui/conversation/message-types/custom-message-list-item.d.ts +9 -9
- package/dist/ui/conversation/message-types/custom.d.ts +9 -9
- package/dist/ui/conversation/message-types/index.d.ts +5 -5
- package/dist/ui/conversation/message-types/system.d.ts +12 -12
- package/dist/ui/conversation/message-types/timestamp.d.ts +8 -8
- package/dist/ui/conversation/message-types/user.d.ts +8 -8
- package/dist/ui/index.d.ts +2 -2
- package/dist/ui/return-button/index.d.ts +2 -2
- package/dist/ui/return-button/return-button-component.d.ts +19 -19
- package/dist/ui/return-button/return-button.d.ts +6 -6
- package/dist/user.d.ts +7 -7
- package/dist/utils/custom-message.d.ts +3 -3
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/open-chat-widget.d.ts +4 -4
- package/package.json +8 -8
- package/dist/index2.js +0 -1678
- package/dist/index2.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/agent.ts","../src/conversation-provider.ts","../src/user.ts","../src/conversation-controller.ts","../src/utils/open-chat-widget.ts","../src/utils/custom-message.ts","../src/conversation-platform.ts","../src/types.ts","../src/ui/conversation/conversation-component.ts","../src/ui/return-button/return-button-component.ts"],"sourcesContent":["import { Symbol } from '@telia-ace/widget-ui';\r\nimport {\r\n ConversationEntry,\r\n ConversationMessageType,\r\n getNormalizedMessageSettings,\r\n} from './conversation-controller';\r\nimport { ConversationProvider } from './conversation-provider';\r\nimport {\r\n ConversationMessageSender,\r\n ConversationMessageSettings,\r\n ConverstationMessageItem,\r\n} from './types';\r\n\r\nexport type AgentSettings = {\r\n name?: string;\r\n avatar?: string | Symbol;\r\n};\r\n\r\nexport class Agent {\r\n name?: string;\r\n avatar?: string | Symbol;\r\n\r\n constructor(private provider: ConversationProvider, settings: AgentSettings) {\r\n this.name = settings.name;\r\n this.avatar = settings.avatar;\r\n }\r\n\r\n print = (\r\n settings:\r\n | string\r\n | ConversationMessageSettings\r\n | ConverstationMessageItem<any>\r\n | ConverstationMessageItem<any>[]\r\n ): ConversationEntry | undefined => {\r\n const sender: ConversationMessageSender = { name: this.name, avatar: this.avatar };\r\n const normalized = getNormalizedMessageSettings(settings);\r\n\r\n return this.provider.createEntry(\r\n normalized.key,\r\n normalized.content,\r\n ConversationMessageType.Agent,\r\n sender,\r\n normalized.timestamp\r\n );\r\n };\r\n typing = () => {\r\n return this.provider.setTypingState({ name: this.name, avatar: this.avatar });\r\n };\r\n\r\n update(settings: AgentSettings): void {\r\n const { name, avatar } = settings;\r\n if (avatar === null) {\r\n this.avatar = undefined;\r\n } else if (avatar) {\r\n this.avatar = avatar;\r\n }\r\n\r\n if (name === null) {\r\n this.name = undefined;\r\n } else if (name) {\r\n this.name = name;\r\n }\r\n }\r\n}\r\n","import {\r\n Container,\r\n EventListener,\r\n EventObject,\r\n EventSubscriptionCancellation,\r\n} from '@webprovisions/platform';\r\nimport { Agent, AgentSettings } from './agent';\r\nimport {\r\n CancelLoaderDelegate,\r\n ConversationController,\r\n ConversationEntry,\r\n ConversationMessageType,\r\n} from './conversation-controller';\r\nimport {\r\n ConversationMessageContent,\r\n ConversationMessageSender,\r\n ConversationMessageSettings,\r\n} from './types';\r\n\r\nexport class ConversationProvider {\r\n private subscriptions: EventSubscriptionCancellation[] = [];\r\n public user: any;\r\n\r\n private constructor(\r\n public name: string,\r\n private container: Container,\r\n public controller: ConversationController | null\r\n ) {\r\n this.user = controller?.user;\r\n }\r\n\r\n static create(name: string, container: Container, controller: ConversationController) {\r\n return new ConversationProvider(name, container, controller);\r\n }\r\n\r\n createAgent(settings: AgentSettings = {}): Agent | undefined {\r\n if (this.controller) {\r\n return new Agent(this, settings);\r\n }\r\n }\r\n\r\n print(settings: string | ConversationMessageSettings): ConversationEntry | undefined {\r\n return this.controller?.print(settings);\r\n }\r\n\r\n setTypingState(sender: ConversationMessageSender, type?: ConversationMessageType) {\r\n return this.controller?.setTypingState(sender, type);\r\n }\r\n\r\n loading(): CancelLoaderDelegate {\r\n if (!this.controller) {\r\n return () => () => {};\r\n }\r\n return this.controller.loader();\r\n }\r\n\r\n createEntry(\r\n key: string,\r\n content: ConversationMessageContent,\r\n type: ConversationMessageType,\r\n sender?: ConversationMessageSender,\r\n timestamp?: number | null\r\n ) {\r\n return this.controller?.createEntry(key, content, type, sender, timestamp);\r\n }\r\n\r\n dispose() {\r\n if (process.env.NODE_ENV !== 'production') {\r\n console.log(`conversation-provider: dispose (${this.name})`);\r\n }\r\n this.controller?.disposeProvider(this);\r\n this.controller = null;\r\n this.subscriptions.forEach((unsub) => unsub());\r\n }\r\n\r\n onUnreadMessage(fn: EventListener): EventSubscriptionCancellation | void {\r\n if (this.controller) {\r\n const unsubscribe = this.controller?.onUnreadMessage(fn);\r\n this.subscriptions.push(unsubscribe);\r\n return () => {\r\n unsubscribe();\r\n };\r\n }\r\n }\r\n\r\n onMounted(fn: EventListener): EventSubscriptionCancellation | void {\r\n if (this.controller) {\r\n const unsubscribe = this.controller?.events.subscribe(\r\n 'conversation:component-mount-changed',\r\n fn\r\n );\r\n this.subscriptions.push(unsubscribe);\r\n fn({} as EventObject, this.controller.getComponentMountedState());\r\n return () => {\r\n unsubscribe();\r\n };\r\n }\r\n }\r\n}\r\n\r\nexport default ConversationProvider;\r\n","import {\r\n ConversationController,\r\n ConversationEntry,\r\n ConversationMessageType,\r\n getNormalizedMessageSettings,\r\n} from './conversation-controller';\r\nimport { ConversationMessageSettings } from './types';\r\n\r\nexport class User {\r\n constructor(private controller: ConversationController) {}\r\n\r\n print = (settings: string | ConversationMessageSettings): ConversationEntry => {\r\n const normalized = getNormalizedMessageSettings(settings);\r\n return this.controller.createEntry(\r\n normalized.key,\r\n normalized.content,\r\n ConversationMessageType.User,\r\n undefined,\r\n normalized.timestamp\r\n );\r\n };\r\n}\r\n","import { FormBuilder } from '@telia-ace/widget-forms';\r\nimport { uuid } from '@telia-ace/widget-utilities';\r\nimport { Container, EventListener, EventManager, Widget } from '@webprovisions/platform';\r\nimport { ConversationProvider } from './conversation-provider';\r\nimport {\r\n ConversationMessageContent,\r\n ConversationMessageSender,\r\n ConversationMessageSettings,\r\n ConversationMessageUpdateSettings,\r\n ConverstationMessageItem,\r\n NormalizedMessageSettings,\r\n} from './types';\r\nimport { User } from './user';\r\nexport type ValidateHandler = (formValues: { [key: string]: any }) => Promise<any>;\r\n\r\nexport type SubmitHandler = (formValues: { [key: string]: any }) => Promise<any>;\r\n\r\nexport type Print = (content: string | ConversationMessageContent) => ConversationEntry;\r\n\r\nexport type FormHandlers = { [key: string]: FormHandler };\r\nexport type FormHandler = { validate?: ValidateHandler; submit: SubmitHandler };\r\n\r\nexport type CancelLoaderDelegate = () => void;\r\n\r\nexport class ConversationEntry {\r\n constructor(private writer: EntryWriter) {}\r\n\r\n update(\r\n content:\r\n | string\r\n | ConversationMessageUpdateSettings\r\n | ConverstationMessageItem<any>\r\n | ConverstationMessageItem<any>[]\r\n ) {\r\n const normalized = this.getNormalizedSettings(content);\r\n // const normalized = typeof content === 'string' ? { body: content } : content;\r\n this.writer(<ConversationMessageUpdateSettings>normalized);\r\n }\r\n\r\n remove() {\r\n this.writer(null);\r\n }\r\n\r\n private getNormalizedSettings(\r\n content:\r\n | string\r\n | ConversationMessageUpdateSettings\r\n | ConverstationMessageItem<any>\r\n | ConverstationMessageItem<any>[]\r\n ) {\r\n if (typeof content === 'string') return { body: content };\r\n else if (content.length > -1 && typeof content === 'object') return { items: content };\r\n else return content;\r\n }\r\n}\r\n\r\nexport enum ConversationMessageType {\r\n User = 'user',\r\n Agent = 'agent',\r\n System = 'system',\r\n}\r\n\r\nexport type ConversationMessage = {\r\n key: string;\r\n timestamp: number | null;\r\n content: ConversationMessageContent | null;\r\n sender: ConversationMessageSender | null;\r\n type: ConversationMessageType;\r\n};\r\n\r\nexport type EntryWriter = (content: ConversationMessageUpdateSettings | null) => void;\r\n\r\nexport const getNormalizedMessageSettings = (\r\n settings:\r\n | string\r\n | ConversationMessageSettings\r\n | ConverstationMessageItem<any>\r\n | ConverstationMessageItem<any>[]\r\n): NormalizedMessageSettings => {\r\n let content: ConversationMessageContent;\r\n let key = uuid();\r\n let timestamp: number | null = Date.now();\r\n\r\n if (Array.isArray(settings) && settings.length > -1) {\r\n if (typeof settings[0] === 'string') {\r\n content = { items: [<ConverstationMessageItem<any>>settings] };\r\n } else {\r\n content = { items: <ConverstationMessageItem<any>[]>settings };\r\n }\r\n } else if (typeof settings === 'string') {\r\n content = { body: settings };\r\n } else {\r\n settings = <ConversationMessageSettings>settings || {};\r\n\r\n if (settings.type) {\r\n content = {\r\n ...(<any>settings),\r\n };\r\n } else {\r\n content = {\r\n body: settings.body,\r\n actions: settings.actions,\r\n title: settings.title,\r\n };\r\n if (settings.key) {\r\n key = settings.key;\r\n }\r\n if (settings.timestamp) {\r\n timestamp = settings.timestamp;\r\n }\r\n if (settings.form) {\r\n const builder = FormBuilder.create(key);\r\n settings.form(builder);\r\n const builtForm = builder.get();\r\n content.form = builtForm;\r\n }\r\n if (settings.timestamp === null) {\r\n timestamp = null;\r\n }\r\n }\r\n }\r\n return { content, key, timestamp };\r\n};\r\n\r\nconst removeTypingState = (\r\n typingActors: ConversationMessageSender[],\r\n sender?: ConversationMessageSender\r\n) => {\r\n if (!sender) {\r\n return;\r\n }\r\n const senderString = JSON.stringify(sender);\r\n const indexToRemove = typingActors.findIndex((item) => {\r\n return senderString === JSON.stringify(item);\r\n });\r\n if (indexToRemove > -1) {\r\n return typingActors.splice(indexToRemove, 1);\r\n }\r\n};\r\n\r\n/**\r\n * Manages the stream of messages inside a `ConversationComponent` and provides external read-write\r\n * access to it as well as exposing emitted actions.\r\n */\r\nexport class ConversationController {\r\n formHandlers: FormHandlers = {};\r\n\r\n /**\r\n * Represents the current end user.\r\n */\r\n user: User = new User(this);\r\n\r\n events: EventManager;\r\n\r\n providers: string[] = [];\r\n\r\n active: boolean = false;\r\n\r\n private registeredProviders: ConversationProvider[] = [];\r\n\r\n private loaders: number = 0;\r\n private componentMounted: boolean = false;\r\n\r\n messages: ConversationMessage[] = [];\r\n private typingActors: ConversationMessageSender[] = [];\r\n\r\n constructor(public container: Container, public id: string) {\r\n const widget: Widget = container.get('$widget');\r\n this.events = widget.events.createChild(this);\r\n }\r\n\r\n setProviders(providers: string[]) {\r\n const removed: string[] = [];\r\n const added: string[] = [];\r\n\r\n // remove\r\n this.providers\r\n .reduce<string[]>((acc, provider) => {\r\n if (providers.indexOf(provider) === -1) {\r\n acc.push(provider);\r\n }\r\n return acc;\r\n }, [])\r\n .forEach((providerToRemove) => {\r\n const indexToRemove = this.providers.indexOf(providerToRemove);\r\n if (indexToRemove > -1) {\r\n removed.push(providerToRemove);\r\n this.providers.splice(indexToRemove, 1);\r\n }\r\n });\r\n\r\n // add\r\n providers.forEach((provider) => {\r\n if (this.providers.indexOf(provider) === -1) {\r\n added.push(provider);\r\n this.providers.push(provider);\r\n }\r\n });\r\n\r\n if (added.length || removed.length) {\r\n this.events.dispatch('conversation:providers-changed', { added, removed });\r\n }\r\n }\r\n\r\n createProvider(name: string): ConversationProvider {\r\n const index = this.providerIndex(name);\r\n if (index > -1) {\r\n return this.registeredProviders[index];\r\n }\r\n const provider = ConversationProvider.create(name, this.container, this);\r\n this.registeredProviders.push(provider);\r\n return provider;\r\n }\r\n\r\n providerIndex(name: string) {\r\n return this.registeredProviders.findIndex((p) => p.name === name);\r\n }\r\n\r\n dispose() {\r\n this.registeredProviders.forEach((provider) => provider.dispose());\r\n this.messages = [];\r\n this.events.dispatch('conversation:controller-disposed', this);\r\n this.active = false;\r\n }\r\n\r\n onDispose(fn: EventListener) {\r\n return this.events.subscribe('conversation:controller-disposed', fn);\r\n }\r\n\r\n onStarted(fn: EventListener) {\r\n return this.events.subscribe('conversation:started', fn);\r\n }\r\n\r\n disposeProvider(target: ConversationProvider) {\r\n const index = this.providerIndex(target.name);\r\n index > -1 && this.registeredProviders.splice(index, 1);\r\n this.events.dispatch('conversation:providers-changed', { removed: [target.name] });\r\n if (!this.registeredProviders.length) {\r\n this.dispose();\r\n }\r\n }\r\n\r\n onProvidersChange(fn: EventListener) {\r\n return this.events.subscribe('conversation:providers-changed', fn);\r\n }\r\n\r\n setComponentMountedState(mounted: boolean) {\r\n if (this.componentMounted === mounted) {\r\n return;\r\n }\r\n this.componentMounted = mounted;\r\n if (mounted) {\r\n this.events.dispatch('conversation:unread-message', false);\r\n this.events.dispatch('conversation:started', true);\r\n this.active = true;\r\n }\r\n this.events.dispatch('conversation:component-mount-changed', mounted);\r\n }\r\n\r\n getComponentMountedState() {\r\n return this.componentMounted;\r\n }\r\n\r\n onUnreadMessage(fn: EventListener) {\r\n return this.events.subscribe('conversation:unread-message', fn);\r\n }\r\n\r\n createEntry(\r\n key: string,\r\n content: ConversationMessageContent,\r\n type: ConversationMessageType,\r\n sender?: ConversationMessageSender,\r\n timestamp?: number | null\r\n ): ConversationEntry {\r\n const message: ConversationMessage = {\r\n key,\r\n content,\r\n type,\r\n sender: sender || null,\r\n timestamp: timestamp || timestamp === null ? timestamp : Date.now(),\r\n };\r\n this.messages.push(message);\r\n message.type === ConversationMessageType.Agent &&\r\n removeTypingState(this.typingActors, sender);\r\n const entry = new ConversationEntry((updated) => {\r\n if (updated !== null) {\r\n const { timestamp: updatedTimestamp = undefined, ...content } = updated;\r\n message.content = content;\r\n if (updatedTimestamp) {\r\n message.timestamp = updatedTimestamp;\r\n }\r\n } else {\r\n const indexToRemove = this.messages.indexOf(message);\r\n message.content = null;\r\n if (indexToRemove > -1) {\r\n this.messages.splice(indexToRemove, 1);\r\n }\r\n }\r\n this.events.dispatch('conversation:message-updated', { message });\r\n this.update();\r\n });\r\n this.events.dispatch('conversation:message-created', { message });\r\n this.update();\r\n if (!this.componentMounted) {\r\n this.events.dispatch('conversation:unread-message', true);\r\n }\r\n return entry;\r\n }\r\n\r\n print = (settings: string | ConversationMessageSettings): ConversationEntry => {\r\n const normalized = getNormalizedMessageSettings(settings);\r\n\r\n return this.createEntry(\r\n normalized.key,\r\n normalized.content,\r\n ConversationMessageType.System,\r\n undefined,\r\n normalized.timestamp\r\n );\r\n };\r\n\r\n update() {\r\n this.events.dispatch('conversation:updated', {\r\n messages: this.messages,\r\n loading: this.loaders > 0,\r\n typingActors: this.typingActors,\r\n });\r\n }\r\n\r\n getMessageStream() {\r\n return {\r\n messages: this.messages,\r\n loading: this.loaders > 0,\r\n typingActors: this.typingActors,\r\n };\r\n }\r\n\r\n setTypingState(sender: ConversationMessageSender, type?: ConversationMessageType) {\r\n if (this.typingActors.indexOf(sender) === -1) {\r\n this.typingActors.push(sender);\r\n this.update();\r\n }\r\n\r\n return () => {\r\n removeTypingState(this.typingActors, sender);\r\n this.update();\r\n };\r\n }\r\n\r\n /**\r\n * Displays a loader in the conversation.\r\n */\r\n loader(): CancelLoaderDelegate {\r\n this.loaders = this.loaders + 1;\r\n let dismissed = false;\r\n if (this.loaders === 1) {\r\n this.update();\r\n }\r\n return () => {\r\n if (!dismissed) {\r\n dismissed = true;\r\n this.loaders = this.loaders - 1;\r\n if (this.loaders === 0) {\r\n this.update();\r\n }\r\n }\r\n };\r\n }\r\n\r\n submitForm(key: string, handler: SubmitHandler) {\r\n this.formHandlers[key] = { ...this.formHandlers[key], submit: handler };\r\n }\r\n\r\n validateForm(key: string, handler: ValidateHandler) {\r\n this.formHandlers[key] = { ...this.formHandlers[key], validate: handler };\r\n }\r\n}\r\n","import { ComponentPlatform, WidgetSettings } from '@telia-ace/widget-core';\r\nimport { closeAllModals } from '@telia-ace/widget-plugins';\r\nimport {\r\n createStorageWriter,\r\n StorageCategory,\r\n StorageMedium,\r\n StorageScope,\r\n} from '@telia-ace/widget-services';\r\nimport { Container, Implementation, Widget } from '@webprovisions/platform';\r\nimport { ConversationEndedBehavior, ConversationPlatform } from '../';\r\n\r\nconst getParentWidget = (widgetName: string, implementation: Implementation) => {\r\n const mainWidgetName = widgetName.split('_contact');\r\n return implementation.widgets.get(mainWidgetName[0]);\r\n};\r\n\r\nconst getSeparateWidget = (container: Container) => {\r\n const originWidget = container.get('$widget');\r\n const { name, implementation }: Widget = container.get('$widget');\r\n\r\n const mainWidget =\r\n name.indexOf('_contact') > -1 ? getParentWidget(name, implementation) : originWidget;\r\n const { data }: WidgetSettings = container.get('$settings');\r\n const { trigger }: WidgetSettings = mainWidget.container.get('$settings');\r\n const chatWidgetName = `${name\r\n .replace('_contact-method', '')\r\n .replace('_contact', '')}_contact-method`;\r\n\r\n const chatWidget = implementation.widgets.get(chatWidgetName);\r\n if (chatWidget && !trigger) {\r\n return { chatWidget, mainWidget, data };\r\n }\r\n return { mainWidget, data };\r\n};\r\n\r\nexport const shouldPreventDefault = (container: Container) => {\r\n const { chatWidget } = getSeparateWidget(container);\r\n return !!chatWidget;\r\n};\r\n\r\nexport const openChatWidget = (\r\n container: Container,\r\n contactMethod: any /*ContactMethodType*/,\r\n triggerDOMTarget?: HTMLElement\r\n) => {\r\n const { mainWidget, data, chatWidget } = getSeparateWidget(container);\r\n\r\n if (chatWidget) {\r\n if (chatWidget.state === 'activated') {\r\n return chatWidget.invoke('open').then(() => {\r\n chatWidget.container.getAsync('conversation').then((conversation) => {\r\n conversation\r\n .navigateToConversationIfActive(contactMethod.id)\r\n .then(() => closeAllModals(container));\r\n });\r\n });\r\n }\r\n return chatWidget\r\n .activate()\r\n .then(() => {\r\n const { trigger } = chatWidget.container.get('$settings');\r\n trigger.action = 'hide'; // could be default in configuration\r\n return chatWidget\r\n .invoke('setSettings', () => ({\r\n data,\r\n trigger,\r\n activate: true,\r\n }))\r\n .then(() => {\r\n return chatWidget.container\r\n .getAsync('components')\r\n .then((components: ComponentPlatform) => {\r\n /**\r\n * Could cause issues if target widget is no longer as specific for this use case\r\n */\r\n const contactMethodsQuery = components\r\n .components()\r\n .ofType('contact-method');\r\n components.write({\r\n key: 'setContactMethodId',\r\n attributes: {\r\n properties: {\r\n id: contactMethod.id,\r\n guideId: contactMethod.guideId,\r\n },\r\n },\r\n target: contactMethodsQuery,\r\n provider: 'localStorage',\r\n });\r\n const conversationsQuery = components\r\n .components()\r\n .ofType('conversation');\r\n components.write({\r\n key: 'setConversationProvider',\r\n attributes: {\r\n properties: { providers: [contactMethod.clientName] },\r\n },\r\n target: conversationsQuery,\r\n provider: 'localStorage',\r\n });\r\n });\r\n });\r\n })\r\n .then(() => {\r\n return chatWidget.invoke('attach', {\r\n key: 'contact-method',\r\n triggerDOMElement: triggerDOMTarget,\r\n withRenderState: 'open',\r\n });\r\n })\r\n .then(() => {\r\n createStorageWriter(\r\n chatWidget.container,\r\n 'activeStickyWidget',\r\n StorageCategory.Necessary,\r\n {\r\n medium: StorageMedium.Local,\r\n scope: StorageScope.Implementation,\r\n }\r\n ).then((write) => write(chatWidget.name));\r\n\r\n return chatWidget.container\r\n .getAsync('conversation')\r\n .then((platform) => {\r\n platform.setConversationEndedBehavior(ConversationEndedBehavior.Deactivate);\r\n })\r\n .then(() => closeAllModals(container))\r\n .then(() => false);\r\n });\r\n }\r\n mainWidget.container.getAsync('conversation').then((platform: ConversationPlatform) => {\r\n return platform\r\n .navigateToConversationIfActive(contactMethod.id)\r\n .then(() => platform.setConversationEndedBehavior(ConversationEndedBehavior.Navigate));\r\n });\r\n return chatWidget ? false : true;\r\n};\r\n\r\nexport const navigateToConversation = (\r\n container: Container,\r\n contactMethod: any /*ContactMethodType*/,\r\n routeName = 'conversation'\r\n) => {\r\n const { mainWidget, chatWidget } = getSeparateWidget(container);\r\n if (chatWidget) {\r\n return chatWidget.container.getAsync('router').then((router: any) => {\r\n router.navigate(routeName, { id: contactMethod.id });\r\n });\r\n }\r\n\r\n return mainWidget.container.getAsync('conversation').then((platform: ConversationPlatform) => {\r\n platform.setConversationEndedBehavior(ConversationEndedBehavior.Navigate)?.then(() => {\r\n mainWidget.container.getAsync('router').then((router: any) => {\r\n mainWidget.container\r\n .getAsync('components')\r\n .then((components: ComponentPlatform) => {\r\n const conversationQuery = components.components().ofType('conversation');\r\n components.write({\r\n key: 'setConversationProvider',\r\n attributes: { properties: { providers: [contactMethod.clientName] } },\r\n target: conversationQuery,\r\n provider: 'localStorage',\r\n });\r\n })\r\n .then(() => {\r\n router.navigate(routeName, { id: contactMethod.id });\r\n });\r\n });\r\n });\r\n });\r\n};\r\n","import { ComponentResolver, ReactComponent } from '@telia-ace/widget-core';\r\nimport { Container } from '@webprovisions/platform';\r\nimport { lazy } from 'react';\r\nimport { ConversationPlatform } from '..';\r\n\r\nexport const registerCustomMessageComponent = (\r\n container: Container,\r\n type: string,\r\n component: ReactComponent\r\n) => {\r\n return container.getAsync('componentResolver').then(async (o: ComponentResolver) => {\r\n const platform = await ConversationPlatform.getInstance(container);\r\n platform.addSubscription(\r\n o.registerComponent(\r\n type,\r\n lazy(() => component)\r\n )\r\n );\r\n });\r\n};\r\n","import {\r\n ComponentNodeController,\r\n ComponentPlatform,\r\n ComponentQuery,\r\n ReactComponent,\r\n} from '@telia-ace/widget-core';\r\nimport { RouteData, RoutingService } from '@telia-ace/widget-routing';\r\nimport {\r\n createStorageWriter,\r\n readStorage,\r\n StorageCategory,\r\n StorageMedium,\r\n StorageWriter,\r\n} from '@telia-ace/widget-services';\r\nimport { lock } from '@telia-ace/widget-utilities';\r\nimport {\r\n Container,\r\n EventManager,\r\n EventSubscriptionCancellation,\r\n Widget,\r\n} from '@webprovisions/platform';\r\nimport { ConversationController } from './conversation-controller';\r\nimport { ConversationProvider } from './conversation-provider';\r\nimport { navigateToConversation, openChatWidget, shouldPreventDefault } from './utils';\r\nimport { registerCustomMessageComponent } from './utils/custom-message';\r\n\r\nconst STORAGE_KEY = 'conversations';\r\n\r\nexport type ConversationHandler = (\r\n conversation: ConversationProvider,\r\n component: ComponentNodeController\r\n) => void | (() => void);\r\n\r\nexport type UnregisterControllerDelegate = () => void;\r\n\r\nexport type ConversationProviderRegistration = {\r\n name: string;\r\n handler: ConversationHandler;\r\n};\r\n\r\nexport enum ConversationEndedBehavior {\r\n Deactivate = 'deactivate',\r\n Navigate = 'navigate',\r\n None = 'none',\r\n}\r\n\r\nexport type SessionInfo = {\r\n id?: string;\r\n route?: RouteData;\r\n conversationEndedBehavior?: ConversationEndedBehavior;\r\n};\r\n\r\nexport class ConversationPlatform {\r\n events: EventManager;\r\n private controllers: {\r\n conversation: ConversationController;\r\n component: ComponentNodeController;\r\n }[] = [];\r\n private providers: ConversationProviderRegistration[] = [];\r\n private disposeProviders: { [providerKey: string]: (() => void)[] } = {};\r\n private subscriptions: EventSubscriptionCancellation[] = [];\r\n private storageWriter: StorageWriter | null = null;\r\n private router: RoutingService | null = null;\r\n private buttonQuery: ComponentQuery | null = null;\r\n private sessionInfo: SessionInfo | null = null;\r\n\r\n constructor(private container: Container, private components: ComponentPlatform) {\r\n const widget: Widget = container.get('$widget');\r\n this.events = widget.events.createChild(this);\r\n }\r\n\r\n initialize() {\r\n createStorageWriter(this.container, STORAGE_KEY, StorageCategory.Necessary, {\r\n medium: StorageMedium.Local,\r\n }).then((writer) => (this.storageWriter = writer));\r\n\r\n readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\r\n (storedSession) => {\r\n this.buttonQuery = this.components\r\n .components()\r\n .ofType('conversation-return-button');\r\n if (storedSession) {\r\n this.sessionInfo = storedSession;\r\n if (storedSession.id && storedSession.route) {\r\n this.writeToComponents({ active: true, alert: { show: false } });\r\n }\r\n }\r\n }\r\n );\r\n this.container.getAsync('router').then((router) => (this.router = router));\r\n this.events.subscribe('conversation:ended', (event, data) => {\r\n switch (this.sessionInfo?.conversationEndedBehavior) {\r\n case ConversationEndedBehavior.Deactivate:\r\n const widget: Widget = this.container.get('$widget');\r\n widget.deactivate();\r\n break;\r\n case ConversationEndedBehavior.Navigate:\r\n const initialRoute = this.router?.getInitialRoute();\r\n if (initialRoute) {\r\n this.router?.navigate(initialRoute.name);\r\n }\r\n break;\r\n case ConversationEndedBehavior.None:\r\n default:\r\n break;\r\n }\r\n this.writeToComponents({ active: false });\r\n this.sessionInfo = null;\r\n this.storageWriter && this.storageWriter();\r\n });\r\n }\r\n\r\n addSubscription(sub: EventSubscriptionCancellation) {\r\n this.subscriptions.push(sub);\r\n }\r\n\r\n static getInstance(\r\n container: Container,\r\n key: string = 'conversation'\r\n ): Promise<ConversationPlatform> {\r\n return lock(container)(() => {\r\n return container.getAsync(key).then((value: ConversationPlatform) => {\r\n let conversation = value;\r\n if (!conversation) {\r\n return ComponentPlatform.getInstance(container).then((components) => {\r\n conversation = new ConversationPlatform(container, components);\r\n conversation.initialize();\r\n container.registerAsync(key, () => conversation);\r\n return conversation;\r\n });\r\n }\r\n return conversation;\r\n });\r\n });\r\n }\r\n\r\n navigateToConversationIfActive(id: string): Promise<void> {\r\n return readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\r\n (storedSession) => {\r\n if (storedSession && storedSession.id === id) {\r\n if (storedSession.route) {\r\n const { name, params } = storedSession.route;\r\n this.router?.navigate(name, params);\r\n }\r\n }\r\n }\r\n );\r\n }\r\n\r\n setConversationEndedBehavior(behavior: ConversationEndedBehavior) {\r\n return readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\r\n (stored) => {\r\n let storedSession = stored;\r\n if (storedSession) {\r\n storedSession.conversationEndedBehavior = behavior;\r\n } else {\r\n storedSession = { conversationEndedBehavior: behavior };\r\n }\r\n this.sessionInfo = storedSession;\r\n return (\r\n (this.storageWriter && this.storageWriter(this.sessionInfo)) ||\r\n Promise.resolve()\r\n );\r\n }\r\n );\r\n }\r\n\r\n createController(id: string) {\r\n const index = this.controllers.findIndex((c) => c.conversation.id === id);\r\n if (index > -1) {\r\n return this.controllers[index].conversation;\r\n }\r\n return new ConversationController(this.container, id);\r\n }\r\n\r\n registerConversationItem(name: string, component: ReactComponent) {\r\n return registerCustomMessageComponent(this.container, name, component);\r\n }\r\n\r\n registerProvider(name: string, handler: ConversationHandler): void {\r\n const provider = {\r\n name,\r\n handler,\r\n };\r\n this.providers.push(provider);\r\n // execute provider for all matching controllers\r\n this.controllers\r\n .filter((controller) => controller.conversation.providers.indexOf(name) > -1)\r\n .forEach((controller) => {\r\n this.invokeHandler(provider, controller);\r\n });\r\n }\r\n\r\n registerController(\r\n conversation: ConversationController,\r\n component: ComponentNodeController\r\n ): boolean {\r\n const index = this.controllers.findIndex((c) => c.conversation.id === conversation.id);\r\n let controller: any;\r\n if (index < 0) {\r\n controller = { conversation, component };\r\n this.controllers.push(controller);\r\n const invokeHandlers = (providers: string[]) => {\r\n if (providers) {\r\n this.providers\r\n .filter((provider) => providers.indexOf(provider.name) > -1)\r\n .forEach((provider) => {\r\n this.invokeHandler(provider, controller);\r\n });\r\n }\r\n };\r\n\r\n this.subscriptions.push(\r\n conversation.onDispose((event, data) => {\r\n const index = this.controllers.findIndex((c) => c.conversation === data);\r\n index > -1 && this.controllers.splice(index, 1);\r\n this.components\r\n .components()\r\n .ofType('conversation-return-button')\r\n .select()\r\n .writeProperties({ active: false });\r\n\r\n this.events.dispatch('conversation:ended', {}, { bubbles: true });\r\n })\r\n );\r\n this.subscriptions.push(\r\n conversation.onProvidersChange((event, data) => {\r\n const { added, removed }: { added: string[]; removed: string[] } = data;\r\n removed.forEach((removedProvider) => {\r\n this.disposeProviders[removedProvider].forEach((dispose) => {\r\n dispose();\r\n });\r\n });\r\n invokeHandlers(added);\r\n })\r\n );\r\n\r\n this.subscriptions.push(\r\n conversation.onStarted((event, isActive) => {\r\n const session: SessionInfo = {\r\n id: conversation.id,\r\n route: this.router?.getRouteData(),\r\n conversationEndedBehavior: this.sessionInfo?.conversationEndedBehavior,\r\n };\r\n this.sessionInfo = session;\r\n this.storageWriter && this.storageWriter(session);\r\n\r\n this.writeToComponents({ active: isActive });\r\n })\r\n );\r\n\r\n this.subscriptions.push(\r\n conversation.onUnreadMessage((event, data) => {\r\n this.events.dispatch('conversation:unread-message', data);\r\n this.writeToComponents({ alert: { show: data } });\r\n })\r\n );\r\n\r\n invokeHandlers(conversation.providers);\r\n return true;\r\n }\r\n controller = this.controllers[index];\r\n return false;\r\n }\r\n\r\n private writeToComponents(properties: any, key: string = 'conversationReturnButtonState') {\r\n if (this.buttonQuery) {\r\n this.components.write({\r\n key: 'conversationReturnButtonState',\r\n attributes: { properties },\r\n target: this.buttonQuery,\r\n provider: 'localStorage',\r\n });\r\n }\r\n }\r\n\r\n private invokeHandler(provider: ConversationProviderRegistration, controller: any) {\r\n const dispose = provider.handler(\r\n controller.conversation.createProvider(provider.name),\r\n controller.component\r\n );\r\n if (dispose) {\r\n if (!this.disposeProviders[provider.name]) {\r\n this.disposeProviders[provider.name] = [];\r\n }\r\n this.disposeProviders[provider.name].push(dispose);\r\n }\r\n }\r\n\r\n getComponentRoute() {\r\n return readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\r\n (stored) => stored?.route\r\n );\r\n }\r\n\r\n dispose() {\r\n Object.keys(this.disposeProviders).forEach((key) => {\r\n this.disposeProviders[key].forEach((dispose) => {\r\n dispose();\r\n });\r\n });\r\n this.subscriptions.forEach((unsubscribe) => {\r\n unsubscribe();\r\n });\r\n this.controllers = [];\r\n this.providers = [];\r\n }\r\n\r\n public static async handleContactMethodClick(\r\n event: any,\r\n container: Container,\r\n contactMethod: any,\r\n callback?: Function\r\n ) {\r\n if (shouldPreventDefault(container)) {\r\n event.preventDefault();\r\n let triggerEl = document.getElementById('humany-dynamic-anchor');\r\n if (!triggerEl) {\r\n triggerEl = document.createElement('a');\r\n triggerEl.setAttribute('href', '#');\r\n triggerEl.id = 'humany-dynamic-anchor';\r\n document.body.appendChild(triggerEl);\r\n }\r\n openChatWidget(container, contactMethod, triggerEl);\r\n }\r\n openChatWidget(container, contactMethod);\r\n }\r\n\r\n public static async handleContactMethodSubmit(container: Container, contactMethod: any) {\r\n return navigateToConversation(container, contactMethod);\r\n }\r\n}\r\n","import { Form, FormBuilder } from '@telia-ace/widget-forms';\r\nimport { Symbol } from '@telia-ace/widget-ui';\r\n\r\nexport type ConversationMessageSettings = {\r\n key?: string;\r\n timestamp?: number;\r\n title?: string;\r\n body?: string;\r\n actions?: { [actionKey: string]: any };\r\n form?: (builder: FormBuilder) => void;\r\n type?: string;\r\n items?: ConversationMessageList[];\r\n [key: string]: any;\r\n};\r\n\r\nexport type NormalizedMessageSettings = {\r\n content: ConversationMessageContent;\r\n key: string;\r\n timestamp: number | null;\r\n};\r\n\r\nexport type ConversationMessageList = {\r\n header?: string;\r\n itemKey: string;\r\n type?: ConversationMessageListType;\r\n items: ConversationMessageListItem[];\r\n};\r\n\r\nexport type ConversationMessageListItem = {\r\n icon?: string;\r\n type?: ConversationMessageListItemType;\r\n actions?: { [actionKey: string]: any };\r\n form?: Form;\r\n body?: string;\r\n key: string;\r\n [key: string]: any;\r\n};\r\n\r\nexport type ConversationMessageContent = {\r\n title?: string;\r\n body?: string;\r\n actions?: { [actionKey: string]: any };\r\n items?: ConverstationMessageItem<any>[];\r\n form?: Form;\r\n [key: string]: any;\r\n};\r\n\r\nexport type ConverstationMessageItem<T, R = ItemPayload> = R extends [T, any] ? R : never;\r\n\r\nexport type ConversationMessageUpdateSettings = ConversationMessageContent & {\r\n timestamp?: number;\r\n};\r\n\r\nexport type ConversationMessageSender = {\r\n name?: string;\r\n avatar?: string | Symbol;\r\n};\r\n\r\nexport enum ConversationMessageListType {\r\n Ordinary = 'ordinary',\r\n Seperator = 'seperator',\r\n}\r\n\r\nexport enum ConversationMessageListItemType {\r\n Header = 'header',\r\n LinkList = 'link-list',\r\n Separator = 'separator',\r\n ButtonList = 'button-list',\r\n CategoryButtonList = 'category-button-list',\r\n Text = 'text',\r\n HTML = 'html',\r\n}\r\n\r\ntype CategoryButton = {\r\n action: string;\r\n symbol: any;\r\n label: string;\r\n};\r\n\r\ntype LinkListItem = [\r\n ConversationMessageListItemType.LinkList,\r\n {\r\n actions: { [key: string]: string };\r\n }\r\n];\r\ntype HeaderItem = [ConversationMessageListItemType.Header, string];\r\ntype TextItem = [ConversationMessageListItemType.Text, string];\r\ntype SeparatorItem = [ConversationMessageListItemType.Separator, undefined];\r\ntype ButtonListItem = [\r\n ConversationMessageListItemType.ButtonList,\r\n {\r\n actions: { [key: string]: string };\r\n }\r\n];\r\ntype HTMLItem = [\r\n ConversationMessageListItemType.HTML,\r\n {\r\n body: string;\r\n }\r\n];\r\n\r\ntype ItemPayload = LinkListItem | HeaderItem | TextItem | SeparatorItem | ButtonListItem | HTMLItem;\r\n","import { RoutingService } from '@telia-ace/widget-routing';\r\nimport { createReactComponent } from '@telia-ace/widget-ui';\r\nimport { Container } from '@webprovisions/platform';\r\nimport { ConversationMessage, ConversationMessageType } from '../../conversation-controller';\r\nimport { ConversationPlatform } from '../../conversation-platform';\r\nimport { ConversationMessageContent, ConversationMessageSender } from '../../types';\r\n\r\nexport type BundledConversationMessage = {\r\n timestamp: number;\r\n content: [BundledMessageContent];\r\n sender: ConversationMessageSender;\r\n type: ConversationMessageType;\r\n};\r\n\r\ntype BundledMessageContent = {\r\n key: string;\r\n} & ConversationMessageContent;\r\n\r\nexport type ConversationContent = {\r\n loading: boolean;\r\n typingActors: ConversationMessageSender[];\r\n messages: ConversationMessage[];\r\n};\r\n\r\n/**\r\n * Group items by sender, type and time. Current grouping threshold is 2000 ms.\r\n * Put this as a property on either the component or on the provider?\r\n * Could possibly be implemented directly in the createEntry method\r\n * of the conversation controller to avoid iterating over the entire array on\r\n * each update.\r\n */\r\nconst groupedMessages = (\r\n messages: ConversationMessage[],\r\n timeout?: number\r\n): BundledConversationMessage[] => {\r\n return messages.reduce((acc: any[], current: any, index: number) => {\r\n const newItem = {\r\n ...current,\r\n content: [{ ...current.content, key: current.key }],\r\n };\r\n if (acc.length > 0 && current.type !== ConversationMessageType.System) {\r\n const previous = acc[acc.length - 1];\r\n if (\r\n (!timeout && timeout !== 0) ||\r\n Math.abs(previous.timestamp - current.timestamp) < timeout\r\n ) {\r\n if (\r\n previous.sender?.name === current.sender?.name &&\r\n previous.type === current.type\r\n ) {\r\n previous.timestamp = current.timestamp;\r\n previous.content.push({ ...current.content, key: current.key });\r\n return acc;\r\n }\r\n }\r\n }\r\n acc.push(newItem);\r\n return acc;\r\n }, []);\r\n};\r\n\r\nexport type ConversationComponentProperties = {\r\n providers: string[];\r\n messages: BundledConversationMessage[]; // internal\r\n loading: boolean;\r\n inputPlaceholder: string;\r\n inputDisabled: boolean;\r\n inputHidden: boolean;\r\n inputMultiline: boolean;\r\n userLabel: string;\r\n avatarSize: string;\r\n typingActors: any[]; // internal\r\n sendButtonLabel: string;\r\n secondaryAction?: { icon?: string; action: string; label: string };\r\n};\r\n\r\nconst ConversationComponent = (container: Container) => {\r\n return Promise.all([\r\n ConversationPlatform.getInstance(container),\r\n container.getAsync('router'),\r\n ]).then(([platform, router]: [ConversationPlatform, RoutingService]) => {\r\n return createReactComponent(\r\n container,\r\n 'conversation',\r\n import('./conversation'),\r\n (component) => {\r\n const routeData = router.getRouteData();\r\n const name = routeData.params.id || component.node.name || 'component';\r\n const conversation = platform.createController(name);\r\n const isNewController = platform.registerController(conversation, component);\r\n\r\n const messageGroupingTimeout = 3 * 60 * 1000;\r\n\r\n const setProperties = (properties: ConversationComponentProperties) => {\r\n const { providers = [] } = properties;\r\n if (providers) {\r\n const providerKeys = Array.isArray(providers) ? providers : [providers];\r\n conversation.setProviders(providerKeys);\r\n return providerKeys;\r\n }\r\n };\r\n setProperties(component.properties<ConversationComponentProperties>(setProperties));\r\n\r\n conversation.setComponentMountedState(true);\r\n\r\n const writeMessages = (messageStream: any) => {\r\n const { loading, typingActors, messages } = messageStream;\r\n component.writeProperties({\r\n loading,\r\n typingActors,\r\n messages: groupedMessages(messages, messageGroupingTimeout),\r\n });\r\n };\r\n\r\n writeMessages(conversation.getMessageStream());\r\n\r\n if (isNewController) {\r\n // todo: dont create actions here, there will be duplicates due to reuseController = true\r\n component.actions.create('user-submit', (data, options) => {\r\n if (options) {\r\n const { preventDefault, validationPromise } = options;\r\n if (preventDefault) {\r\n if (validationPromise) {\r\n validationPromise().then((text: string) => {\r\n if (text) {\r\n conversation.user.print(text);\r\n }\r\n });\r\n }\r\n return;\r\n }\r\n }\r\n conversation.user.print(data.text);\r\n });\r\n\r\n component.actions.create('user-typing', (data, options) => {});\r\n\r\n component.actions.create('form', (data, options) => {});\r\n\r\n component.actions.create('action', (data, options) => {});\r\n }\r\n\r\n const unsubscribe = conversation.events.subscribe(\r\n 'conversation:updated',\r\n (e: any, conversationData: ConversationContent) => {\r\n writeMessages(conversationData);\r\n }\r\n );\r\n\r\n return () => {\r\n conversation.setComponentMountedState(false);\r\n unsubscribe();\r\n if (!conversation.active) {\r\n // unregisterController();\r\n // todo: add possibility to dispose this through extendComponent()\r\n // component.dispose();\r\n writeMessages({ messages: [], typingActors: [], loading: false });\r\n }\r\n };\r\n },\r\n { reuseController: true }\r\n );\r\n });\r\n};\r\n\r\nexport default ConversationComponent;\r\n","import { ComponentPlatform } from '@telia-ace/widget-core';\r\nimport { RoutingService } from '@telia-ace/widget-routing';\r\nimport { createReactComponent, Symbol } from '@telia-ace/widget-ui';\r\nimport { Container } from '@webprovisions/platform';\r\nimport { ConversationPlatform } from '../../';\r\n\r\nexport enum ButtonMode {\r\n flat = 'flat',\r\n flashing = 'flashing',\r\n flashingGradient = 'flashingGradient',\r\n}\r\n\r\nexport type ReturnButtonProps = {\r\n label: string;\r\n active: boolean;\r\n mode: ButtonMode;\r\n alert?: {\r\n symbol?: Symbol;\r\n show?: boolean;\r\n label?: string;\r\n };\r\n};\r\n\r\nconst ConversationReturnButtonComponent = (container: Container) => {\r\n return Promise.all([\r\n ComponentPlatform.getInstance(container),\r\n ConversationPlatform.getInstance(container),\r\n container.getAsync('router'),\r\n ]).then(\r\n ([components, platform, router]: [\r\n ComponentPlatform,\r\n ConversationPlatform,\r\n RoutingService\r\n ]) => {\r\n return createReactComponent(\r\n container,\r\n 'conversation-return-button',\r\n import('./return-button'),\r\n (component) => {\r\n component.actions.create('toggle', (options = {}) => {\r\n platform.getComponentRoute()?.then((route) => {\r\n route && router.navigate(route.name, route.params);\r\n });\r\n });\r\n }\r\n );\r\n }\r\n );\r\n};\r\n\r\nexport default ConversationReturnButtonComponent;\r\n"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { EventSubscriptionCancellation, Widget } from '@webprovisions/platform';
|
|
2
|
-
export declare type EntityValueResolver = (value: any) => void;
|
|
3
|
-
export declare 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
|
+
import { EventSubscriptionCancellation, Widget } from '@webprovisions/platform';
|
|
2
|
+
export declare type EntityValueResolver = (value: any) => void;
|
|
3
|
+
export declare 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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"return-button.js","sources":["../src/ui/return-button/return-button.tsx"],"sourcesContent":["// import { Component } from '@telia-ace/widget-types-grid';\nimport {\n borderTabStyle,\n Button,\n SymbolBadge,\n useDispatch,\n useProperties,\n} from '@telia-ace/widget-ui';\nimport React from 'react';\nimport styled, { css, keyframes } from 'styled-components';\nimport { ReturnButtonProps } from './return-button-component';\n\ntype Props = {\n className: string;\n};\n\nconst ReturnButton: React.SFC<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 = (props: any) => 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 = css<any>`\n animation: ${FlashingColorAnimation} 1s ease infinite;\n`;\n\nconst flashingGradientStyle = css<any>`\n background: linear-gradient(\n 155deg,\n ${(p) => p.theme.colors?.primary},\n ${(p) => p.theme.colors?.accent}\n );\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 {\n ${(p) => p.theme.accessibility?.isTabbing && borderTabStyle}\n background: ${(p) => p.theme.colors?.text};\n color: ${(p) => p.theme.colors?.primary};\n }\n`;\n\nexport default ReturnButton;\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAgBA,MAAM,eAAiC,CAAC,OAA4B;AAA5B,eAAE,gBAAF,IAAgB,kBAAhB,IAAgB,CAAd;AAChC,QAAA,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,CAAA,MAAO;AACrD,QAAM,EAAE,QAAQ,OAAO,YAAY,MAAM,cAAc;AAEvD,QAAM,WAAW;AAEjB,MAAI,CAAC,QAAQ;AACF,WAAA;AAAA,EACX;AAEA,SACK,sBAAA,cAAA,yBAAA;AAAA,IACG;AAAA,IACA;AAAA,IACA,cAAY;AAAA,IACZ,SAAS,MAAM;AACX,eAAS,QAAQ;AAAA,IACrB;AAAA,EAAA,GAEC,sBAAA,cAAA,aAAA,MAAa,KAAM,GACnB,UACI,sBAAA,cAAA,kBAAA;AAAA,IAAiB;AAAA,EAAA,GACb,sBAAA,cAAA,aAAA;AAAA,IAAY;AAAA,IAAgB,OAAO;AAAA,IAAY,MAAM;AAAA,EAAI,CAAA,CAC9D,CAER;AAER;AAEA,MAAM,yBAAyB,CAAC,UAAe;;AAAA;AAAA;AAAA,wBAEvB,YAAM,MAAM,WAAZ,mBAAoB;AAAA;AAAA;AAAA,wBAGpB,YAAM,MAAM,WAAZ,mBAAoB;AAAA;AAAA;AAAA,wBAGpB,YAAM,MAAM,WAAZ,mBAAoB;AAAA;AAAA;AAAA;AAI5C,MAAM,6BAA6B,CAAC,UAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYnD,MAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuCtB,MAAM,mBAAmB,OAAO;AAAA;AAAA,4BAEJ,CAAC,MAAO,EAAE,YAAY,QAAQ;AAAA,eAC3C,CAAC,MAAO,EAAE,YAAY,IAAI;AAAA;AAAA;AAIzC,MAAM,cAAc,OAAO;AAAA;AAAA;AAAA;AAK3B,MAAM,gBAAgB;AAAA,iBACL;AAAA;AAGjB,MAAM,wBAAwB;AAAA;AAAA;AAAA,UAGpB,CAAC,MAAM;;AAAA,iBAAE,MAAM,WAAR,mBAAgB;AAAA;AAAA,UACvB,CAAC,MAAM;;AAAA,iBAAE,MAAM,WAAR,mBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,iBAIhB;AAAA;AAGjB,MAAM,0BAA0B,OAAO,MAAM;AAAA;AAAA,eAE9B,CAAC,MAAM;;AAAA,iBAAE,MAAM,UAAR,mBAAe;AAAA;AAAA,qBAChB,CAAC,MAAM,EAAE,MAAM;AAAA,aACvB,CAAC,MAAM;;AAAA,iBAAE,MAAM,WAAR,mBAAgB;AAAA;AAAA,MAC9B,CAAC,MACC,EAAE,SAAS,aACL,gBACA,EAAE,SAAS,qBACX,wBACA;AAAA,wBACU,CAAC,MAAM;;AAAA,iBAAE,MAAM,WAAR,mBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAM1B;AAAA;AAAA;AAAA;AAAA,UAIX,CAAC,MAAA;;AAAM,kBAAE,MAAM,kBAAR,mBAAuB,cAAa;AAAA;AAAA,sBAC/B,CAAC,MAAM;;AAAA,iBAAE,MAAM,WAAR,mBAAgB;AAAA;AAAA,iBAC5B,CAAC,MAAM;;AAAA,iBAAE,MAAM,WAAR,mBAAgB;AAAA;AAAA;AAAA;;"}
|
|
1
|
+
{"version":3,"file":"return-button.js","sources":["../src/ui/return-button/return-button.tsx"],"sourcesContent":["// import { Component } from '@telia-ace/widget-types-grid';\r\nimport {\r\n borderTabStyle,\r\n Button,\r\n SymbolBadge,\r\n useDispatch,\r\n useProperties,\r\n} from '@telia-ace/widget-ui';\r\nimport React from 'react';\r\nimport styled, { css, keyframes } from 'styled-components';\r\nimport { ReturnButtonProps } from './return-button-component';\r\n\r\ntype Props = {\r\n className: string;\r\n};\r\n\r\nconst ReturnButton: React.SFC<Props> = ({ className, ...other }) => {\r\n const { label, active, mode = 'flat', alert = {} } = useProperties<ReturnButtonProps>();\r\n const { symbol, label: alertLabel, show: showAlert } = alert;\r\n // const [showAlert, setShowAlert] = useState(show);\r\n const dispatch = useDispatch();\r\n\r\n if (!active) {\r\n return null;\r\n }\r\n\r\n return (\r\n <StyledHighlightedButton\r\n className={className}\r\n mode={mode}\r\n aria-label={label}\r\n onClick={() => {\r\n dispatch('toggle');\r\n }}\r\n >\r\n <StyledLabel>{label}</StyledLabel>\r\n {symbol && (\r\n <StyledIconHolder showAlert={showAlert}>\r\n <SymbolBadge symbol={symbol} title={alertLabel} size={20}></SymbolBadge>\r\n </StyledIconHolder>\r\n )}\r\n </StyledHighlightedButton>\r\n );\r\n};\r\n\r\nconst FlashingColorAnimation = (props: any) => keyframes`\r\n 0% {\r\n background-color: ${props.theme.colors?.primary};\r\n }\r\n 50% {\r\n background-color: ${props.theme.colors?.accent};\r\n }\r\n 100 {\r\n background-color: ${props.theme.colors?.primary};\r\n }\r\n`;\r\n\r\nconst ScrollingGradientAnimation = (props: any) => keyframes`\r\n 0% {\r\n background-position:0% 51%\r\n }\r\n 50% {\r\n background-position:100% 0%\r\n }\r\n 100% {\r\n background-position:0% 51%\r\n }\r\n`;\r\n\r\nconst PulsatingIcon = keyframes`\r\n 0% {\r\n transform: rotate(0deg) scale(1.00);\r\n }\r\n 50% {\r\n transform: rotate(0deg) scale(1.00);\r\n }\r\n 55% {\r\n transform: rotate(-3deg) scale(0.80);\r\n }\r\n 60% {\r\n transform: rotate(-3deg) scale(0.80);\r\n }\r\n 65% {\r\n transform: rotate(3deg) scale(1.20);\r\n }\r\n 70% {\r\n transform: rotate(-3deg) scale(1.20);\r\n }\r\n 75% {\r\n transform: rotate(3deg) scale(1.20);\r\n }\r\n 80% {\r\n transform: rotate(-3deg) scale(1.20);\r\n }\r\n 85% {\r\n transform: rotate(3deg) scale(1.20);\r\n }\r\n 90% {\r\n transform: rotate(-3deg) scale(1.20);\r\n }\r\n 95% {\r\n transform: rotate(3deg) scale(1.20);\r\n }\r\n 100% {\r\n transform: rotate(0deg) scale(1);\r\n }\r\n`;\r\n\r\nconst StyledIconHolder = styled.span<any>`\r\n flex-grow: 0;\r\n transform: translateX(${(p) => (p.showAlert ? '0px' : '50px')});\r\n opacity: ${(p) => (p.showAlert ? 1 : 0)};\r\n transition: transform 0.5s ease, opacity 0.3s ease;\r\n`;\r\n\r\nconst StyledLabel = styled.span<any>`\r\n flex: 1;\r\n font-weight: 300;\r\n`;\r\n\r\nconst flashingStyle = css<any>`\r\n animation: ${FlashingColorAnimation} 1s ease infinite;\r\n`;\r\n\r\nconst flashingGradientStyle = css<any>`\r\n background: linear-gradient(\r\n 155deg,\r\n ${(p) => p.theme.colors?.primary},\r\n ${(p) => p.theme.colors?.accent}\r\n );\r\n background-position: 0px 0px;\r\n background-size: 200% 200%;\r\n animation: ${ScrollingGradientAnimation} 1.5s ease infinite;\r\n`;\r\n\r\nconst StyledHighlightedButton = styled(Button)<any>`\r\n overflow: hidden;\r\n padding: ${(p) => p.theme.sizes?.large};\r\n border-radius: ${(p) => p.theme.borderRadius};\r\n color: ${(p) => p.theme.colors?.text};\r\n ${(p) =>\r\n p.mode === 'flashing'\r\n ? flashingStyle\r\n : p.mode === 'flashingGradient'\r\n ? flashingGradientStyle\r\n : ''}\r\n background-color: ${(p) => p.theme.colors?.primary};\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n i,\r\n svg {\r\n animation: ${PulsatingIcon} 3s ease infinite;\r\n }\r\n\r\n &:focus {\r\n ${(p) => p.theme.accessibility?.isTabbing && borderTabStyle}\r\n background: ${(p) => p.theme.colors?.text};\r\n color: ${(p) => p.theme.colors?.primary};\r\n }\r\n`;\r\n\r\nexport default ReturnButton;\r\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAgBA,MAAM,eAAiC,CAAC,OAA4B;AAA5B,eAAE,gBAAF,IAAgB,kBAAhB,IAAgB,CAAd;AAChC,QAAA,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,CAAA,MAAO;AACrD,QAAM,EAAE,QAAQ,OAAO,YAAY,MAAM,cAAc;AAEvD,QAAM,WAAW;AAEjB,MAAI,CAAC,QAAQ;AACF,WAAA;AAAA,EACX;AAEA,SACK,sBAAA,cAAA,yBAAA;AAAA,IACG;AAAA,IACA;AAAA,IACA,cAAY;AAAA,IACZ,SAAS,MAAM;AACX,eAAS,QAAQ;AAAA,IACrB;AAAA,EAAA,GAEC,sBAAA,cAAA,aAAA,MAAa,KAAM,GACnB,UACI,sBAAA,cAAA,kBAAA;AAAA,IAAiB;AAAA,EAAA,GACb,sBAAA,cAAA,aAAA;AAAA,IAAY;AAAA,IAAgB,OAAO;AAAA,IAAY,MAAM;AAAA,EAAI,CAAA,CAC9D,CAER;AAER;AAEA,MAAM,yBAAyB,CAAC,UAAe;;AAAA;AAAA;AAAA,wBAEvB,YAAM,MAAM,WAAZ,mBAAoB;AAAA;AAAA;AAAA,wBAGpB,YAAM,MAAM,WAAZ,mBAAoB;AAAA;AAAA;AAAA,wBAGpB,YAAM,MAAM,WAAZ,mBAAoB;AAAA;AAAA;AAAA;AAI5C,MAAM,6BAA6B,CAAC,UAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYnD,MAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuCtB,MAAM,mBAAmB,OAAO;AAAA;AAAA,4BAEJ,CAAC,MAAO,EAAE,YAAY,QAAQ;AAAA,eAC3C,CAAC,MAAO,EAAE,YAAY,IAAI;AAAA;AAAA;AAIzC,MAAM,cAAc,OAAO;AAAA;AAAA;AAAA;AAK3B,MAAM,gBAAgB;AAAA,iBACL;AAAA;AAGjB,MAAM,wBAAwB;AAAA;AAAA;AAAA,UAGpB,CAAC,MAAM;;AAAA,iBAAE,MAAM,WAAR,mBAAgB;AAAA;AAAA,UACvB,CAAC,MAAM;;AAAA,iBAAE,MAAM,WAAR,mBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,iBAIhB;AAAA;AAGjB,MAAM,0BAA0B,OAAO,MAAM;AAAA;AAAA,eAE9B,CAAC,MAAM;;AAAA,iBAAE,MAAM,UAAR,mBAAe;AAAA;AAAA,qBAChB,CAAC,MAAM,EAAE,MAAM;AAAA,aACvB,CAAC,MAAM;;AAAA,iBAAE,MAAM,WAAR,mBAAgB;AAAA;AAAA,MAC9B,CAAC,MACC,EAAE,SAAS,aACL,gBACA,EAAE,SAAS,qBACX,wBACA;AAAA,wBACU,CAAC,MAAM;;AAAA,iBAAE,MAAM,WAAR,mBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAM1B;AAAA;AAAA;AAAA;AAAA,UAIX,CAAC,MAAA;;AAAM,kBAAE,MAAM,kBAAR,mBAAuB,cAAa;AAAA;AAAA,sBAC/B,CAAC,MAAM;;AAAA,iBAAE,MAAM,WAAR,mBAAgB;AAAA;AAAA,iBAC5B,CAAC,MAAM;;AAAA,iBAAE,MAAM,WAAR,mBAAgB;AAAA;AAAA;AAAA;;"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,110 +1,95 @@
|
|
|
1
|
-
import { Form, FormBuilder } from '@telia-ace/widget-forms';
|
|
2
|
-
import { Symbol } from '@telia-ace/widget-ui';
|
|
3
|
-
export declare type ConversationMessageSettings = {
|
|
4
|
-
key?: string;
|
|
5
|
-
timestamp?: number;
|
|
6
|
-
title?: string;
|
|
7
|
-
body?: string;
|
|
8
|
-
actions?: {
|
|
9
|
-
[actionKey: string]: any;
|
|
10
|
-
};
|
|
11
|
-
form?: (builder: FormBuilder) => void;
|
|
12
|
-
type?: string;
|
|
13
|
-
items?: ConversationMessageList[];
|
|
14
|
-
[key: string]: any;
|
|
15
|
-
};
|
|
16
|
-
export declare type NormalizedMessageSettings = {
|
|
17
|
-
content: ConversationMessageContent;
|
|
18
|
-
key: string;
|
|
19
|
-
timestamp: number | null;
|
|
20
|
-
};
|
|
21
|
-
export declare type ConversationMessageList = {
|
|
22
|
-
header?: string;
|
|
23
|
-
itemKey: string;
|
|
24
|
-
type?: ConversationMessageListType;
|
|
25
|
-
items: ConversationMessageListItem[];
|
|
26
|
-
};
|
|
27
|
-
export declare type ConversationMessageListItem = {
|
|
28
|
-
icon?: string;
|
|
29
|
-
type?: ConversationMessageListItemType;
|
|
30
|
-
actions?: {
|
|
31
|
-
[actionKey: string]: any;
|
|
32
|
-
};
|
|
33
|
-
form?: Form;
|
|
34
|
-
body?: string;
|
|
35
|
-
key: string;
|
|
36
|
-
[key: string]: any;
|
|
37
|
-
};
|
|
38
|
-
export declare type ConversationMessageContent = {
|
|
39
|
-
title?: string;
|
|
40
|
-
body?: string;
|
|
41
|
-
actions?: {
|
|
42
|
-
[actionKey: string]: any;
|
|
43
|
-
};
|
|
44
|
-
items?: ConverstationMessageItem<any>[];
|
|
45
|
-
form?: Form;
|
|
46
|
-
[key: string]: any;
|
|
47
|
-
};
|
|
48
|
-
export declare type ConverstationMessageItem<T, R = ItemPayload> = R extends [T, any] ? R : never;
|
|
49
|
-
export declare type ConversationMessageUpdateSettings = ConversationMessageContent & {
|
|
50
|
-
timestamp?: number;
|
|
51
|
-
};
|
|
52
|
-
export declare type ConversationMessageSender = {
|
|
53
|
-
name?: string;
|
|
54
|
-
avatar?: string | Symbol;
|
|
55
|
-
};
|
|
56
|
-
export declare enum ConversationMessageListType {
|
|
57
|
-
Ordinary = "ordinary",
|
|
58
|
-
Seperator = "seperator"
|
|
59
|
-
}
|
|
60
|
-
export declare enum ConversationMessageListItemType {
|
|
61
|
-
Header = "header",
|
|
62
|
-
LinkList = "link-list",
|
|
63
|
-
Separator = "separator",
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
Text = "text",
|
|
67
|
-
HTML = "html"
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
];
|
|
78
|
-
declare type
|
|
79
|
-
declare type
|
|
80
|
-
declare type
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
ConversationMessageListItemType.FeedbackList,
|
|
97
|
-
{
|
|
98
|
-
actions: {
|
|
99
|
-
[key: string]: string;
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
];
|
|
103
|
-
declare type HTMLItem = [
|
|
104
|
-
ConversationMessageListItemType.HTML,
|
|
105
|
-
{
|
|
106
|
-
body: string;
|
|
107
|
-
}
|
|
108
|
-
];
|
|
109
|
-
declare type ItemPayload = LinkListItem | HeaderItem | TextItem | SeparatorItem | NoGoodAlternativeItem | ButtonListItem | HTMLItem | FeedbackListItem;
|
|
110
|
-
export {};
|
|
1
|
+
import { Form, FormBuilder } from '@telia-ace/widget-forms';
|
|
2
|
+
import { Symbol } from '@telia-ace/widget-ui';
|
|
3
|
+
export declare type ConversationMessageSettings = {
|
|
4
|
+
key?: string;
|
|
5
|
+
timestamp?: number;
|
|
6
|
+
title?: string;
|
|
7
|
+
body?: string;
|
|
8
|
+
actions?: {
|
|
9
|
+
[actionKey: string]: any;
|
|
10
|
+
};
|
|
11
|
+
form?: (builder: FormBuilder) => void;
|
|
12
|
+
type?: string;
|
|
13
|
+
items?: ConversationMessageList[];
|
|
14
|
+
[key: string]: any;
|
|
15
|
+
};
|
|
16
|
+
export declare type NormalizedMessageSettings = {
|
|
17
|
+
content: ConversationMessageContent;
|
|
18
|
+
key: string;
|
|
19
|
+
timestamp: number | null;
|
|
20
|
+
};
|
|
21
|
+
export declare type ConversationMessageList = {
|
|
22
|
+
header?: string;
|
|
23
|
+
itemKey: string;
|
|
24
|
+
type?: ConversationMessageListType;
|
|
25
|
+
items: ConversationMessageListItem[];
|
|
26
|
+
};
|
|
27
|
+
export declare type ConversationMessageListItem = {
|
|
28
|
+
icon?: string;
|
|
29
|
+
type?: ConversationMessageListItemType;
|
|
30
|
+
actions?: {
|
|
31
|
+
[actionKey: string]: any;
|
|
32
|
+
};
|
|
33
|
+
form?: Form;
|
|
34
|
+
body?: string;
|
|
35
|
+
key: string;
|
|
36
|
+
[key: string]: any;
|
|
37
|
+
};
|
|
38
|
+
export declare type ConversationMessageContent = {
|
|
39
|
+
title?: string;
|
|
40
|
+
body?: string;
|
|
41
|
+
actions?: {
|
|
42
|
+
[actionKey: string]: any;
|
|
43
|
+
};
|
|
44
|
+
items?: ConverstationMessageItem<any>[];
|
|
45
|
+
form?: Form;
|
|
46
|
+
[key: string]: any;
|
|
47
|
+
};
|
|
48
|
+
export declare type ConverstationMessageItem<T, R = ItemPayload> = R extends [T, any] ? R : never;
|
|
49
|
+
export declare type ConversationMessageUpdateSettings = ConversationMessageContent & {
|
|
50
|
+
timestamp?: number;
|
|
51
|
+
};
|
|
52
|
+
export declare type ConversationMessageSender = {
|
|
53
|
+
name?: string;
|
|
54
|
+
avatar?: string | Symbol;
|
|
55
|
+
};
|
|
56
|
+
export declare enum ConversationMessageListType {
|
|
57
|
+
Ordinary = "ordinary",
|
|
58
|
+
Seperator = "seperator"
|
|
59
|
+
}
|
|
60
|
+
export declare enum ConversationMessageListItemType {
|
|
61
|
+
Header = "header",
|
|
62
|
+
LinkList = "link-list",
|
|
63
|
+
Separator = "separator",
|
|
64
|
+
ButtonList = "button-list",
|
|
65
|
+
CategoryButtonList = "category-button-list",
|
|
66
|
+
Text = "text",
|
|
67
|
+
HTML = "html"
|
|
68
|
+
}
|
|
69
|
+
declare type LinkListItem = [
|
|
70
|
+
ConversationMessageListItemType.LinkList,
|
|
71
|
+
{
|
|
72
|
+
actions: {
|
|
73
|
+
[key: string]: string;
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
];
|
|
77
|
+
declare type HeaderItem = [ConversationMessageListItemType.Header, string];
|
|
78
|
+
declare type TextItem = [ConversationMessageListItemType.Text, string];
|
|
79
|
+
declare type SeparatorItem = [ConversationMessageListItemType.Separator, undefined];
|
|
80
|
+
declare type ButtonListItem = [
|
|
81
|
+
ConversationMessageListItemType.ButtonList,
|
|
82
|
+
{
|
|
83
|
+
actions: {
|
|
84
|
+
[key: string]: string;
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
];
|
|
88
|
+
declare type HTMLItem = [
|
|
89
|
+
ConversationMessageListItemType.HTML,
|
|
90
|
+
{
|
|
91
|
+
body: string;
|
|
92
|
+
}
|
|
93
|
+
];
|
|
94
|
+
declare type ItemPayload = LinkListItem | HeaderItem | TextItem | SeparatorItem | ButtonListItem | HTMLItem;
|
|
95
|
+
export {};
|
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
import { Container } from '@webprovisions/platform';
|
|
2
|
-
import { ConversationMessage, ConversationMessageType } from '../../conversation-controller';
|
|
3
|
-
import { ConversationMessageContent, ConversationMessageSender } from '../../types';
|
|
4
|
-
export declare type BundledConversationMessage = {
|
|
5
|
-
timestamp: number;
|
|
6
|
-
content: [BundledMessageContent];
|
|
7
|
-
sender: ConversationMessageSender;
|
|
8
|
-
type: ConversationMessageType;
|
|
9
|
-
};
|
|
10
|
-
declare type BundledMessageContent = {
|
|
11
|
-
key: string;
|
|
12
|
-
} & ConversationMessageContent;
|
|
13
|
-
export declare type ConversationContent = {
|
|
14
|
-
loading: boolean;
|
|
15
|
-
typingActors: ConversationMessageSender[];
|
|
16
|
-
messages: ConversationMessage[];
|
|
17
|
-
};
|
|
18
|
-
export declare type ConversationComponentProperties = {
|
|
19
|
-
providers: string[];
|
|
20
|
-
messages: BundledConversationMessage[];
|
|
21
|
-
loading: boolean;
|
|
22
|
-
inputPlaceholder: string;
|
|
23
|
-
inputDisabled: boolean;
|
|
24
|
-
inputHidden: boolean;
|
|
25
|
-
inputMultiline: boolean;
|
|
26
|
-
userLabel: string;
|
|
27
|
-
avatarSize: string;
|
|
28
|
-
typingActors: any[];
|
|
29
|
-
sendButtonLabel: string;
|
|
30
|
-
secondaryAction?: {
|
|
31
|
-
icon?: string;
|
|
32
|
-
action: string;
|
|
33
|
-
label: string;
|
|
34
|
-
};
|
|
35
|
-
};
|
|
36
|
-
declare const ConversationComponent: (container: Container) => Promise<void>;
|
|
37
|
-
export default ConversationComponent;
|
|
1
|
+
import { Container } from '@webprovisions/platform';
|
|
2
|
+
import { ConversationMessage, ConversationMessageType } from '../../conversation-controller';
|
|
3
|
+
import { ConversationMessageContent, ConversationMessageSender } from '../../types';
|
|
4
|
+
export declare type BundledConversationMessage = {
|
|
5
|
+
timestamp: number;
|
|
6
|
+
content: [BundledMessageContent];
|
|
7
|
+
sender: ConversationMessageSender;
|
|
8
|
+
type: ConversationMessageType;
|
|
9
|
+
};
|
|
10
|
+
declare type BundledMessageContent = {
|
|
11
|
+
key: string;
|
|
12
|
+
} & ConversationMessageContent;
|
|
13
|
+
export declare type ConversationContent = {
|
|
14
|
+
loading: boolean;
|
|
15
|
+
typingActors: ConversationMessageSender[];
|
|
16
|
+
messages: ConversationMessage[];
|
|
17
|
+
};
|
|
18
|
+
export declare type ConversationComponentProperties = {
|
|
19
|
+
providers: string[];
|
|
20
|
+
messages: BundledConversationMessage[];
|
|
21
|
+
loading: boolean;
|
|
22
|
+
inputPlaceholder: string;
|
|
23
|
+
inputDisabled: boolean;
|
|
24
|
+
inputHidden: boolean;
|
|
25
|
+
inputMultiline: boolean;
|
|
26
|
+
userLabel: string;
|
|
27
|
+
avatarSize: string;
|
|
28
|
+
typingActors: any[];
|
|
29
|
+
sendButtonLabel: string;
|
|
30
|
+
secondaryAction?: {
|
|
31
|
+
icon?: string;
|
|
32
|
+
action: string;
|
|
33
|
+
label: string;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
declare const ConversationComponent: (container: Container) => Promise<void>;
|
|
37
|
+
export default ConversationComponent;
|
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { ConversationMessageContent } from '../../types';
|
|
3
|
-
declare type Props = {
|
|
4
|
-
className?: string;
|
|
5
|
-
content: ConversationMessageContent;
|
|
6
|
-
isUser: boolean;
|
|
7
|
-
stacked?: string;
|
|
8
|
-
CustomComponent?: any;
|
|
9
|
-
};
|
|
10
|
-
declare const ConversationContent: React.FC<Props>;
|
|
11
|
-
export
|
|
12
|
-
export default ConversationContent;
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ConversationMessageContent } from '../../types';
|
|
3
|
+
declare type Props = {
|
|
4
|
+
className?: string;
|
|
5
|
+
content: ConversationMessageContent;
|
|
6
|
+
isUser: boolean;
|
|
7
|
+
stacked?: string;
|
|
8
|
+
CustomComponent?: any;
|
|
9
|
+
};
|
|
10
|
+
declare const ConversationContent: React.FC<Props>;
|
|
11
|
+
export default ConversationContent;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
declare type Props = {
|
|
3
|
-
className?: string;
|
|
4
|
-
};
|
|
5
|
-
declare const ConversationInput: React.FC<Props>;
|
|
6
|
-
export default ConversationInput;
|
|
1
|
+
import React from 'react';
|
|
2
|
+
declare type Props = {
|
|
3
|
+
className?: string;
|
|
4
|
+
};
|
|
5
|
+
declare const ConversationInput: React.FC<Props>;
|
|
6
|
+
export default ConversationInput;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { ConversationMessageSender } from '../../types';
|
|
3
|
-
declare type Props = {
|
|
4
|
-
className?: string;
|
|
5
|
-
agentData?: ConversationMessageSender;
|
|
6
|
-
};
|
|
7
|
-
declare const ConversationLoader: React.FC<Props>;
|
|
8
|
-
export default ConversationLoader;
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ConversationMessageSender } from '../../types';
|
|
3
|
+
declare type Props = {
|
|
4
|
+
className?: string;
|
|
5
|
+
agentData?: ConversationMessageSender;
|
|
6
|
+
};
|
|
7
|
+
declare const ConversationLoader: React.FC<Props>;
|
|
8
|
+
export default ConversationLoader;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { BundledConversationMessage } from './conversation-component';
|
|
3
|
-
declare type Props = {
|
|
4
|
-
className?: string;
|
|
5
|
-
} & BundledConversationMessage;
|
|
6
|
-
declare const ConversationMessageComponent: React.FC<Props>;
|
|
7
|
-
export default ConversationMessageComponent;
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { BundledConversationMessage } from './conversation-component';
|
|
3
|
+
declare type Props = {
|
|
4
|
+
className?: string;
|
|
5
|
+
} & BundledConversationMessage;
|
|
6
|
+
declare const ConversationMessageComponent: React.FC<Props>;
|
|
7
|
+
export default ConversationMessageComponent;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
/// <reference types="react" />
|
|
2
|
-
export declare const Avatar: import("styled-components").StyledComponent<"div", any, any, never>;
|
|
3
|
-
export declare const LoaderAnimation: import("styled-components").Keyframes;
|
|
4
|
-
export declare const Loader: import("styled-components").StyledComponent<"div", any, {}, never>;
|
|
5
|
-
export declare const ContentBundle: import("styled-components").StyledComponent<"div", any, {}, never>;
|
|
6
|
-
export declare const MessageTitle: import("styled-components").StyledComponent<import("react").FC<import("@telia-ace/widget-ui").TypographyProps>, any, {}, never>;
|
|
7
|
-
export declare const MessageContainer: import("styled-components").StyledComponent<"div", any, {}, never>;
|
|
8
|
-
export declare const MessageContent: import("styled-components").StyledComponent<"div", any, any, never>;
|
|
9
|
-
export declare const MessageContentPart: import("styled-components").StyledComponent<"div", any, {
|
|
10
|
-
noPadding?: boolean | undefined;
|
|
11
|
-
}, never>;
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
export declare const Avatar: import("styled-components").StyledComponent<"div", any, any, never>;
|
|
3
|
+
export declare const LoaderAnimation: import("styled-components").Keyframes;
|
|
4
|
+
export declare const Loader: import("styled-components").StyledComponent<"div", any, {}, never>;
|
|
5
|
+
export declare const ContentBundle: import("styled-components").StyledComponent<"div", any, {}, never>;
|
|
6
|
+
export declare const MessageTitle: import("styled-components").StyledComponent<import("react").FC<import("@telia-ace/widget-ui").TypographyProps>, any, {}, never>;
|
|
7
|
+
export declare const MessageContainer: import("styled-components").StyledComponent<"div", any, {}, never>;
|
|
8
|
+
export declare const MessageContent: import("styled-components").StyledComponent<"div", any, any, never>;
|
|
9
|
+
export declare const MessageContentPart: import("styled-components").StyledComponent<"div", any, {
|
|
10
|
+
noPadding?: boolean | undefined;
|
|
11
|
+
}, never>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
declare type Props = {
|
|
3
|
-
className: string;
|
|
4
|
-
};
|
|
5
|
-
declare const Conversation: React.FC<Props>;
|
|
6
|
-
export default Conversation;
|
|
1
|
+
import React from 'react';
|
|
2
|
+
declare type Props = {
|
|
3
|
+
className: string;
|
|
4
|
+
};
|
|
5
|
+
declare const Conversation: React.FC<Props>;
|
|
6
|
+
export default Conversation;
|
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
import ConversationComponent from './conversation-component';
|
|
2
|
-
export
|
|
3
|
-
export default ConversationComponent;
|
|
1
|
+
import ConversationComponent from './conversation-component';
|
|
2
|
+
export default ConversationComponent;
|