@telia-ace/widget-conversation 1.0.28 → 1.0.29-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.txt +5 -5
- package/README.md +396 -396
- package/dist/agent.d.ts +17 -17
- package/dist/components/conversation/conversation.d.ts +6 -6
- package/dist/components/conversation/plugin.d.ts +43 -43
- package/dist/components/conversation/ui/content.d.ts +2 -2
- package/dist/components/conversation/ui/input.d.ts +6 -6
- package/dist/components/conversation/ui/loader.d.ts +9 -9
- package/dist/components/conversation/ui/message-list-items/button-list.d.ts +8 -8
- package/dist/components/conversation/ui/message-list-items/custom.d.ts +9 -9
- package/dist/components/conversation/ui/message-list-items/html.d.ts +5 -5
- package/dist/components/conversation/ui/message-list-items/link-list.d.ts +8 -8
- package/dist/components/conversation/ui/message-list-items/separator.d.ts +2 -2
- package/dist/components/conversation/ui/message-list-items/text.d.ts +6 -6
- package/dist/components/conversation/ui/message-list-items/video-request.d.ts +8 -8
- package/dist/components/conversation/ui/message-types/agent.d.ts +11 -11
- package/dist/components/conversation/ui/message-types/index.d.ts +4 -4
- package/dist/components/conversation/ui/message-types/message-list.d.ts +9 -9
- package/dist/components/conversation/ui/message-types/system.d.ts +12 -12
- package/dist/components/conversation/ui/message-types/timestamp.d.ts +8 -8
- package/dist/components/conversation/ui/message-types/user.d.ts +8 -8
- package/dist/components/conversation/ui/message.d.ts +5 -5
- package/dist/components/conversation/ui/overlay-outlets.d.ts +13 -13
- package/dist/components/conversation/ui/styles.d.ts +31 -31
- package/dist/components/return-button/plugin.d.ts +18 -18
- package/dist/components/return-button/return-button.d.ts +6 -6
- package/dist/conversation-controller.d.ts +88 -88
- package/dist/conversation-form-adapter.d.ts +7 -7
- package/dist/conversation-platform.d.ts +49 -49
- package/dist/conversation-provider.d.ts +22 -22
- package/dist/conversation.d7aad569.js.map +1 -1
- package/dist/index.d.ts +10 -10
- package/dist/index.js.map +1 -1
- package/dist/resolve-entity-value.d.ts +10 -10
- package/dist/return-button.9c517bbe.js.map +1 -1
- package/dist/types.d.ts +103 -103
- 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/map-actions.d.ts +1 -1
- package/dist/utils/open-chat-widget.d.ts +4 -4
- package/package.json +10 -13
package/dist/index.js.map
CHANGED
|
@@ -1 +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/components/conversation/plugin.ts","../src/components/return-button/plugin.ts","../src/types.ts","../src/utils/custom-message.ts"],"sourcesContent":["import { Symbol } from '@telia-ace/widget-ui';\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 { 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 overlay?: { conversation: boolean; secondary: boolean }; // internal\r\n overlayConversationHeader?: string;\r\n overlayConversationCloseLabel?: string;\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\nexport const 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 component.actions.create('overlay-mounted', (data, options) => {});\r\n\r\n component.actions.create('show-overlay', (data, options) => {\r\n component.writeProperties({\r\n overlay: { conversation: false, secondary: false },\r\n });\r\n });\r\n\r\n component.actions.create('hide-overlay', (data, options) => {\r\n component.writeProperties({\r\n overlay: null,\r\n });\r\n });\r\n\r\n component.actions.create('show-overlay-conversation', (data, options) => {\r\n component.writeProperties({\r\n overlay: { conversation: true, secondary: false },\r\n });\r\n });\r\n\r\n component.actions.create('hide-overlay-conversation', (data, options) => {\r\n component.writeProperties({\r\n overlay: { conversation: false, secondary: false },\r\n });\r\n });\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","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\nexport const 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","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 LinkList = 'link-list',\r\n Separator = 'separator',\r\n ButtonList = 'button-list',\r\n Text = 'text',\r\n HTML = 'html',\r\n VideoRequest = 'video-request',\r\n}\r\n\r\nexport type LinkListProperties = {\r\n header?: string;\r\n actions: { [key: string]: string } | { label: string; actionKey: string; data: any }[];\r\n};\r\n\r\ntype LinkListItem = [ConversationMessageListItemType.LinkList, LinkListProperties];\r\n\r\ntype TextItem = [ConversationMessageListItemType.Text, string];\r\ntype SeparatorItem = [ConversationMessageListItemType.Separator, undefined];\r\n\r\nexport type ButtonListProperties = {\r\n header?: string;\r\n actions: { [key: string]: string } | { label: string; actionKey: string; data: any }[];\r\n};\r\n\r\ntype ButtonListItem = [ConversationMessageListItemType.ButtonList, ButtonListProperties];\r\n\r\nexport type VideoRequestProperties = {\r\n header?: string;\r\n acceptLabel: string;\r\n declineLabel: string;\r\n};\r\n\r\ntype VideoRequestItem = [ConversationMessageListItemType.VideoRequest, VideoRequestProperties];\r\n\r\nexport type HtmlProperties = {\r\n body: string;\r\n};\r\n\r\ntype HtmlItem = [ConversationMessageListItemType.HTML, HtmlProperties];\r\n\r\ntype ItemPayload =\r\n | LinkListItem\r\n | TextItem\r\n | SeparatorItem\r\n | ButtonListItem\r\n | HtmlItem\r\n | VideoRequestItem;\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":["Agent","provider","settings","__publicField","sender","normalized","getNormalizedMessageSettings","ConversationMessageType","name","avatar","ConversationProvider","container","controller","_a","type","key","content","timestamp","unsub","fn","unsubscribe","User","ConversationEntry","writer","uuid","__spreadValues","builder","FormBuilder","builtForm","removeTypingState","typingActors","senderString","indexToRemove","item","ConversationController","id","widget","providers","removed","added","acc","providerToRemove","index","p","target","mounted","message","entry","updated","updatedTimestamp","dismissed","handler","__spreadProps","getParentWidget","widgetName","implementation","mainWidgetName","getSeparateWidget","originWidget","mainWidget","data","trigger","chatWidgetName","chatWidget","shouldPreventDefault","openChatWidget","contactMethod","triggerDOMTarget","conversation","closeAllModals","components","contactMethodsQuery","conversationsQuery","createStorageWriter","StorageCategory","StorageMedium","StorageScope","write","platform","ConversationEndedBehavior","navigateToConversation","routeName","router","conversationQuery","STORAGE_KEY","ConversationPlatform","readStorage","storedSession","event","initialRoute","_b","_c","sub","lock","value","ComponentPlatform","params","behavior","stored","c","component","invokeHandlers","removedProvider","dispose","isActive","session","properties","callback","__async","triggerEl","groupedMessages","messages","timeout","current","newItem","previous","ConversationComponent","createReactComponent","isNewController","messageGroupingTimeout","setProperties","providerKeys","writeMessages","messageStream","loading","options","preventDefault","validationPromise","text","e","conversationData","ConversationReturnButtonComponent","route","ConversationMessageListItemType","registerCustomMessageComponent","o","lazy"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/agent.ts","../src/conversation-provider.ts","../src/user.ts","../src/conversation-controller.ts","../src/utils/open-chat-widget.ts","../src/conversation-platform.ts","../src/components/conversation/plugin.ts","../src/components/return-button/plugin.ts","../src/types.ts","../src/utils/custom-message.ts"],"sourcesContent":["import { Symbol } from '@telia-ace/widget-ui';\nimport {\n ConversationEntry,\n ConversationMessageType,\n getNormalizedMessageSettings,\n} from './conversation-controller';\nimport { ConversationProvider } from './conversation-provider';\nimport {\n ConversationMessageSender,\n ConversationMessageSettings,\n ConverstationMessageItem,\n} from './types';\n\nexport type AgentSettings = {\n name?: string;\n avatar?: string | Symbol;\n};\n\nexport class Agent {\n name?: string;\n avatar?: string | Symbol;\n\n constructor(private provider: ConversationProvider, settings: AgentSettings) {\n this.name = settings.name;\n this.avatar = settings.avatar;\n }\n\n print = (\n settings:\n | string\n | ConversationMessageSettings\n | ConverstationMessageItem<any>\n | ConverstationMessageItem<any>[]\n ): ConversationEntry | undefined => {\n const sender: ConversationMessageSender = { name: this.name, avatar: this.avatar };\n const normalized = getNormalizedMessageSettings(settings);\n\n return this.provider.createEntry(\n normalized.key,\n normalized.content,\n ConversationMessageType.Agent,\n sender,\n normalized.timestamp\n );\n };\n typing = () => {\n return this.provider.setTypingState({ name: this.name, avatar: this.avatar });\n };\n\n update(settings: AgentSettings): void {\n const { name, avatar } = settings;\n if (avatar === null) {\n this.avatar = undefined;\n } else if (avatar) {\n this.avatar = avatar;\n }\n\n if (name === null) {\n this.name = undefined;\n } else if (name) {\n this.name = name;\n }\n }\n}\n","import {\n Container,\n EventListener,\n EventObject,\n EventSubscriptionCancellation,\n} from '@webprovisions/platform';\nimport { Agent, AgentSettings } from './agent';\nimport {\n CancelLoaderDelegate,\n ConversationController,\n ConversationEntry,\n ConversationMessageType,\n} from './conversation-controller';\nimport {\n ConversationMessageContent,\n ConversationMessageSender,\n ConversationMessageSettings,\n} from './types';\n\nexport class ConversationProvider {\n private subscriptions: EventSubscriptionCancellation[] = [];\n public user: any;\n\n private constructor(\n public name: string,\n private container: Container,\n public controller: ConversationController | null\n ) {\n this.user = controller?.user;\n }\n\n static create(name: string, container: Container, controller: ConversationController) {\n return new ConversationProvider(name, container, controller);\n }\n\n createAgent(settings: AgentSettings = {}): Agent | undefined {\n if (this.controller) {\n return new Agent(this, settings);\n }\n }\n\n print(settings: string | ConversationMessageSettings): ConversationEntry | undefined {\n return this.controller?.print(settings);\n }\n\n setTypingState(sender: ConversationMessageSender, type?: ConversationMessageType) {\n return this.controller?.setTypingState(sender, type);\n }\n\n loading(): CancelLoaderDelegate {\n if (!this.controller) {\n return () => () => {};\n }\n return this.controller.loader();\n }\n\n createEntry(\n key: string,\n content: ConversationMessageContent,\n type: ConversationMessageType,\n sender?: ConversationMessageSender,\n timestamp?: number | null\n ) {\n return this.controller?.createEntry(key, content, type, sender, timestamp);\n }\n\n dispose() {\n if (process.env.NODE_ENV !== 'production') {\n console.log(`conversation-provider: dispose (${this.name})`);\n }\n this.controller?.disposeProvider(this);\n this.controller = null;\n this.subscriptions.forEach((unsub) => unsub());\n }\n\n onUnreadMessage(fn: EventListener): EventSubscriptionCancellation | void {\n if (this.controller) {\n const unsubscribe = this.controller?.onUnreadMessage(fn);\n this.subscriptions.push(unsubscribe);\n return () => {\n unsubscribe();\n };\n }\n }\n\n onMounted(fn: EventListener): EventSubscriptionCancellation | void {\n if (this.controller) {\n const unsubscribe = this.controller?.events.subscribe(\n 'conversation:component-mount-changed',\n fn\n );\n this.subscriptions.push(unsubscribe);\n fn({} as EventObject, this.controller.getComponentMountedState());\n return () => {\n unsubscribe();\n };\n }\n }\n}\n\nexport default ConversationProvider;\n","import {\n ConversationController,\n ConversationEntry,\n ConversationMessageType,\n getNormalizedMessageSettings,\n} from './conversation-controller';\nimport { ConversationMessageSettings } from './types';\n\nexport class User {\n constructor(private controller: ConversationController) {}\n\n print = (settings: string | ConversationMessageSettings): ConversationEntry => {\n const normalized = getNormalizedMessageSettings(settings);\n return this.controller.createEntry(\n normalized.key,\n normalized.content,\n ConversationMessageType.User,\n undefined,\n normalized.timestamp\n );\n };\n}\n","import { FormBuilder } from '@telia-ace/widget-forms';\nimport { uuid } from '@telia-ace/widget-utilities';\nimport { Container, EventListener, EventManager, Widget } from '@webprovisions/platform';\nimport { ConversationProvider } from './conversation-provider';\nimport {\n ConversationMessageContent,\n ConversationMessageSender,\n ConversationMessageSettings,\n ConversationMessageUpdateSettings,\n ConverstationMessageItem,\n NormalizedMessageSettings,\n} from './types';\nimport { User } from './user';\nexport type ValidateHandler = (formValues: { [key: string]: any }) => Promise<any>;\n\nexport type SubmitHandler = (formValues: { [key: string]: any }) => Promise<any>;\n\nexport type Print = (content: string | ConversationMessageContent) => ConversationEntry;\n\nexport type FormHandlers = { [key: string]: FormHandler };\nexport type FormHandler = { validate?: ValidateHandler; submit: SubmitHandler };\n\nexport type CancelLoaderDelegate = () => void;\n\nexport class ConversationEntry {\n constructor(private writer: EntryWriter) {}\n\n update(\n content:\n | string\n | ConversationMessageUpdateSettings\n | ConverstationMessageItem<any>\n | ConverstationMessageItem<any>[]\n ) {\n const normalized = this.getNormalizedSettings(content);\n // const normalized = typeof content === 'string' ? { body: content } : content;\n this.writer(<ConversationMessageUpdateSettings>normalized);\n }\n\n remove() {\n this.writer(null);\n }\n\n private getNormalizedSettings(\n content:\n | string\n | ConversationMessageUpdateSettings\n | ConverstationMessageItem<any>\n | ConverstationMessageItem<any>[]\n ) {\n if (typeof content === 'string') return { body: content };\n else if (content.length > -1 && typeof content === 'object') return { items: content };\n else return content;\n }\n}\n\nexport enum ConversationMessageType {\n User = 'user',\n Agent = 'agent',\n System = 'system',\n}\n\nexport type ConversationMessage = {\n key: string;\n timestamp: number | null;\n content: ConversationMessageContent | null;\n sender: ConversationMessageSender | null;\n type: ConversationMessageType;\n};\n\nexport type EntryWriter = (content: ConversationMessageUpdateSettings | null) => void;\n\nexport const getNormalizedMessageSettings = (\n settings:\n | string\n | ConversationMessageSettings\n | ConverstationMessageItem<any>\n | ConverstationMessageItem<any>[]\n): NormalizedMessageSettings => {\n let content: ConversationMessageContent;\n let key = uuid();\n let timestamp: number | null = Date.now();\n\n if (Array.isArray(settings) && settings.length > -1) {\n if (typeof settings[0] === 'string') {\n content = { items: [<ConverstationMessageItem<any>>settings] };\n } else {\n content = { items: <ConverstationMessageItem<any>[]>settings };\n }\n } else if (typeof settings === 'string') {\n content = { body: settings };\n } else {\n settings = <ConversationMessageSettings>settings || {};\n\n if (settings.type) {\n content = {\n ...(<any>settings),\n };\n } else {\n content = {\n body: settings.body,\n actions: settings.actions,\n title: settings.title,\n };\n if (settings.key) {\n key = settings.key;\n }\n if (settings.timestamp) {\n timestamp = settings.timestamp;\n }\n if (settings.form) {\n const builder = FormBuilder.create(key);\n settings.form(builder);\n const builtForm = builder.get();\n content.form = builtForm;\n }\n if (settings.timestamp === null) {\n timestamp = null;\n }\n }\n }\n return { content, key, timestamp };\n};\n\nconst removeTypingState = (\n typingActors: ConversationMessageSender[],\n sender?: ConversationMessageSender\n) => {\n if (!sender) {\n return;\n }\n const senderString = JSON.stringify(sender);\n const indexToRemove = typingActors.findIndex((item) => {\n return senderString === JSON.stringify(item);\n });\n if (indexToRemove > -1) {\n return typingActors.splice(indexToRemove, 1);\n }\n};\n\n/**\n * Manages the stream of messages inside a `ConversationComponent` and provides external read-write\n * access to it as well as exposing emitted actions.\n */\nexport class ConversationController {\n formHandlers: FormHandlers = {};\n\n /**\n * Represents the current end user.\n */\n user: User = new User(this);\n\n events: EventManager;\n\n providers: string[] = [];\n\n active: boolean = false;\n\n private registeredProviders: ConversationProvider[] = [];\n\n private loaders: number = 0;\n private componentMounted: boolean = false;\n\n messages: ConversationMessage[] = [];\n private typingActors: ConversationMessageSender[] = [];\n\n constructor(public container: Container, public id: string) {\n const widget: Widget = container.get('$widget');\n this.events = widget.events.createChild(this);\n }\n\n setProviders(providers: string[]) {\n const removed: string[] = [];\n const added: string[] = [];\n\n // remove\n this.providers\n .reduce<string[]>((acc, provider) => {\n if (providers.indexOf(provider) === -1) {\n acc.push(provider);\n }\n return acc;\n }, [])\n .forEach((providerToRemove) => {\n const indexToRemove = this.providers.indexOf(providerToRemove);\n if (indexToRemove > -1) {\n removed.push(providerToRemove);\n this.providers.splice(indexToRemove, 1);\n }\n });\n\n // add\n providers.forEach((provider) => {\n if (this.providers.indexOf(provider) === -1) {\n added.push(provider);\n this.providers.push(provider);\n }\n });\n\n if (added.length || removed.length) {\n this.events.dispatch('conversation:providers-changed', { added, removed });\n }\n }\n\n createProvider(name: string): ConversationProvider {\n const index = this.providerIndex(name);\n if (index > -1) {\n return this.registeredProviders[index];\n }\n const provider = ConversationProvider.create(name, this.container, this);\n this.registeredProviders.push(provider);\n return provider;\n }\n\n providerIndex(name: string) {\n return this.registeredProviders.findIndex((p) => p.name === name);\n }\n\n dispose() {\n this.registeredProviders.forEach((provider) => provider.dispose());\n this.messages = [];\n this.events.dispatch('conversation:controller-disposed', this);\n this.active = false;\n }\n\n onDispose(fn: EventListener) {\n return this.events.subscribe('conversation:controller-disposed', fn);\n }\n\n onStarted(fn: EventListener) {\n return this.events.subscribe('conversation:started', fn);\n }\n\n disposeProvider(target: ConversationProvider) {\n const index = this.providerIndex(target.name);\n index > -1 && this.registeredProviders.splice(index, 1);\n this.events.dispatch('conversation:providers-changed', { removed: [target.name] });\n if (!this.registeredProviders.length) {\n this.dispose();\n }\n }\n\n onProvidersChange(fn: EventListener) {\n return this.events.subscribe('conversation:providers-changed', fn);\n }\n\n setComponentMountedState(mounted: boolean) {\n if (this.componentMounted === mounted) {\n return;\n }\n this.componentMounted = mounted;\n if (mounted) {\n this.events.dispatch('conversation:unread-message', false);\n this.events.dispatch('conversation:started', true);\n this.active = true;\n }\n this.events.dispatch('conversation:component-mount-changed', mounted);\n }\n\n getComponentMountedState() {\n return this.componentMounted;\n }\n\n onUnreadMessage(fn: EventListener) {\n return this.events.subscribe('conversation:unread-message', fn);\n }\n\n createEntry(\n key: string,\n content: ConversationMessageContent,\n type: ConversationMessageType,\n sender?: ConversationMessageSender,\n timestamp?: number | null\n ): ConversationEntry {\n const message: ConversationMessage = {\n key,\n content,\n type,\n sender: sender || null,\n timestamp: timestamp || timestamp === null ? timestamp : Date.now(),\n };\n this.messages.push(message);\n message.type === ConversationMessageType.Agent &&\n removeTypingState(this.typingActors, sender);\n const entry = new ConversationEntry((updated) => {\n if (updated !== null) {\n const { timestamp: updatedTimestamp = undefined, ...content } = updated;\n message.content = content;\n if (updatedTimestamp) {\n message.timestamp = updatedTimestamp;\n }\n } else {\n const indexToRemove = this.messages.indexOf(message);\n message.content = null;\n if (indexToRemove > -1) {\n this.messages.splice(indexToRemove, 1);\n }\n }\n this.events.dispatch('conversation:message-updated', { message });\n this.update();\n });\n this.events.dispatch('conversation:message-created', { message });\n this.update();\n if (!this.componentMounted) {\n this.events.dispatch('conversation:unread-message', true);\n }\n return entry;\n }\n\n print = (settings: string | ConversationMessageSettings): ConversationEntry => {\n const normalized = getNormalizedMessageSettings(settings);\n\n return this.createEntry(\n normalized.key,\n normalized.content,\n ConversationMessageType.System,\n undefined,\n normalized.timestamp\n );\n };\n\n update() {\n this.events.dispatch('conversation:updated', {\n messages: this.messages,\n loading: this.loaders > 0,\n typingActors: this.typingActors,\n });\n }\n\n getMessageStream() {\n return {\n messages: this.messages,\n loading: this.loaders > 0,\n typingActors: this.typingActors,\n };\n }\n\n setTypingState(sender: ConversationMessageSender, type?: ConversationMessageType) {\n if (this.typingActors.indexOf(sender) === -1) {\n this.typingActors.push(sender);\n this.update();\n }\n\n return () => {\n removeTypingState(this.typingActors, sender);\n this.update();\n };\n }\n\n /**\n * Displays a loader in the conversation.\n */\n loader(): CancelLoaderDelegate {\n this.loaders = this.loaders + 1;\n let dismissed = false;\n if (this.loaders === 1) {\n this.update();\n }\n return () => {\n if (!dismissed) {\n dismissed = true;\n this.loaders = this.loaders - 1;\n if (this.loaders === 0) {\n this.update();\n }\n }\n };\n }\n\n submitForm(key: string, handler: SubmitHandler) {\n this.formHandlers[key] = { ...this.formHandlers[key], submit: handler };\n }\n\n validateForm(key: string, handler: ValidateHandler) {\n this.formHandlers[key] = { ...this.formHandlers[key], validate: handler };\n }\n}\n","import { ComponentPlatform, WidgetSettings } from '@telia-ace/widget-core';\nimport { closeAllModals } from '@telia-ace/widget-plugins';\nimport {\n createStorageWriter,\n StorageCategory,\n StorageMedium,\n StorageScope,\n} from '@telia-ace/widget-services';\nimport { Container, Implementation, Widget } from '@webprovisions/platform';\nimport { ConversationEndedBehavior, ConversationPlatform } from '../';\n\nconst getParentWidget = (widgetName: string, implementation: Implementation) => {\n const mainWidgetName = widgetName.split('_contact');\n return implementation.widgets.get(mainWidgetName[0]);\n};\n\nconst getSeparateWidget = (container: Container) => {\n const originWidget = container.get('$widget');\n const { name, implementation }: Widget = container.get('$widget');\n\n const mainWidget =\n name.indexOf('_contact') > -1 ? getParentWidget(name, implementation) : originWidget;\n const { data }: WidgetSettings = container.get('$settings');\n const { trigger }: WidgetSettings = mainWidget.container.get('$settings');\n const chatWidgetName = `${name\n .replace('_contact-method', '')\n .replace('_contact', '')}_contact-method`;\n\n const chatWidget = implementation.widgets.get(chatWidgetName);\n if (chatWidget && !trigger) {\n return { chatWidget, mainWidget, data };\n }\n return { mainWidget, data };\n};\n\nexport const shouldPreventDefault = (container: Container) => {\n const { chatWidget } = getSeparateWidget(container);\n return !!chatWidget;\n};\n\nexport const openChatWidget = (\n container: Container,\n contactMethod: any /*ContactMethodType*/,\n triggerDOMTarget?: HTMLElement\n) => {\n const { mainWidget, data, chatWidget } = getSeparateWidget(container);\n\n if (chatWidget) {\n if (chatWidget.state === 'activated') {\n return chatWidget.invoke('open').then(() => {\n chatWidget.container.getAsync('conversation').then((conversation) => {\n conversation\n .navigateToConversationIfActive(contactMethod.id)\n .then(() => closeAllModals(container));\n });\n });\n }\n return chatWidget\n .activate()\n .then(() => {\n const { trigger } = chatWidget.container.get('$settings');\n trigger.action = 'hide'; // could be default in configuration\n return chatWidget\n .invoke('setSettings', () => ({\n data,\n trigger,\n activate: true,\n }))\n .then(() => {\n return chatWidget.container\n .getAsync('components')\n .then((components: ComponentPlatform) => {\n /**\n * Could cause issues if target widget is no longer as specific for this use case\n */\n const contactMethodsQuery = components\n .components()\n .ofType('contact-method');\n components.write({\n key: 'setContactMethodId',\n attributes: {\n properties: {\n id: contactMethod.id,\n guideId: contactMethod.guideId,\n },\n },\n target: contactMethodsQuery,\n provider: 'localStorage',\n });\n const conversationsQuery = components\n .components()\n .ofType('conversation');\n components.write({\n key: 'setConversationProvider',\n attributes: {\n properties: { providers: [contactMethod.clientName] },\n },\n target: conversationsQuery,\n provider: 'localStorage',\n });\n });\n });\n })\n .then(() => {\n return chatWidget.invoke('attach', {\n key: 'contact-method',\n triggerDOMElement: triggerDOMTarget,\n withRenderState: 'open',\n });\n })\n .then(() => {\n createStorageWriter(\n chatWidget.container,\n 'activeStickyWidget',\n StorageCategory.Necessary,\n {\n medium: StorageMedium.Local,\n scope: StorageScope.Implementation,\n }\n ).then((write) => write(chatWidget.name));\n\n return chatWidget.container\n .getAsync('conversation')\n .then((platform) => {\n platform.setConversationEndedBehavior(ConversationEndedBehavior.Deactivate);\n })\n .then(() => closeAllModals(container))\n .then(() => false);\n });\n }\n mainWidget.container.getAsync('conversation').then((platform: ConversationPlatform) => {\n return platform\n .navigateToConversationIfActive(contactMethod.id)\n .then(() => platform.setConversationEndedBehavior(ConversationEndedBehavior.Navigate));\n });\n return chatWidget ? false : true;\n};\n\nexport const navigateToConversation = (\n container: Container,\n contactMethod: any /*ContactMethodType*/,\n routeName = 'conversation'\n) => {\n const { mainWidget, chatWidget } = getSeparateWidget(container);\n if (chatWidget) {\n return chatWidget.container.getAsync('router').then((router: any) => {\n router.navigate(routeName, { id: contactMethod.id });\n });\n }\n\n return mainWidget.container.getAsync('conversation').then((platform: ConversationPlatform) => {\n platform.setConversationEndedBehavior(ConversationEndedBehavior.Navigate)?.then(() => {\n mainWidget.container.getAsync('router').then((router: any) => {\n mainWidget.container\n .getAsync('components')\n .then((components: ComponentPlatform) => {\n const conversationQuery = components.components().ofType('conversation');\n components.write({\n key: 'setConversationProvider',\n attributes: { properties: { providers: [contactMethod.clientName] } },\n target: conversationQuery,\n provider: 'localStorage',\n });\n })\n .then(() => {\n router.navigate(routeName, { id: contactMethod.id });\n });\n });\n });\n });\n};\n","import { ComponentNodeController, ComponentPlatform, ComponentQuery } from '@telia-ace/widget-core';\nimport { RouteData, RoutingService } from '@telia-ace/widget-routing';\nimport {\n createStorageWriter,\n readStorage,\n StorageCategory,\n StorageMedium,\n StorageWriter,\n} from '@telia-ace/widget-services';\nimport { lock } from '@telia-ace/widget-utilities';\nimport {\n Container,\n EventManager,\n EventSubscriptionCancellation,\n Widget,\n} from '@webprovisions/platform';\nimport { ConversationController } from './conversation-controller';\nimport { ConversationProvider } from './conversation-provider';\nimport { navigateToConversation, openChatWidget, shouldPreventDefault } from './utils';\n\nconst STORAGE_KEY = 'conversations';\n\nexport type ConversationHandler = (\n conversation: ConversationProvider,\n component: ComponentNodeController\n) => void | (() => void);\n\nexport type UnregisterControllerDelegate = () => void;\n\nexport type ConversationProviderRegistration = {\n name: string;\n handler: ConversationHandler;\n};\n\nexport enum ConversationEndedBehavior {\n Deactivate = 'deactivate',\n Navigate = 'navigate',\n None = 'none',\n}\n\nexport type SessionInfo = {\n id?: string;\n route?: RouteData;\n conversationEndedBehavior?: ConversationEndedBehavior;\n};\n\nexport class ConversationPlatform {\n events: EventManager;\n private controllers: {\n conversation: ConversationController;\n component: ComponentNodeController;\n }[] = [];\n private providers: ConversationProviderRegistration[] = [];\n private disposeProviders: { [providerKey: string]: (() => void)[] } = {};\n private subscriptions: EventSubscriptionCancellation[] = [];\n private storageWriter: StorageWriter | null = null;\n private router: RoutingService | null = null;\n private buttonQuery: ComponentQuery | null = null;\n private sessionInfo: SessionInfo | null = null;\n\n constructor(private container: Container, private components: ComponentPlatform) {\n const widget: Widget = container.get('$widget');\n this.events = widget.events.createChild(this);\n }\n\n initialize() {\n createStorageWriter(this.container, STORAGE_KEY, StorageCategory.Necessary, {\n medium: StorageMedium.Local,\n }).then((writer) => (this.storageWriter = writer));\n\n readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\n (storedSession) => {\n this.buttonQuery = this.components\n .components()\n .ofType('conversation-return-button');\n if (storedSession) {\n this.sessionInfo = storedSession;\n if (storedSession.id && storedSession.route) {\n this.writeToComponents({ active: true, alert: { show: false } });\n }\n }\n }\n );\n this.container.getAsync('router').then((router) => (this.router = router));\n this.events.subscribe('conversation:ended', (event, data) => {\n switch (this.sessionInfo?.conversationEndedBehavior) {\n case ConversationEndedBehavior.Deactivate:\n const widget: Widget = this.container.get('$widget');\n widget.deactivate();\n break;\n case ConversationEndedBehavior.Navigate:\n const initialRoute = this.router?.getInitialRoute();\n if (initialRoute) {\n this.router?.navigate(initialRoute.name);\n }\n break;\n case ConversationEndedBehavior.None:\n default:\n break;\n }\n this.writeToComponents({ active: false });\n this.sessionInfo = null;\n this.storageWriter && this.storageWriter();\n });\n }\n\n addSubscription(sub: EventSubscriptionCancellation) {\n this.subscriptions.push(sub);\n }\n\n static getInstance(\n container: Container,\n key: string = 'conversation'\n ): Promise<ConversationPlatform> {\n return lock(container)(() => {\n return container.getAsync(key).then((value: ConversationPlatform) => {\n let conversation = value;\n if (!conversation) {\n return ComponentPlatform.getInstance(container).then((components) => {\n conversation = new ConversationPlatform(container, components);\n conversation.initialize();\n container.registerAsync(key, () => conversation);\n return conversation;\n });\n }\n return conversation;\n });\n });\n }\n\n navigateToConversationIfActive(id: string): Promise<void> {\n return readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\n (storedSession) => {\n if (storedSession && storedSession.id === id) {\n if (storedSession.route) {\n const { name, params } = storedSession.route;\n this.router?.navigate(name, params);\n }\n }\n }\n );\n }\n\n setConversationEndedBehavior(behavior: ConversationEndedBehavior) {\n return readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\n (stored) => {\n let storedSession = stored;\n if (storedSession) {\n storedSession.conversationEndedBehavior = behavior;\n } else {\n storedSession = { conversationEndedBehavior: behavior };\n }\n this.sessionInfo = storedSession;\n return (\n (this.storageWriter && this.storageWriter(this.sessionInfo)) ||\n Promise.resolve()\n );\n }\n );\n }\n\n createController(id: string) {\n const index = this.controllers.findIndex((c) => c.conversation.id === id);\n if (index > -1) {\n return this.controllers[index].conversation;\n }\n return new ConversationController(this.container, id);\n }\n\n registerProvider(name: string, handler: ConversationHandler): void {\n const provider = {\n name,\n handler,\n };\n this.providers.push(provider);\n // execute provider for all matching controllers\n this.controllers\n .filter((controller) => controller.conversation.providers.indexOf(name) > -1)\n .forEach((controller) => {\n this.invokeHandler(provider, controller);\n });\n }\n\n registerController(\n conversation: ConversationController,\n component: ComponentNodeController\n ): boolean {\n const index = this.controllers.findIndex((c) => c.conversation.id === conversation.id);\n let controller: any;\n if (index < 0) {\n controller = { conversation, component };\n this.controllers.push(controller);\n const invokeHandlers = (providers: string[]) => {\n if (providers) {\n this.providers\n .filter((provider) => providers.indexOf(provider.name) > -1)\n .forEach((provider) => {\n this.invokeHandler(provider, controller);\n });\n }\n };\n\n this.subscriptions.push(\n conversation.onDispose((event, data) => {\n const index = this.controllers.findIndex((c) => c.conversation === data);\n index > -1 && this.controllers.splice(index, 1);\n this.components\n .components()\n .ofType('conversation-return-button')\n .select()\n .writeProperties({ active: false });\n\n this.events.dispatch('conversation:ended', {}, { bubbles: true });\n })\n );\n this.subscriptions.push(\n conversation.onProvidersChange((event, data) => {\n const { added, removed }: { added: string[]; removed: string[] } = data;\n removed.forEach((removedProvider) => {\n this.disposeProviders[removedProvider].forEach((dispose) => {\n dispose();\n });\n });\n invokeHandlers(added);\n })\n );\n\n this.subscriptions.push(\n conversation.onStarted((event, isActive) => {\n const session: SessionInfo = {\n id: conversation.id,\n route: this.router?.getRouteData(),\n conversationEndedBehavior: this.sessionInfo?.conversationEndedBehavior,\n };\n this.sessionInfo = session;\n this.storageWriter && this.storageWriter(session);\n\n this.writeToComponents({ active: isActive });\n })\n );\n\n this.subscriptions.push(\n conversation.onUnreadMessage((event, data) => {\n this.events.dispatch('conversation:unread-message', data);\n this.writeToComponents({ alert: { show: data } });\n })\n );\n\n invokeHandlers(conversation.providers);\n return true;\n }\n controller = this.controllers[index];\n return false;\n }\n\n private writeToComponents(properties: any, key: string = 'conversationReturnButtonState') {\n if (this.buttonQuery) {\n this.components.write({\n key: 'conversationReturnButtonState',\n attributes: { properties },\n target: this.buttonQuery,\n provider: 'localStorage',\n });\n }\n }\n\n private invokeHandler(provider: ConversationProviderRegistration, controller: any) {\n const dispose = provider.handler(\n controller.conversation.createProvider(provider.name),\n controller.component\n );\n if (dispose) {\n if (!this.disposeProviders[provider.name]) {\n this.disposeProviders[provider.name] = [];\n }\n this.disposeProviders[provider.name].push(dispose);\n }\n }\n\n getComponentRoute() {\n return readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\n (stored) => stored?.route\n );\n }\n\n dispose() {\n Object.keys(this.disposeProviders).forEach((key) => {\n this.disposeProviders[key].forEach((dispose) => {\n dispose();\n });\n });\n this.subscriptions.forEach((unsubscribe) => {\n unsubscribe();\n });\n this.controllers = [];\n this.providers = [];\n }\n\n public static async handleContactMethodClick(\n event: any,\n container: Container,\n contactMethod: any,\n callback?: Function\n ) {\n if (shouldPreventDefault(container)) {\n event.preventDefault();\n let triggerEl = document.getElementById('humany-dynamic-anchor');\n if (!triggerEl) {\n triggerEl = document.createElement('a');\n triggerEl.setAttribute('href', '#');\n triggerEl.id = 'humany-dynamic-anchor';\n document.body.appendChild(triggerEl);\n }\n openChatWidget(container, contactMethod, triggerEl);\n }\n openChatWidget(container, contactMethod);\n }\n\n public static async handleContactMethodSubmit(container: Container, contactMethod: any) {\n return navigateToConversation(container, contactMethod);\n }\n}\n","import { RoutingService } from '@telia-ace/widget-routing';\nimport { createReactComponent } from '@telia-ace/widget-ui';\nimport { Container } from '@webprovisions/platform';\nimport { ConversationMessage, ConversationMessageType } from '../../conversation-controller';\nimport { ConversationPlatform } from '../../conversation-platform';\nimport { ConversationMessageContent, ConversationMessageSender } from '../../types';\n\nexport type BundledConversationMessage = {\n timestamp: number;\n content: [BundledMessageContent];\n sender: ConversationMessageSender;\n type: ConversationMessageType;\n};\n\ntype BundledMessageContent = {\n key: string;\n} & ConversationMessageContent;\n\nexport type ConversationContent = {\n loading: boolean;\n typingActors: ConversationMessageSender[];\n messages: ConversationMessage[];\n};\n\n/**\n * Group items by sender, type and time. Current grouping threshold is 2000 ms.\n * Put this as a property on either the component or on the provider?\n * Could possibly be implemented directly in the createEntry method\n * of the conversation controller to avoid iterating over the entire array on\n * each update.\n */\nconst groupedMessages = (\n messages: ConversationMessage[],\n timeout?: number\n): BundledConversationMessage[] => {\n return messages.reduce((acc: any[], current: any, index: number) => {\n const newItem = {\n ...current,\n content: [{ ...current.content, key: current.key }],\n };\n if (acc.length > 0 && current.type !== ConversationMessageType.System) {\n const previous = acc[acc.length - 1];\n if (\n (!timeout && timeout !== 0) ||\n Math.abs(previous.timestamp - current.timestamp) < timeout\n ) {\n if (\n previous.sender?.name === current.sender?.name &&\n previous.type === current.type\n ) {\n previous.timestamp = current.timestamp;\n previous.content.push({ ...current.content, key: current.key });\n return acc;\n }\n }\n }\n acc.push(newItem);\n return acc;\n }, []);\n};\n\nexport type ConversationComponentProperties = {\n providers: string[];\n messages: BundledConversationMessage[]; // internal\n overlay?: { conversation: boolean; secondary: boolean }; // internal\n overlayConversationHeader?: string;\n overlayConversationCloseLabel?: string;\n loading: boolean;\n inputPlaceholder: string;\n inputDisabled: boolean;\n inputHidden: boolean;\n inputMultiline: boolean;\n userLabel: string;\n avatarSize: string;\n typingActors: any[]; // internal\n sendButtonLabel: string;\n secondaryAction?: { icon?: string; action: string; label: string };\n};\n\nexport const ConversationComponent = (container: Container) => {\n return Promise.all([\n ConversationPlatform.getInstance(container),\n container.getAsync('router'),\n ]).then(([platform, router]: [ConversationPlatform, RoutingService]) => {\n return createReactComponent(\n container,\n 'conversation',\n import('./conversation'),\n (component) => {\n const routeData = router.getRouteData();\n const name = routeData.params.id || component.node.name || 'component';\n const conversation = platform.createController(name);\n const isNewController = platform.registerController(conversation, component);\n\n const messageGroupingTimeout = 3 * 60 * 1000;\n\n const setProperties = (properties: ConversationComponentProperties) => {\n const { providers = [] } = properties;\n if (providers) {\n const providerKeys = Array.isArray(providers) ? providers : [providers];\n conversation.setProviders(providerKeys);\n return providerKeys;\n }\n };\n setProperties(component.properties<ConversationComponentProperties>(setProperties));\n\n conversation.setComponentMountedState(true);\n\n const writeMessages = (messageStream: any) => {\n const { loading, typingActors, messages } = messageStream;\n component.writeProperties({\n loading,\n typingActors,\n messages: groupedMessages(messages, messageGroupingTimeout),\n });\n };\n\n writeMessages(conversation.getMessageStream());\n\n if (isNewController) {\n // todo: dont create actions here, there will be duplicates due to reuseController = true\n component.actions.create('user-submit', (data, options) => {\n if (options) {\n const { preventDefault, validationPromise } = options;\n if (preventDefault) {\n if (validationPromise) {\n validationPromise().then((text: string) => {\n if (text) {\n conversation.user.print(text);\n }\n });\n }\n return;\n }\n }\n conversation.user.print(data.text);\n });\n\n component.actions.create('user-typing', (data, options) => {});\n\n component.actions.create('form', (data, options) => {});\n\n component.actions.create('action', (data, options) => {});\n\n component.actions.create('overlay-mounted', (data, options) => {});\n\n component.actions.create('show-overlay', (data, options) => {\n component.writeProperties({\n overlay: { conversation: false, secondary: false },\n });\n });\n\n component.actions.create('hide-overlay', (data, options) => {\n component.writeProperties({\n overlay: null,\n });\n });\n\n component.actions.create('show-overlay-conversation', (data, options) => {\n component.writeProperties({\n overlay: { conversation: true, secondary: false },\n });\n });\n\n component.actions.create('hide-overlay-conversation', (data, options) => {\n component.writeProperties({\n overlay: { conversation: false, secondary: false },\n });\n });\n }\n\n const unsubscribe = conversation.events.subscribe(\n 'conversation:updated',\n (e: any, conversationData: ConversationContent) => {\n writeMessages(conversationData);\n }\n );\n\n return () => {\n conversation.setComponentMountedState(false);\n unsubscribe();\n if (!conversation.active) {\n // unregisterController();\n // todo: add possibility to dispose this through extendComponent()\n // component.dispose();\n writeMessages({ messages: [], typingActors: [], loading: false });\n }\n };\n },\n { reuseController: true }\n );\n });\n};\n","import { ComponentPlatform } from '@telia-ace/widget-core';\nimport { RoutingService } from '@telia-ace/widget-routing';\nimport { createReactComponent, Symbol } from '@telia-ace/widget-ui';\nimport { Container } from '@webprovisions/platform';\nimport { ConversationPlatform } from '../..';\n\nexport enum ButtonMode {\n flat = 'flat',\n flashing = 'flashing',\n flashingGradient = 'flashingGradient',\n}\n\nexport type ReturnButtonProps = {\n label: string;\n active: boolean;\n mode: ButtonMode;\n alert?: {\n symbol?: Symbol;\n show?: boolean;\n label?: string;\n };\n};\n\nexport const ConversationReturnButtonComponent = (container: Container) => {\n return Promise.all([\n ComponentPlatform.getInstance(container),\n ConversationPlatform.getInstance(container),\n container.getAsync('router'),\n ]).then(\n ([components, platform, router]: [\n ComponentPlatform,\n ConversationPlatform,\n RoutingService\n ]) => {\n return createReactComponent(\n container,\n 'conversation-return-button',\n import('./return-button'),\n (component) => {\n component.actions.create('toggle', (options = {}) => {\n platform.getComponentRoute()?.then((route) => {\n route && router.navigate(route.name, route.params);\n });\n });\n }\n );\n }\n );\n};\n","import { Form, FormBuilder } from '@telia-ace/widget-forms';\nimport { Symbol } from '@telia-ace/widget-ui';\n\nexport type ConversationMessageSettings = {\n key?: string;\n timestamp?: number;\n title?: string;\n body?: string;\n actions?: { [actionKey: string]: any };\n form?: (builder: FormBuilder) => void;\n type?: string;\n items?: ConversationMessageList[];\n [key: string]: any;\n};\n\nexport type NormalizedMessageSettings = {\n content: ConversationMessageContent;\n key: string;\n timestamp: number | null;\n};\n\nexport type ConversationMessageList = {\n header?: string;\n itemKey: string;\n type?: ConversationMessageListType;\n items: ConversationMessageListItem[];\n};\n\nexport type ConversationMessageListItem = {\n icon?: string;\n type?: ConversationMessageListItemType;\n actions?: { [actionKey: string]: any };\n form?: Form;\n body?: string;\n key: string;\n [key: string]: any;\n};\n\nexport type ConversationMessageContent = {\n title?: string;\n body?: string;\n actions?: { [actionKey: string]: any };\n items?: ConverstationMessageItem<any>[];\n form?: Form;\n [key: string]: any;\n};\n\nexport type ConverstationMessageItem<T, R = ItemPayload> = R extends [T, any] ? R : never;\n\nexport type ConversationMessageUpdateSettings = ConversationMessageContent & {\n timestamp?: number;\n};\n\nexport type ConversationMessageSender = {\n name?: string;\n avatar?: string | Symbol;\n};\n\nexport enum ConversationMessageListType {\n Ordinary = 'ordinary',\n Seperator = 'seperator',\n}\n\nexport enum ConversationMessageListItemType {\n LinkList = 'link-list',\n Separator = 'separator',\n ButtonList = 'button-list',\n Text = 'text',\n HTML = 'html',\n VideoRequest = 'video-request',\n}\n\nexport type LinkListProperties = {\n header?: string;\n actions: { [key: string]: string } | { label: string; actionKey: string; data: any }[];\n};\n\ntype LinkListItem = [ConversationMessageListItemType.LinkList, LinkListProperties];\n\ntype TextItem = [ConversationMessageListItemType.Text, string];\ntype SeparatorItem = [ConversationMessageListItemType.Separator, undefined];\n\nexport type ButtonListProperties = {\n header?: string;\n actions: { [key: string]: string } | { label: string; actionKey: string; data: any }[];\n};\n\ntype ButtonListItem = [ConversationMessageListItemType.ButtonList, ButtonListProperties];\n\nexport type VideoRequestProperties = {\n header?: string;\n acceptLabel: string;\n declineLabel: string;\n};\n\ntype VideoRequestItem = [ConversationMessageListItemType.VideoRequest, VideoRequestProperties];\n\nexport type HtmlProperties = {\n body: string;\n};\n\ntype HtmlItem = [ConversationMessageListItemType.HTML, HtmlProperties];\n\ntype ItemPayload =\n | LinkListItem\n | TextItem\n | SeparatorItem\n | ButtonListItem\n | HtmlItem\n | VideoRequestItem;\n","import { ComponentResolver, ReactComponent } from '@telia-ace/widget-core';\nimport { Container } from '@webprovisions/platform';\nimport { lazy } from 'react';\nimport { ConversationPlatform } from '..';\n\nexport const registerCustomMessageComponent = (\n container: Container,\n type: string,\n component: ReactComponent\n) => {\n return container.getAsync('componentResolver').then(async (o: ComponentResolver) => {\n const platform = await ConversationPlatform.getInstance(container);\n platform.addSubscription(\n o.registerComponent(\n type,\n lazy(() => component)\n )\n );\n });\n};\n"],"names":["Agent","provider","settings","__publicField","sender","normalized","getNormalizedMessageSettings","ConversationMessageType","name","avatar","ConversationProvider","container","controller","_a","type","key","content","timestamp","unsub","fn","unsubscribe","User","ConversationEntry","writer","uuid","__spreadValues","builder","FormBuilder","builtForm","removeTypingState","typingActors","senderString","indexToRemove","item","ConversationController","id","widget","providers","removed","added","acc","providerToRemove","index","p","target","mounted","message","entry","updated","updatedTimestamp","dismissed","handler","__spreadProps","getParentWidget","widgetName","implementation","mainWidgetName","getSeparateWidget","originWidget","mainWidget","data","trigger","chatWidgetName","chatWidget","shouldPreventDefault","openChatWidget","contactMethod","triggerDOMTarget","conversation","closeAllModals","components","contactMethodsQuery","conversationsQuery","createStorageWriter","StorageCategory","StorageMedium","StorageScope","write","platform","ConversationEndedBehavior","navigateToConversation","routeName","router","conversationQuery","STORAGE_KEY","ConversationPlatform","readStorage","storedSession","event","initialRoute","_b","_c","sub","lock","value","ComponentPlatform","params","behavior","stored","c","component","invokeHandlers","removedProvider","dispose","isActive","session","properties","callback","__async","triggerEl","groupedMessages","messages","timeout","current","newItem","previous","ConversationComponent","createReactComponent","isNewController","messageGroupingTimeout","setProperties","providerKeys","writeMessages","messageStream","loading","options","preventDefault","validationPromise","text","e","conversationData","ConversationReturnButtonComponent","route","ConversationMessageListItemType","registerCustomMessageComponent","o","lazy"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBO,MAAMA,EAAM;AAAA,EAIf,YAAoBC,GAAgCC,GAAyB;AAH7E,IAAAC,EAAA;AACA,IAAAA,EAAA;AAOA,IAAAA,EAAA,eAAQ,CACJD,MAKgC;AAChC,YAAME,IAAoC,EAAE,MAAM,KAAK,MAAM,QAAQ,KAAK,UACpEC,IAAaC,EAA6BJ,CAAQ;AAExD,aAAO,KAAK,SAAS;AAAA,QACjBG,EAAW;AAAA,QACXA,EAAW;AAAA,QACXE,EAAwB;AAAA,QACxBH;AAAA,QACAC,EAAW;AAAA,MAAA;AAAA,IACf;AAEJ,IAAAF,EAAA,gBAAS,MACE,KAAK,SAAS,eAAe,EAAE,MAAM,KAAK,MAAM,QAAQ,KAAK,OAAQ,CAAA;AAxB5D,SAAA,WAAAF,GAChB,KAAK,OAAOC,EAAS,MACrB,KAAK,SAASA,EAAS;AAAA,EAC3B;AAAA,EAwBA,OAAOA,GAA+B;AAC5B,UAAA,EAAE,MAAAM,GAAM,QAAAC,EAAW,IAAAP;AACzB,IAAIO,MAAW,OACX,KAAK,SAAS,SACPA,MACP,KAAK,SAASA,IAGdD,MAAS,OACT,KAAK,OAAO,SACLA,MACP,KAAK,OAAOA;AAAA,EAEpB;AACJ;AC5CO,MAAME,EAAqB;AAAA,EAItB,YACGF,GACCG,GACDC,GACT;AAPM,IAAAT,EAAA,uBAAiD,CAAA;AAClD,IAAAA,EAAA;AAGI,SAAA,OAAAK,GACC,KAAA,YAAAG,GACD,KAAA,aAAAC,GAEP,KAAK,OAAOA,KAAA,gBAAAA,EAAY;AAAA,EAC5B;AAAA,EAEA,OAAO,OAAOJ,GAAcG,GAAsBC,GAAoC;AAClF,WAAO,IAAIF,EAAqBF,GAAMG,GAAWC,CAAU;AAAA,EAC/D;AAAA,EAEA,YAAYV,IAA0B,IAAuB;AACzD,QAAI,KAAK;AACE,aAAA,IAAIF,EAAM,MAAME,CAAQ;AAAA,EAEvC;AAAA,EAEA,MAAMA,GAA+E;;AAC1E,YAAAW,IAAA,KAAK,eAAL,gBAAAA,EAAiB,MAAMX;AAAA,EAClC;AAAA,EAEA,eAAeE,GAAmCU,GAAgC;;AAC9E,YAAOD,IAAA,KAAK,eAAL,gBAAAA,EAAiB,eAAeT,GAAQU;AAAA,EACnD;AAAA,EAEA,UAAgC;AACxB,WAAC,KAAK,aAGH,KAAK,WAAW,WAFZ,MAAM,MAAM;AAAA,IAAA;AAAA,EAG3B;AAAA,EAEA,YACIC,GACAC,GACAF,GACAV,GACAa,GACF;;AACE,YAAOJ,IAAA,KAAK,eAAL,gBAAAA,EAAiB,YAAYE,GAAKC,GAASF,GAAMV,GAAQa;AAAA,EACpE;AAAA,EAEA,UAAU;;AACF,IAAA,QAAQ,IAAI,aAAa,gBACjB,QAAA,IAAI,mCAAmC,KAAK,OAAO,IAE1DJ,IAAA,KAAA,eAAA,QAAAA,EAAY,gBAAgB,OACjC,KAAK,aAAa,MAClB,KAAK,cAAc,QAAQ,CAACK,MAAUA,EAAO,CAAA;AAAA,EACjD;AAAA,EAEA,gBAAgBC,GAAyD;;AACrE,QAAI,KAAK,YAAY;AACjB,YAAMC,KAAcP,IAAA,KAAK,eAAL,gBAAAA,EAAiB,gBAAgBM;AAChD,kBAAA,cAAc,KAAKC,CAAW,GAC5B,MAAM;AACG,QAAAA;MAAA;AAAA,IAEpB;AAAA,EACJ;AAAA,EAEA,UAAUD,GAAyD;;AAC/D,QAAI,KAAK,YAAY;AACX,YAAAC,KAAcP,IAAA,KAAK,eAAL,gBAAAA,EAAiB,OAAO;AAAA,QACxC;AAAA,QACAM;AAAA;AAEC,kBAAA,cAAc,KAAKC,CAAW,GACnCD,EAAG,CAAA,GAAmB,KAAK,WAAW,yBAA0B,CAAA,GACzD,MAAM;AACG,QAAAC;MAAA;AAAA,IAEpB;AAAA,EACJ;AACJ;AC1FO,MAAMC,EAAK;AAAA,EACd,YAAoBT,GAAoC;AAExD,IAAAT,EAAA,eAAQ,CAACD,MAAsE;AACrE,YAAAG,IAAaC,EAA6BJ,CAAQ;AACxD,aAAO,KAAK,WAAW;AAAA,QACnBG,EAAW;AAAA,QACXA,EAAW;AAAA,QACXE,EAAwB;AAAA,QACxB;AAAA,QACAF,EAAW;AAAA,MAAA;AAAA,IACf;AAVgB,SAAA,aAAAO;AAAA,EAAqC;AAY7D;ACGO,MAAMU,EAAkB;AAAA,EAC3B,YAAoBC,GAAqB;AAArB,SAAA,SAAAA;AAAA,EAAsB;AAAA,EAE1C,OACIP,GAKF;AACQ,UAAAX,IAAa,KAAK,sBAAsBW,CAAO;AAErD,SAAK,OAA0CX,CAAU;AAAA,EAC7D;AAAA,EAEA,SAAS;AACL,SAAK,OAAO,IAAI;AAAA,EACpB;AAAA,EAEQ,sBACJW,GAKF;AACE,WAAI,OAAOA,KAAY,WAAiB,EAAE,MAAMA,MACvCA,EAAQ,SAAS,MAAM,OAAOA,KAAY,WAAiB,EAAE,OAAOA,MACjEA;AAAA,EAChB;AACJ;AAEY,IAAAT,sBAAAA,OACRA,EAAA,OAAO,QACPA,EAAA,QAAQ,SACRA,EAAA,SAAS,UAHDA,IAAAA,KAAA,CAAA,CAAA;AAgBC,MAAAD,IAA+B,CACxCJ,MAK4B;AACxB,MAAAc,GACAD,IAAMS,KACNP,IAA2B,KAAK;AAEpC,MAAI,MAAM,QAAQf,CAAQ,KAAKA,EAAS,SAAS;AACzC,IAAA,OAAOA,EAAS,MAAO,WACvBc,IAAU,EAAE,OAAO,CAAgCd,CAAQ,EAAE,IAEnDc,IAAA,EAAE,OAAwCd;WAEjD,OAAOA,KAAa;AACjB,IAAAc,IAAA,EAAE,MAAMd;WAElBA,IAAwCA,KAAY,IAEhDA,EAAS;AACC,IAAAc,IAAAS,EAAA,IACGvB;AAAA,OAEV;AAYH,QAXUc,IAAA;AAAA,MACN,MAAMd,EAAS;AAAA,MACf,SAASA,EAAS;AAAA,MAClB,OAAOA,EAAS;AAAA,IAAA,GAEhBA,EAAS,QACTa,IAAMb,EAAS,MAEfA,EAAS,cACTe,IAAYf,EAAS,YAErBA,EAAS,MAAM;AACT,YAAAwB,IAAUC,EAAY,OAAOZ,CAAG;AACtC,MAAAb,EAAS,KAAKwB,CAAO;AACf,YAAAE,IAAYF,EAAQ;AAC1B,MAAAV,EAAQ,OAAOY;AAAA,IACnB;AACI,IAAA1B,EAAS,cAAc,SACXe,IAAA;AAAA,EAEpB;AAEG,SAAA,EAAE,SAAAD,GAAS,KAAAD,GAAK,WAAAE;AAC3B,GAEMY,IAAoB,CACtBC,GACA1B,MACC;AACD,MAAI,CAACA;AACD;AAEE,QAAA2B,IAAe,KAAK,UAAU3B,CAAM,GACpC4B,IAAgBF,EAAa,UAAU,CAACG,MACnCF,MAAiB,KAAK,UAAUE,CAAI,CAC9C;AACD,MAAID,IAAgB;AACT,WAAAF,EAAa,OAAOE,GAAe,CAAC;AAEnD;AAMO,MAAME,EAAuB;AAAA,EAsBhC,YAAmBvB,GAA6BwB,GAAY;AArB5D,IAAAhC,EAAA,sBAA6B,CAAA;AAK7B,IAAAA,EAAA,cAAa,IAAIkB,EAAK,IAAI;AAE1B,IAAAlB,EAAA;AAEA,IAAAA,EAAA,mBAAsB,CAAA;AAEtB,IAAAA,EAAA,gBAAkB;AAEV,IAAAA,EAAA,6BAA8C,CAAA;AAE9C,IAAAA,EAAA,iBAAkB;AAClB,IAAAA,EAAA,0BAA4B;AAEpC,IAAAA,EAAA,kBAAkC,CAAA;AAC1B,IAAAA,EAAA,sBAA4C,CAAA;AAiJpD,IAAAA,EAAA,eAAQ,CAACD,MAAsE;AACrE,YAAAG,IAAaC,EAA6BJ,CAAQ;AAExD,aAAO,KAAK;AAAA,QACRG,EAAW;AAAA,QACXA,EAAW;AAAA,QACX;AAAA,QACA;AAAA,QACAA,EAAW;AAAA,MAAA;AAAA,IACf;AAxJe,SAAA,YAAAM,GAA6B,KAAA,KAAAwB;AACtC,UAAAC,IAAiBzB,EAAU,IAAI,SAAS;AAC9C,SAAK,SAASyB,EAAO,OAAO,YAAY,IAAI;AAAA,EAChD;AAAA,EAEA,aAAaC,GAAqB;AAC9B,UAAMC,IAAoB,CAAA,GACpBC,IAAkB,CAAA;AAGxB,SAAK,UACA,OAAiB,CAACC,GAAKvC,OAChBoC,EAAU,QAAQpC,CAAQ,MAAM,MAChCuC,EAAI,KAAKvC,CAAQ,GAEduC,IACR,EAAE,EACJ,QAAQ,CAACC,MAAqB;AAC3B,YAAMT,IAAgB,KAAK,UAAU,QAAQS,CAAgB;AAC7D,MAAIT,IAAgB,OAChBM,EAAQ,KAAKG,CAAgB,GACxB,KAAA,UAAU,OAAOT,GAAe,CAAC;AAAA,IAC1C,CACH,GAGKK,EAAA,QAAQ,CAACpC,MAAa;AAC5B,MAAI,KAAK,UAAU,QAAQA,CAAQ,MAAM,OACrCsC,EAAM,KAAKtC,CAAQ,GACd,KAAA,UAAU,KAAKA,CAAQ;AAAA,IAChC,CACH,IAEGsC,EAAM,UAAUD,EAAQ,WACxB,KAAK,OAAO,SAAS,kCAAkC,EAAE,OAAAC,GAAO,SAAAD,GAAS;AAAA,EAEjF;AAAA,EAEA,eAAe9B,GAAoC;AACzC,UAAAkC,IAAQ,KAAK,cAAclC,CAAI;AACrC,QAAIkC,IAAQ;AACR,aAAO,KAAK,oBAAoBA;AAEpC,UAAMzC,IAAWS,EAAqB,OAAOF,GAAM,KAAK,WAAW,IAAI;AAClE,gBAAA,oBAAoB,KAAKP,CAAQ,GAC/BA;AAAA,EACX;AAAA,EAEA,cAAcO,GAAc;AACxB,WAAO,KAAK,oBAAoB,UAAU,CAACmC,MAAMA,EAAE,SAASnC,CAAI;AAAA,EACpE;AAAA,EAEA,UAAU;AACN,SAAK,oBAAoB,QAAQ,CAACP,MAAaA,EAAS,SAAS,GACjE,KAAK,WAAW,IACX,KAAA,OAAO,SAAS,oCAAoC,IAAI,GAC7D,KAAK,SAAS;AAAA,EAClB;AAAA,EAEA,UAAUkB,GAAmB;AACzB,WAAO,KAAK,OAAO,UAAU,oCAAoCA,CAAE;AAAA,EACvE;AAAA,EAEA,UAAUA,GAAmB;AACzB,WAAO,KAAK,OAAO,UAAU,wBAAwBA,CAAE;AAAA,EAC3D;AAAA,EAEA,gBAAgByB,GAA8B;AAC1C,UAAMF,IAAQ,KAAK,cAAcE,EAAO,IAAI;AAC5C,IAAAF,IAAQ,MAAM,KAAK,oBAAoB,OAAOA,GAAO,CAAC,GACjD,KAAA,OAAO,SAAS,kCAAkC,EAAE,SAAS,CAACE,EAAO,IAAI,EAAA,CAAG,GAC5E,KAAK,oBAAoB,UAC1B,KAAK,QAAQ;AAAA,EAErB;AAAA,EAEA,kBAAkBzB,GAAmB;AACjC,WAAO,KAAK,OAAO,UAAU,kCAAkCA,CAAE;AAAA,EACrE;AAAA,EAEA,yBAAyB0B,GAAkB;AACnC,IAAA,KAAK,qBAAqBA,MAG9B,KAAK,mBAAmBA,GACpBA,MACK,KAAA,OAAO,SAAS,+BAA+B,EAAK,GACpD,KAAA,OAAO,SAAS,wBAAwB,EAAI,GACjD,KAAK,SAAS,KAEb,KAAA,OAAO,SAAS,wCAAwCA,CAAO;AAAA,EACxE;AAAA,EAEA,2BAA2B;AACvB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,gBAAgB1B,GAAmB;AAC/B,WAAO,KAAK,OAAO,UAAU,+BAA+BA,CAAE;AAAA,EAClE;AAAA,EAEA,YACIJ,GACAC,GACAF,GACAV,GACAa,GACiB;AACjB,UAAM6B,IAA+B;AAAA,MACjC,KAAA/B;AAAA,MACA,SAAAC;AAAA,MACA,MAAAF;AAAA,MACA,QAAQV,KAAU;AAAA,MAClB,WAAWa,KAAaA,MAAc,OAAOA,IAAY,KAAK,IAAI;AAAA,IAAA;AAEjE,SAAA,SAAS,KAAK6B,CAAO,GAC1BA,EAAQ,SAAS,WACbjB,EAAkB,KAAK,cAAczB,CAAM;AAC/C,UAAM2C,IAAQ,IAAIzB,EAAkB,CAAC0B,MAAY;AAC7C,UAAIA,MAAY,MAAM;AAClB,cAAgEnC,IAAAmC,GAAxD,aAAWC,IAAmB,WAA0BpC,GAAZG,IAAAA,EAAYH,GAAZG,CAA5C;AACR,QAAA8B,EAAQ,UAAU9B,GACdiC,MACAH,EAAQ,YAAYG;AAAA,MACxB,OACG;AACH,cAAMjB,IAAgB,KAAK,SAAS,QAAQc,CAAO;AACnD,QAAAA,EAAQ,UAAU,MACdd,IAAgB,MACX,KAAA,SAAS,OAAOA,GAAe,CAAC;AAAA,MAE7C;AACA,WAAK,OAAO,SAAS,gCAAgC,EAAE,SAAAc,EAAS,CAAA,GAChE,KAAK,OAAO;AAAA,IAAA,CACf;AACD,gBAAK,OAAO,SAAS,gCAAgC,EAAE,SAAAA,EAAS,CAAA,GAChE,KAAK,OAAO,GACP,KAAK,oBACD,KAAA,OAAO,SAAS,+BAA+B,EAAI,GAErDC;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,eAAe3C,GAAmCU,GAAgC;AAC9E,WAAI,KAAK,aAAa,QAAQV,CAAM,MAAM,OACjC,KAAA,aAAa,KAAKA,CAAM,GAC7B,KAAK,OAAO,IAGT,MAAM;AACS,MAAAyB,EAAA,KAAK,cAAczB,CAAM,GAC3C,KAAK,OAAO;AAAA,IAAA;AAAA,EAEpB;AAAA,EAKA,SAA+B;AACtB,SAAA,UAAU,KAAK,UAAU;AAC9B,QAAI8C,IAAY;AACZ,WAAA,KAAK,YAAY,KACjB,KAAK,OAAO,GAET,MAAM;AACT,MAAKA,MACWA,IAAA,IACP,KAAA,UAAU,KAAK,UAAU,GAC1B,KAAK,YAAY,KACjB,KAAK,OAAO;AAAA,IAEpB;AAAA,EAER;AAAA,EAEA,WAAWnC,GAAaoC,GAAwB;AACvC,SAAA,aAAapC,KAAOqC,EAAA3B,EAAA,IAAK,KAAK,aAAaV,KAAvB,EAA6B,QAAQoC;EAClE;AAAA,EAEA,aAAapC,GAAaoC,GAA0B;AAC3C,SAAA,aAAapC,KAAOqC,EAAA3B,EAAA,IAAK,KAAK,aAAaV,KAAvB,EAA6B,UAAUoC;EACpE;AACJ;AC7WA,MAAME,KAAkB,CAACC,GAAoBC,MAAmC;AACtE,QAAAC,IAAiBF,EAAW,MAAM,UAAU;AAClD,SAAOC,EAAe,QAAQ,IAAIC,EAAe,EAAE;AACvD,GAEMC,IAAoB,CAAC9C,MAAyB;AAC1C,QAAA+C,IAAe/C,EAAU,IAAI,SAAS,GACtC,EAAE,MAAAH,GAAM,gBAAA+C,EAAA,IAA2B5C,EAAU,IAAI,SAAS,GAE1DgD,IACFnD,EAAK,QAAQ,UAAU,IAAI,KAAK6C,GAAgB7C,GAAM+C,CAAc,IAAIG,GACtE,EAAE,MAAAE,EAAyB,IAAAjD,EAAU,IAAI,WAAW,GACpD,EAAE,SAAAkD,EAAQ,IAAoBF,EAAW,UAAU,IAAI,WAAW,GAClEG,IAAiB,GAAGtD,EACrB,QAAQ,mBAAmB,EAAE,EAC7B,QAAQ,YAAY,EAAE,oBAErBuD,IAAaR,EAAe,QAAQ,IAAIO,CAAc;AACxD,SAAAC,KAAc,CAACF,IACR,EAAE,YAAAE,GAAY,YAAAJ,GAAY,MAAAC,MAE9B,EAAE,YAAAD,GAAY,MAAAC;AACzB,GAEaI,KAAuB,CAACrD,MAAyB;AAC1D,QAAM,EAAE,YAAAoD,EAAA,IAAeN,EAAkB9C,CAAS;AAClD,SAAO,CAAC,CAACoD;AACb,GAEaE,IAAiB,CAC1BtD,GACAuD,GACAC,MACC;AACD,QAAM,EAAE,YAAAR,GAAY,MAAAC,GAAM,YAAAG,EAAW,IAAIN,EAAkB9C,CAAS;AAEpE,SAAIoD,IACIA,EAAW,UAAU,cACdA,EAAW,OAAO,MAAM,EAAE,KAAK,MAAM;AACxC,IAAAA,EAAW,UAAU,SAAS,cAAc,EAAE,KAAK,CAACK,MAAiB;AAE5D,MAAAA,EAAA,+BAA+BF,EAAc,EAAE,EAC/C,KAAK,MAAMG,EAAe1D,CAAS,CAAC;AAAA,IAAA,CAC5C;AAAA,EAAA,CACJ,IAEEoD,EACF,WACA,KAAK,MAAM;AACR,UAAM,EAAE,SAAAF,EAAQ,IAAIE,EAAW,UAAU,IAAI,WAAW;AACxD,WAAAF,EAAQ,SAAS,QACVE,EACF,OAAO,eAAe,OAAO;AAAA,MAC1B,MAAAH;AAAA,MACA,SAAAC;AAAA,MACA,UAAU;AAAA,IAAA,EACZ,EACD,KAAK,MACKE,EAAW,UACb,SAAS,YAAY,EACrB,KAAK,CAACO,MAAkC;AAIrC,YAAMC,IAAsBD,EACvB,WAAW,EACX,OAAO,gBAAgB;AAC5B,MAAAA,EAAW,MAAM;AAAA,QACb,KAAK;AAAA,QACL,YAAY;AAAA,UACR,YAAY;AAAA,YACR,IAAIJ,EAAc;AAAA,YAClB,SAASA,EAAc;AAAA,UAC3B;AAAA,QACJ;AAAA,QACA,QAAQK;AAAA,QACR,UAAU;AAAA,MAAA,CACb;AACD,YAAMC,IAAqBF,EACtB,WAAW,EACX,OAAO,cAAc;AAC1B,MAAAA,EAAW,MAAM;AAAA,QACb,KAAK;AAAA,QACL,YAAY;AAAA,UACR,YAAY,EAAE,WAAW,CAACJ,EAAc,UAAU,EAAE;AAAA,QACxD;AAAA,QACA,QAAQM;AAAA,QACR,UAAU;AAAA,MAAA,CACb;AAAA,IAAA,CACJ,CACR;AAAA,EAAA,CACR,EACA,KAAK,MACKT,EAAW,OAAO,UAAU;AAAA,IAC/B,KAAK;AAAA,IACL,mBAAmBI;AAAA,IACnB,iBAAiB;AAAA,EAAA,CACpB,CACJ,EACA,KAAK,OACFM;AAAA,IACIV,EAAW;AAAA,IACX;AAAA,IACAW,EAAgB;AAAA,IAChB;AAAA,MACI,QAAQC,EAAc;AAAA,MACtB,OAAOC,EAAa;AAAA,IACxB;AAAA,EAAA,EACF,KAAK,CAACC,MAAUA,EAAMd,EAAW,IAAI,CAAC,GAEjCA,EAAW,UACb,SAAS,cAAc,EACvB,KAAK,CAACe,MAAa;AACP,IAAAA,EAAA,6BAA6BC,EAA0B,UAAU;AAAA,EAAA,CAC7E,EACA,KAAK,MAAMV,EAAe1D,CAAS,CAAC,EACpC,KAAK,MAAM,EAAK,EACxB,KAETgD,EAAW,UAAU,SAAS,cAAc,EAAE,KAAK,CAACmB,MACzCA,EACF,+BAA+BZ,EAAc,EAAE,EAC/C,KAAK,MAAMY,EAAS,6BAA6BC,EAA0B,QAAQ,CAAC,CAC5F,GACM,CAAAhB;AACX,GAEaiB,KAAyB,CAClCrE,GACAuD,GACAe,IAAY,mBACX;AACD,QAAM,EAAE,YAAAtB,GAAY,YAAAI,EAAW,IAAIN,EAAkB9C,CAAS;AAC9D,SAAIoD,IACOA,EAAW,UAAU,SAAS,QAAQ,EAAE,KAAK,CAACmB,MAAgB;AACjE,IAAAA,EAAO,SAASD,GAAW,EAAE,IAAIf,EAAc,IAAI;AAAA,EAAA,CACtD,IAGEP,EAAW,UAAU,SAAS,cAAc,EAAE,KAAK,CAACmB,MAAmC;;AAC1F,KAAAjE,IAAAiE,EAAS,6BAA6BC,EAA0B,QAAQ,MAAxE,QAAAlE,EAA2E,KAAK,MAAM;AAClF,MAAA8C,EAAW,UAAU,SAAS,QAAQ,EAAE,KAAK,CAACuB,MAAgB;AAC1D,QAAAvB,EAAW,UACN,SAAS,YAAY,EACrB,KAAK,CAACW,MAAkC;AACrC,gBAAMa,IAAoBb,EAAW,WAAW,EAAE,OAAO,cAAc;AACvE,UAAAA,EAAW,MAAM;AAAA,YACb,KAAK;AAAA,YACL,YAAY,EAAE,YAAY,EAAE,WAAW,CAACJ,EAAc,UAAU,IAAI;AAAA,YACpE,QAAQiB;AAAA,YACR,UAAU;AAAA,UAAA,CACb;AAAA,QAAA,CACJ,EACA,KAAK,MAAM;AACR,UAAAD,EAAO,SAASD,GAAW,EAAE,IAAIf,EAAc,IAAI;AAAA,QAAA,CACtD;AAAA,MAAA,CACR;AAAA,IAAA;AAAA,EACJ,CACJ;AACL,GCtJMkB,IAAc;AAcR,IAAAL,sBAAAA,OACRA,EAAA,aAAa,cACbA,EAAA,WAAW,YACXA,EAAA,OAAO,QAHCA,IAAAA,KAAA,CAAA,CAAA;AAYL,MAAMM,EAAqB;AAAA,EAc9B,YAAoB1E,GAA8B2D,GAA+B;AAbjF,IAAAnE,EAAA;AACQ,IAAAA,EAAA,qBAGF,CAAA;AACE,IAAAA,EAAA,mBAAgD,CAAA;AAChD,IAAAA,EAAA,0BAA8D,CAAA;AAC9D,IAAAA,EAAA,uBAAiD,CAAA;AACjD,IAAAA,EAAA,uBAAsC;AACtC,IAAAA,EAAA,gBAAgC;AAChC,IAAAA,EAAA,qBAAqC;AACrC,IAAAA,EAAA,qBAAkC;AAEtB,SAAA,YAAAQ,GAA8B,KAAA,aAAA2D;AACxC,UAAAlC,IAAiBzB,EAAU,IAAI,SAAS;AAC9C,SAAK,SAASyB,EAAO,OAAO,YAAY,IAAI;AAAA,EAChD;AAAA,EAEA,aAAa;AACT,IAAAqC,EAAoB,KAAK,WAAWW,GAAaV,EAAgB,WAAW;AAAA,MACxE,QAAQC,EAAc;AAAA,IAAA,CACzB,EAAE,KAAK,CAACpD,MAAY,KAAK,gBAAgBA,CAAO,GAEjD+D,EAAyB,KAAK,WAAWF,GAAaT,EAAc,KAAK,EAAE;AAAA,MACvE,CAACY,MAAkB;AACf,aAAK,cAAc,KAAK,WACnB,aACA,OAAO,4BAA4B,GACpCA,MACA,KAAK,cAAcA,GACfA,EAAc,MAAMA,EAAc,SAC7B,KAAA,kBAAkB,EAAE,QAAQ,IAAM,OAAO,EAAE,MAAM,GAAM,EAAA,CAAG;AAAA,MAG3E;AAAA,IAAA,GAEC,KAAA,UAAU,SAAS,QAAQ,EAAE,KAAK,CAACL,MAAY,KAAK,SAASA,CAAO,GACzE,KAAK,OAAO,UAAU,sBAAsB,CAACM,GAAO5B,MAAS;;AACjD,eAAA/C,IAAA,KAAK,gBAAL,gBAAAA,EAAkB,2BAA2B;AAAA,QACjD,KAAK;AAED,UADuB,KAAK,UAAU,IAAI,SAAS,EAC5C,WAAW;AAClB;AAAA,QACJ,KAAK;AACK,gBAAA4E,KAAeC,IAAA,KAAK,WAAL,gBAAAA,EAAa;AAClC,UAAID,OACKE,IAAA,KAAA,WAAA,QAAAA,EAAQ,SAASF,EAAa;AAEvC;AAAA,MAIR;AACA,WAAK,kBAAkB,EAAE,QAAQ,GAAO,CAAA,GACxC,KAAK,cAAc,MACd,KAAA,iBAAiB,KAAK;IAAc,CAC5C;AAAA,EACL;AAAA,EAEA,gBAAgBG,GAAoC;AAC3C,SAAA,cAAc,KAAKA,CAAG;AAAA,EAC/B;AAAA,EAEA,OAAO,YACHjF,GACAI,IAAc,gBACe;AACtB,WAAA8E,EAAKlF,CAAS,EAAE,MACZA,EAAU,SAASI,CAAG,EAAE,KAAK,CAAC+E,MAAgC;AACjE,UAAI1B,IAAe0B;AACnB,aAAK1B,KACM2B,EAAkB,YAAYpF,CAAS,EAAE,KAAK,CAAC2D,OACnCF,IAAA,IAAIiB,EAAqB1E,GAAW2D,CAAU,GAC7DF,EAAa,WAAW,GACdzD,EAAA,cAAcI,GAAK,MAAMqD,CAAY,GACxCA,EACV;AAAA,IAEE,CACV,CACJ;AAAA,EACL;AAAA,EAEA,+BAA+BjC,GAA2B;AACtD,WAAOmD,EAAyB,KAAK,WAAWF,GAAaT,EAAc,KAAK,EAAE;AAAA,MAC9E,CAACY,MAAkB;;AACX,YAAAA,KAAiBA,EAAc,OAAOpD,KAClCoD,EAAc,OAAO;AACrB,gBAAM,EAAE,MAAA/E,GAAM,QAAAwF,MAAWT,EAAc;AAClC,WAAA1E,IAAA,KAAA,WAAA,QAAAA,EAAQ,SAASL,GAAMwF;AAAA,QAChC;AAAA,MAER;AAAA,IAAA;AAAA,EAER;AAAA,EAEA,6BAA6BC,GAAqC;AAC9D,WAAOX,EAAyB,KAAK,WAAWF,GAAaT,EAAc,KAAK,EAAE;AAAA,MAC9E,CAACuB,MAAW;AACR,YAAIX,IAAgBW;AACpB,eAAIX,IACAA,EAAc,4BAA4BU,IAE1BV,IAAA,EAAE,2BAA2BU,KAEjD,KAAK,cAAcV,GAEd,KAAK,iBAAiB,KAAK,cAAc,KAAK,WAAW,KAC1D,QAAQ;MAEhB;AAAA,IAAA;AAAA,EAER;AAAA,EAEA,iBAAiBpD,GAAY;AACnB,UAAAO,IAAQ,KAAK,YAAY,UAAU,CAACyD,MAAMA,EAAE,aAAa,OAAOhE,CAAE;AACxE,WAAIO,IAAQ,KACD,KAAK,YAAYA,GAAO,eAE5B,IAAIR,EAAuB,KAAK,WAAWC,CAAE;AAAA,EACxD;AAAA,EAEA,iBAAiB3B,GAAc2C,GAAoC;AAC/D,UAAMlD,IAAW;AAAA,MACb,MAAAO;AAAA,MACA,SAAA2C;AAAA,IAAA;AAEC,SAAA,UAAU,KAAKlD,CAAQ,GAE5B,KAAK,YACA,OAAO,CAACW,MAAeA,EAAW,aAAa,UAAU,QAAQJ,CAAI,IAAI,EAAE,EAC3E,QAAQ,CAACI,MAAe;AAChB,WAAA,cAAcX,GAAUW,CAAU;AAAA,IAAA,CAC1C;AAAA,EACT;AAAA,EAEA,mBACIwD,GACAgC,GACO;AACD,UAAA1D,IAAQ,KAAK,YAAY,UAAU,CAACyD,MAAMA,EAAE,aAAa,OAAO/B,EAAa,EAAE;AACjF,QAAAxD;AACJ,QAAI8B,IAAQ,GAAG;AACE,MAAA9B,IAAA,EAAE,cAAAwD,GAAc,WAAAgC,KACxB,KAAA,YAAY,KAAKxF,CAAU;AAC1B,YAAAyF,IAAiB,CAAChE,MAAwB;AAC5C,QAAIA,KACA,KAAK,UACA,OAAO,CAACpC,MAAaoC,EAAU,QAAQpC,EAAS,IAAI,IAAI,EAAE,EAC1D,QAAQ,CAACA,MAAa;AACd,eAAA,cAAcA,GAAUW,CAAU;AAAA,QAAA,CAC1C;AAAA,MACT;AAGJ,kBAAK,cAAc;AAAA,QACfwD,EAAa,UAAU,CAACoB,GAAO5B,MAAS;AAC9BlB,gBAAAA,IAAQ,KAAK,YAAY,UAAU,CAACyD,MAAMA,EAAE,iBAAiBvC,CAAI;AACvElB,UAAAA,IAAQ,MAAM,KAAK,YAAY,OAAOA,GAAO,CAAC,GAC9C,KAAK,WACA,WACA,EAAA,OAAO,4BAA4B,EACnC,OAAO,EACP,gBAAgB,EAAE,QAAQ,GAAO,CAAA,GAEjC,KAAA,OAAO,SAAS,sBAAsB,IAAI,EAAE,SAAS,IAAM;AAAA,QAAA,CACnE;AAAA,MAAA,GAEL,KAAK,cAAc;AAAA,QACf0B,EAAa,kBAAkB,CAACoB,GAAO5B,MAAS;AACtC,gBAAA,EAAE,OAAArB,GAAO,SAAAD,EAAoD,IAAAsB;AAC3D,UAAAtB,EAAA,QAAQ,CAACgE,MAAoB;AACjC,iBAAK,iBAAiBA,GAAiB,QAAQ,CAACC,MAAY;AAChD,cAAAA;YAAA,CACX;AAAA,UAAA,CACJ,GACDF,EAAe9D,CAAK;AAAA,QAAA,CACvB;AAAA,MAAA,GAGL,KAAK,cAAc;AAAA,QACf6B,EAAa,UAAU,CAACoB,GAAOgB,MAAa;;AACxC,gBAAMC,IAAuB;AAAA,YACzB,IAAIrC,EAAa;AAAA,YACjB,QAAOvD,IAAA,KAAK,WAAL,gBAAAA,EAAa;AAAA,YACpB,4BAA2B6E,IAAA,KAAK,gBAAL,gBAAAA,EAAkB;AAAA,UAAA;AAEjD,eAAK,cAAce,GACd,KAAA,iBAAiB,KAAK,cAAcA,CAAO,GAEhD,KAAK,kBAAkB,EAAE,QAAQD,EAAU,CAAA;AAAA,QAAA,CAC9C;AAAA,MAAA,GAGL,KAAK,cAAc;AAAA,QACfpC,EAAa,gBAAgB,CAACoB,GAAO5B,MAAS;AACrC,eAAA,OAAO,SAAS,+BAA+BA,CAAI,GACxD,KAAK,kBAAkB,EAAE,OAAO,EAAE,MAAMA,KAAQ;AAAA,QAAA,CACnD;AAAA,MAAA,GAGLyC,EAAejC,EAAa,SAAS,GAC9B;AAAA,IACX;AACA,WAAAxD,IAAa,KAAK,YAAY8B,IACvB;AAAA,EACX;AAAA,EAEQ,kBAAkBgE,GAAiB3F,IAAc,iCAAiC;AACtF,IAAI,KAAK,eACL,KAAK,WAAW,MAAM;AAAA,MAClB,KAAK;AAAA,MACL,YAAY,EAAE,YAAA2F,EAAW;AAAA,MACzB,QAAQ,KAAK;AAAA,MACb,UAAU;AAAA,IAAA,CACb;AAAA,EAET;AAAA,EAEQ,cAAczG,GAA4CW,GAAiB;AAC/E,UAAM2F,IAAUtG,EAAS;AAAA,MACrBW,EAAW,aAAa,eAAeX,EAAS,IAAI;AAAA,MACpDW,EAAW;AAAA,IAAA;AAEf,IAAI2F,MACK,KAAK,iBAAiBtG,EAAS,UAC3B,KAAA,iBAAiBA,EAAS,QAAQ,CAAA,IAE3C,KAAK,iBAAiBA,EAAS,MAAM,KAAKsG,CAAO;AAAA,EAEzD;AAAA,EAEA,oBAAoB;AAChB,WAAOjB,EAAyB,KAAK,WAAWF,GAAaT,EAAc,KAAK,EAAE;AAAA,MAC9E,CAACuB,MAAWA,KAAA,gBAAAA,EAAQ;AAAA,IAAA;AAAA,EAE5B;AAAA,EAEA,UAAU;AACN,WAAO,KAAK,KAAK,gBAAgB,EAAE,QAAQ,CAACnF,MAAQ;AAChD,WAAK,iBAAiBA,GAAK,QAAQ,CAACwF,MAAY;AACpC,QAAAA;MAAA,CACX;AAAA,IAAA,CACJ,GACI,KAAA,cAAc,QAAQ,CAACnF,MAAgB;AAC5B,MAAAA;IAAA,CACf,GACD,KAAK,cAAc,IACnB,KAAK,YAAY;EACrB;AAAA,EAEA,OAAoB,yBAChBoE,GACA7E,GACAuD,GACAyC,GACF;AAAA,WAAAC,EAAA;AACM,UAAA5C,GAAqBrD,CAAS,GAAG;AACjC,QAAA6E,EAAM,eAAe;AACjB,YAAAqB,IAAY,SAAS,eAAe,uBAAuB;AAC/D,QAAKA,MACWA,IAAA,SAAS,cAAc,GAAG,GAC5BA,EAAA,aAAa,QAAQ,GAAG,GAClCA,EAAU,KAAK,yBACN,SAAA,KAAK,YAAYA,CAAS,IAExB5C,EAAAtD,GAAWuD,GAAe2C,CAAS;AAAA,MACtD;AACA,MAAA5C,EAAetD,GAAWuD,CAAa;AAAA,IAC3C;AAAA;AAAA,EAEA,OAAoB,0BAA0BvD,GAAsBuD,GAAoB;AAAA,WAAA0C,EAAA;AAC7E,aAAA5B,GAAuBrE,GAAWuD,CAAa;AAAA,IAC1D;AAAA;AACJ;AClSA,MAAM4C,KAAkB,CACpBC,GACAC,MAEOD,EAAS,OAAO,CAACvE,GAAYyE,GAAcvE,MAAkB;;AAChE,QAAMwE,IAAU9D,EAAA3B,EAAA,IACTwF,IADS;AAAA,IAEZ,SAAS,CAAC7D,EAAA3B,EAAA,IAAKwF,EAAQ,UAAb,EAAsB,KAAKA,EAAQ,MAAK;AAAA,EAAA;AAEtD,MAAIzE,EAAI,SAAS,KAAKyE,EAAQ,SAAS1G,EAAwB,QAAQ;AAC7D,UAAA4G,IAAW3E,EAAIA,EAAI,SAAS;AAE7B,SAAA,CAACwE,KAAWA,MAAY,KACzB,KAAK,IAAIG,EAAS,YAAYF,EAAQ,SAAS,IAAID,QAG/CnG,IAAAsG,EAAS,WAAT,gBAAAtG,EAAiB,YAAS6E,IAAAuB,EAAQ,WAAR,gBAAAvB,EAAgB,SAC1CyB,EAAS,SAASF,EAAQ;AAE1B,aAAAE,EAAS,YAAYF,EAAQ,WACpBE,EAAA,QAAQ,KAAK/D,EAAA3B,EAAA,IAAKwF,EAAQ,UAAb,EAAsB,KAAKA,EAAQ,IAAA,EAAK,GACvDzE;AAAA,EAGnB;AACA,SAAAA,EAAI,KAAK0E,CAAO,GACT1E;AACX,GAAG,CAAE,CAAA,GAqBI4E,KAAwB,CAACzG,MAC3B,QAAQ,IAAI;AAAA,EACf0E,EAAqB,YAAY1E,CAAS;AAAA,EAC1CA,EAAU,SAAS,QAAQ;AAC9B,CAAA,EAAE,KAAK,CAAC,CAACmE,GAAUI,CAAM,MACfmC;AAAA,EACH1G;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,CAACyF,MAAc;AAEX,UAAM5F,IADY0E,EAAO,eACF,OAAO,MAAMkB,EAAU,KAAK,QAAQ,aACrDhC,IAAeU,EAAS,iBAAiBtE,CAAI,GAC7C8G,IAAkBxC,EAAS,mBAAmBV,GAAcgC,CAAS,GAErEmB,IAAyB,IAAI,KAAK,KAElCC,IAAgB,CAACd,MAAgD;AACnE,YAAM,EAAE,WAAArE,IAAY,GAAO,IAAAqE;AAC3B,UAAIrE,GAAW;AACX,cAAMoF,IAAe,MAAM,QAAQpF,CAAS,IAAIA,IAAY,CAACA,CAAS;AACtE,eAAA+B,EAAa,aAAaqD,CAAY,GAC/BA;AAAA,MACX;AAAA,IAAA;AAEU,IAAAD,EAAApB,EAAU,WAA4CoB,CAAa,CAAC,GAElFpD,EAAa,yBAAyB,EAAI;AAEpC,UAAAsD,IAAgB,CAACC,MAAuB;AAC1C,YAAM,EAAE,SAAAC,GAAS,cAAA9F,GAAc,UAAAiF,EAAA,IAAaY;AAC5C,MAAAvB,EAAU,gBAAgB;AAAA,QACtB,SAAAwB;AAAA,QACA,cAAA9F;AAAA,QACA,UAAUgF,GAAgBC,GAAUQ,CAAsB;AAAA,MAAA,CAC7D;AAAA,IAAA;AAGS,IAAAG,EAAAtD,EAAa,kBAAkB,GAEzCkD,MAEAlB,EAAU,QAAQ,OAAO,eAAe,CAACxC,GAAMiE,MAAY;AACvD,UAAIA,GAAS;AACH,cAAA,EAAE,gBAAAC,GAAgB,mBAAAC,EAAsB,IAAAF;AAC9C,YAAIC,GAAgB;AAChB,UAAIC,KACkBA,EAAA,EAAE,KAAK,CAACC,MAAiB;AACvC,YAAIA,KACa5D,EAAA,KAAK,MAAM4D,CAAI;AAAA,UAChC,CACH;AAEL;AAAA,QACJ;AAAA,MACJ;AACa,MAAA5D,EAAA,KAAK,MAAMR,EAAK,IAAI;AAAA,IAAA,CACpC,GAEDwC,EAAU,QAAQ,OAAO,eAAe,CAACxC,GAAMiE,MAAY;AAAA,IAAA,CAAE,GAE7DzB,EAAU,QAAQ,OAAO,QAAQ,CAACxC,GAAMiE,MAAY;AAAA,IAAA,CAAE,GAEtDzB,EAAU,QAAQ,OAAO,UAAU,CAACxC,GAAMiE,MAAY;AAAA,IAAA,CAAE,GAExDzB,EAAU,QAAQ,OAAO,mBAAmB,CAACxC,GAAMiE,MAAY;AAAA,IAAA,CAAE,GAEjEzB,EAAU,QAAQ,OAAO,gBAAgB,CAACxC,GAAMiE,MAAY;AACxD,MAAAzB,EAAU,gBAAgB;AAAA,QACtB,SAAS,EAAE,cAAc,IAAO,WAAW,GAAM;AAAA,MAAA,CACpD;AAAA,IAAA,CACJ,GAEDA,EAAU,QAAQ,OAAO,gBAAgB,CAACxC,GAAMiE,MAAY;AACxD,MAAAzB,EAAU,gBAAgB;AAAA,QACtB,SAAS;AAAA,MAAA,CACZ;AAAA,IAAA,CACJ,GAEDA,EAAU,QAAQ,OAAO,6BAA6B,CAACxC,GAAMiE,MAAY;AACrE,MAAAzB,EAAU,gBAAgB;AAAA,QACtB,SAAS,EAAE,cAAc,IAAM,WAAW,GAAM;AAAA,MAAA,CACnD;AAAA,IAAA,CACJ,GAEDA,EAAU,QAAQ,OAAO,6BAA6B,CAACxC,GAAMiE,MAAY;AACrE,MAAAzB,EAAU,gBAAgB;AAAA,QACtB,SAAS,EAAE,cAAc,IAAO,WAAW,GAAM;AAAA,MAAA,CACpD;AAAA,IAAA,CACJ;AAGC,UAAAhF,IAAcgD,EAAa,OAAO;AAAA,MACpC;AAAA,MACA,CAAC6D,GAAQC,MAA0C;AAC/C,QAAAR,EAAcQ,CAAgB;AAAA,MAClC;AAAA,IAAA;AAGJ,WAAO,MAAM;AACT,MAAA9D,EAAa,yBAAyB,EAAK,GAC/BhD,KACPgD,EAAa,UAIAsD,EAAA,EAAE,UAAU,IAAI,cAAc,CAAA,GAAI,SAAS,GAAA,CAAO;AAAA,IACpE;AAAA,EAER;AAAA,EACA,EAAE,iBAAiB,GAAK;AAAA,CAE/B,GCxKQS,KAAoC,CAACxH,MACvC,QAAQ,IAAI;AAAA,EACfoF,EAAkB,YAAYpF,CAAS;AAAA,EACvC0E,EAAqB,YAAY1E,CAAS;AAAA,EAC1CA,EAAU,SAAS,QAAQ;AAC9B,CAAA,EAAE;AAAA,EACC,CAAC,CAAC2D,GAAYQ,GAAUI,CAAM,MAKnBmC;AAAA,IACH1G;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,CAACyF,MAAc;AACX,MAAAA,EAAU,QAAQ,OAAO,UAAU,CAACyB,IAAU,CAAA,MAAO;;AACjD,SAAAhH,IAAAiE,EAAS,kBAAkB,MAA3B,QAAAjE,EAA8B,KAAK,CAACuH,MAAU;AAC1C,UAAAA,KAASlD,EAAO,SAASkD,EAAM,MAAMA,EAAM,MAAM;AAAA,QAAA;AAAA,MACpD,CACJ;AAAA,IACL;AAAA,EAAA;AAER;ACiBI,IAAAC,uBAAAA,OACRA,EAAA,WAAW,aACXA,EAAA,YAAY,aACZA,EAAA,aAAa,eACbA,EAAA,OAAO,QACPA,EAAA,OAAO,QACPA,EAAA,eAAe,iBANPA,IAAAA,MAAA,CAAA,CAAA;AC1DL,MAAMC,KAAiC,CAC1C3H,GACAG,GACAsF,MAEOzF,EAAU,SAAS,mBAAmB,EAAE,KAAK,CAAO4H,MAAyB3B,EAAA;AAEvE,GADQ,MAAMvB,EAAqB,YAAY1E,CAAS,GACxD;AAAA,IACL4H,EAAE;AAAA,MACEzH;AAAA,MACA0H,EAAK,MAAMpC,CAAS;AAAA,IACxB;AAAA,EAAA;AACJ,EACH;"}
|
|
@@ -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.9c517bbe.js","sources":["../src/components/return-button/return-button.tsx"],"sourcesContent":["// import { Component } from '@telia-ace/widget-types-grid';\
|
|
1
|
+
{"version":3,"file":"return-button.9c517bbe.js","sources":["../src/components/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 './plugin';\n\ntype Props = {\n className: string;\n};\n\nconst ReturnButton: React.FC<Props> = ({ className, ...other }) => {\n const { label, active, mode = 'flat', alert = {} } = useProperties<ReturnButtonProps>();\n const { symbol, label: alertLabel, show: showAlert } = alert;\n // const [showAlert, setShowAlert] = useState(show);\n const dispatch = useDispatch();\n\n if (!active) {\n return null;\n }\n\n return (\n <StyledHighlightedButton\n className={className}\n mode={mode}\n aria-label={label}\n onClick={() => {\n dispatch('toggle');\n }}\n >\n <StyledLabel>{label}</StyledLabel>\n {symbol && (\n <StyledIconHolder showAlert={showAlert}>\n <SymbolBadge symbol={symbol} title={alertLabel} size={20}></SymbolBadge>\n </StyledIconHolder>\n )}\n </StyledHighlightedButton>\n );\n};\n\nconst FlashingColorAnimation = (props: any) => keyframes`\n 0% {\n background-color: ${props.theme.colors?.primary};\n }\n 50% {\n background-color: ${props.theme.colors?.accent};\n }\n 100 {\n background-color: ${props.theme.colors?.primary};\n }\n`;\n\nconst ScrollingGradientAnimation = (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-visible {\n ${borderTabStyle}\n background: ${(p) => p.theme.colors?.text};\n color: ${(p) => p.theme.colors?.primary};\n }\n`;\n\nexport default ReturnButton;\n"],"names":["ReturnButton","_a","_b","className","other","__objRest","label","active","mode","alert","useProperties","symbol","alertLabel","showAlert","dispatch","useDispatch","React","StyledHighlightedButton","StyledLabel","StyledIconHolder","SymbolBadge","FlashingColorAnimation","props","keyframes","_c","ScrollingGradientAnimation","PulsatingIcon","styled","p","flashingStyle","css","flashingGradientStyle","Button","borderTabStyle"],"mappings":"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"}
|