@telia-ace/widget-conversation 1.0.11 → 1.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/{lib-esm → dist}/agent.d.ts +0 -0
  2. package/{lib-esm → dist}/conversation-controller.d.ts +0 -0
  3. package/{lib-esm → dist}/conversation-form-adapter.d.ts +0 -0
  4. package/{lib-esm → dist}/conversation-platform.d.ts +0 -0
  5. package/{lib-esm → dist}/conversation-provider.d.ts +0 -0
  6. package/dist/conversation.js +1357 -0
  7. package/dist/conversation.js.map +1 -0
  8. package/{lib-esm → dist}/index.d.ts +0 -0
  9. package/dist/index.js +867 -0
  10. package/dist/index.js.map +1 -0
  11. package/{lib-esm → dist}/resolve-entity-value.d.ts +0 -0
  12. package/dist/return-button.js +174 -0
  13. package/dist/return-button.js.map +1 -0
  14. package/{lib-esm → dist}/types.d.ts +0 -0
  15. package/{lib-esm → dist}/ui/conversation/conversation-component.d.ts +0 -0
  16. package/{lib-esm → dist}/ui/conversation/conversation-content.d.ts +0 -0
  17. package/{lib-esm → dist}/ui/conversation/conversation-input.d.ts +0 -0
  18. package/{lib-esm → dist}/ui/conversation/conversation-loader.d.ts +0 -0
  19. package/{lib-esm → dist}/ui/conversation/conversation-message.d.ts +0 -0
  20. package/{lib-esm → dist}/ui/conversation/conversation-styles.d.ts +0 -0
  21. package/{lib-esm → dist}/ui/conversation/conversation.d.ts +0 -0
  22. package/{lib-esm → dist}/ui/conversation/index.d.ts +0 -0
  23. package/{lib-esm → dist}/ui/conversation/message-types/agent.d.ts +0 -0
  24. package/{lib-esm → dist}/ui/conversation/message-types/custom-message-list-item.d.ts +0 -0
  25. package/{lib-esm → dist}/ui/conversation/message-types/custom.d.ts +0 -0
  26. package/{lib-esm → dist}/ui/conversation/message-types/index.d.ts +0 -0
  27. package/{lib-esm → dist}/ui/conversation/message-types/system.d.ts +0 -0
  28. package/{lib-esm → dist}/ui/conversation/message-types/timestamp.d.ts +0 -0
  29. package/{lib-esm → dist}/ui/conversation/message-types/user.d.ts +0 -0
  30. package/{lib-esm → dist}/ui/index.d.ts +0 -0
  31. package/{lib-esm → dist}/ui/return-button/index.d.ts +0 -0
  32. package/{lib-esm → dist}/ui/return-button/return-button-component.d.ts +0 -0
  33. package/{lib-esm → dist}/ui/return-button/return-button.d.ts +0 -0
  34. package/{lib-esm → dist}/user.d.ts +0 -0
  35. package/{lib-esm → dist}/utils/custom-message.d.ts +0 -0
  36. package/{lib-esm → dist}/utils/index.d.ts +0 -0
  37. package/{lib-esm → dist}/utils/open-chat-widget.d.ts +0 -0
  38. package/package.json +15 -16
  39. package/lib/agent.d.ts +0 -17
  40. package/lib/agent.js +0 -37
  41. package/lib/conversation-controller.d.ts +0 -88
  42. package/lib/conversation-controller.js +0 -318
  43. package/lib/conversation-form-adapter.d.ts +0 -7
  44. package/lib/conversation-form-adapter.js +0 -88
  45. package/lib/conversation-platform.d.ts +0 -49
  46. package/lib/conversation-platform.js +0 -295
  47. package/lib/conversation-provider.d.ts +0 -22
  48. package/lib/conversation-provider.js +0 -73
  49. package/lib/index.d.ts +0 -9
  50. package/lib/index.js +0 -17
  51. package/lib/resolve-entity-value.d.ts +0 -10
  52. package/lib/resolve-entity-value.js +0 -22
  53. package/lib/types.d.ts +0 -110
  54. package/lib/types.js +0 -19
  55. package/lib/ui/conversation/conversation-component.d.ts +0 -37
  56. package/lib/ui/conversation/conversation-component.js +0 -152
  57. package/lib/ui/conversation/conversation-content.d.ts +0 -11
  58. package/lib/ui/conversation/conversation-content.js +0 -240
  59. package/lib/ui/conversation/conversation-input.d.ts +0 -6
  60. package/lib/ui/conversation/conversation-input.js +0 -163
  61. package/lib/ui/conversation/conversation-loader.d.ts +0 -8
  62. package/lib/ui/conversation/conversation-loader.js +0 -18
  63. package/lib/ui/conversation/conversation-message.d.ts +0 -7
  64. package/lib/ui/conversation/conversation-message.js +0 -141
  65. package/lib/ui/conversation/conversation-styles.d.ts +0 -11
  66. package/lib/ui/conversation/conversation-styles.js +0 -65
  67. package/lib/ui/conversation/conversation.d.ts +0 -6
  68. package/lib/ui/conversation/conversation.js +0 -139
  69. package/lib/ui/conversation/index.d.ts +0 -2
  70. package/lib/ui/conversation/index.js +0 -7
  71. package/lib/ui/conversation/message-types/agent.d.ts +0 -11
  72. package/lib/ui/conversation/message-types/agent.js +0 -54
  73. package/lib/ui/conversation/message-types/custom-message-list-item.d.ts +0 -9
  74. package/lib/ui/conversation/message-types/custom-message-list-item.js +0 -27
  75. package/lib/ui/conversation/message-types/custom.d.ts +0 -9
  76. package/lib/ui/conversation/message-types/custom.js +0 -50
  77. package/lib/ui/conversation/message-types/index.d.ts +0 -5
  78. package/lib/ui/conversation/message-types/index.js +0 -16
  79. package/lib/ui/conversation/message-types/system.d.ts +0 -12
  80. package/lib/ui/conversation/message-types/system.js +0 -26
  81. package/lib/ui/conversation/message-types/timestamp.d.ts +0 -8
  82. package/lib/ui/conversation/message-types/timestamp.js +0 -36
  83. package/lib/ui/conversation/message-types/user.d.ts +0 -8
  84. package/lib/ui/conversation/message-types/user.js +0 -24
  85. package/lib/ui/index.d.ts +0 -2
  86. package/lib/ui/index.js +0 -10
  87. package/lib/ui/return-button/index.d.ts +0 -2
  88. package/lib/ui/return-button/index.js +0 -7
  89. package/lib/ui/return-button/return-button-component.d.ts +0 -19
  90. package/lib/ui/return-button/return-button-component.js +0 -70
  91. package/lib/ui/return-button/return-button.d.ts +0 -6
  92. package/lib/ui/return-button/return-button.js +0 -82
  93. package/lib/user.d.ts +0 -7
  94. package/lib/user.js +0 -16
  95. package/lib/utils/custom-message.d.ts +0 -3
  96. package/lib/utils/custom-message.js +0 -56
  97. package/lib/utils/index.d.ts +0 -1
  98. package/lib/utils/index.js +0 -7
  99. package/lib/utils/open-chat-widget.d.ts +0 -4
  100. package/lib/utils/open-chat-widget.js +0 -148
  101. package/lib-esm/agent.js +0 -34
  102. package/lib-esm/conversation-controller.js +0 -314
  103. package/lib-esm/conversation-form-adapter.js +0 -85
  104. package/lib-esm/conversation-platform.js +0 -292
  105. package/lib-esm/conversation-provider.js +0 -70
  106. package/lib-esm/index.js +0 -6
  107. package/lib-esm/resolve-entity-value.js +0 -18
  108. package/lib-esm/types.js +0 -16
  109. package/lib-esm/ui/conversation/conversation-component.js +0 -127
  110. package/lib-esm/ui/conversation/conversation-content.js +0 -212
  111. package/lib-esm/ui/conversation/conversation-input.js +0 -138
  112. package/lib-esm/ui/conversation/conversation-loader.js +0 -13
  113. package/lib-esm/ui/conversation/conversation-message.js +0 -113
  114. package/lib-esm/ui/conversation/conversation-styles.js +0 -39
  115. package/lib-esm/ui/conversation/conversation.js +0 -111
  116. package/lib-esm/ui/conversation/index.js +0 -2
  117. package/lib-esm/ui/conversation/message-types/agent.js +0 -25
  118. package/lib-esm/ui/conversation/message-types/custom-message-list-item.js +0 -22
  119. package/lib-esm/ui/conversation/message-types/custom.js +0 -25
  120. package/lib-esm/ui/conversation/message-types/index.js +0 -5
  121. package/lib-esm/ui/conversation/message-types/system.js +0 -20
  122. package/lib-esm/ui/conversation/message-types/timestamp.js +0 -31
  123. package/lib-esm/ui/conversation/message-types/user.js +0 -19
  124. package/lib-esm/ui/index.js +0 -2
  125. package/lib-esm/ui/return-button/index.js +0 -2
  126. package/lib-esm/ui/return-button/return-button-component.js +0 -44
  127. package/lib-esm/ui/return-button/return-button.js +0 -54
  128. package/lib-esm/user.js +0 -13
  129. package/lib-esm/utils/custom-message.js +0 -52
  130. package/lib-esm/utils/index.js +0 -1
  131. package/lib-esm/utils/open-chat-widget.js +0 -142
@@ -0,0 +1 @@
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/conversation-platform.ts","../src/types.ts","../src/ui/conversation/conversation-component.ts","../src/ui/return-button/return-button-component.ts","../src/utils/custom-message.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 { ComponentNodeController, ComponentPlatform, ComponentQuery } 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\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 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 NoGoodAlternative = 'no-good-alternative',\r\n ButtonList = 'button-list',\r\n Text = 'text',\r\n HTML = 'html',\r\n FeedbackList = 'feedback-list',\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 NoGoodAlternativeItem = [\r\n ConversationMessageListItemType.NoGoodAlternative,\r\n {\r\n body: string;\r\n }\r\n];\r\ntype ButtonListItem = [\r\n ConversationMessageListItemType.ButtonList,\r\n {\r\n actions: { [key: string]: string };\r\n }\r\n];\r\ntype FeedbackListItem = [\r\n ConversationMessageListItemType.FeedbackList,\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 =\r\n | LinkListItem\r\n | HeaderItem\r\n | TextItem\r\n | SeparatorItem\r\n | NoGoodAlternativeItem\r\n | ButtonListItem\r\n | HTMLItem\r\n | FeedbackListItem;\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","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"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBO,MAAM,MAAM;AAAA,EAIf,YAAoB,UAAgC,UAAyB;AAAzD,SAAA,WAAA;AAKpB,SAAA,QAAQ,CACJ,cAKgC;AAChC,YAAM,SAAoC,EAAE,MAAM,KAAK,MAAM,QAAQ,KAAK;AACpE,YAAA,aAAa,6BAA6B,SAAQ;AAEjD,aAAA,KAAK,SAAS,YACjB,WAAW,KACX,WAAW,SACX,wBAAwB,OACxB,QACA,WAAW,SACf;AAAA,IAAA;AAEJ,SAAA,SAAS,MAAM;AACJ,aAAA,KAAK,SAAS,eAAe,EAAE,MAAM,KAAK,MAAM,QAAQ,KAAK,OAAQ,CAAA;AAAA,IAAA;AAvB5E,SAAK,OAAO,SAAS;AACrB,SAAK,SAAS,SAAS;AAAA,EAC3B;AAAA,EAwBA,OAAO,UAA+B;AAC5B,UAAA,EAAE,MAAM,WAAW;AACzB,QAAI,WAAW,MAAM;AACjB,WAAK,SAAS;AAAA,eACP,QAAQ;AACf,WAAK,SAAS;AAAA,IAClB;AAEA,QAAI,SAAS,MAAM;AACf,WAAK,OAAO;AAAA,eACL,MAAM;AACb,WAAK,OAAO;AAAA,IAChB;AAAA,EACJ;AACJ;AC5CO,MAAM,qBAAqB;AAAA,EAI9B,YACW,MACC,WACD,YACT;AAHS,SAAA,OAAA;AACC,SAAA,YAAA;AACD,SAAA,aAAA;AANX,SAAQ,gBAAiD;AAQrD,SAAK,OAAO,yCAAY;AAAA,EAC5B;AAAA,EAEA,OAAO,OAAO,MAAc,WAAsB,YAAoC;AAClF,WAAO,IAAI,qBAAqB,MAAM,WAAW,UAAU;AAAA,EAC/D;AAAA,EAEA,YAAY,WAA0B,IAAuB;AACzD,QAAI,KAAK,YAAY;AACV,aAAA,IAAI,MAAM,MAAM,QAAQ;AAAA,IACnC;AAAA,EACJ;AAAA,EAEA,MAAM,UAA+E;;AAC1E,WAAA,WAAK,eAAL,mBAAiB,MAAM;AAAA,EAClC;AAAA,EAEA,eAAe,QAAmC,MAAgC;;AAC9E,WAAO,WAAK,eAAL,mBAAiB,eAAe,QAAQ;AAAA,EACnD;AAAA,EAEA,UAAgC;AACxB,QAAA,CAAC,KAAK,YAAY;AAClB,aAAO,MAAM,MAAM;AAAA,MAAA;AAAA,IACvB;AACO,WAAA,KAAK,WAAW;EAC3B;AAAA,EAEA,YACI,KACA,SACA,MACA,QACA,WACF;;AACE,WAAO,WAAK,eAAL,mBAAiB,YAAY,KAAK,SAAS,MAAM,QAAQ;AAAA,EACpE;AAAA,EAEA,UAAU;;AAID,eAAA,eAAA,mBAAY,gBAAgB;AACjC,SAAK,aAAa;AAClB,SAAK,cAAc,QAAQ,CAAC,UAAU,MAAO,CAAA;AAAA,EACjD;AAAA,EAEA,gBAAgB,IAAyD;;AACrE,QAAI,KAAK,YAAY;AACjB,YAAM,cAAc,WAAK,eAAL,mBAAiB,gBAAgB;AAChD,WAAA,cAAc,KAAK,WAAW;AACnC,aAAO,MAAM;AACG;MAAA;AAAA,IAEpB;AAAA,EACJ;AAAA,EAEA,UAAU,IAAyD;;AAC/D,QAAI,KAAK,YAAY;AACjB,YAAM,cAAc,WAAK,eAAL,mBAAiB,OAAO,UACxC,wCACA;AAEC,WAAA,cAAc,KAAK,WAAW;AACnC,SAAG,CAAA,GAAmB,KAAK,WAAW,yBAA0B,CAAA;AAChE,aAAO,MAAM;AACG;MAAA;AAAA,IAEpB;AAAA,EACJ;AACJ;AC1FO,MAAM,KAAK;AAAA,EACd,YAAoB,YAAoC;AAApC,SAAA,aAAA;AAEpB,SAAA,QAAQ,CAAC,aAAsE;AACrE,YAAA,aAAa,6BAA6B,QAAQ;AACjD,aAAA,KAAK,WAAW,YACnB,WAAW,KACX,WAAW,SACX,wBAAwB,MACxB,QACA,WAAW,SACf;AAAA,IAAA;AAAA,EAVqD;AAY7D;ACGO,MAAM,kBAAkB;AAAA,EAC3B,YAAoB,QAAqB;AAArB,SAAA,SAAA;AAAA,EAAsB;AAAA,EAE1C,OACI,SAKF;AACQ,UAAA,aAAa,KAAK,sBAAsB,OAAO;AAErD,SAAK,OAA0C,UAAU;AAAA,EAC7D;AAAA,EAEA,SAAS;AACL,SAAK,OAAO,IAAI;AAAA,EACpB;AAAA,EAEQ,sBACJ,SAKF;AACE,QAAI,OAAO,YAAY;AAAiB,aAAA,EAAE,MAAM;aACvC,QAAQ,SAAS,MAAM,OAAO,YAAY;AAAiB,aAAA,EAAE,OAAO;;AACjE,aAAA;AAAA,EAChB;AACJ;AAEY,IAAA,4CAAA,6BAAL;AACI,2BAAA,UAAA;AACC,2BAAA,WAAA;AACC,2BAAA,YAAA;AAHD,SAAA;AAAA,GAAA,2BAAA,CAAA,CAAA;AAgBC,MAAA,+BAA+B,CACxC,aAK4B;AACxB,MAAA;AACJ,MAAI,MAAM;AACN,MAAA,YAA2B,KAAK;AAEpC,MAAI,MAAM,QAAQ,QAAQ,KAAK,SAAS,SAAS,IAAI;AAC7C,QAAA,OAAO,SAAS,OAAO,UAAU;AACjC,gBAAU,EAAE,OAAO,CAAgC,QAAQ,EAAE;AAAA,IAAA,OAC1D;AACO,gBAAA,EAAE,OAAwC;IACxD;AAAA,EAAA,WACO,OAAO,aAAa,UAAU;AAC3B,cAAA,EAAE,MAAM;EAAS,OACxB;AACH,eAAwC,YAAY;AAEpD,QAAI,SAAS,MAAM;AACL,gBAAA,mBACG;AAAA,IACb,OACG;AACO,gBAAA;AAAA,QACN,MAAM,SAAS;AAAA,QACf,SAAS,SAAS;AAAA,QAClB,OAAO,SAAS;AAAA,MAAA;AAEpB,UAAI,SAAS,KAAK;AACd,cAAM,SAAS;AAAA,MACnB;AACA,UAAI,SAAS,WAAW;AACpB,oBAAY,SAAS;AAAA,MACzB;AACA,UAAI,SAAS,MAAM;AACT,cAAA,UAAU,YAAY,OAAO,GAAG;AACtC,iBAAS,KAAK,OAAO;AACf,cAAA,YAAY,QAAQ;AAC1B,gBAAQ,OAAO;AAAA,MACnB;AACI,UAAA,SAAS,cAAc,MAAM;AACjB,oBAAA;AAAA,MAChB;AAAA,IACJ;AAAA,EACJ;AACO,SAAA,EAAE,SAAS,KAAK;AAC3B;AAEA,MAAM,oBAAoB,CACtB,cACA,WACC;AACD,MAAI,CAAC,QAAQ;AACT;AAAA,EACJ;AACM,QAAA,eAAe,KAAK,UAAU,MAAM;AAC1C,QAAM,gBAAgB,aAAa,UAAU,CAAC,SAAS;AAC5C,WAAA,iBAAiB,KAAK,UAAU,IAAI;AAAA,EAAA,CAC9C;AACD,MAAI,gBAAgB,IAAI;AACb,WAAA,aAAa,OAAO,eAAe,CAAC;AAAA,EAC/C;AACJ;AAMO,MAAM,uBAAuB;AAAA,EAsBhC,YAAmB,WAA6B,IAAY;AAAzC,SAAA,YAAA;AAA6B,SAAA,KAAA;AArBhD,SAAA,eAA6B;AAKhB,SAAA,OAAA,IAAI,KAAK,IAAI;AAI1B,SAAA,YAAsB;AAEJ,SAAA,SAAA;AAElB,SAAQ,sBAA8C;AAEtD,SAAQ,UAAkB;AAC1B,SAAQ,mBAA4B;AAEpC,SAAA,WAAkC;AAClC,SAAQ,eAA4C;AAiJpD,SAAA,QAAQ,CAAC,aAAsE;AACrE,YAAA,aAAa,6BAA6B,QAAQ;AAEjD,aAAA,KAAK,YACR,WAAW,KACX,WAAW,SACX,UACA,QACA,WAAW,SACf;AAAA,IAAA;AAvJM,UAAA,SAAiB,UAAU,IAAI,SAAS;AAC9C,SAAK,SAAS,OAAO,OAAO,YAAY,IAAI;AAAA,EAChD;AAAA,EAEA,aAAa,WAAqB;AAC9B,UAAM,UAAoB,CAAA;AAC1B,UAAM,QAAkB,CAAA;AAGxB,SAAK,UACA,OAAiB,CAAC,KAAK,aAAa;AACjC,UAAI,UAAU,QAAQ,QAAQ,MAAM,IAAI;AACpC,YAAI,KAAK,QAAQ;AAAA,MACrB;AACO,aAAA;AAAA,OACR,EAAE,EACJ,QAAQ,CAAC,qBAAqB;AAC3B,YAAM,gBAAgB,KAAK,UAAU,QAAQ,gBAAgB;AAC7D,UAAI,gBAAgB,IAAI;AACpB,gBAAQ,KAAK,gBAAgB;AACxB,aAAA,UAAU,OAAO,eAAe,CAAC;AAAA,MAC1C;AAAA,IAAA,CACH;AAGK,cAAA,QAAQ,CAAC,aAAa;AAC5B,UAAI,KAAK,UAAU,QAAQ,QAAQ,MAAM,IAAI;AACzC,cAAM,KAAK,QAAQ;AACd,aAAA,UAAU,KAAK,QAAQ;AAAA,MAChC;AAAA,IAAA,CACH;AAEG,QAAA,MAAM,UAAU,QAAQ,QAAQ;AAChC,WAAK,OAAO,SAAS,kCAAkC,EAAE,OAAO,SAAS;AAAA,IAC7E;AAAA,EACJ;AAAA,EAEA,eAAe,MAAoC;AACzC,UAAA,QAAQ,KAAK,cAAc,IAAI;AACrC,QAAI,QAAQ,IAAI;AACZ,aAAO,KAAK,oBAAoB;AAAA,IACpC;AACA,UAAM,WAAW,qBAAqB,OAAO,MAAM,KAAK,WAAW,IAAI;AAClE,SAAA,oBAAoB,KAAK,QAAQ;AAC/B,WAAA;AAAA,EACX;AAAA,EAEA,cAAc,MAAc;AACxB,WAAO,KAAK,oBAAoB,UAAU,CAAC,MAAM,EAAE,SAAS,IAAI;AAAA,EACpE;AAAA,EAEA,UAAU;AACN,SAAK,oBAAoB,QAAQ,CAAC,aAAa,SAAS,SAAS;AACjE,SAAK,WAAW;AACX,SAAA,OAAO,SAAS,oCAAoC,IAAI;AAC7D,SAAK,SAAS;AAAA,EAClB;AAAA,EAEA,UAAU,IAAmB;AACzB,WAAO,KAAK,OAAO,UAAU,oCAAoC,EAAE;AAAA,EACvE;AAAA,EAEA,UAAU,IAAmB;AACzB,WAAO,KAAK,OAAO,UAAU,wBAAwB,EAAE;AAAA,EAC3D;AAAA,EAEA,gBAAgB,QAA8B;AAC1C,UAAM,QAAQ,KAAK,cAAc,OAAO,IAAI;AAC5C,YAAQ,MAAM,KAAK,oBAAoB,OAAO,OAAO,CAAC;AACjD,SAAA,OAAO,SAAS,kCAAkC,EAAE,SAAS,CAAC,OAAO,IAAI,EAAA,CAAG;AAC7E,QAAA,CAAC,KAAK,oBAAoB,QAAQ;AAClC,WAAK,QAAQ;AAAA,IACjB;AAAA,EACJ;AAAA,EAEA,kBAAkB,IAAmB;AACjC,WAAO,KAAK,OAAO,UAAU,kCAAkC,EAAE;AAAA,EACrE;AAAA,EAEA,yBAAyB,SAAkB;AACnC,QAAA,KAAK,qBAAqB,SAAS;AACnC;AAAA,IACJ;AACA,SAAK,mBAAmB;AACxB,QAAI,SAAS;AACJ,WAAA,OAAO,SAAS,+BAA+B,KAAK;AACpD,WAAA,OAAO,SAAS,wBAAwB,IAAI;AACjD,WAAK,SAAS;AAAA,IAClB;AACK,SAAA,OAAO,SAAS,wCAAwC,OAAO;AAAA,EACxE;AAAA,EAEA,2BAA2B;AACvB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,gBAAgB,IAAmB;AAC/B,WAAO,KAAK,OAAO,UAAU,+BAA+B,EAAE;AAAA,EAClE;AAAA,EAEA,YACI,KACA,SACA,MACA,QACA,WACiB;AACjB,UAAM,UAA+B;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,UAAU;AAAA,MAClB,WAAW,aAAa,cAAc,OAAO,YAAY,KAAK,IAAI;AAAA,IAAA;AAEjE,SAAA,SAAS,KAAK,OAAO;AAC1B,YAAQ,SAAS,WACb,kBAAkB,KAAK,cAAc,MAAM;AAC/C,UAAM,QAAQ,IAAI,kBAAkB,CAAC,YAAY;AAC7C,UAAI,YAAY,MAAM;AAClB,cAAgE,cAAxD,aAAW,mBAAmB,WAA0B,IAAZ,qBAAY,IAAZ,CAA5C;AACR,gBAAQ,UAAU;AAClB,YAAI,kBAAkB;AAClB,kBAAQ,YAAY;AAAA,QACxB;AAAA,MAAA,OACG;AACH,cAAM,gBAAgB,KAAK,SAAS,QAAQ,OAAO;AACnD,gBAAQ,UAAU;AAClB,YAAI,gBAAgB,IAAI;AACf,eAAA,SAAS,OAAO,eAAe,CAAC;AAAA,QACzC;AAAA,MACJ;AACA,WAAK,OAAO,SAAS,gCAAgC,EAAE,QAAS,CAAA;AAChE,WAAK,OAAO;AAAA,IAAA,CACf;AACD,SAAK,OAAO,SAAS,gCAAgC,EAAE,QAAS,CAAA;AAChE,SAAK,OAAO;AACR,QAAA,CAAC,KAAK,kBAAkB;AACnB,WAAA,OAAO,SAAS,+BAA+B,IAAI;AAAA,IAC5D;AACO,WAAA;AAAA,EACX;AAAA,EAcA,SAAS;AACA,SAAA,OAAO,SAAS,wBAAwB;AAAA,MACzC,UAAU,KAAK;AAAA,MACf,SAAS,KAAK,UAAU;AAAA,MACxB,cAAc,KAAK;AAAA,IAAA,CACtB;AAAA,EACL;AAAA,EAEA,mBAAmB;AACR,WAAA;AAAA,MACH,UAAU,KAAK;AAAA,MACf,SAAS,KAAK,UAAU;AAAA,MACxB,cAAc,KAAK;AAAA,IAAA;AAAA,EAE3B;AAAA,EAEA,eAAe,QAAmC,MAAgC;AAC9E,QAAI,KAAK,aAAa,QAAQ,MAAM,MAAM,IAAI;AACrC,WAAA,aAAa,KAAK,MAAM;AAC7B,WAAK,OAAO;AAAA,IAChB;AAEA,WAAO,MAAM;AACS,wBAAA,KAAK,cAAc,MAAM;AAC3C,WAAK,OAAO;AAAA,IAAA;AAAA,EAEpB;AAAA,EAKA,SAA+B;AACtB,SAAA,UAAU,KAAK,UAAU;AAC9B,QAAI,YAAY;AACZ,QAAA,KAAK,YAAY,GAAG;AACpB,WAAK,OAAO;AAAA,IAChB;AACA,WAAO,MAAM;AACT,UAAI,CAAC,WAAW;AACA,oBAAA;AACP,aAAA,UAAU,KAAK,UAAU;AAC1B,YAAA,KAAK,YAAY,GAAG;AACpB,eAAK,OAAO;AAAA,QAChB;AAAA,MACJ;AAAA,IAAA;AAAA,EAER;AAAA,EAEA,WAAW,KAAa,SAAwB;AACvC,SAAA,aAAa,OAAO,iCAAK,KAAK,aAAa,OAAvB,EAA6B,QAAQ;EAClE;AAAA,EAEA,aAAa,KAAa,SAA0B;AAC3C,SAAA,aAAa,OAAO,iCAAK,KAAK,aAAa,OAAvB,EAA6B,UAAU;EACpE;AACJ;AC7WA,MAAM,kBAAkB,CAAC,YAAoB,mBAAmC;AACtE,QAAA,iBAAiB,WAAW,MAAM,UAAU;AAClD,SAAO,eAAe,QAAQ,IAAI,eAAe,EAAE;AACvD;AAEA,MAAM,oBAAoB,CAAC,cAAyB;AAC1C,QAAA,eAAe,UAAU,IAAI,SAAS;AAC5C,QAAM,EAAE,MAAM,mBAA2B,UAAU,IAAI,SAAS;AAE1D,QAAA,aACF,KAAK,QAAQ,UAAU,IAAI,KAAK,gBAAgB,MAAM,cAAc,IAAI;AAC5E,QAAM,EAAE,SAAyB,UAAU,IAAI,WAAW;AAC1D,QAAM,EAAE,YAA4B,WAAW,UAAU,IAAI,WAAW;AAClE,QAAA,iBAAiB,GAAG,KACrB,QAAQ,mBAAmB,EAAE,EAC7B,QAAQ,YAAY,EAAE;AAE3B,QAAM,aAAa,eAAe,QAAQ,IAAI,cAAc;AACxD,MAAA,cAAc,CAAC,SAAS;AACjB,WAAA,EAAE,YAAY,YAAY;EACrC;AACO,SAAA,EAAE,YAAY;AACzB;AAEa,MAAA,uBAAuB,CAAC,cAAyB;AACpD,QAAA,EAAE,eAAe,kBAAkB,SAAS;AAClD,SAAO,CAAC,CAAC;AACb;AAEO,MAAM,iBAAiB,CAC1B,WACA,eACA,qBACC;AACD,QAAM,EAAE,YAAY,MAAM,eAAe,kBAAkB,SAAS;AAEpE,MAAI,YAAY;AACR,QAAA,WAAW,UAAU,aAAa;AAClC,aAAO,WAAW,OAAO,MAAM,EAAE,KAAK,MAAM;AACxC,mBAAW,UAAU,SAAS,cAAc,EAAE,KAAK,CAAC,iBAAiB;AAE5D,uBAAA,+BAA+B,cAAc,EAAE,EAC/C,KAAK,MAAM,eAAe,SAAS,CAAC;AAAA,QAAA,CAC5C;AAAA,MAAA,CACJ;AAAA,IACL;AACA,WAAO,WACF,WACA,KAAK,MAAM;AACR,YAAM,EAAE,YAAY,WAAW,UAAU,IAAI,WAAW;AACxD,cAAQ,SAAS;AACV,aAAA,WACF,OAAO,eAAe,MAAO;AAAA,QAC1B;AAAA,QACA;AAAA,QACA,UAAU;AAAA,MAAA,EACZ,EACD,KAAK,MAAM;AACR,eAAO,WAAW,UACb,SAAS,YAAY,EACrB,KAAK,CAAC,eAAkC;AAIrC,gBAAM,sBAAsB,WACvB,WAAW,EACX,OAAO,gBAAgB;AAC5B,qBAAW,MAAM;AAAA,YACb,KAAK;AAAA,YACL,YAAY;AAAA,cACR,YAAY;AAAA,gBACR,IAAI,cAAc;AAAA,gBAClB,SAAS,cAAc;AAAA,cAC3B;AAAA,YACJ;AAAA,YACA,QAAQ;AAAA,YACR,UAAU;AAAA,UAAA,CACb;AACD,gBAAM,qBAAqB,WACtB,WAAW,EACX,OAAO,cAAc;AAC1B,qBAAW,MAAM;AAAA,YACb,KAAK;AAAA,YACL,YAAY;AAAA,cACR,YAAY,EAAE,WAAW,CAAC,cAAc,UAAU,EAAE;AAAA,YACxD;AAAA,YACA,QAAQ;AAAA,YACR,UAAU;AAAA,UAAA,CACb;AAAA,QAAA,CACJ;AAAA,MAAA,CACR;AAAA,IAAA,CACR,EACA,KAAK,MAAM;AACD,aAAA,WAAW,OAAO,UAAU;AAAA,QAC/B,KAAK;AAAA,QACL,mBAAmB;AAAA,QACnB,iBAAiB;AAAA,MAAA,CACpB;AAAA,IAAA,CACJ,EACA,KAAK,MAAM;AACR,0BACI,WAAW,WACX,sBACA,gBAAgB,WAChB;AAAA,QACI,QAAQ,cAAc;AAAA,QACtB,OAAO,aAAa;AAAA,MAAA,CAE5B,EAAE,KAAK,CAAC,UAAU,MAAM,WAAW,IAAI,CAAC;AAExC,aAAO,WAAW,UACb,SAAS,cAAc,EACvB,KAAK,CAAC,aAAa;AACP,iBAAA,6BAA6B,0BAA0B,UAAU;AAAA,MAAA,CAC7E,EACA,KAAK,MAAM,eAAe,SAAS,CAAC,EACpC,KAAK,MAAM,KAAK;AAAA,IAAA,CACxB;AAAA,EACT;AACA,aAAW,UAAU,SAAS,cAAc,EAAE,KAAK,CAAC,aAAmC;AAC5E,WAAA,SACF,+BAA+B,cAAc,EAAE,EAC/C,KAAK,MAAM,SAAS,6BAA6B,0BAA0B,QAAQ,CAAC;AAAA,EAAA,CAC5F;AACD,SAAO,aAAa,QAAQ;AAChC;AAEO,MAAM,yBAAyB,CAClC,WACA,eACA,YAAY,mBACX;AACD,QAAM,EAAE,YAAY,eAAe,kBAAkB,SAAS;AAC9D,MAAI,YAAY;AACZ,WAAO,WAAW,UAAU,SAAS,QAAQ,EAAE,KAAK,CAAC,WAAgB;AACjE,aAAO,SAAS,WAAW,EAAE,IAAI,cAAc,IAAI;AAAA,IAAA,CACtD;AAAA,EACL;AAEA,SAAO,WAAW,UAAU,SAAS,cAAc,EAAE,KAAK,CAAC,aAAmC;;AAC1F,mBAAS,6BAA6B,0BAA0B,QAAQ,MAAxE,mBAA2E,KAAK,MAAM;AAClF,iBAAW,UAAU,SAAS,QAAQ,EAAE,KAAK,CAAC,WAAgB;AAC1D,mBAAW,UACN,SAAS,YAAY,EACrB,KAAK,CAAC,eAAkC;AACrC,gBAAM,oBAAoB,WAAW,WAAW,EAAE,OAAO,cAAc;AACvE,qBAAW,MAAM;AAAA,YACb,KAAK;AAAA,YACL,YAAY,EAAE,YAAY,EAAE,WAAW,CAAC,cAAc,UAAU,IAAI;AAAA,YACpE,QAAQ;AAAA,YACR,UAAU;AAAA,UAAA,CACb;AAAA,QAAA,CACJ,EACA,KAAK,MAAM;AACR,iBAAO,SAAS,WAAW,EAAE,IAAI,cAAc,IAAI;AAAA,QAAA,CACtD;AAAA,MAAA,CACR;AAAA,IAAA;AAAA,EACJ,CACJ;AACL;ACtJA,MAAM,cAAc;AAcR,IAAA,8CAAA,+BAAL;AACU,6BAAA,gBAAA;AACF,6BAAA,cAAA;AACJ,6BAAA,UAAA;AAHC,SAAA;AAAA,GAAA,6BAAA,CAAA,CAAA;AAYL,MAAM,qBAAqB;AAAA,EAc9B,YAAoB,WAA8B,YAA+B;AAA7D,SAAA,YAAA;AAA8B,SAAA,aAAA;AAZlD,SAAQ,cAGF;AACN,SAAQ,YAAgD;AACxD,SAAQ,mBAA8D;AACtE,SAAQ,gBAAiD;AACzD,SAAQ,gBAAsC;AAC9C,SAAQ,SAAgC;AACxC,SAAQ,cAAqC;AAC7C,SAAQ,cAAkC;AAGhC,UAAA,SAAiB,UAAU,IAAI,SAAS;AAC9C,SAAK,SAAS,OAAO,OAAO,YAAY,IAAI;AAAA,EAChD;AAAA,EAEA,aAAa;AACT,wBAAoB,KAAK,WAAW,aAAa,gBAAgB,WAAW;AAAA,MACxE,QAAQ,cAAc;AAAA,IAAA,CACzB,EAAE,KAAK,CAAC,WAAY,KAAK,gBAAgB,MAAO;AAExB,gBAAA,KAAK,WAAW,aAAa,cAAc,KAAK,EAAE,KACvE,CAAC,kBAAkB;AACf,WAAK,cAAc,KAAK,WACnB,aACA,OAAO,4BAA4B;AACxC,UAAI,eAAe;AACf,aAAK,cAAc;AACf,YAAA,cAAc,MAAM,cAAc,OAAO;AACpC,eAAA,kBAAkB,EAAE,QAAQ,MAAM,OAAO,EAAE,MAAM,MAAM,EAAA,CAAG;AAAA,QACnE;AAAA,MACJ;AAAA,IAAA,CAER;AACK,SAAA,UAAU,SAAS,QAAQ,EAAE,KAAK,CAAC,WAAY,KAAK,SAAS,MAAO;AACzE,SAAK,OAAO,UAAU,sBAAsB,CAAC,OAAO,SAAS;;AACzD,cAAQ,WAAK,gBAAL,mBAAkB;AAAA,aACjB;AACD,gBAAM,SAAiB,KAAK,UAAU,IAAI,SAAS;AACnD,iBAAO,WAAW;AAClB;AAAA,aACC;AACK,gBAAA,eAAe,WAAK,WAAL,mBAAa;AAClC,cAAI,cAAc;AACT,uBAAA,WAAA,mBAAQ,SAAS,aAAa;AAAA,UACvC;AACA;AAAA;AAKR,WAAK,kBAAkB,EAAE,QAAQ,MAAO,CAAA;AACxC,WAAK,cAAc;AACd,WAAA,iBAAiB,KAAK;IAAc,CAC5C;AAAA,EACL;AAAA,EAEA,gBAAgB,KAAoC;AAC3C,SAAA,cAAc,KAAK,GAAG;AAAA,EAC/B;AAAA,EAEA,OAAO,YACH,WACA,MAAc,gBACe;AACtB,WAAA,KAAK,SAAS,EAAE,MAAM;AACzB,aAAO,UAAU,SAAS,GAAG,EAAE,KAAK,CAAC,UAAgC;AACjE,YAAI,eAAe;AACnB,YAAI,CAAC,cAAc;AACf,iBAAO,kBAAkB,YAAY,SAAS,EAAE,KAAK,CAAC,eAAe;AAClD,2BAAA,IAAI,qBAAqB,WAAW,UAAU;AAC7D,yBAAa,WAAW;AACd,sBAAA,cAAc,KAAK,MAAM,YAAY;AACxC,mBAAA;AAAA,UAAA,CACV;AAAA,QACL;AACO,eAAA;AAAA,MAAA,CACV;AAAA,IAAA,CACJ;AAAA,EACL;AAAA,EAEA,+BAA+B,IAA2B;AAC/C,WAAA,YAAyB,KAAK,WAAW,aAAa,cAAc,KAAK,EAAE,KAC9E,CAAC,kBAAkB;;AACX,UAAA,iBAAiB,cAAc,OAAO,IAAI;AAC1C,YAAI,cAAc,OAAO;AACf,gBAAA,EAAE,MAAM,WAAW,cAAc;AAClC,qBAAA,WAAA,mBAAQ,SAAS,MAAM;AAAA,QAChC;AAAA,MACJ;AAAA,IAAA,CAER;AAAA,EACJ;AAAA,EAEA,6BAA6B,UAAqC;AACvD,WAAA,YAAyB,KAAK,WAAW,aAAa,cAAc,KAAK,EAAE,KAC9E,CAAC,WAAW;AACR,UAAI,gBAAgB;AACpB,UAAI,eAAe;AACf,sBAAc,4BAA4B;AAAA,MAAA,OACvC;AACa,wBAAA,EAAE,2BAA2B;MACjD;AACA,WAAK,cAAc;AAEd,aAAA,KAAK,iBAAiB,KAAK,cAAc,KAAK,WAAW,KAC1D,QAAQ;IAAQ,CAG5B;AAAA,EACJ;AAAA,EAEA,iBAAiB,IAAY;AACnB,UAAA,QAAQ,KAAK,YAAY,UAAU,CAAC,MAAM,EAAE,aAAa,OAAO,EAAE;AACxE,QAAI,QAAQ,IAAI;AACL,aAAA,KAAK,YAAY,OAAO;AAAA,IACnC;AACA,WAAO,IAAI,uBAAuB,KAAK,WAAW,EAAE;AAAA,EACxD;AAAA,EAEA,iBAAiB,MAAc,SAAoC;AAC/D,UAAM,WAAW;AAAA,MACb;AAAA,MACA;AAAA,IAAA;AAEC,SAAA,UAAU,KAAK,QAAQ;AAE5B,SAAK,YACA,OAAO,CAAC,eAAe,WAAW,aAAa,UAAU,QAAQ,IAAI,IAAI,EAAE,EAC3E,QAAQ,CAAC,eAAe;AAChB,WAAA,cAAc,UAAU,UAAU;AAAA,IAAA,CAC1C;AAAA,EACT;AAAA,EAEA,mBACI,cACA,WACO;AACD,UAAA,QAAQ,KAAK,YAAY,UAAU,CAAC,MAAM,EAAE,aAAa,OAAO,aAAa,EAAE;AACjF,QAAA;AACJ,QAAI,QAAQ,GAAG;AACE,mBAAA,EAAE,cAAc;AACxB,WAAA,YAAY,KAAK,UAAU;AAC1B,YAAA,iBAAiB,CAAC,cAAwB;AAC5C,YAAI,WAAW;AACX,eAAK,UACA,OAAO,CAAC,aAAa,UAAU,QAAQ,SAAS,IAAI,IAAI,EAAE,EAC1D,QAAQ,CAAC,aAAa;AACd,iBAAA,cAAc,UAAU,UAAU;AAAA,UAAA,CAC1C;AAAA,QACT;AAAA,MAAA;AAGJ,WAAK,cAAc,KACf,aAAa,UAAU,CAAC,OAAO,SAAS;AAC9B,cAAA,SAAQ,KAAK,YAAY,UAAU,CAAC,MAAM,EAAE,iBAAiB,IAAI;AACvE,iBAAQ,MAAM,KAAK,YAAY,OAAO,QAAO,CAAC;AAC9C,aAAK,WACA,WACA,EAAA,OAAO,4BAA4B,EACnC,OAAO,EACP,gBAAgB,EAAE,QAAQ,MAAO,CAAA;AAEjC,aAAA,OAAO,SAAS,sBAAsB,IAAI,EAAE,SAAS,MAAM;AAAA,MACnE,CAAA,CACL;AACA,WAAK,cAAc,KACf,aAAa,kBAAkB,CAAC,OAAO,SAAS;AACtC,cAAA,EAAE,OAAO,YAAoD;AAC3D,gBAAA,QAAQ,CAAC,oBAAoB;AACjC,eAAK,iBAAiB,iBAAiB,QAAQ,CAAC,YAAY;AAChD;UAAA,CACX;AAAA,QAAA,CACJ;AACD,uBAAe,KAAK;AAAA,MACvB,CAAA,CACL;AAEA,WAAK,cAAc,KACf,aAAa,UAAU,CAAC,OAAO,aAAa;;AACxC,cAAM,UAAuB;AAAA,UACzB,IAAI,aAAa;AAAA,UACjB,OAAO,WAAK,WAAL,mBAAa;AAAA,UACpB,2BAA2B,WAAK,gBAAL,mBAAkB;AAAA,QAAA;AAEjD,aAAK,cAAc;AACd,aAAA,iBAAiB,KAAK,cAAc,OAAO;AAEhD,aAAK,kBAAkB,EAAE,QAAQ,SAAU,CAAA;AAAA,MAC9C,CAAA,CACL;AAEA,WAAK,cAAc,KACf,aAAa,gBAAgB,CAAC,OAAO,SAAS;AACrC,aAAA,OAAO,SAAS,+BAA+B,IAAI;AACxD,aAAK,kBAAkB,EAAE,OAAO,EAAE,MAAM,QAAQ;AAAA,MACnD,CAAA,CACL;AAEA,qBAAe,aAAa,SAAS;AAC9B,aAAA;AAAA,IACX;AACA,iBAAa,KAAK,YAAY;AACvB,WAAA;AAAA,EACX;AAAA,EAEA,kBAA0B,YAAiB,MAAc,iCAAiC;AACtF,QAAI,KAAK,aAAa;AAClB,WAAK,WAAW,MAAM;AAAA,QAClB,KAAK;AAAA,QACL,YAAY,EAAE,WAAW;AAAA,QACzB,QAAQ,KAAK;AAAA,QACb,UAAU;AAAA,MAAA,CACb;AAAA,IACL;AAAA,EACJ;AAAA,EAEQ,cAAc,UAA4C,YAAiB;AACzE,UAAA,UAAU,SAAS,QACrB,WAAW,aAAa,eAAe,SAAS,IAAI,GACpD,WAAW,SACf;AACA,QAAI,SAAS;AACT,UAAI,CAAC,KAAK,iBAAiB,SAAS,OAAO;AAClC,aAAA,iBAAiB,SAAS,QAAQ,CAAA;AAAA,MAC3C;AACA,WAAK,iBAAiB,SAAS,MAAM,KAAK,OAAO;AAAA,IACrD;AAAA,EACJ;AAAA,EAEA,oBAAoB;AACT,WAAA,YAAyB,KAAK,WAAW,aAAa,cAAc,KAAK,EAAE,KAC9E,CAAC,WAAW,iCAAQ,KACxB;AAAA,EACJ;AAAA,EAEA,UAAU;AACN,WAAO,KAAK,KAAK,gBAAgB,EAAE,QAAQ,CAAC,QAAQ;AAChD,WAAK,iBAAiB,KAAK,QAAQ,CAAC,YAAY;AACpC;MAAA,CACX;AAAA,IAAA,CACJ;AACI,SAAA,cAAc,QAAQ,CAAC,gBAAgB;AAC5B;IAAA,CACf;AACD,SAAK,cAAc;AACnB,SAAK,YAAY;EACrB;AAAA,EAEA,OAAoB,yBAChB,OACA,WACA,eACA,UACF;AAAA;AACM,UAAA,qBAAqB,SAAS,GAAG;AACjC,cAAM,eAAe;AACjB,YAAA,YAAY,SAAS,eAAe,uBAAuB;AAC/D,YAAI,CAAC,WAAW;AACA,sBAAA,SAAS,cAAc,GAAG;AAC5B,oBAAA,aAAa,QAAQ,GAAG;AAClC,oBAAU,KAAK;AACN,mBAAA,KAAK,YAAY,SAAS;AAAA,QACvC;AACe,uBAAA,WAAW,eAAe,SAAS;AAAA,MACtD;AACA,qBAAe,WAAW,aAAa;AAAA,IAC3C;AAAA;AAAA,EAEA,OAAoB,0BAA0B,WAAsB,eAAoB;AAAA;AAC7E,aAAA,uBAAuB,WAAW,aAAa;AAAA,IAC1D;AAAA;AACJ;AClQY,IAAA,oDAAA,qCAAL;AACM,mCAAA,YAAA;AACE,mCAAA,cAAA;AACC,mCAAA,eAAA;AACQ,mCAAA,uBAAA;AACP,mCAAA,gBAAA;AACN,mCAAA,UAAA;AACA,mCAAA,UAAA;AACQ,mCAAA,kBAAA;AARP,SAAA;AAAA,GAAA,mCAAA,CAAA,CAAA;AChCZ,MAAM,kBAAkB,CACpB,UACA,YAC+B;AAC/B,SAAO,SAAS,OAAO,CAAC,KAAY,SAAc,UAAkB;;AAChE,UAAM,UAAU,iCACT,UADS;AAAA,MAEZ,SAAS,CAAC,iCAAK,QAAQ,UAAb,EAAsB,KAAK,QAAQ,MAAK;AAAA,IAAA;AAEtD,QAAI,IAAI,SAAS,KAAK,QAAQ,SAAS,wBAAwB,QAAQ;AAC7D,YAAA,WAAW,IAAI,IAAI,SAAS;AAE7B,UAAA,CAAC,WAAW,YAAY,KACzB,KAAK,IAAI,SAAS,YAAY,QAAQ,SAAS,IAAI,SACrD;AAEM,YAAA,gBAAS,WAAT,mBAAiB,UAAS,eAAQ,WAAR,mBAAgB,SAC1C,SAAS,SAAS,QAAQ,MAC5B;AACE,mBAAS,YAAY,QAAQ;AACpB,mBAAA,QAAQ,KAAK,iCAAK,QAAQ,UAAb,EAAsB,KAAK,QAAQ,IAAA,EAAK;AACvD,iBAAA;AAAA,QACX;AAAA,MACJ;AAAA,IACJ;AACA,QAAI,KAAK,OAAO;AACT,WAAA;AAAA,EACX,GAAG,CAAE,CAAA;AACT;AAiBM,MAAA,wBAAwB,CAAC,cAAyB;AACpD,SAAO,QAAQ,IAAI;AAAA,IACf,qBAAqB,YAAY,SAAS;AAAA,IAC1C,UAAU,SAAS,QAAQ;AAAA,EAC9B,CAAA,EAAE,KAAK,CAAC,CAAC,UAAU,YAAoD;AACpE,WAAO,qBACH,WACA,gBACA,OAAO,sBACP,CAAC,cAAc;AACL,YAAA,YAAY,OAAO;AACzB,YAAM,OAAO,UAAU,OAAO,MAAM,UAAU,KAAK,QAAQ;AACrD,YAAA,eAAe,SAAS,iBAAiB,IAAI;AACnD,YAAM,kBAAkB,SAAS,mBAAmB,cAAc,SAAS;AAErE,YAAA,yBAAyB,IAAI,KAAK;AAElC,YAAA,gBAAgB,CAAC,eAAgD;AAC7D,cAAA,EAAE,YAAY,OAAO;AAC3B,YAAI,WAAW;AACX,gBAAM,eAAe,MAAM,QAAQ,SAAS,IAAI,YAAY,CAAC,SAAS;AACtE,uBAAa,aAAa,YAAY;AAC/B,iBAAA;AAAA,QACX;AAAA,MAAA;AAEU,oBAAA,UAAU,WAA4C,aAAa,CAAC;AAElF,mBAAa,yBAAyB,IAAI;AAEpC,YAAA,gBAAgB,CAAC,kBAAuB;AACpC,cAAA,EAAE,SAAS,cAAc,aAAa;AAC5C,kBAAU,gBAAgB;AAAA,UACtB;AAAA,UACA;AAAA,UACA,UAAU,gBAAgB,UAAU,sBAAsB;AAAA,QAAA,CAC7D;AAAA,MAAA;AAGS,oBAAA,aAAa,kBAAkB;AAE7C,UAAI,iBAAiB;AAEjB,kBAAU,QAAQ,OAAO,eAAe,CAAC,MAAM,YAAY;AACvD,cAAI,SAAS;AACH,kBAAA,EAAE,gBAAgB,sBAAsB;AAC9C,gBAAI,gBAAgB;AAChB,kBAAI,mBAAmB;AACD,kCAAA,EAAE,KAAK,CAAC,SAAiB;AACvC,sBAAI,MAAM;AACO,iCAAA,KAAK,MAAM,IAAI;AAAA,kBAChC;AAAA,gBAAA,CACH;AAAA,cACL;AACA;AAAA,YACJ;AAAA,UACJ;AACa,uBAAA,KAAK,MAAM,KAAK,IAAI;AAAA,QAAA,CACpC;AAED,kBAAU,QAAQ,OAAO,eAAe,CAAC,MAAM,YAAY;AAAA,QAAA,CAAE;AAE7D,kBAAU,QAAQ,OAAO,QAAQ,CAAC,MAAM,YAAY;AAAA,QAAA,CAAE;AAEtD,kBAAU,QAAQ,OAAO,UAAU,CAAC,MAAM,YAAY;AAAA,QAAA,CAAE;AAAA,MAC5D;AAEA,YAAM,cAAc,aAAa,OAAO,UACpC,wBACA,CAAC,GAAQ,qBAA0C;AAC/C,sBAAc,gBAAgB;AAAA,MAAA,CAEtC;AAEA,aAAO,MAAM;AACT,qBAAa,yBAAyB,KAAK;AAC/B;AACR,YAAA,CAAC,aAAa,QAAQ;AAIR,wBAAA,EAAE,UAAU,IAAI,cAAc,CAAA,GAAI,SAAS,MAAA,CAAO;AAAA,QACpE;AAAA,MAAA;AAAA,IACJ,GAEJ,EAAE,iBAAiB,KAAA,CACvB;AAAA,EAAA,CACH;AACL;AC5IM,MAAA,oCAAoC,CAAC,cAAyB;AAChE,SAAO,QAAQ,IAAI;AAAA,IACf,kBAAkB,YAAY,SAAS;AAAA,IACvC,qBAAqB,YAAY,SAAS;AAAA,IAC1C,UAAU,SAAS,QAAQ;AAAA,EAAA,CAC9B,EAAE,KACC,CAAC,CAAC,YAAY,UAAU,YAIlB;AACF,WAAO,qBACH,WACA,8BACA,OAAO,uBACP,CAAC,cAAc;AACX,gBAAU,QAAQ,OAAO,UAAU,CAAC,UAAU,CAAA,MAAO;;AACjD,uBAAS,kBAAkB,MAA3B,mBAA8B,KAAK,CAAC,UAAU;AAC1C,mBAAS,OAAO,SAAS,MAAM,MAAM,MAAM,MAAM;AAAA,QAAA;AAAA,MACpD,CACJ;AAAA,IAAA,CAET;AAAA,EAAA,CAER;AACJ;AC3CO,MAAM,iCAAiC,CAC1C,WACA,MACA,cACC;AACD,SAAO,UAAU,SAAS,mBAAmB,EAAE,KAAK,CAAO,MAAyB;AAChF,UAAM,WAAW,MAAM,qBAAqB,YAAY,SAAS;AACxD,aAAA,gBACL,EAAE,kBACE,MACA,KAAK,MAAM,SAAS,CACxB,CACJ;AAAA,EAAA,EACH;AACL;;"}
File without changes
@@ -0,0 +1,174 @@
1
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
2
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
3
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
4
+ var __objRest = (source, exclude) => {
5
+ var target = {};
6
+ for (var prop in source)
7
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
8
+ target[prop] = source[prop];
9
+ if (source != null && __getOwnPropSymbols)
10
+ for (var prop of __getOwnPropSymbols(source)) {
11
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
12
+ target[prop] = source[prop];
13
+ }
14
+ return target;
15
+ };
16
+ import { useProperties, useDispatch, SymbolBadge, Button, borderTabStyle } from "@telia-ace/widget-ui";
17
+ import React from "react";
18
+ import styled, { keyframes, css } from "styled-components";
19
+ const ReturnButton = (_a) => {
20
+ var _b = _a, { className } = _b, other = __objRest(_b, ["className"]);
21
+ const { label, active, mode = "flat", alert = {} } = useProperties();
22
+ const { symbol, label: alertLabel, show: showAlert } = alert;
23
+ const dispatch = useDispatch();
24
+ if (!active) {
25
+ return null;
26
+ }
27
+ return /* @__PURE__ */ React.createElement(StyledHighlightedButton, {
28
+ className,
29
+ mode,
30
+ "aria-label": label,
31
+ onClick: () => {
32
+ dispatch("toggle");
33
+ }
34
+ }, /* @__PURE__ */ React.createElement(StyledLabel, null, label), symbol && /* @__PURE__ */ React.createElement(StyledIconHolder, {
35
+ showAlert
36
+ }, /* @__PURE__ */ React.createElement(SymbolBadge, {
37
+ symbol,
38
+ title: alertLabel,
39
+ size: 20
40
+ })));
41
+ };
42
+ const FlashingColorAnimation = (props) => {
43
+ var _a, _b, _c;
44
+ return keyframes`
45
+ 0% {
46
+ background-color: ${(_a = props.theme.colors) == null ? void 0 : _a.primary};
47
+ }
48
+ 50% {
49
+ background-color: ${(_b = props.theme.colors) == null ? void 0 : _b.accent};
50
+ }
51
+ 100 {
52
+ background-color: ${(_c = props.theme.colors) == null ? void 0 : _c.primary};
53
+ }
54
+ `;
55
+ };
56
+ const ScrollingGradientAnimation = (props) => keyframes`
57
+ 0% {
58
+ background-position:0% 51%
59
+ }
60
+ 50% {
61
+ background-position:100% 0%
62
+ }
63
+ 100% {
64
+ background-position:0% 51%
65
+ }
66
+ `;
67
+ const PulsatingIcon = keyframes`
68
+ 0% {
69
+ transform: rotate(0deg) scale(1.00);
70
+ }
71
+ 50% {
72
+ transform: rotate(0deg) scale(1.00);
73
+ }
74
+ 55% {
75
+ transform: rotate(-3deg) scale(0.80);
76
+ }
77
+ 60% {
78
+ transform: rotate(-3deg) scale(0.80);
79
+ }
80
+ 65% {
81
+ transform: rotate(3deg) scale(1.20);
82
+ }
83
+ 70% {
84
+ transform: rotate(-3deg) scale(1.20);
85
+ }
86
+ 75% {
87
+ transform: rotate(3deg) scale(1.20);
88
+ }
89
+ 80% {
90
+ transform: rotate(-3deg) scale(1.20);
91
+ }
92
+ 85% {
93
+ transform: rotate(3deg) scale(1.20);
94
+ }
95
+ 90% {
96
+ transform: rotate(-3deg) scale(1.20);
97
+ }
98
+ 95% {
99
+ transform: rotate(3deg) scale(1.20);
100
+ }
101
+ 100% {
102
+ transform: rotate(0deg) scale(1);
103
+ }
104
+ `;
105
+ const StyledIconHolder = styled.span`
106
+ flex-grow: 0;
107
+ transform: translateX(${(p) => p.showAlert ? "0px" : "50px"});
108
+ opacity: ${(p) => p.showAlert ? 1 : 0};
109
+ transition: transform 0.5s ease, opacity 0.3s ease;
110
+ `;
111
+ const StyledLabel = styled.span`
112
+ flex: 1;
113
+ font-weight: 300;
114
+ `;
115
+ const flashingStyle = css`
116
+ animation: ${FlashingColorAnimation} 1s ease infinite;
117
+ `;
118
+ const flashingGradientStyle = css`
119
+ background: linear-gradient(
120
+ 155deg,
121
+ ${(p) => {
122
+ var _a;
123
+ return (_a = p.theme.colors) == null ? void 0 : _a.primary;
124
+ }},
125
+ ${(p) => {
126
+ var _a;
127
+ return (_a = p.theme.colors) == null ? void 0 : _a.accent;
128
+ }}
129
+ );
130
+ background-position: 0px 0px;
131
+ background-size: 200% 200%;
132
+ animation: ${ScrollingGradientAnimation} 1.5s ease infinite;
133
+ `;
134
+ const StyledHighlightedButton = styled(Button)`
135
+ overflow: hidden;
136
+ padding: ${(p) => {
137
+ var _a;
138
+ return (_a = p.theme.sizes) == null ? void 0 : _a.large;
139
+ }};
140
+ border-radius: ${(p) => p.theme.borderRadius};
141
+ color: ${(p) => {
142
+ var _a;
143
+ return (_a = p.theme.colors) == null ? void 0 : _a.text;
144
+ }};
145
+ ${(p) => p.mode === "flashing" ? flashingStyle : p.mode === "flashingGradient" ? flashingGradientStyle : ""}
146
+ background-color: ${(p) => {
147
+ var _a;
148
+ return (_a = p.theme.colors) == null ? void 0 : _a.primary;
149
+ }};
150
+ display: flex;
151
+ align-items: center;
152
+ justify-content: center;
153
+ i,
154
+ svg {
155
+ animation: ${PulsatingIcon} 3s ease infinite;
156
+ }
157
+
158
+ &:focus {
159
+ ${(p) => {
160
+ var _a;
161
+ return ((_a = p.theme.accessibility) == null ? void 0 : _a.isTabbing) && borderTabStyle;
162
+ }}
163
+ background: ${(p) => {
164
+ var _a;
165
+ return (_a = p.theme.colors) == null ? void 0 : _a.text;
166
+ }};
167
+ color: ${(p) => {
168
+ var _a;
169
+ return (_a = p.theme.colors) == null ? void 0 : _a.primary;
170
+ }};
171
+ }
172
+ `;
173
+ export { ReturnButton as default };
174
+ //# sourceMappingURL=return-button.js.map
@@ -0,0 +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';\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;;"}
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/package.json CHANGED
@@ -1,37 +1,36 @@
1
1
  {
2
2
  "name": "@telia-ace/widget-conversation",
3
- "version": "1.0.11",
3
+ "version": "1.0.14",
4
4
  "description": "ACE Widget Conversation Platform",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
6
  "author": "Telia Company AB",
7
7
  "keywords": [
8
8
  "telia"
9
9
  ],
10
- "main": "lib/index.js",
11
- "module": "lib-esm/index.js",
10
+ "module": "dist/index.js",
11
+ "types": "dist/index.d.ts",
12
12
  "files": [
13
13
  "LICENSE.txt",
14
14
  "README.md",
15
- "lib/",
16
- "lib-esm/"
15
+ "dist/"
17
16
  ],
18
17
  "publishConfig": {
19
18
  "access": "public"
20
19
  },
21
20
  "scripts": {
22
- "clean": "cleandir lib && cleandir lib-esm",
23
- "compile": "tsc -p tsconfig.cjs.json && tsc -p tsconfig.esm.json"
21
+ "clean": "rimraf ./dist",
22
+ "precompile": "tsc -emitDeclarationOnly",
23
+ "compile": "vite build"
24
24
  },
25
25
  "sideEffects": false,
26
- "typings": "lib/index.d.ts",
27
26
  "dependencies": {
28
- "@telia-ace/widget-core": "^1.0.4",
29
- "@telia-ace/widget-forms": "^1.0.7",
30
- "@telia-ace/widget-plugins": "^1.0.5",
31
- "@telia-ace/widget-routing": "^1.0.5",
32
- "@telia-ace/widget-services": "^1.0.4",
33
- "@telia-ace/widget-ui": "^1.0.7",
34
- "@telia-ace/widget-utilities": "^1.0.1",
27
+ "@telia-ace/widget-core": "^1.0.6",
28
+ "@telia-ace/widget-forms": "^1.0.10",
29
+ "@telia-ace/widget-plugins": "^1.0.7",
30
+ "@telia-ace/widget-routing": "^1.0.7",
31
+ "@telia-ace/widget-services": "^1.0.6",
32
+ "@telia-ace/widget-ui": "^1.0.10",
33
+ "@telia-ace/widget-utilities": "^1.0.2",
35
34
  "@webprovisions/platform": "^1.1.2"
36
35
  },
37
36
  "peerDependencies": {
@@ -41,5 +40,5 @@
41
40
  "devDependencies": {
42
41
  "@types/react": "^16.8.0"
43
42
  },
44
- "gitHead": "d0810784ed9655d556f5653a168d13b8f71910b7"
43
+ "gitHead": "4234ef0e32b09c8a88cac47e2294fb8b3c41d610"
45
44
  }
package/lib/agent.d.ts DELETED
@@ -1,17 +0,0 @@
1
- import { Symbol } from '@telia-ace/widget-ui';
2
- import { ConversationEntry } from './conversation-controller';
3
- import { ConversationProvider } from './conversation-provider';
4
- import { ConversationMessageSettings, ConverstationMessageItem } from './types';
5
- export declare type AgentSettings = {
6
- name?: string;
7
- avatar?: string | Symbol;
8
- };
9
- export declare class Agent {
10
- private provider;
11
- name?: string;
12
- avatar?: string | Symbol;
13
- constructor(provider: ConversationProvider, settings: AgentSettings);
14
- print: (settings: string | ConversationMessageSettings | ConverstationMessageItem<any> | ConverstationMessageItem<any>[]) => ConversationEntry | undefined;
15
- typing: () => (() => void) | undefined;
16
- update(settings: AgentSettings): void;
17
- }
package/lib/agent.js DELETED
@@ -1,37 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Agent = void 0;
4
- var conversation_controller_1 = require("./conversation-controller");
5
- var Agent = /** @class */ (function () {
6
- function Agent(provider, settings) {
7
- var _this = this;
8
- this.provider = provider;
9
- this.print = function (settings) {
10
- var sender = { name: _this.name, avatar: _this.avatar };
11
- var normalized = (0, conversation_controller_1.getNormalizedMessageSettings)(settings);
12
- return _this.provider.createEntry(normalized.key, normalized.content, conversation_controller_1.ConversationMessageType.Agent, sender, normalized.timestamp);
13
- };
14
- this.typing = function () {
15
- return _this.provider.setTypingState({ name: _this.name, avatar: _this.avatar });
16
- };
17
- this.name = settings.name;
18
- this.avatar = settings.avatar;
19
- }
20
- Agent.prototype.update = function (settings) {
21
- var name = settings.name, avatar = settings.avatar;
22
- if (avatar === null) {
23
- this.avatar = undefined;
24
- }
25
- else if (avatar) {
26
- this.avatar = avatar;
27
- }
28
- if (name === null) {
29
- this.name = undefined;
30
- }
31
- else if (name) {
32
- this.name = name;
33
- }
34
- };
35
- return Agent;
36
- }());
37
- exports.Agent = Agent;
@@ -1,88 +0,0 @@
1
- import { Container, EventListener, EventManager } from '@webprovisions/platform';
2
- import { ConversationProvider } from './conversation-provider';
3
- import { ConversationMessageContent, ConversationMessageSender, ConversationMessageSettings, ConversationMessageUpdateSettings, ConverstationMessageItem, NormalizedMessageSettings } from './types';
4
- import { User } from './user';
5
- export declare type ValidateHandler = (formValues: {
6
- [key: string]: any;
7
- }) => Promise<any>;
8
- export declare type SubmitHandler = (formValues: {
9
- [key: string]: any;
10
- }) => Promise<any>;
11
- export declare type Print = (content: string | ConversationMessageContent) => ConversationEntry;
12
- export declare type FormHandlers = {
13
- [key: string]: FormHandler;
14
- };
15
- export declare type FormHandler = {
16
- validate?: ValidateHandler;
17
- submit: SubmitHandler;
18
- };
19
- export declare type CancelLoaderDelegate = () => void;
20
- export declare class ConversationEntry {
21
- private writer;
22
- constructor(writer: EntryWriter);
23
- update(content: string | ConversationMessageUpdateSettings | ConverstationMessageItem<any> | ConverstationMessageItem<any>[]): void;
24
- remove(): void;
25
- private getNormalizedSettings;
26
- }
27
- export declare enum ConversationMessageType {
28
- User = "user",
29
- Agent = "agent",
30
- System = "system"
31
- }
32
- export declare type ConversationMessage = {
33
- key: string;
34
- timestamp: number | null;
35
- content: ConversationMessageContent | null;
36
- sender: ConversationMessageSender | null;
37
- type: ConversationMessageType;
38
- };
39
- export declare type EntryWriter = (content: ConversationMessageUpdateSettings | null) => void;
40
- export declare const getNormalizedMessageSettings: (settings: string | ConversationMessageSettings | ConverstationMessageItem<any> | ConverstationMessageItem<any>[]) => NormalizedMessageSettings;
41
- /**
42
- * Manages the stream of messages inside a `ConversationComponent` and provides external read-write
43
- * access to it as well as exposing emitted actions.
44
- */
45
- export declare class ConversationController {
46
- container: Container;
47
- id: string;
48
- formHandlers: FormHandlers;
49
- /**
50
- * Represents the current end user.
51
- */
52
- user: User;
53
- events: EventManager;
54
- providers: string[];
55
- active: boolean;
56
- private registeredProviders;
57
- private loaders;
58
- private componentMounted;
59
- messages: ConversationMessage[];
60
- private typingActors;
61
- constructor(container: Container, id: string);
62
- setProviders(providers: string[]): void;
63
- createProvider(name: string): ConversationProvider;
64
- providerIndex(name: string): number;
65
- dispose(): void;
66
- onDispose(fn: EventListener): import("@webprovisions/platform").EventSubscriptionCancellation;
67
- onStarted(fn: EventListener): import("@webprovisions/platform").EventSubscriptionCancellation;
68
- disposeProvider(target: ConversationProvider): void;
69
- onProvidersChange(fn: EventListener): import("@webprovisions/platform").EventSubscriptionCancellation;
70
- setComponentMountedState(mounted: boolean): void;
71
- getComponentMountedState(): boolean;
72
- onUnreadMessage(fn: EventListener): import("@webprovisions/platform").EventSubscriptionCancellation;
73
- createEntry(key: string, content: ConversationMessageContent, type: ConversationMessageType, sender?: ConversationMessageSender, timestamp?: number | null): ConversationEntry;
74
- print: (settings: string | ConversationMessageSettings) => ConversationEntry;
75
- update(): void;
76
- getMessageStream(): {
77
- messages: ConversationMessage[];
78
- loading: boolean;
79
- typingActors: ConversationMessageSender[];
80
- };
81
- setTypingState(sender: ConversationMessageSender, type?: ConversationMessageType): () => void;
82
- /**
83
- * Displays a loader in the conversation.
84
- */
85
- loader(): CancelLoaderDelegate;
86
- submitForm(key: string, handler: SubmitHandler): void;
87
- validateForm(key: string, handler: ValidateHandler): void;
88
- }