@nyaruka/temba-components 0.92.0 → 0.93.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/temba-components.js +87 -70
- package/dist/temba-components.js.map +1 -1
- package/out-tsc/src/chat/Chat.js +32 -12
- package/out-tsc/src/chat/Chat.js.map +1 -1
- package/out-tsc/src/contacts/ContactChat.js +86 -65
- package/out-tsc/src/contacts/ContactChat.js.map +1 -1
- package/package.json +1 -1
- package/src/chat/Chat.ts +33 -12
- package/src/contacts/ContactChat.ts +88 -64
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContactChat.js","sourceRoot":"","sources":["../../../src/contacts/ContactChat.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-this-alias */\nimport { css, html, PropertyValueMap, TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { Contact, CustomEventType, Ticket } from '../interfaces';\nimport { oxford, oxfordFn, postJSON } from '../utils';\nimport { ContactStoreElement } from './ContactStoreElement';\nimport { Compose } from '../compose/Compose';\nimport { fetchContactHistory, getDisplayName } from './helpers';\nimport {\n AirtimeTransferredEvent,\n CampaignFiredEvent,\n ChannelEvent,\n ContactEvent,\n ContactGroupsEvent,\n ContactHistoryPage,\n ContactLanguageChangedEvent,\n EmailSentEvent,\n ErrorMessageEvent,\n FlowEvent,\n LabelsAddedEvent,\n MsgEvent,\n NameChangedEvent,\n OptinRequestedEvent,\n TicketEvent,\n UpdateFieldEvent,\n UpdateResultEvent,\n URNsChangedEvent,\n WebhookEvent\n} from './events';\nimport { Chat, ChatEvent, MessageType } from '../chat/Chat';\nimport { getUserDisplay } from '../webchat';\nimport { DEFAULT_AVATAR } from '../webchat/assets';\n\nexport enum Events {\n MESSAGE_CREATED = 'msg_created',\n MESSAGE_RECEIVED = 'msg_received',\n BROADCAST_CREATED = 'broadcast_created',\n IVR_CREATED = 'ivr_created',\n FLOW_ENTERED = 'flow_entered',\n\n FLOW_EXITED = 'flow_exited',\n RUN_RESULT_CHANGED = 'run_result_changed',\n CONTACT_FIELD_CHANGED = 'contact_field_changed',\n CONTACT_GROUPS_CHANGED = 'contact_groups_changed',\n CONTACT_NAME_CHANGED = 'contact_name_changed',\n CONTACT_URNS_CHANGED = 'contact_urns_changed',\n CAMPAIGN_FIRED = 'campaign_fired',\n CHANNEL_EVENT = 'channel_event',\n CONTACT_LANGUAGE_CHANGED = 'contact_language_changed',\n WEBHOOK_CALLED = 'webhook_called',\n AIRTIME_TRANSFERRED = 'airtime_transferred',\n CALL_STARTED = 'call_started',\n EMAIL_SENT = 'email_sent',\n INPUT_LABELS_ADDED = 'input_labels_added',\n NOTE_CREATED = 'note_created',\n TICKET_ASSIGNED = 'ticket_assigned',\n TICKET_NOTE_ADDED = 'ticket_note_added',\n TICKET_CLOSED = 'ticket_closed',\n TICKET_OPENED = 'ticket_opened',\n TICKET_REOPENED = 'ticket_reopened',\n OPTIN_REQUESTED = 'optin_requested',\n ERROR = 'error',\n FAILURE = 'failure'\n}\n\nconst renderInfoList = (singular: string, plural: string, items: any[]) => {\n if (items.length === 1) {\n return `${singular} **${items[0].name}**`;\n } else {\n const list = items.map((item) => `**${item.name}**`);\n if (list.length === 2) {\n return `${plural} ${list.join(' and ')}`;\n } else {\n const last = list.pop();\n return `${plural} ${list.join(', ')}, and ${last}`;\n }\n }\n};\n\nconst toTitleCase = (str: string) => {\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\nconst renderChannelEvent = (event: ChannelEvent): string => {\n if (event.event.type === 'mt_miss') {\n return 'Missed outgoing call';\n } else if (event.event.type === 'mo_miss') {\n return 'Missed incoming call';\n } else if (event.event.type === 'new_conversation') {\n return 'Started conversation';\n } else if (event.channel_event_type === 'welcome_message') {\n return 'Welcome Message Sent';\n } else if (event.event.type === 'referral') {\n return 'Referred';\n } else if (event.event.type === 'follow') {\n return 'Followed';\n } else if (event.event.type === 'stop_contact') {\n return 'Stopped';\n } else if (event.event.type === 'mt_call') {\n return 'Outgoing Phone Call';\n } else if (event.event.type == 'mo_call') {\n return 'Incoming Phone call';\n } else if (event.event.type == 'optin') {\n return `Opted in to **${event.event.optin?.name}**`;\n } else if (event.event.type == 'optout') {\n return `Opted out of **${event.event.optin?.name}**`;\n }\n};\n\nconst renderFlowEvent = (event: FlowEvent): string => {\n let verb = 'Interrupted';\n if (event.status !== 'I') {\n if (event.type === Events.FLOW_ENTERED) {\n verb = 'Started';\n } else {\n verb = 'Completed';\n }\n }\n return `${verb} [**${event.flow.name}**](/flow/editor/${event.flow.uuid}/)`;\n};\n\nconst renderResultEvent = (event: UpdateResultEvent): string => {\n if (!event.name.startsWith('_') && event.value) {\n return `Updated flow result **${event.name}** to **${event.value}**`;\n }\n};\n\nconst renderUpdateEvent = (event: UpdateFieldEvent): string => {\n return event.value\n ? `Updated **${event.field.name}** to **${event.value.text}**`\n : `Cleared **${event.field.name}**`;\n};\n\nconst renderNameChanged = (event: NameChangedEvent): string => {\n return `Updated **Contact Name** to **${event.name}**`;\n};\n\nconst renderContactURNsChanged = (event: URNsChangedEvent): string => {\n return `Updated **URNs** to ${oxfordFn(\n event.urns,\n (urn: string) => `**${urn.split(':')[1].split('?')[0]}**`\n )}`;\n};\n\nconst renderEmailSent = (event: EmailSentEvent): string => {\n return `Email sent to **${oxford(event.to, 'and')}** with subject **${\n event.subject\n }**`;\n};\n\nconst renderLabelsAdded = (event: LabelsAddedEvent): string => {\n return `Applied ${renderInfoList('label', 'labels', event.labels)}`;\n};\n\nexport const renderTicketAction = (\n event: TicketEvent,\n action: string\n): string => {\n if (event.created_by) {\n return `**${getUserDisplay(\n event.created_by\n )}** ${action} a **[ticket](/ticket/all/closed/${event.ticket.uuid}/)**`;\n }\n return `A **[ticket](/ticket/all/closed/${event.ticket.uuid}/)** was **${action}**`;\n};\n\nexport const renderTicketAssigned = (event: TicketEvent): string => {\n return event.assignee\n ? event.assignee.id === event.created_by.id\n ? `**${getDisplayName(event.created_by)}** took this ticket`\n : `${getDisplayName(\n event.created_by\n )} assigned this ticket to **${getDisplayName(event.assignee)}**`\n : `**${getDisplayName(event.created_by)}** unassigned this ticket`;\n};\n\nexport const renderContactGroupsEvent = (event: ContactGroupsEvent): string => {\n const groupsEvent = event as ContactGroupsEvent;\n if (groupsEvent.groups_added) {\n return renderInfoList(\n 'Added to group',\n 'Added to groups',\n groupsEvent.groups_added\n );\n } else if (groupsEvent.groups_removed) {\n return renderInfoList(\n 'Removed from group',\n 'Removed from groups',\n groupsEvent.groups_removed\n );\n }\n};\n\nexport const renderCampaignFiredEvent = (event: CampaignFiredEvent): string => {\n return `Campaign ${event.campaign.name}\n ${event.fired_result === 'S' ? 'skipped' : 'triggered'}\n ${event.campaign_event.offset_display}\n ${event.campaign_event.relative_to.name}`;\n};\n\nexport const renderTicketOpened = (event: TicketEvent): string => {\n return `${event.ticket.topic.name} ticket was opened`;\n};\n\nexport const renderErrorMessage = (event: ErrorMessageEvent): string => {\n return `${event.text} ${\n event.type === Events.FAILURE\n ? `Run ended prematurely, check the flow design`\n : null\n }`;\n};\n\nexport const renderWebhookEvent = (event: WebhookEvent): string => {\n return event.status === 'success'\n ? `Successfully called ${event.url}`\n : `Failed to call ${event.url}`;\n};\n\nexport const renderAirtimeTransferredEvent = (\n event: AirtimeTransferredEvent\n): string => {\n if (parseFloat(event.actual_amount) === 0) {\n return `Airtime transfer failed`;\n }\n return `Transferred **${event.actual_amount}** ${event.currency} of airtime`;\n};\n\nexport const renderCallStartedEvent = (): string => {\n return `Call Started`;\n};\n\nexport const renderContactLanguageChangedEvent = (\n event: ContactLanguageChangedEvent\n): string => {\n return `Language updated to **${event.language}**`;\n};\n\nexport const renderOptinRequested = (event: OptinRequestedEvent): string => {\n return `Requested opt-in for ${event.optin.name}`;\n};\n\nexport class ContactChat extends ContactStoreElement {\n public static get styles() {\n return css`\n :host {\n flex-grow: 1;\n display: flex;\n flex-direction: row;\n min-height: 0;\n --compose-shadow: none;\n --compose-border: none;\n --compose-padding: 3px;\n --compose-curvature: none;\n }\n\n .chat-wrapper {\n display: flex;\n flex-grow: 1;\n flex-direction: column;\n min-height: 0;\n }\n\n temba-contact-history {\n border-bottom: 1px solid #f6f6f6;\n flex-grow: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n }\n\n .chatbox {\n background: #fff;\n display: flex;\n flex-direction: column;\n --textarea-min-height: 1em;\n --textarea-height: 1.2em;\n --widget-box-shadow-focused: none;\n }\n\n .chatbox.full {\n border-bottom-right-radius: 0 !important;\n }\n\n .closed-footer {\n padding: 1em;\n background: #f2f2f2;\n border-top: 3px solid #e1e1e1;\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n\n a {\n color: var(--color-link-primary);\n }\n\n a:hover {\n text-decoration: underline;\n color: var(--color-link-primary-hover);\n }\n\n temba-button#reopen-button {\n --button-y: 1px;\n --button-x: 12px;\n }\n\n temba-completion {\n --widget-box-shadow: none;\n --color-widget-border: transparent;\n --widget-box-shadow-focused: none;\n --color-focus: transparent;\n --color-widget-bg-focused: transparent;\n }\n\n .border {\n border-top: 1px solid #f1f1f1;\n margin: 0 1em;\n }\n `;\n }\n\n @property({ type: String, attribute: 'ticket' })\n ticketUUID: string;\n\n @property({ type: String })\n contactsEndpoint = '/api/v2/contacts.json';\n\n @property({ type: String })\n currentNote = '';\n\n @property({ type: Boolean })\n showDetails = true;\n\n @property({ type: Object })\n currentTicket: Ticket = null;\n\n @property({ type: Object })\n currentContact: Contact = null;\n\n @property({ type: String })\n agent = '';\n\n @property({ type: Boolean })\n blockFetching = false;\n\n @property({ type: String })\n avatar = DEFAULT_AVATAR;\n\n // http promise to monitor for completeness\n public httpComplete: Promise<void>;\n private chat: Chat;\n\n ticket = null;\n lastEventTime = null;\n newestEventTime = null;\n refreshId = null;\n polling = false;\n\n constructor() {\n super();\n }\n\n public firstUpdated(\n changed: PropertyValueMap<any> | Map<PropertyKey, unknown>\n ): void {\n super.firstUpdated(changed);\n }\n\n public connectedCallback() {\n super.connectedCallback();\n this.chat = this.shadowRoot.querySelector('temba-chat');\n }\n\n public disconnectedCallback() {\n if (this.refreshId) {\n clearInterval(this.refreshId);\n }\n }\n\n public updated(changedProperties: Map<string, any>) {\n super.updated(changedProperties);\n\n // if we don't have an endpoint infer one\n if (\n changedProperties.has('data') ||\n changedProperties.has('currentContact')\n ) {\n this.currentContact = this.data;\n }\n\n if (changedProperties.has('currentContact')) {\n this.chat = this.shadowRoot.querySelector('temba-chat');\n this.reset();\n this.fetchPreviousMessages();\n }\n }\n\n private reset() {\n this.blockFetching = false;\n this.ticket = null;\n this.lastEventTime = null;\n this.newestEventTime = null;\n this.refreshId = null;\n this.polling = false;\n }\n\n public refresh() {\n this.checkForNewMessages();\n }\n\n private handleSend(evt: CustomEvent) {\n const buttonName = evt.detail.name;\n if (buttonName === 'Send') {\n const payload = {\n contact: this.currentContact.uuid\n };\n const compose = evt.currentTarget as Compose;\n if (compose) {\n const text = compose.currentText;\n if (text && text.length > 0) {\n payload['text'] = text;\n }\n const attachments = compose.currentAttachments;\n if (attachments && attachments.length > 0) {\n const attachment_uuids = attachments.map(\n (attachment) => attachment.uuid\n );\n payload['attachments'] = attachment_uuids;\n }\n }\n if (this.currentTicket) {\n payload['ticket'] = this.currentTicket.uuid;\n }\n\n const genericError = buttonName + ' failed, please try again.';\n\n postJSON(`/api/v2/messages.json`, payload)\n .then((response) => {\n if (response.status < 400) {\n this.checkForNewMessages();\n compose.reset();\n this.fireCustomEvent(CustomEventType.MessageSent, { msg: payload });\n } else if (response.status < 500) {\n if (\n response.json.text &&\n response.json.text.length > 0 &&\n response.json.text[0].length > 0\n ) {\n let textError = response.json.text[0];\n textError = textError.replace(\n 'Ensure this field has no more than',\n 'Maximum allowed text is'\n );\n compose.buttonError = textError;\n } else if (\n response.json.attachments &&\n response.json.attachments.length > 0 &&\n response.json.attachments[0].length > 0\n ) {\n let attachmentError = response.json.attachments[0];\n attachmentError = attachmentError\n .replace(\n 'Ensure this field has no more than',\n 'Maximum allowed attachments is'\n )\n .replace('elements', 'files');\n compose.buttonError = attachmentError;\n } else {\n compose.buttonError = genericError;\n }\n } else {\n compose.buttonError = genericError;\n }\n })\n .catch((error) => {\n console.error(error);\n compose.buttonError = genericError;\n });\n }\n }\n\n public render(): TemplateResult {\n const contactHistory = this.currentContact\n ? this.getTembaContactHistory()\n : null;\n const chatbox = this.currentContact ? this.getTembaChatbox() : null;\n\n const contactHistoryAndChatbox = html`\n <div class=\"chat-wrapper\">${contactHistory} ${chatbox}</div>\n `;\n return html`${contactHistoryAndChatbox}`;\n }\n\n private getEndpoint() {\n return `/contact/history/${this.currentContact.uuid}/?_format=json`;\n }\n\n private scheduleRefresh() {\n // knock five seconds off the newest event time so we are\n // a little more aggressive about refreshing short term\n let window = new Date().getTime() - this.newestEventTime / 1000 - 5000;\n\n if (this.refreshId) {\n clearTimeout(this.refreshId);\n this.refreshId = null;\n }\n\n // wait no longer than 15 seconds\n window = Math.min(window, 15000);\n\n // wait at least 2 seconds\n window = Math.max(window, 2000);\n\n this.refreshId = setTimeout(() => {\n this.checkForNewMessages();\n }, window);\n }\n\n public getEventMessage(event: ContactEvent): ChatEvent {\n let message = null;\n switch (event.type) {\n case Events.ERROR:\n case Events.FAILURE:\n message = {\n type: MessageType.Inline,\n text: `Error during flow: ${toTitleCase(\n (event as ErrorMessageEvent).text\n )}`\n };\n break;\n case Events.TICKET_OPENED:\n message = {\n type: MessageType.Inline,\n text: renderTicketAction(event as TicketEvent, 'opened')\n };\n break;\n case Events.TICKET_ASSIGNED:\n message = {\n type: MessageType.Inline,\n text: renderTicketAssigned(event as TicketEvent)\n };\n break;\n case Events.TICKET_REOPENED:\n message = {\n type: MessageType.Inline,\n text: renderTicketAction(event as TicketEvent, 'reopened')\n };\n break;\n case Events.TICKET_CLOSED:\n message = {\n type: MessageType.Inline,\n text: renderTicketAction(event as TicketEvent, 'closed')\n };\n break;\n case Events.FLOW_ENTERED:\n case Events.FLOW_EXITED:\n message = {\n type: MessageType.Inline,\n text: renderFlowEvent(event as FlowEvent)\n };\n break;\n case Events.RUN_RESULT_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderResultEvent(event as UpdateResultEvent)\n };\n break;\n case Events.CONTACT_FIELD_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderUpdateEvent(event as UpdateFieldEvent)\n };\n break;\n case Events.CONTACT_NAME_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderNameChanged(event as NameChangedEvent)\n };\n break;\n case Events.CONTACT_URNS_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderContactURNsChanged(event as URNsChangedEvent)\n };\n break;\n case Events.EMAIL_SENT:\n message = {\n type: MessageType.Inline,\n text: renderEmailSent(event as EmailSentEvent)\n };\n break;\n case Events.INPUT_LABELS_ADDED:\n message = {\n type: MessageType.Inline,\n text: renderLabelsAdded(event as LabelsAddedEvent)\n };\n break;\n case Events.CONTACT_GROUPS_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderContactGroupsEvent(event as ContactGroupsEvent)\n };\n break;\n case Events.WEBHOOK_CALLED:\n message = {\n type: MessageType.Inline,\n text: renderWebhookEvent(event as WebhookEvent)\n };\n break;\n case Events.AIRTIME_TRANSFERRED:\n message = {\n type: MessageType.Inline,\n text: renderAirtimeTransferredEvent(event as AirtimeTransferredEvent)\n };\n break;\n case Events.CALL_STARTED:\n message = {\n type: MessageType.Inline,\n text: renderCallStartedEvent()\n };\n break;\n case Events.CAMPAIGN_FIRED:\n message = {\n type: MessageType.Inline,\n text: renderCampaignFiredEvent(event as CampaignFiredEvent)\n };\n break;\n case Events.CHANNEL_EVENT:\n message = {\n type: MessageType.Inline,\n text: renderChannelEvent(event as ChannelEvent)\n };\n break;\n case Events.CONTACT_LANGUAGE_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderContactLanguageChangedEvent(\n event as ContactLanguageChangedEvent\n )\n };\n break;\n case Events.OPTIN_REQUESTED:\n message = {\n type: MessageType.Inline,\n text: renderOptinRequested(event as OptinRequestedEvent)\n };\n break;\n }\n\n message.date = new Date(event.created_on);\n return message;\n }\n\n private getUserForEvent(event: MsgEvent | TicketEvent) {\n let user = null;\n if (event.created_by) {\n const storeUser = this.store.getUser(event.created_by.email);\n if (storeUser) {\n user = {\n email: event.created_by.email,\n name: [storeUser.first_name, storeUser.last_name].join(' '),\n avatar: storeUser.avatar\n };\n }\n } else if (event.type === 'msg_received') {\n user = {\n name: this.currentContact.name\n };\n }\n return user;\n }\n\n private createMessages(page: ContactHistoryPage): ChatEvent[] {\n let messages = page.events.map((event) => {\n const ts = new Date(event.created_on).getTime() * 1000;\n if (ts > this.newestEventTime) {\n this.newestEventTime = ts;\n }\n\n if (event.type === 'ticket_note_added') {\n const ticketEvent = event as TicketEvent;\n return {\n type: MessageType.Note,\n id: event.created_on + event.type,\n user: this.getUserForEvent(ticketEvent),\n date: new Date(ticketEvent.created_on),\n text: ticketEvent.note\n };\n }\n\n if (event.type === 'msg_created' || event.type === 'msg_received') {\n const msgEvent = event as MsgEvent;\n return {\n type: msgEvent.type === 'msg_created' ? 'msg_out' : 'msg_in',\n id: msgEvent.msg.id + '',\n user: this.getUserForEvent(msgEvent),\n date: new Date(msgEvent.created_on),\n attachments: msgEvent.msg.attachments,\n text: msgEvent.msg.text,\n sendError: msgEvent.status === 'E' || msgEvent.status === 'F',\n popup: html`<div\n style=\"display: flex; flex-direction: row; align-items:center; justify-content: space-between;font-size:0.9em;line-height:1em;min-width:10em\"\n >\n <div style=\"justify-content:left;text-align:left\">\n <temba-date\n value=${msgEvent.created_on}\n display=\"duration\"\n ></temba-date>\n\n ${msgEvent.failed_reason_display\n ? html`\n <div\n style=\"margin-top:0.2em;margin-right: 0.5em;min-width:10em;max-width:15em;color:var(--color-error);font-size:0.9em\"\n >\n ${msgEvent.failed_reason_display}\n </div>\n `\n : null}\n </div>\n ${msgEvent.logs_url\n ? html`<a style=\"margin-left:0.5em\" href=\"${msgEvent.logs_url}\"\n ><temba-icon name=\"log\"></temba-icon\n ></a>`\n : null}\n </div> `\n };\n } else {\n return this.getEventMessage(event);\n }\n });\n\n // remove any messages we don't recognize\n messages = messages.filter((msg) => !!msg);\n return messages as ChatEvent[];\n }\n\n private checkForNewMessages() {\n // we are already working on it\n if (this.polling) {\n return;\n }\n\n const chat = this.chat;\n const contactChat = this;\n if (this.currentContact && this.newestEventTime) {\n this.polling = true;\n const endpoint = this.getEndpoint();\n\n fetchContactHistory(\n false,\n endpoint,\n this.currentTicket?.uuid,\n null,\n this.newestEventTime\n ).then((page: ContactHistoryPage) => {\n this.lastEventTime = page.next_before;\n const messages = this.createMessages(page);\n if (messages.length === 0) {\n contactChat.blockFetching = true;\n }\n messages.reverse();\n chat.addMessages(messages, null, true);\n this.polling = false;\n this.scheduleRefresh();\n });\n }\n }\n\n private fetchPreviousMessages() {\n const chat = this.chat;\n const contactChat = this;\n\n if (!chat || chat.fetching || contactChat.blockFetching) {\n return;\n }\n\n chat.fetching = true;\n if (this.currentContact) {\n const endpoint = this.getEndpoint();\n fetchContactHistory(\n false,\n endpoint,\n this.currentTicket?.uuid,\n this.lastEventTime\n ).then((page: ContactHistoryPage) => {\n this.lastEventTime = page.next_before;\n const messages = this.createMessages(page);\n messages.reverse();\n\n if (messages.length === 0) {\n contactChat.blockFetching = true;\n }\n chat.addMessages(messages);\n this.scheduleRefresh();\n });\n }\n }\n\n private fetchComplete() {\n this.chat.fetching = false;\n }\n\n private getTembaContactHistory(): TemplateResult {\n return html`<temba-chat\n @temba-scroll-threshold=${this.fetchPreviousMessages}\n @temba-fetch-complete=${this.fetchComplete}\n avatar=${this.avatar}\n agent\n ></temba-chat>`;\n }\n\n private getTembaChatbox(): TemplateResult {\n if (this.currentTicket) {\n if (this.currentContact && this.currentContact.status !== 'active') {\n //no chatbox for archived, blocked, or stopped contacts\n return null;\n } else {\n if (!this.currentTicket.closed_on) {\n //chatbox for active contacts with an open ticket\n return this.getChatbox();\n } else {\n return null;\n }\n }\n }\n\n if (this.currentContact && this.currentContact.status !== 'active') {\n //no chatbox for archived, blocked, or stopped contacts\n return null;\n } else {\n //chatbox for active contacts\n return this.getChatbox();\n }\n }\n\n private getChatbox(): TemplateResult {\n return html`<div class=\"border\"></div>\n <div class=\"chatbox\">\n <temba-compose\n chatbox\n attachments\n counter\n button\n autogrow\n @temba-button-clicked=${this.handleSend.bind(this)}\n >\n </temba-compose>\n </div>`;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ContactChat.js","sourceRoot":"","sources":["../../../src/contacts/ContactChat.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-this-alias */\nimport { css, html, PropertyValueMap, TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { Contact, CustomEventType, Ticket } from '../interfaces';\nimport { oxford, oxfordFn, postJSON } from '../utils';\nimport { ContactStoreElement } from './ContactStoreElement';\nimport { Compose } from '../compose/Compose';\nimport { fetchContactHistory, getDisplayName } from './helpers';\nimport {\n AirtimeTransferredEvent,\n CampaignFiredEvent,\n ChannelEvent,\n ContactEvent,\n ContactGroupsEvent,\n ContactHistoryPage,\n ContactLanguageChangedEvent,\n EmailSentEvent,\n ErrorMessageEvent,\n FlowEvent,\n LabelsAddedEvent,\n MsgEvent,\n NameChangedEvent,\n OptinRequestedEvent,\n TicketEvent,\n UpdateFieldEvent,\n UpdateResultEvent,\n URNsChangedEvent,\n WebhookEvent\n} from './events';\nimport { Chat, ChatEvent, MessageType } from '../chat/Chat';\nimport { getUserDisplay } from '../webchat';\nimport { DEFAULT_AVATAR } from '../webchat/assets';\n\nexport enum Events {\n MESSAGE_CREATED = 'msg_created',\n MESSAGE_RECEIVED = 'msg_received',\n BROADCAST_CREATED = 'broadcast_created',\n IVR_CREATED = 'ivr_created',\n FLOW_ENTERED = 'flow_entered',\n\n FLOW_EXITED = 'flow_exited',\n RUN_RESULT_CHANGED = 'run_result_changed',\n CONTACT_FIELD_CHANGED = 'contact_field_changed',\n CONTACT_GROUPS_CHANGED = 'contact_groups_changed',\n CONTACT_NAME_CHANGED = 'contact_name_changed',\n CONTACT_URNS_CHANGED = 'contact_urns_changed',\n CAMPAIGN_FIRED = 'campaign_fired',\n CHANNEL_EVENT = 'channel_event',\n CONTACT_LANGUAGE_CHANGED = 'contact_language_changed',\n WEBHOOK_CALLED = 'webhook_called',\n AIRTIME_TRANSFERRED = 'airtime_transferred',\n CALL_STARTED = 'call_started',\n EMAIL_SENT = 'email_sent',\n INPUT_LABELS_ADDED = 'input_labels_added',\n NOTE_CREATED = 'note_created',\n TICKET_ASSIGNED = 'ticket_assigned',\n TICKET_NOTE_ADDED = 'ticket_note_added',\n TICKET_CLOSED = 'ticket_closed',\n TICKET_OPENED = 'ticket_opened',\n TICKET_REOPENED = 'ticket_reopened',\n OPTIN_REQUESTED = 'optin_requested',\n ERROR = 'error',\n FAILURE = 'failure'\n}\n\nconst renderInfoList = (singular: string, plural: string, items: any[]) => {\n if (items.length === 1) {\n return `${singular} **${items[0].name}**`;\n } else {\n const list = items.map((item) => `**${item.name}**`);\n if (list.length === 2) {\n return `${plural} ${list.join(' and ')}`;\n } else {\n const last = list.pop();\n return `${plural} ${list.join(', ')}, and ${last}`;\n }\n }\n};\n\nconst toTitleCase = (str: string) => {\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\nconst renderChannelEvent = (event: ChannelEvent): string => {\n if (event.event.type === 'mt_miss') {\n return 'Missed outgoing call';\n } else if (event.event.type === 'mo_miss') {\n return 'Missed incoming call';\n } else if (event.event.type === 'new_conversation') {\n return 'Started conversation';\n } else if (event.channel_event_type === 'welcome_message') {\n return 'Welcome Message Sent';\n } else if (event.event.type === 'referral') {\n return 'Referred';\n } else if (event.event.type === 'follow') {\n return 'Followed';\n } else if (event.event.type === 'stop_contact') {\n return 'Stopped';\n } else if (event.event.type === 'mt_call') {\n return 'Outgoing Phone Call';\n } else if (event.event.type == 'mo_call') {\n return 'Incoming Phone call';\n } else if (event.event.type == 'optin') {\n return `Opted in to **${event.event.optin?.name}**`;\n } else if (event.event.type == 'optout') {\n return `Opted out of **${event.event.optin?.name}**`;\n }\n};\n\nconst renderFlowEvent = (event: FlowEvent): string => {\n let verb = 'Interrupted';\n if (event.status !== 'I') {\n if (event.type === Events.FLOW_ENTERED) {\n verb = 'Started';\n } else {\n verb = 'Completed';\n }\n }\n return `${verb} [**${event.flow.name}**](/flow/editor/${event.flow.uuid}/)`;\n};\n\nconst renderResultEvent = (event: UpdateResultEvent): string => {\n if (!event.name.startsWith('_') && event.value) {\n return `Updated flow result **${event.name}** to **${event.value}**`;\n }\n};\n\nconst renderUpdateEvent = (event: UpdateFieldEvent): string => {\n return event.value\n ? `Updated **${event.field.name}** to **${event.value.text}**`\n : `Cleared **${event.field.name}**`;\n};\n\nconst renderNameChanged = (event: NameChangedEvent): string => {\n return `Updated **Contact Name** to **${event.name}**`;\n};\n\nconst renderContactURNsChanged = (event: URNsChangedEvent): string => {\n return `Updated **URNs** to ${oxfordFn(\n event.urns,\n (urn: string) => `**${urn.split(':')[1].split('?')[0]}**`\n )}`;\n};\n\nconst renderEmailSent = (event: EmailSentEvent): string => {\n return `Email sent to **${oxford(event.to, 'and')}** with subject **${\n event.subject\n }**`;\n};\n\nconst renderLabelsAdded = (event: LabelsAddedEvent): string => {\n return `Applied ${renderInfoList('label', 'labels', event.labels)}`;\n};\n\nexport const renderTicketAction = (\n event: TicketEvent,\n action: string\n): string => {\n if (event.created_by) {\n return `**${getUserDisplay(\n event.created_by\n )}** ${action} a **[ticket](/ticket/all/closed/${event.ticket.uuid}/)**`;\n }\n return `A **[ticket](/ticket/all/closed/${event.ticket.uuid}/)** was **${action}**`;\n};\n\nexport const renderTicketAssigned = (event: TicketEvent): string => {\n return event.assignee\n ? event.assignee.id === event.created_by.id\n ? `**${getDisplayName(event.created_by)}** took this ticket`\n : `${getDisplayName(\n event.created_by\n )} assigned this ticket to **${getDisplayName(event.assignee)}**`\n : `**${getDisplayName(event.created_by)}** unassigned this ticket`;\n};\n\nexport const renderContactGroupsEvent = (event: ContactGroupsEvent): string => {\n const groupsEvent = event as ContactGroupsEvent;\n if (groupsEvent.groups_added) {\n return renderInfoList(\n 'Added to group',\n 'Added to groups',\n groupsEvent.groups_added\n );\n } else if (groupsEvent.groups_removed) {\n return renderInfoList(\n 'Removed from group',\n 'Removed from groups',\n groupsEvent.groups_removed\n );\n }\n};\n\nexport const renderCampaignFiredEvent = (event: CampaignFiredEvent): string => {\n return `Campaign ${event.campaign.name}\n ${event.fired_result === 'S' ? 'skipped' : 'triggered'}\n ${event.campaign_event.offset_display}\n ${event.campaign_event.relative_to.name}`;\n};\n\nexport const renderTicketOpened = (event: TicketEvent): string => {\n return `${event.ticket.topic.name} ticket was opened`;\n};\n\nexport const renderErrorMessage = (event: ErrorMessageEvent): string => {\n return `${event.text} ${\n event.type === Events.FAILURE\n ? `Run ended prematurely, check the flow design`\n : null\n }`;\n};\n\nexport const renderWebhookEvent = (event: WebhookEvent): string => {\n return event.status === 'success'\n ? `Successfully called ${event.url}`\n : `Failed to call ${event.url}`;\n};\n\nexport const renderAirtimeTransferredEvent = (\n event: AirtimeTransferredEvent\n): string => {\n if (parseFloat(event.actual_amount) === 0) {\n return `Airtime transfer failed`;\n }\n return `Transferred **${event.actual_amount}** ${event.currency} of airtime`;\n};\n\nexport const renderCallStartedEvent = (): string => {\n return `Call Started`;\n};\n\nexport const renderContactLanguageChangedEvent = (\n event: ContactLanguageChangedEvent\n): string => {\n return `Language updated to **${event.language}**`;\n};\n\nexport const renderOptinRequested = (event: OptinRequestedEvent): string => {\n return `Requested opt-in for ${event.optin.name}`;\n};\n\nexport class ContactChat extends ContactStoreElement {\n public static get styles() {\n return css`\n :host {\n flex-grow: 1;\n display: flex;\n flex-direction: row;\n min-height: 0;\n --compose-shadow: none;\n --compose-border: none;\n --compose-padding: 3px;\n --compose-curvature: none;\n }\n\n .chat-wrapper {\n display: flex;\n flex-grow: 1;\n flex-direction: column;\n min-height: 0;\n }\n\n temba-contact-history {\n border-bottom: 1px solid #f6f6f6;\n flex-grow: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n }\n\n .chatbox {\n background: #fff;\n display: flex;\n flex-direction: column;\n --textarea-min-height: 1em;\n --textarea-height: 1.2em;\n --widget-box-shadow-focused: none;\n }\n\n .chatbox.full {\n border-bottom-right-radius: 0 !important;\n }\n\n .closed-footer {\n padding: 1em;\n background: #f2f2f2;\n border-top: 3px solid #e1e1e1;\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n\n a {\n color: var(--color-link-primary);\n }\n\n a:hover {\n text-decoration: underline;\n color: var(--color-link-primary-hover);\n }\n\n temba-button#reopen-button {\n --button-y: 1px;\n --button-x: 12px;\n }\n\n temba-completion {\n --widget-box-shadow: none;\n --color-widget-border: transparent;\n --widget-box-shadow-focused: none;\n --color-focus: transparent;\n --color-widget-bg-focused: transparent;\n }\n\n .border {\n border-top: 1px solid #f1f1f1;\n margin: 0 1em;\n }\n `;\n }\n\n @property({ type: String, attribute: 'ticket' })\n ticketUUID: string;\n\n @property({ type: String })\n contactsEndpoint = '/api/v2/contacts.json';\n\n @property({ type: String })\n currentNote = '';\n\n @property({ type: Boolean })\n showDetails = true;\n\n @property({ type: Object })\n currentTicket: Ticket = null;\n\n @property({ type: Object })\n currentContact: Contact = null;\n\n @property({ type: String })\n agent = '';\n\n @property({ type: Boolean })\n blockFetching = false;\n\n @property({ type: String })\n avatar = DEFAULT_AVATAR;\n\n // http promise to monitor for completeness\n public httpComplete: Promise<void>;\n private chat: Chat;\n\n ticket = null;\n lastEventTime = null;\n newestEventTime = null;\n refreshId = null;\n polling = false;\n\n constructor() {\n super();\n }\n\n public firstUpdated(\n changed: PropertyValueMap<any> | Map<PropertyKey, unknown>\n ): void {\n super.firstUpdated(changed);\n }\n\n public connectedCallback() {\n super.connectedCallback();\n this.chat = this.shadowRoot.querySelector('temba-chat');\n }\n\n public disconnectedCallback() {\n if (this.refreshId) {\n clearInterval(this.refreshId);\n }\n }\n\n public updated(changedProperties: Map<string, any>) {\n super.updated(changedProperties);\n\n // if we don't have an endpoint infer one\n if (\n changedProperties.has('data') ||\n changedProperties.has('currentContact')\n ) {\n this.currentContact = this.data;\n }\n\n if (changedProperties.has('currentContact')) {\n this.chat = this.shadowRoot.querySelector('temba-chat');\n this.reset();\n this.fetchPreviousMessages();\n }\n }\n\n private reset() {\n if (this.chat) {\n this.chat.reset();\n }\n this.blockFetching = false;\n this.ticket = null;\n this.lastEventTime = null;\n this.newestEventTime = null;\n this.refreshId = null;\n this.polling = false;\n }\n\n public refresh() {\n this.checkForNewMessages();\n }\n\n private handleSend(evt: CustomEvent) {\n const buttonName = evt.detail.name;\n if (buttonName === 'Send') {\n const payload = {\n contact: this.currentContact.uuid\n };\n const compose = evt.currentTarget as Compose;\n if (compose) {\n const text = compose.currentText;\n if (text && text.length > 0) {\n payload['text'] = text;\n }\n const attachments = compose.currentAttachments;\n if (attachments && attachments.length > 0) {\n const attachment_uuids = attachments.map(\n (attachment) => attachment.uuid\n );\n payload['attachments'] = attachment_uuids;\n }\n }\n if (this.currentTicket) {\n payload['ticket'] = this.currentTicket.uuid;\n }\n\n const genericError = buttonName + ' failed, please try again.';\n\n postJSON(`/api/v2/messages.json`, payload)\n .then((response) => {\n if (response.status < 400) {\n this.checkForNewMessages();\n compose.reset();\n this.fireCustomEvent(CustomEventType.MessageSent, { msg: payload });\n } else if (response.status < 500) {\n if (\n response.json.text &&\n response.json.text.length > 0 &&\n response.json.text[0].length > 0\n ) {\n let textError = response.json.text[0];\n textError = textError.replace(\n 'Ensure this field has no more than',\n 'Maximum allowed text is'\n );\n compose.buttonError = textError;\n } else if (\n response.json.attachments &&\n response.json.attachments.length > 0 &&\n response.json.attachments[0].length > 0\n ) {\n let attachmentError = response.json.attachments[0];\n attachmentError = attachmentError\n .replace(\n 'Ensure this field has no more than',\n 'Maximum allowed attachments is'\n )\n .replace('elements', 'files');\n compose.buttonError = attachmentError;\n } else {\n compose.buttonError = genericError;\n }\n } else {\n compose.buttonError = genericError;\n }\n })\n .catch((error) => {\n console.error(error);\n compose.buttonError = genericError;\n });\n }\n }\n\n public render(): TemplateResult {\n const contactHistory = this.currentContact\n ? this.getTembaContactHistory()\n : null;\n const chatbox = this.currentContact ? this.getTembaChatbox() : null;\n\n const contactHistoryAndChatbox = html`\n <div class=\"chat-wrapper\">${contactHistory} ${chatbox}</div>\n `;\n return html`${contactHistoryAndChatbox}`;\n }\n\n private getEndpoint() {\n return `/contact/history/${this.currentContact.uuid}/?_format=json`;\n }\n\n private scheduleRefresh() {\n // knock five seconds off the newest event time so we are\n // a little more aggressive about refreshing short term\n let window = new Date().getTime() - this.newestEventTime / 1000 - 5000;\n\n if (this.refreshId) {\n clearTimeout(this.refreshId);\n this.refreshId = null;\n }\n\n // wait no longer than 15 seconds\n window = Math.min(window, 15000);\n\n // wait at least 2 seconds\n window = Math.max(window, 2000);\n\n this.refreshId = setTimeout(() => {\n this.checkForNewMessages();\n }, window);\n }\n\n public getEventMessage(event: ContactEvent): ChatEvent {\n let message = null;\n switch (event.type) {\n case Events.ERROR:\n case Events.FAILURE:\n message = {\n type: MessageType.Inline,\n text: `Error during flow: ${toTitleCase(\n (event as ErrorMessageEvent).text\n )}`\n };\n break;\n case Events.TICKET_OPENED:\n message = {\n type: MessageType.Inline,\n text: renderTicketAction(event as TicketEvent, 'opened')\n };\n break;\n case Events.TICKET_ASSIGNED:\n message = {\n type: MessageType.Inline,\n text: renderTicketAssigned(event as TicketEvent)\n };\n break;\n case Events.TICKET_REOPENED:\n message = {\n type: MessageType.Inline,\n text: renderTicketAction(event as TicketEvent, 'reopened')\n };\n break;\n case Events.TICKET_CLOSED:\n message = {\n type: MessageType.Inline,\n text: renderTicketAction(event as TicketEvent, 'closed')\n };\n break;\n case Events.FLOW_ENTERED:\n case Events.FLOW_EXITED:\n message = {\n type: MessageType.Inline,\n text: renderFlowEvent(event as FlowEvent)\n };\n break;\n case Events.RUN_RESULT_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderResultEvent(event as UpdateResultEvent)\n };\n break;\n case Events.CONTACT_FIELD_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderUpdateEvent(event as UpdateFieldEvent)\n };\n break;\n case Events.CONTACT_NAME_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderNameChanged(event as NameChangedEvent)\n };\n break;\n case Events.CONTACT_URNS_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderContactURNsChanged(event as URNsChangedEvent)\n };\n break;\n case Events.EMAIL_SENT:\n message = {\n type: MessageType.Inline,\n text: renderEmailSent(event as EmailSentEvent)\n };\n break;\n case Events.INPUT_LABELS_ADDED:\n message = {\n type: MessageType.Inline,\n text: renderLabelsAdded(event as LabelsAddedEvent)\n };\n break;\n case Events.CONTACT_GROUPS_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderContactGroupsEvent(event as ContactGroupsEvent)\n };\n break;\n case Events.WEBHOOK_CALLED:\n message = {\n type: MessageType.Inline,\n text: renderWebhookEvent(event as WebhookEvent)\n };\n break;\n case Events.AIRTIME_TRANSFERRED:\n message = {\n type: MessageType.Inline,\n text: renderAirtimeTransferredEvent(event as AirtimeTransferredEvent)\n };\n break;\n case Events.CALL_STARTED:\n message = {\n type: MessageType.Inline,\n text: renderCallStartedEvent()\n };\n break;\n case Events.CAMPAIGN_FIRED:\n message = {\n type: MessageType.Inline,\n text: renderCampaignFiredEvent(event as CampaignFiredEvent)\n };\n break;\n case Events.CHANNEL_EVENT:\n message = {\n type: MessageType.Inline,\n text: renderChannelEvent(event as ChannelEvent)\n };\n break;\n case Events.CONTACT_LANGUAGE_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderContactLanguageChangedEvent(\n event as ContactLanguageChangedEvent\n )\n };\n break;\n case Events.OPTIN_REQUESTED:\n message = {\n type: MessageType.Inline,\n text: renderOptinRequested(event as OptinRequestedEvent)\n };\n break;\n }\n\n if (message && event.created_on) {\n message.date = new Date(event.created_on);\n } else {\n console.error('Unknown event type', event);\n }\n\n return message;\n }\n\n private getUserForEvent(event: MsgEvent | TicketEvent) {\n let user = null;\n if (event.created_by) {\n const storeUser = this.store.getUser(event.created_by.email);\n if (storeUser) {\n user = {\n email: event.created_by.email,\n name: [storeUser.first_name, storeUser.last_name].join(' '),\n avatar: storeUser.avatar\n };\n }\n } else if (event.type === 'msg_received') {\n user = {\n name: this.currentContact.name\n };\n }\n return user;\n }\n\n private createMessages(page: ContactHistoryPage): ChatEvent[] {\n if (page.events) {\n let messages = page.events.map((event) => {\n const ts = new Date(event.created_on).getTime() * 1000;\n if (ts > this.newestEventTime) {\n this.newestEventTime = ts;\n }\n\n if (event.type === 'ticket_note_added') {\n const ticketEvent = event as TicketEvent;\n return {\n type: MessageType.Note,\n id: event.created_on + event.type,\n user: this.getUserForEvent(ticketEvent),\n date: new Date(ticketEvent.created_on),\n text: ticketEvent.note\n };\n }\n\n if (\n event.type === 'msg_created' ||\n event.type === 'msg_received' ||\n event.type === 'broadcast_created'\n ) {\n const msgEvent = event as MsgEvent;\n return {\n type: msgEvent.type === 'msg_received' ? 'msg_in' : 'msg_out',\n id: msgEvent.msg.id + '',\n user: this.getUserForEvent(msgEvent),\n date: new Date(msgEvent.created_on),\n attachments: msgEvent.msg.attachments,\n text: msgEvent.msg.text,\n sendError: msgEvent.status === 'E' || msgEvent.status === 'F',\n popup: html`<div\n style=\"display: flex; flex-direction: row; align-items:center; justify-content: space-between;font-size:0.9em;line-height:1em;min-width:10em\"\n >\n <div style=\"justify-content:left;text-align:left\">\n <temba-date\n value=${msgEvent.created_on}\n display=\"duration\"\n ></temba-date>\n\n ${msgEvent.optin\n ? html`<div style=\"font-size:0.9em;color:#aaa\">\n ${msgEvent.optin.name}\n </div>`\n : null}\n ${msgEvent.failed_reason_display\n ? html`\n <div\n style=\"margin-top:0.2em;margin-right: 0.5em;min-width:10em;max-width:15em;color:var(--color-error);font-size:0.9em\"\n >\n ${msgEvent.failed_reason_display}\n </div>\n `\n : null}\n </div>\n ${msgEvent.logs_url\n ? html`<a style=\"margin-left:0.5em\" href=\"${msgEvent.logs_url}\"\n ><temba-icon name=\"log\"></temba-icon\n ></a>`\n : null}\n </div> `\n };\n } else {\n return this.getEventMessage(event);\n }\n });\n\n // remove any messages we don't recognize\n messages = messages.filter((msg) => !!msg);\n return messages as ChatEvent[];\n }\n return [];\n }\n\n private checkForNewMessages() {\n // we are already working on it\n if (this.polling) {\n return;\n }\n\n const chat = this.chat;\n const contactChat = this;\n if (this.currentContact && this.newestEventTime) {\n this.polling = true;\n const endpoint = this.getEndpoint();\n\n const fetchContact = this.currentContact.uuid;\n\n fetchContactHistory(\n false,\n endpoint,\n this.currentTicket?.uuid,\n null,\n this.newestEventTime\n ).then((page: ContactHistoryPage) => {\n if (fetchContact === this.currentContact.uuid) {\n this.lastEventTime = page.next_before;\n const messages = this.createMessages(page);\n if (messages.length === 0) {\n contactChat.blockFetching = true;\n }\n messages.reverse();\n chat.addMessages(messages, null, true);\n }\n this.polling = false;\n this.scheduleRefresh();\n });\n }\n }\n\n private fetchPreviousMessages() {\n const chat = this.chat;\n const contactChat = this;\n\n if (!chat || chat.fetching || contactChat.blockFetching) {\n return;\n }\n\n chat.fetching = true;\n if (this.currentContact) {\n const endpoint = this.getEndpoint();\n fetchContactHistory(\n false,\n endpoint,\n this.currentTicket?.uuid,\n this.lastEventTime\n ).then((page: ContactHistoryPage) => {\n this.lastEventTime = page.next_before;\n const messages = this.createMessages(page);\n messages.reverse();\n\n if (messages.length === 0) {\n contactChat.blockFetching = true;\n }\n chat.addMessages(messages);\n this.scheduleRefresh();\n });\n }\n }\n\n private fetchComplete() {\n this.chat.fetching = false;\n }\n\n private getTembaContactHistory(): TemplateResult {\n return html`<temba-chat\n @temba-scroll-threshold=${this.fetchPreviousMessages}\n @temba-fetch-complete=${this.fetchComplete}\n avatar=${this.avatar}\n agent\n ></temba-chat>`;\n }\n\n private getTembaChatbox(): TemplateResult {\n if (this.currentTicket) {\n if (this.currentContact && this.currentContact.status !== 'active') {\n //no chatbox for archived, blocked, or stopped contacts\n return null;\n } else {\n if (!this.currentTicket.closed_on) {\n //chatbox for active contacts with an open ticket\n return this.getChatbox();\n } else {\n return null;\n }\n }\n }\n\n if (this.currentContact && this.currentContact.status !== 'active') {\n //no chatbox for archived, blocked, or stopped contacts\n return null;\n } else {\n //chatbox for active contacts\n return this.getChatbox();\n }\n }\n\n private getChatbox(): TemplateResult {\n return html`<div class=\"border\"></div>\n <div class=\"chatbox\">\n <temba-compose\n chatbox\n attachments\n counter\n button\n autogrow\n @temba-button-clicked=${this.handleSend.bind(this)}\n >\n </temba-compose>\n </div>`;\n }\n}\n"]}
|
package/package.json
CHANGED
package/src/chat/Chat.ts
CHANGED
|
@@ -165,6 +165,10 @@ export class Chat extends RapidElement {
|
|
|
165
165
|
border-bottom-left-radius: 0;
|
|
166
166
|
}
|
|
167
167
|
|
|
168
|
+
.incoming .bubble-wrap {
|
|
169
|
+
align-items: flex-end;
|
|
170
|
+
}
|
|
171
|
+
|
|
168
172
|
.incoming .bubble {
|
|
169
173
|
background: var(--color-chat-out, #3c92dd);
|
|
170
174
|
color: white;
|
|
@@ -179,8 +183,12 @@ export class Chat extends RapidElement {
|
|
|
179
183
|
}
|
|
180
184
|
|
|
181
185
|
.note .bubble {
|
|
182
|
-
background: #
|
|
183
|
-
color: rgba(0, 0, 0, 0.
|
|
186
|
+
background: #fffac3;
|
|
187
|
+
color: rgba(0, 0, 0, 0.7);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
.note .bubble .name {
|
|
191
|
+
color: rgba(0, 0, 0, 0.5);
|
|
184
192
|
}
|
|
185
193
|
|
|
186
194
|
.message {
|
|
@@ -223,7 +231,8 @@ export class Chat extends RapidElement {
|
|
|
223
231
|
bottom: 0;
|
|
224
232
|
right: 0;
|
|
225
233
|
left: 0;
|
|
226
|
-
overflow: auto;
|
|
234
|
+
overflow-y: auto;
|
|
235
|
+
overflow-x: hidden;
|
|
227
236
|
-webkit-overflow-scrolling: touch;
|
|
228
237
|
overflow-scrolling: touch;
|
|
229
238
|
padding: 1em 1em 1em 1em;
|
|
@@ -271,9 +280,9 @@ export class Chat extends RapidElement {
|
|
|
271
280
|
max-width: 70%;
|
|
272
281
|
display: flex;
|
|
273
282
|
flex-direction: column;
|
|
274
|
-
align-items:
|
|
275
|
-
margin: -
|
|
276
|
-
padding:
|
|
283
|
+
align-items: flex-start;
|
|
284
|
+
margin-top: -1em;
|
|
285
|
+
padding-top: 1em;
|
|
277
286
|
}
|
|
278
287
|
|
|
279
288
|
.scroll-at-top.messages:before {
|
|
@@ -412,20 +421,26 @@ export class Chat extends RapidElement {
|
|
|
412
421
|
--thumb-icon: white;
|
|
413
422
|
}
|
|
414
423
|
|
|
424
|
+
.outgoing .popup {
|
|
425
|
+
justify-content: left;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
.incoming .popup {
|
|
429
|
+
justify-content: right;
|
|
430
|
+
}
|
|
431
|
+
|
|
415
432
|
.popup {
|
|
416
|
-
align-self: center;
|
|
417
433
|
display: flex;
|
|
418
434
|
position: absolute;
|
|
419
435
|
background: #fff;
|
|
436
|
+
margin: 0;
|
|
420
437
|
padding: 0.5em 1em;
|
|
421
|
-
justify-content: center;
|
|
422
|
-
text-align: center;
|
|
423
438
|
border-radius: var(--curvature);
|
|
424
439
|
box-shadow: rgba(0, 0, 0, 0.05) 0px 3px 7px 0px,
|
|
425
440
|
rgba(0, 0, 0, 0.2) 0px 1px 2px 0px;
|
|
426
441
|
border: 1px solid #f3f3f3;
|
|
427
442
|
opacity: 0;
|
|
428
|
-
transform: scale(0.
|
|
443
|
+
transform: scale(0.7);
|
|
429
444
|
transition: opacity 0.2s ease-out, transform 0.2s ease-out;
|
|
430
445
|
z-index: 2;
|
|
431
446
|
}
|
|
@@ -443,8 +458,7 @@ export class Chat extends RapidElement {
|
|
|
443
458
|
}
|
|
444
459
|
|
|
445
460
|
.bubble-wrap:hover .popup {
|
|
446
|
-
transform: translateY(-
|
|
447
|
-
margin-top: -0.5em;
|
|
461
|
+
transform: translateY(-120%);
|
|
448
462
|
opacity: 1;
|
|
449
463
|
}
|
|
450
464
|
`;
|
|
@@ -767,6 +781,13 @@ export class Chat extends RapidElement {
|
|
|
767
781
|
`;
|
|
768
782
|
}
|
|
769
783
|
|
|
784
|
+
public reset() {
|
|
785
|
+
this.msgMap.clear();
|
|
786
|
+
this.messageGroups = [];
|
|
787
|
+
this.hideBottomScroll = true;
|
|
788
|
+
this.hideTopScroll = true;
|
|
789
|
+
}
|
|
790
|
+
|
|
770
791
|
public render(): TemplateResult {
|
|
771
792
|
return html` <div
|
|
772
793
|
class="
|
|
@@ -396,6 +396,9 @@ export class ContactChat extends ContactStoreElement {
|
|
|
396
396
|
}
|
|
397
397
|
|
|
398
398
|
private reset() {
|
|
399
|
+
if (this.chat) {
|
|
400
|
+
this.chat.reset();
|
|
401
|
+
}
|
|
399
402
|
this.blockFetching = false;
|
|
400
403
|
this.ticket = null;
|
|
401
404
|
this.lastEventTime = null;
|
|
@@ -647,7 +650,12 @@ export class ContactChat extends ContactStoreElement {
|
|
|
647
650
|
break;
|
|
648
651
|
}
|
|
649
652
|
|
|
650
|
-
message
|
|
653
|
+
if (message && event.created_on) {
|
|
654
|
+
message.date = new Date(event.created_on);
|
|
655
|
+
} else {
|
|
656
|
+
console.error('Unknown event type', event);
|
|
657
|
+
}
|
|
658
|
+
|
|
651
659
|
return message;
|
|
652
660
|
}
|
|
653
661
|
|
|
@@ -671,67 +679,79 @@ export class ContactChat extends ContactStoreElement {
|
|
|
671
679
|
}
|
|
672
680
|
|
|
673
681
|
private createMessages(page: ContactHistoryPage): ChatEvent[] {
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
this.newestEventTime
|
|
678
|
-
|
|
682
|
+
if (page.events) {
|
|
683
|
+
let messages = page.events.map((event) => {
|
|
684
|
+
const ts = new Date(event.created_on).getTime() * 1000;
|
|
685
|
+
if (ts > this.newestEventTime) {
|
|
686
|
+
this.newestEventTime = ts;
|
|
687
|
+
}
|
|
679
688
|
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
689
|
+
if (event.type === 'ticket_note_added') {
|
|
690
|
+
const ticketEvent = event as TicketEvent;
|
|
691
|
+
return {
|
|
692
|
+
type: MessageType.Note,
|
|
693
|
+
id: event.created_on + event.type,
|
|
694
|
+
user: this.getUserForEvent(ticketEvent),
|
|
695
|
+
date: new Date(ticketEvent.created_on),
|
|
696
|
+
text: ticketEvent.note
|
|
697
|
+
};
|
|
698
|
+
}
|
|
690
699
|
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
700
|
+
if (
|
|
701
|
+
event.type === 'msg_created' ||
|
|
702
|
+
event.type === 'msg_received' ||
|
|
703
|
+
event.type === 'broadcast_created'
|
|
704
|
+
) {
|
|
705
|
+
const msgEvent = event as MsgEvent;
|
|
706
|
+
return {
|
|
707
|
+
type: msgEvent.type === 'msg_received' ? 'msg_in' : 'msg_out',
|
|
708
|
+
id: msgEvent.msg.id + '',
|
|
709
|
+
user: this.getUserForEvent(msgEvent),
|
|
710
|
+
date: new Date(msgEvent.created_on),
|
|
711
|
+
attachments: msgEvent.msg.attachments,
|
|
712
|
+
text: msgEvent.msg.text,
|
|
713
|
+
sendError: msgEvent.status === 'E' || msgEvent.status === 'F',
|
|
714
|
+
popup: html`<div
|
|
715
|
+
style="display: flex; flex-direction: row; align-items:center; justify-content: space-between;font-size:0.9em;line-height:1em;min-width:10em"
|
|
716
|
+
>
|
|
717
|
+
<div style="justify-content:left;text-align:left">
|
|
718
|
+
<temba-date
|
|
719
|
+
value=${msgEvent.created_on}
|
|
720
|
+
display="duration"
|
|
721
|
+
></temba-date>
|
|
722
|
+
|
|
723
|
+
${msgEvent.optin
|
|
724
|
+
? html`<div style="font-size:0.9em;color:#aaa">
|
|
725
|
+
${msgEvent.optin.name}
|
|
726
|
+
</div>`
|
|
727
|
+
: null}
|
|
728
|
+
${msgEvent.failed_reason_display
|
|
729
|
+
? html`
|
|
730
|
+
<div
|
|
731
|
+
style="margin-top:0.2em;margin-right: 0.5em;min-width:10em;max-width:15em;color:var(--color-error);font-size:0.9em"
|
|
732
|
+
>
|
|
733
|
+
${msgEvent.failed_reason_display}
|
|
734
|
+
</div>
|
|
735
|
+
`
|
|
736
|
+
: null}
|
|
737
|
+
</div>
|
|
738
|
+
${msgEvent.logs_url
|
|
739
|
+
? html`<a style="margin-left:0.5em" href="${msgEvent.logs_url}"
|
|
740
|
+
><temba-icon name="log"></temba-icon
|
|
741
|
+
></a>`
|
|
718
742
|
: null}
|
|
719
|
-
</div>
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
</div> `
|
|
726
|
-
};
|
|
727
|
-
} else {
|
|
728
|
-
return this.getEventMessage(event);
|
|
729
|
-
}
|
|
730
|
-
});
|
|
743
|
+
</div> `
|
|
744
|
+
};
|
|
745
|
+
} else {
|
|
746
|
+
return this.getEventMessage(event);
|
|
747
|
+
}
|
|
748
|
+
});
|
|
731
749
|
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
750
|
+
// remove any messages we don't recognize
|
|
751
|
+
messages = messages.filter((msg) => !!msg);
|
|
752
|
+
return messages as ChatEvent[];
|
|
753
|
+
}
|
|
754
|
+
return [];
|
|
735
755
|
}
|
|
736
756
|
|
|
737
757
|
private checkForNewMessages() {
|
|
@@ -746,6 +766,8 @@ export class ContactChat extends ContactStoreElement {
|
|
|
746
766
|
this.polling = true;
|
|
747
767
|
const endpoint = this.getEndpoint();
|
|
748
768
|
|
|
769
|
+
const fetchContact = this.currentContact.uuid;
|
|
770
|
+
|
|
749
771
|
fetchContactHistory(
|
|
750
772
|
false,
|
|
751
773
|
endpoint,
|
|
@@ -753,13 +775,15 @@ export class ContactChat extends ContactStoreElement {
|
|
|
753
775
|
null,
|
|
754
776
|
this.newestEventTime
|
|
755
777
|
).then((page: ContactHistoryPage) => {
|
|
756
|
-
this.
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
778
|
+
if (fetchContact === this.currentContact.uuid) {
|
|
779
|
+
this.lastEventTime = page.next_before;
|
|
780
|
+
const messages = this.createMessages(page);
|
|
781
|
+
if (messages.length === 0) {
|
|
782
|
+
contactChat.blockFetching = true;
|
|
783
|
+
}
|
|
784
|
+
messages.reverse();
|
|
785
|
+
chat.addMessages(messages, null, true);
|
|
760
786
|
}
|
|
761
|
-
messages.reverse();
|
|
762
|
-
chat.addMessages(messages, null, true);
|
|
763
787
|
this.polling = false;
|
|
764
788
|
this.scheduleRefresh();
|
|
765
789
|
});
|