@nyaruka/temba-components 0.103.0 → 0.104.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/CHANGELOG.md +6 -0
- package/dist/temba-components.js +47 -47
- package/dist/temba-components.js.map +1 -1
- package/out-tsc/src/contacts/ContactChat.js +21 -7
- package/out-tsc/src/contacts/ContactChat.js.map +1 -1
- package/out-tsc/src/contacts/events.js.map +1 -1
- package/package.json +1 -1
- package/src/contacts/ContactChat.ts +20 -8
- package/src/contacts/events.ts +0 -1
|
@@ -569,26 +569,40 @@ export class ContactChat extends ContactStoreElement {
|
|
|
569
569
|
}
|
|
570
570
|
createMessages(page) {
|
|
571
571
|
if (page.events) {
|
|
572
|
-
let messages =
|
|
572
|
+
let messages = [];
|
|
573
|
+
page.events.forEach((event) => {
|
|
573
574
|
const ts = new Date(event.created_on).getTime() * 1000;
|
|
574
575
|
if (ts > this.newestEventTime) {
|
|
575
576
|
this.newestEventTime = ts;
|
|
576
577
|
}
|
|
577
578
|
if (event.type === 'ticket_note_added') {
|
|
578
579
|
const ticketEvent = event;
|
|
579
|
-
|
|
580
|
+
messages.push({
|
|
580
581
|
type: MessageType.Note,
|
|
581
582
|
id: event.created_on + event.type,
|
|
582
583
|
user: this.getUserForEvent(ticketEvent),
|
|
583
584
|
date: new Date(ticketEvent.created_on),
|
|
584
585
|
text: ticketEvent.note
|
|
585
|
-
};
|
|
586
|
+
});
|
|
586
587
|
}
|
|
587
|
-
if (event.type === '
|
|
588
|
+
else if (event.type === 'ticket_opened') {
|
|
589
|
+
// ticket open events can have a note attached
|
|
590
|
+
const ticketEvent = event;
|
|
591
|
+
messages.push({
|
|
592
|
+
type: MessageType.Note,
|
|
593
|
+
id: event.created_on + event.type + '_note',
|
|
594
|
+
user: this.getUserForEvent(ticketEvent),
|
|
595
|
+
date: new Date(ticketEvent.created_on),
|
|
596
|
+
text: ticketEvent.note
|
|
597
|
+
});
|
|
598
|
+
// but the opening of the ticket is a normal event
|
|
599
|
+
messages.push(this.getEventMessage(event));
|
|
600
|
+
}
|
|
601
|
+
else if (event.type === 'msg_created' ||
|
|
588
602
|
event.type === 'msg_received' ||
|
|
589
603
|
event.type === 'broadcast_created') {
|
|
590
604
|
const msgEvent = event;
|
|
591
|
-
|
|
605
|
+
messages.push({
|
|
592
606
|
type: msgEvent.type === 'msg_received' ? 'msg_in' : 'msg_out',
|
|
593
607
|
id: msgEvent.msg.id + '',
|
|
594
608
|
user: this.getUserForEvent(msgEvent),
|
|
@@ -626,10 +640,10 @@ export class ContactChat extends ContactStoreElement {
|
|
|
626
640
|
></a>`
|
|
627
641
|
: null}
|
|
628
642
|
</div> `
|
|
629
|
-
};
|
|
643
|
+
});
|
|
630
644
|
}
|
|
631
645
|
else {
|
|
632
|
-
|
|
646
|
+
messages.push(this.getEventMessage(event));
|
|
633
647
|
}
|
|
634
648
|
});
|
|
635
649
|
// remove any messages we don't recognize
|
|
@@ -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 TICKET_TOPIC_CHANGED = 'ticket_topic_changed',\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.contact}/?_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.TICKET_TOPIC_CHANGED:\n message = {\n type: MessageType.Inline,\n text: `Topic changed to **${(event as TicketEvent).topic.name}**`\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 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 TICKET_TOPIC_CHANGED = 'ticket_topic_changed',\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.contact}/?_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.TICKET_TOPIC_CHANGED:\n message = {\n type: MessageType.Inline,\n text: `Topic changed to **${(event as TicketEvent).topic.name}**`\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 = [];\n page.events.forEach((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 messages.push({\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 } else if (event.type === 'ticket_opened') {\n // ticket open events can have a note attached\n const ticketEvent = event as TicketEvent;\n messages.push({\n type: MessageType.Note,\n id: event.created_on + event.type + '_note',\n user: this.getUserForEvent(ticketEvent),\n date: new Date(ticketEvent.created_on),\n text: ticketEvent.note\n });\n\n // but the opening of the ticket is a normal event\n messages.push(this.getEventMessage(event));\n } else if (\n event.type === 'msg_created' ||\n event.type === 'msg_received' ||\n event.type === 'broadcast_created'\n ) {\n const msgEvent = event as MsgEvent;\n messages.push({\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 messages.push(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 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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/contacts/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAkB,MAAM,KAAK,CAAC;AAE3C,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/contacts/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAkB,MAAM,KAAK,CAAC;AAE3C,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAmJrC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,UAAkB,EAAkB,EAAE;IACrE,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACvC,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAE/C,IAAI,KAAK,GAAG,IAAI,CAAC;IACjB,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QAC1B,KAAK,GAAG,IAAI,CAAA;kBACE,GAAG;KAChB,CAAC;IACJ,CAAC;SAAM,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QACzB,OAAO,IAAI,CAAA;;mBAEI,GAAG,8GAA8G,CAAC;IACnI,CAAC;SAAM,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,IAAI,CAAA;;;;;qBAKM,GAAG;cACV,CAAC;IACb,CAAC;SAAM,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,IAAI,CAAA;;aAEF,GAAG;cACF,OAAO;;;4BAGO,GAAG,KAAK,GAAG;aAC1B,CAAC;IACZ,CAAC;SAAM,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,GAAG,GAAG,GAAG,GAAG,YAAY,IAAI,QAAQ,CAAC;QAE3C,OAAO,IAAI,CAAA;;;;;;;;kEAQmD,SAAS;YACrE,KAAK,YAAY,QAAQ,GAAG,KAAK,MAAM,SAAS;YAChD,KAAK,YAAY,QAAQ;YACzB,KAAK,sCAAsC,GAAG;eACrC,CAAC;IACd,CAAC;SAAM,CAAC;QACN,OAAO,IAAI,CAAA;0BACW,IAAI,CAAC,QAAQ;wBACf,GAAG;WAChB,CAAC;IACV,CAAC;IAED,OAAO,IAAI,CAAA,iBAAiB,KAAK,QAAQ,CAAC;AAC5C,CAAC,CAAC","sourcesContent":["import { html, TemplateResult } from 'lit';\nimport { Msg, ObjectReference, User } from '../interfaces';\nimport { Icon } from '../vectoricon';\n\nexport interface EventGroup {\n type: string;\n events: ContactEvent[];\n open: boolean;\n}\n\nexport interface ContactEvent {\n type: string;\n created_on: string;\n}\n\nexport interface ChannelEvent extends ContactEvent {\n channel_event_type: string;\n duration: number;\n\n event: {\n type: string;\n channel: { uuid: string; name: string };\n duration?: number;\n optin?: {\n uuid: string;\n name: string;\n };\n };\n}\n\nexport interface ContactLanguageChangedEvent extends ContactEvent {\n language: string;\n step_uuid: string;\n session_uuid: string;\n}\n\nexport interface OptinRequestedEvent extends ContactEvent {\n optin: {\n uuid: string;\n name: string;\n };\n}\n\nexport interface MsgEvent extends ContactEvent {\n msg: Msg;\n status: string;\n failed_reason?: string;\n failed_reason_display?: string;\n logs_url: string;\n msg_type: string;\n recipient_count?: number;\n created_by?: User;\n optin?: ObjectReference;\n}\n\nexport interface FlowEvent extends ContactEvent {\n flow: ObjectReference;\n status: string;\n}\n\nexport interface EmailSentEvent extends ContactEvent {\n to: string[];\n subject: string;\n body: string;\n}\n\nexport interface URNsChangedEvent extends ContactEvent {\n urns: string[];\n}\n\nexport interface TicketEvent extends ContactEvent {\n note?: string;\n assignee?: User;\n ticket: {\n uuid: string;\n topic?: ObjectReference;\n closed_on?: string;\n opened_on?: string;\n };\n topic?: ObjectReference;\n created_by?: User;\n}\n\nexport interface LabelsAddedEvent extends ContactEvent {\n labels: ObjectReference[];\n}\n\nexport interface NameChangedEvent extends ContactEvent {\n name: string;\n}\n\nexport interface UpdateFieldEvent extends ContactEvent {\n field: { key: string; name: string };\n value: { text: string };\n}\n\nexport interface ErrorMessageEvent extends ContactEvent {\n text: string;\n}\n\nexport interface UpdateResultEvent extends ContactEvent {\n name: string;\n value: string;\n category: string;\n input: string;\n}\n\nexport interface ContactGroupsEvent extends ContactEvent {\n groups_added: ObjectReference[];\n groups_removed: ObjectReference[];\n}\n\nexport interface WebhookEvent extends ContactEvent {\n status: string;\n status_code: number;\n elapsed_ms: number;\n logs_url: string;\n url: string;\n}\n\nexport interface AirtimeTransferredEvent extends ContactEvent {\n sender: string;\n recipient: string;\n currency: string;\n desired_amount: string;\n actual_amount: string;\n logs_url: string;\n}\n\nexport type CallStartedEvent = ContactEvent;\nexport interface CampaignFiredEvent extends ContactEvent {\n campaign: { uuid: string; id: number; name: string };\n campaign_event: {\n id: number;\n offset_display: string;\n relative_to: { key: string; name: string };\n };\n fired_result: string;\n}\n\nexport interface ContactHistoryPage {\n has_older: boolean;\n recent_only: boolean;\n next_before: number;\n next_after: number;\n start_date: Date;\n events: ContactEvent[];\n}\n\nexport const renderAttachment = (attachment: string): TemplateResult => {\n const idx = attachment.indexOf(':');\n const attType = attachment.substr(0, idx);\n const url = attachment.substr(idx + 1);\n const [mediaType, ext] = attType.split('/', 2);\n\n let inner = null;\n if (mediaType === 'image') {\n inner = html`\n <img src=\"${url}\" style=\"height:auto;width:100%;display:block;\" />\n `;\n } else if (ext === 'pdf') {\n return html`<div\n style=\"width:100%;height:300px;border-radius:calc(var(--curvature) * 2.5);box-shadow:0px 0px 12px 0px rgba(0,0,0,.1), 0px 0px 2px 0px rgba(0,0,0,.15);overflow:hidden\"\n ><embed src=\"${url}#view=Fit\" type=\"application/pdf\" frameBorder=\"0\" scrolling=\"auto\" height=\"100%\" width=\"100%\"></embed></div>`;\n } else if (mediaType === 'video') {\n return html`<video\n style=\"border-radius:var(--curvature);box-shadow:0px 0px 12px 0px rgba(0,0,0,.1), 0px 0px 2px 0px rgba(0,0,0,.15);max-width:400px\"\n height=\"auto\"\n controls\n >\n <source src=\"${url}\" type=\"video/mp4\" />\n </video> `;\n } else if (mediaType === 'audio') {\n return html`<audio\n style=\"border-radius: 99px; box-shadow:0px 0px 12px 0px rgba(0,0,0,.1), 0px 0px 2px 0px rgba(0,0,0,.15);\"\n src=\"${url}\"\n type=\"${attType}\"\n controls\n >\n <a target=\"_\" href=\"${url}\">${url}</a>\n </audio>`;\n } else if (attType === 'geo') {\n const [lat, long] = url.split(',');\n const latFloat = parseFloat(lat);\n const longFloat = parseFloat(long);\n const geo = `${lat}000000%2C${long}000000`;\n\n return html` <iframe\n style=\"border-radius: var(--curvature);box-shadow:0px 0px 12px 0px rgba(0,0,0,.1), 0px 0px 2px 0px rgba(0,0,0,.15);\"\n width=\"300\"\n height=\"300\"\n frameborder=\"0\"\n scrolling=\"no\"\n marginheight=\"0\"\n marginwidth=\"0\"\n src=\"https://www.openstreetmap.org/export/embed.html?bbox=${longFloat -\n 0.005}000000%2C${latFloat - 0.005}%2C${longFloat +\n 0.005}000000%2C${latFloat +\n 0.005}000000&layer=mapnik&marker=${geo}\"\n ></iframe>`;\n } else {\n return html`<div style=\"display:flex\">\n <temba-icon name=\"${Icon.download}\"></temba-icon>\n <div>Attachment ${ext}</div>\n </div>`;\n }\n\n return html`<div style=\"\">${inner}</div>`;\n};\n"]}
|
package/package.json
CHANGED
|
@@ -687,7 +687,8 @@ export class ContactChat extends ContactStoreElement {
|
|
|
687
687
|
|
|
688
688
|
private createMessages(page: ContactHistoryPage): ChatEvent[] {
|
|
689
689
|
if (page.events) {
|
|
690
|
-
let messages =
|
|
690
|
+
let messages = [];
|
|
691
|
+
page.events.forEach((event) => {
|
|
691
692
|
const ts = new Date(event.created_on).getTime() * 1000;
|
|
692
693
|
if (ts > this.newestEventTime) {
|
|
693
694
|
this.newestEventTime = ts;
|
|
@@ -695,22 +696,33 @@ export class ContactChat extends ContactStoreElement {
|
|
|
695
696
|
|
|
696
697
|
if (event.type === 'ticket_note_added') {
|
|
697
698
|
const ticketEvent = event as TicketEvent;
|
|
698
|
-
|
|
699
|
+
messages.push({
|
|
699
700
|
type: MessageType.Note,
|
|
700
701
|
id: event.created_on + event.type,
|
|
701
702
|
user: this.getUserForEvent(ticketEvent),
|
|
702
703
|
date: new Date(ticketEvent.created_on),
|
|
703
704
|
text: ticketEvent.note
|
|
704
|
-
};
|
|
705
|
-
}
|
|
705
|
+
});
|
|
706
|
+
} else if (event.type === 'ticket_opened') {
|
|
707
|
+
// ticket open events can have a note attached
|
|
708
|
+
const ticketEvent = event as TicketEvent;
|
|
709
|
+
messages.push({
|
|
710
|
+
type: MessageType.Note,
|
|
711
|
+
id: event.created_on + event.type + '_note',
|
|
712
|
+
user: this.getUserForEvent(ticketEvent),
|
|
713
|
+
date: new Date(ticketEvent.created_on),
|
|
714
|
+
text: ticketEvent.note
|
|
715
|
+
});
|
|
706
716
|
|
|
707
|
-
|
|
717
|
+
// but the opening of the ticket is a normal event
|
|
718
|
+
messages.push(this.getEventMessage(event));
|
|
719
|
+
} else if (
|
|
708
720
|
event.type === 'msg_created' ||
|
|
709
721
|
event.type === 'msg_received' ||
|
|
710
722
|
event.type === 'broadcast_created'
|
|
711
723
|
) {
|
|
712
724
|
const msgEvent = event as MsgEvent;
|
|
713
|
-
|
|
725
|
+
messages.push({
|
|
714
726
|
type: msgEvent.type === 'msg_received' ? 'msg_in' : 'msg_out',
|
|
715
727
|
id: msgEvent.msg.id + '',
|
|
716
728
|
user: this.getUserForEvent(msgEvent),
|
|
@@ -748,9 +760,9 @@ export class ContactChat extends ContactStoreElement {
|
|
|
748
760
|
></a>`
|
|
749
761
|
: null}
|
|
750
762
|
</div> `
|
|
751
|
-
};
|
|
763
|
+
});
|
|
752
764
|
} else {
|
|
753
|
-
|
|
765
|
+
messages.push(this.getEventMessage(event));
|
|
754
766
|
}
|
|
755
767
|
});
|
|
756
768
|
|