@nyaruka/temba-components 0.104.1 → 0.105.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.
@@ -0,0 +1,136 @@
1
+ import { __decorate } from "tslib";
2
+ import { css, html } from 'lit';
3
+ import { property } from 'lit/decorators.js';
4
+ import { ResizeElement } from '../ResizeElement';
5
+ import { fetchResults } from '../utils';
6
+ const MIN_BACKLOG = 500000;
7
+ export class OutboxMonitor extends ResizeElement {
8
+ constructor() {
9
+ super(...arguments);
10
+ this.backlogSize = 0;
11
+ this.endpoint = '/msg/menu/';
12
+ this.folders = {};
13
+ this.fetches = 0;
14
+ this.msgsPerSecond = 0;
15
+ }
16
+ static get styles() {
17
+ return css `
18
+ .monitor {
19
+ margin: 1rem;
20
+ margin-bottom: -0.5rem;
21
+ }
22
+
23
+ .header {
24
+ font-weight: bold;
25
+ }
26
+
27
+ .estimate {
28
+ font-size: 0.9em;
29
+ }
30
+ `;
31
+ }
32
+ fetchFolders() {
33
+ fetchResults(this.endpoint).then((items) => {
34
+ items
35
+ .filter((item) => item.id === 'outbox' || item.id === 'sent' || item.id === 'failed')
36
+ .forEach((item) => {
37
+ if (this.folders[item.id]) {
38
+ this.folders[item.id].current = item.count;
39
+ }
40
+ else {
41
+ this.folders[item.id] = {
42
+ start: item.count,
43
+ current: item.count
44
+ };
45
+ }
46
+ });
47
+ if (this.firstFetch) {
48
+ this.lastFetch = new Date();
49
+ }
50
+ else {
51
+ this.firstFetch = new Date();
52
+ }
53
+ this.fetches++;
54
+ this.scheduleRefresh(Math.min(this.fetches * 5000, 60000));
55
+ const outbox = this.folders['outbox'];
56
+ this.backlogSize = outbox.current;
57
+ if (outbox.current > 1) {
58
+ this.estimateCompletion();
59
+ }
60
+ });
61
+ }
62
+ estimateCompletion() {
63
+ if (this.lastFetch) {
64
+ const time = (this.lastFetch.getTime() - this.firstFetch.getTime()) / 1000;
65
+ const sent = this.folders['sent'];
66
+ const failed = this.folders['failed'];
67
+ const totalCompleted = sent.current + failed.current;
68
+ const startCount = sent.start + failed.start;
69
+ const sentInWindow = totalCompleted - startCount;
70
+ this.msgsPerSecond = sentInWindow / time;
71
+ const remaining = this.folders['outbox'].current;
72
+ const secondsRemaining = remaining / this.msgsPerSecond;
73
+ this.estimatedCompletionDate = new Date(new Date().getTime() + secondsRemaining * 1000);
74
+ }
75
+ }
76
+ scheduleRefresh(time) {
77
+ setTimeout(() => {
78
+ this.fetchFolders();
79
+ }, time);
80
+ }
81
+ firstUpdated(changes) {
82
+ if (changes.has('endpoint') && this.endpoint) {
83
+ this.fetchFolders();
84
+ }
85
+ }
86
+ hasBacklog() {
87
+ return this.backlogSize > MIN_BACKLOG;
88
+ }
89
+ render() {
90
+ const roundedRate = Math.round(this.msgsPerSecond);
91
+ if (this.hasBacklog() && this.estimatedCompletionDate && !this.isMobile()) {
92
+ return html `<div class="monitor">
93
+ <temba-alert
94
+ ><div class="header">Outbox Notice</div>
95
+ <div class="estimate">
96
+ If your outbox becomes too full, you won't be able to send new flows
97
+ or broadcasts. Your channels are currently sending at
98
+ ${roundedRate.toLocaleString()}
99
+ message${roundedRate == 1 ? '' : 's'} per second. At that rate, your
100
+ outbox will clear
101
+ <temba-date
102
+ value="${this.estimatedCompletionDate.toISOString()}"
103
+ display="duration"
104
+ ></temba-date
105
+ >.
106
+ </div></temba-alert
107
+ >
108
+ </div>`;
109
+ }
110
+ else {
111
+ return null;
112
+ }
113
+ }
114
+ }
115
+ __decorate([
116
+ property({ type: Number })
117
+ ], OutboxMonitor.prototype, "backlogSize", void 0);
118
+ __decorate([
119
+ property({ type: String })
120
+ ], OutboxMonitor.prototype, "endpoint", void 0);
121
+ __decorate([
122
+ property({ type: Object })
123
+ ], OutboxMonitor.prototype, "firstFetch", void 0);
124
+ __decorate([
125
+ property({ type: Object })
126
+ ], OutboxMonitor.prototype, "lastFetch", void 0);
127
+ __decorate([
128
+ property({ type: Number })
129
+ ], OutboxMonitor.prototype, "fetches", void 0);
130
+ __decorate([
131
+ property({ type: Number })
132
+ ], OutboxMonitor.prototype, "msgsPerSecond", void 0);
133
+ __decorate([
134
+ property({ type: Object })
135
+ ], OutboxMonitor.prototype, "estimatedCompletionDate", void 0);
136
+ //# sourceMappingURL=OutboxMonitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OutboxMonitor.js","sourceRoot":"","sources":["../../../src/outboxmonitor/OutboxMonitor.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, PropertyValueMap } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { ResizeElement } from '../ResizeElement';\nimport { fetchResults } from '../utils';\n\nconst MIN_BACKLOG = 500000;\nexport class OutboxMonitor extends ResizeElement {\n @property({ type: Number })\n backlogSize = 0;\n\n @property({ type: String })\n endpoint = '/msg/menu/';\n\n folders: { [id: string]: { start: number; current: number } } = {};\n\n @property({ type: Object })\n firstFetch: Date;\n\n @property({ type: Object })\n lastFetch: Date;\n\n @property({ type: Number })\n fetches = 0;\n\n @property({ type: Number })\n msgsPerSecond = 0;\n\n @property({ type: Object })\n estimatedCompletionDate: Date;\n\n public static get styles() {\n return css`\n .monitor {\n margin: 1rem;\n margin-bottom: -0.5rem;\n }\n\n .header {\n font-weight: bold;\n }\n\n .estimate {\n font-size: 0.9em;\n }\n `;\n }\n\n private fetchFolders() {\n fetchResults(this.endpoint).then((items) => {\n items\n .filter(\n (item) =>\n item.id === 'outbox' || item.id === 'sent' || item.id === 'failed'\n )\n .forEach((item) => {\n if (this.folders[item.id]) {\n this.folders[item.id].current = item.count;\n } else {\n this.folders[item.id] = {\n start: item.count,\n current: item.count\n };\n }\n });\n\n if (this.firstFetch) {\n this.lastFetch = new Date();\n } else {\n this.firstFetch = new Date();\n }\n this.fetches++;\n\n this.scheduleRefresh(Math.min(this.fetches * 5000, 60000));\n\n const outbox = this.folders['outbox'];\n\n this.backlogSize = outbox.current;\n if (outbox.current > 1) {\n this.estimateCompletion();\n }\n });\n }\n\n private estimateCompletion() {\n if (this.lastFetch) {\n const time =\n (this.lastFetch.getTime() - this.firstFetch.getTime()) / 1000;\n const sent = this.folders['sent'];\n const failed = this.folders['failed'];\n\n const totalCompleted = sent.current + failed.current;\n const startCount = sent.start + failed.start;\n\n const sentInWindow = totalCompleted - startCount;\n this.msgsPerSecond = sentInWindow / time;\n\n const remaining = this.folders['outbox'].current;\n const secondsRemaining = remaining / this.msgsPerSecond;\n\n this.estimatedCompletionDate = new Date(\n new Date().getTime() + secondsRemaining * 1000\n );\n }\n }\n\n private scheduleRefresh(time: number) {\n setTimeout(() => {\n this.fetchFolders();\n }, time);\n }\n\n protected firstUpdated(\n changes: PropertyValueMap<any> | Map<PropertyKey, unknown>\n ): void {\n if (changes.has('endpoint') && this.endpoint) {\n this.fetchFolders();\n }\n }\n\n public hasBacklog() {\n return this.backlogSize > MIN_BACKLOG;\n }\n\n public render() {\n const roundedRate = Math.round(this.msgsPerSecond);\n if (this.hasBacklog() && this.estimatedCompletionDate && !this.isMobile()) {\n return html`<div class=\"monitor\">\n <temba-alert\n ><div class=\"header\">Outbox Notice</div>\n <div class=\"estimate\">\n If your outbox becomes too full, you won't be able to send new flows\n or broadcasts. Your channels are currently sending at\n ${roundedRate.toLocaleString()}\n message${roundedRate == 1 ? '' : 's'} per second. At that rate, your\n outbox will clear\n <temba-date\n value=\"${this.estimatedCompletionDate.toISOString()}\"\n display=\"duration\"\n ></temba-date\n >.\n </div></temba-alert\n >\n </div>`;\n } else {\n return null;\n }\n }\n}\n"]}
@@ -57,6 +57,7 @@ import { Toast } from './src/toast/Toast';
57
57
  import { Chat } from './src/chat/Chat';
58
58
  import { MediaPicker } from './src/mediapicker/MediaPicker';
59
59
  import { ContactNotepad } from './src/contacts/ContactNotepad';
60
+ import { OutboxMonitor } from './src/outboxmonitor/OutboxMonitor';
60
61
  export function addCustomElement(name, comp) {
61
62
  if (!window.customElements.get(name)) {
62
63
  window.customElements.define(name, comp);
@@ -122,4 +123,5 @@ addCustomElement('temba-toast', Toast);
122
123
  addCustomElement('temba-chat', Chat);
123
124
  addCustomElement('temba-media-picker', MediaPicker);
124
125
  addCustomElement('temba-contact-notepad', ContactNotepad);
126
+ addCustomElement('temba-outbox-monitor', OutboxMonitor);
125
127
  //# sourceMappingURL=temba-modules.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"temba-modules.js","sourceRoot":"","sources":["../temba-modules.ts"],"names":[],"mappings":"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","sourcesContent":["import { Checkbox } from './src/checkbox/Checkbox';\nimport { TextInput } from './src/textinput/TextInput';\nimport { Store } from './src/store/Store';\nimport { Select } from './src/select/Select';\nimport { Completion } from './src/completion/Completion';\nimport { Modax } from './src/dialog/Modax';\nimport { Dialog } from './src/dialog/Dialog';\nimport { Button } from './src/button/Button';\nimport { FormField } from './src/formfield/FormField';\nimport { Loading } from './src/loading/Loading';\nimport { CharCount } from './src/charcount/CharCount';\nimport { Options } from './src/options/Options';\nimport { ContactChat } from './src/contacts/ContactChat';\nimport { TicketList } from './src/list/TicketList';\nimport { ContactDetails } from './src/contacts/ContactDetails';\nimport { TembaList } from './src/list/TembaList';\nimport { ContactSearch } from './src/contactsearch/ContactSearch';\nimport { VectorIcon } from './src/vectoricon/VectorIcon';\nimport { Alert } from './src/alert/Alert';\nimport { Omnibox } from './src/omnibox/Omnibox';\nimport { Tip } from './src/tip/Tip';\nimport { TembaMenu } from './src/list/TembaMenu';\nimport { Anchor } from './src/anchor/Anchor';\nimport { Dropdown } from './src/dropdown/Dropdown';\nimport { TabPane } from './src/tabpane/TabPane';\nimport { Tab } from './src/tabpane/Tab';\nimport Label from './src/label/Label';\nimport { ContactName } from './src/contacts/ContactName';\nimport { ContactUrn } from './src/contacts/ContactUrn';\nimport { ContactFields } from './src/contacts/ContactFields';\nimport { ContactFieldEditor } from './src/contacts/ContactFieldEditor';\n\nimport { ContactBadges } from './src/contacts/ContactBadges';\nimport { ContactPending } from './src/contacts/ContactPending';\nimport { ContactTickets } from './src/contacts/ContactTickets';\nimport { TembaSlider } from './src/slider/TembaSlider';\nimport { RunList } from './src/list/RunList';\nimport { FlowStoreElement } from './src/flow/FlowStoreElement';\nimport { ContactNameFetch } from './src/contacts/ContactNameFetch';\nimport DatePicker from './src/datepicker/DatePicker';\nimport { FieldManager } from './src/fields/FieldManager';\nimport { SortableList } from './src/list/SortableList';\nimport { ContentMenu } from './src/list/ContentMenu';\nimport { TembaDate } from './src/date/TembaDate';\nimport Remote from './src/remote/Remote';\nimport { Compose } from './src/compose/Compose';\nimport { Lightbox } from './src/lightbox/Lightbox';\nimport { ColorPicker } from './src/colorpicker/ColorPicker';\nimport { Resizer } from './src/resizer/Resizer';\nimport { Thumbnail } from './src/thumbnail/Thumbnail';\nimport { NotificationList } from './src/list/NotificationList';\nimport { WebChat } from './src/webchat/WebChat';\nimport { ImagePicker } from './src/imagepicker/ImagePicker';\nimport { Mask } from './src/mask/Mask';\nimport { TembaUser } from './src/user/TembaUser';\nimport { TemplateEditor } from './src/templates/TemplateEditor';\nimport { Toast } from './src/toast/Toast';\nimport { Chat } from './src/chat/Chat';\nimport { MediaPicker } from './src/mediapicker/MediaPicker';\nimport { ContactNotepad } from './src/contacts/ContactNotepad';\n\nexport function addCustomElement(name: string, comp: any) {\n if (!window.customElements.get(name)) {\n window.customElements.define(name, comp);\n }\n}\n\naddCustomElement('temba-anchor', Anchor);\naddCustomElement('temba-alert', Alert);\naddCustomElement('temba-store', Store);\naddCustomElement('temba-textinput', TextInput);\naddCustomElement('temba-datepicker', DatePicker);\naddCustomElement('temba-date', TembaDate);\naddCustomElement('temba-completion', Completion);\naddCustomElement('temba-checkbox', Checkbox);\naddCustomElement('temba-select', Select);\naddCustomElement('temba-options', Options);\naddCustomElement('temba-loading', Loading);\naddCustomElement('temba-lightbox', Lightbox);\naddCustomElement('temba-button', Button);\naddCustomElement('temba-omnibox', Omnibox);\naddCustomElement('temba-tip', Tip);\naddCustomElement('temba-contact-name', ContactName);\naddCustomElement('temba-contact-name-fetch', ContactNameFetch);\naddCustomElement('temba-contact-field', ContactFieldEditor);\naddCustomElement('temba-contact-fields', ContactFields);\naddCustomElement('temba-field-manager', FieldManager);\naddCustomElement('temba-urn', ContactUrn);\naddCustomElement('temba-content-menu', ContentMenu);\n\naddCustomElement('temba-field', FormField);\naddCustomElement('temba-dialog', Dialog);\naddCustomElement('temba-modax', Modax);\naddCustomElement('temba-charcount', CharCount);\naddCustomElement('temba-contact-chat', ContactChat);\naddCustomElement('temba-contact-details', ContactDetails);\naddCustomElement('temba-ticket-list', TicketList);\naddCustomElement('temba-notification-list', NotificationList);\naddCustomElement('temba-list', TembaList);\naddCustomElement('temba-sortable-list', SortableList);\naddCustomElement('temba-run-list', RunList);\naddCustomElement('temba-flow-details', FlowStoreElement);\naddCustomElement('temba-label', Label);\naddCustomElement('temba-menu', TembaMenu);\naddCustomElement('temba-remote', Remote);\naddCustomElement('temba-contact-search', ContactSearch);\naddCustomElement('temba-icon', VectorIcon);\naddCustomElement('temba-dropdown', Dropdown);\naddCustomElement('temba-tabs', TabPane);\naddCustomElement('temba-tab', Tab);\naddCustomElement('temba-contact-badges', ContactBadges);\naddCustomElement('temba-contact-pending', ContactPending);\naddCustomElement('temba-contact-tickets', ContactTickets);\naddCustomElement('temba-slider', TembaSlider);\naddCustomElement('temba-content-menu', ContentMenu);\naddCustomElement('temba-compose', Compose);\naddCustomElement('temba-color-picker', ColorPicker);\naddCustomElement('temba-resizer', Resizer);\naddCustomElement('temba-thumbnail', Thumbnail);\naddCustomElement('temba-webchat', WebChat);\naddCustomElement('temba-image-picker', ImagePicker);\naddCustomElement('temba-mask', Mask);\naddCustomElement('temba-user', TembaUser);\naddCustomElement('temba-template-editor', TemplateEditor);\naddCustomElement('temba-toast', Toast);\naddCustomElement('temba-chat', Chat);\naddCustomElement('temba-media-picker', MediaPicker);\naddCustomElement('temba-contact-notepad', ContactNotepad);\n"]}
1
+ {"version":3,"file":"temba-modules.js","sourceRoot":"","sources":["../temba-modules.ts"],"names":[],"mappings":"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","sourcesContent":["import { Checkbox } from './src/checkbox/Checkbox';\nimport { TextInput } from './src/textinput/TextInput';\nimport { Store } from './src/store/Store';\nimport { Select } from './src/select/Select';\nimport { Completion } from './src/completion/Completion';\nimport { Modax } from './src/dialog/Modax';\nimport { Dialog } from './src/dialog/Dialog';\nimport { Button } from './src/button/Button';\nimport { FormField } from './src/formfield/FormField';\nimport { Loading } from './src/loading/Loading';\nimport { CharCount } from './src/charcount/CharCount';\nimport { Options } from './src/options/Options';\nimport { ContactChat } from './src/contacts/ContactChat';\nimport { TicketList } from './src/list/TicketList';\nimport { ContactDetails } from './src/contacts/ContactDetails';\nimport { TembaList } from './src/list/TembaList';\nimport { ContactSearch } from './src/contactsearch/ContactSearch';\nimport { VectorIcon } from './src/vectoricon/VectorIcon';\nimport { Alert } from './src/alert/Alert';\nimport { Omnibox } from './src/omnibox/Omnibox';\nimport { Tip } from './src/tip/Tip';\nimport { TembaMenu } from './src/list/TembaMenu';\nimport { Anchor } from './src/anchor/Anchor';\nimport { Dropdown } from './src/dropdown/Dropdown';\nimport { TabPane } from './src/tabpane/TabPane';\nimport { Tab } from './src/tabpane/Tab';\nimport Label from './src/label/Label';\nimport { ContactName } from './src/contacts/ContactName';\nimport { ContactUrn } from './src/contacts/ContactUrn';\nimport { ContactFields } from './src/contacts/ContactFields';\nimport { ContactFieldEditor } from './src/contacts/ContactFieldEditor';\n\nimport { ContactBadges } from './src/contacts/ContactBadges';\nimport { ContactPending } from './src/contacts/ContactPending';\nimport { ContactTickets } from './src/contacts/ContactTickets';\nimport { TembaSlider } from './src/slider/TembaSlider';\nimport { RunList } from './src/list/RunList';\nimport { FlowStoreElement } from './src/flow/FlowStoreElement';\nimport { ContactNameFetch } from './src/contacts/ContactNameFetch';\nimport DatePicker from './src/datepicker/DatePicker';\nimport { FieldManager } from './src/fields/FieldManager';\nimport { SortableList } from './src/list/SortableList';\nimport { ContentMenu } from './src/list/ContentMenu';\nimport { TembaDate } from './src/date/TembaDate';\nimport Remote from './src/remote/Remote';\nimport { Compose } from './src/compose/Compose';\nimport { Lightbox } from './src/lightbox/Lightbox';\nimport { ColorPicker } from './src/colorpicker/ColorPicker';\nimport { Resizer } from './src/resizer/Resizer';\nimport { Thumbnail } from './src/thumbnail/Thumbnail';\nimport { NotificationList } from './src/list/NotificationList';\nimport { WebChat } from './src/webchat/WebChat';\nimport { ImagePicker } from './src/imagepicker/ImagePicker';\nimport { Mask } from './src/mask/Mask';\nimport { TembaUser } from './src/user/TembaUser';\nimport { TemplateEditor } from './src/templates/TemplateEditor';\nimport { Toast } from './src/toast/Toast';\nimport { Chat } from './src/chat/Chat';\nimport { MediaPicker } from './src/mediapicker/MediaPicker';\nimport { ContactNotepad } from './src/contacts/ContactNotepad';\nimport { OutboxMonitor } from './src/outboxmonitor/OutboxMonitor';\n\nexport function addCustomElement(name: string, comp: any) {\n if (!window.customElements.get(name)) {\n window.customElements.define(name, comp);\n }\n}\n\naddCustomElement('temba-anchor', Anchor);\naddCustomElement('temba-alert', Alert);\naddCustomElement('temba-store', Store);\naddCustomElement('temba-textinput', TextInput);\naddCustomElement('temba-datepicker', DatePicker);\naddCustomElement('temba-date', TembaDate);\naddCustomElement('temba-completion', Completion);\naddCustomElement('temba-checkbox', Checkbox);\naddCustomElement('temba-select', Select);\naddCustomElement('temba-options', Options);\naddCustomElement('temba-loading', Loading);\naddCustomElement('temba-lightbox', Lightbox);\naddCustomElement('temba-button', Button);\naddCustomElement('temba-omnibox', Omnibox);\naddCustomElement('temba-tip', Tip);\naddCustomElement('temba-contact-name', ContactName);\naddCustomElement('temba-contact-name-fetch', ContactNameFetch);\naddCustomElement('temba-contact-field', ContactFieldEditor);\naddCustomElement('temba-contact-fields', ContactFields);\naddCustomElement('temba-field-manager', FieldManager);\naddCustomElement('temba-urn', ContactUrn);\naddCustomElement('temba-content-menu', ContentMenu);\n\naddCustomElement('temba-field', FormField);\naddCustomElement('temba-dialog', Dialog);\naddCustomElement('temba-modax', Modax);\naddCustomElement('temba-charcount', CharCount);\naddCustomElement('temba-contact-chat', ContactChat);\naddCustomElement('temba-contact-details', ContactDetails);\naddCustomElement('temba-ticket-list', TicketList);\naddCustomElement('temba-notification-list', NotificationList);\naddCustomElement('temba-list', TembaList);\naddCustomElement('temba-sortable-list', SortableList);\naddCustomElement('temba-run-list', RunList);\naddCustomElement('temba-flow-details', FlowStoreElement);\naddCustomElement('temba-label', Label);\naddCustomElement('temba-menu', TembaMenu);\naddCustomElement('temba-remote', Remote);\naddCustomElement('temba-contact-search', ContactSearch);\naddCustomElement('temba-icon', VectorIcon);\naddCustomElement('temba-dropdown', Dropdown);\naddCustomElement('temba-tabs', TabPane);\naddCustomElement('temba-tab', Tab);\naddCustomElement('temba-contact-badges', ContactBadges);\naddCustomElement('temba-contact-pending', ContactPending);\naddCustomElement('temba-contact-tickets', ContactTickets);\naddCustomElement('temba-slider', TembaSlider);\naddCustomElement('temba-content-menu', ContentMenu);\naddCustomElement('temba-compose', Compose);\naddCustomElement('temba-color-picker', ColorPicker);\naddCustomElement('temba-resizer', Resizer);\naddCustomElement('temba-thumbnail', Thumbnail);\naddCustomElement('temba-webchat', WebChat);\naddCustomElement('temba-image-picker', ImagePicker);\naddCustomElement('temba-mask', Mask);\naddCustomElement('temba-user', TembaUser);\naddCustomElement('temba-template-editor', TemplateEditor);\naddCustomElement('temba-toast', Toast);\naddCustomElement('temba-chat', Chat);\naddCustomElement('temba-media-picker', MediaPicker);\naddCustomElement('temba-contact-notepad', ContactNotepad);\naddCustomElement('temba-outbox-monitor', OutboxMonitor);\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nyaruka/temba-components",
3
- "version": "0.104.1",
3
+ "version": "0.105.1",
4
4
  "description": "Web components to support rapidpro and related projects",
5
5
  "author": "Nyaruka <code@nyaruka.coim>",
6
6
  "main": "dist/index.js",
@@ -0,0 +1,148 @@
1
+ import { css, html, PropertyValueMap } from 'lit';
2
+ import { property } from 'lit/decorators.js';
3
+ import { ResizeElement } from '../ResizeElement';
4
+ import { fetchResults } from '../utils';
5
+
6
+ const MIN_BACKLOG = 500000;
7
+ export class OutboxMonitor extends ResizeElement {
8
+ @property({ type: Number })
9
+ backlogSize = 0;
10
+
11
+ @property({ type: String })
12
+ endpoint = '/msg/menu/';
13
+
14
+ folders: { [id: string]: { start: number; current: number } } = {};
15
+
16
+ @property({ type: Object })
17
+ firstFetch: Date;
18
+
19
+ @property({ type: Object })
20
+ lastFetch: Date;
21
+
22
+ @property({ type: Number })
23
+ fetches = 0;
24
+
25
+ @property({ type: Number })
26
+ msgsPerSecond = 0;
27
+
28
+ @property({ type: Object })
29
+ estimatedCompletionDate: Date;
30
+
31
+ public static get styles() {
32
+ return css`
33
+ .monitor {
34
+ margin: 1rem;
35
+ margin-bottom: -0.5rem;
36
+ }
37
+
38
+ .header {
39
+ font-weight: bold;
40
+ }
41
+
42
+ .estimate {
43
+ font-size: 0.9em;
44
+ }
45
+ `;
46
+ }
47
+
48
+ private fetchFolders() {
49
+ fetchResults(this.endpoint).then((items) => {
50
+ items
51
+ .filter(
52
+ (item) =>
53
+ item.id === 'outbox' || item.id === 'sent' || item.id === 'failed'
54
+ )
55
+ .forEach((item) => {
56
+ if (this.folders[item.id]) {
57
+ this.folders[item.id].current = item.count;
58
+ } else {
59
+ this.folders[item.id] = {
60
+ start: item.count,
61
+ current: item.count
62
+ };
63
+ }
64
+ });
65
+
66
+ if (this.firstFetch) {
67
+ this.lastFetch = new Date();
68
+ } else {
69
+ this.firstFetch = new Date();
70
+ }
71
+ this.fetches++;
72
+
73
+ this.scheduleRefresh(Math.min(this.fetches * 5000, 60000));
74
+
75
+ const outbox = this.folders['outbox'];
76
+
77
+ this.backlogSize = outbox.current;
78
+ if (outbox.current > 1) {
79
+ this.estimateCompletion();
80
+ }
81
+ });
82
+ }
83
+
84
+ private estimateCompletion() {
85
+ if (this.lastFetch) {
86
+ const time =
87
+ (this.lastFetch.getTime() - this.firstFetch.getTime()) / 1000;
88
+ const sent = this.folders['sent'];
89
+ const failed = this.folders['failed'];
90
+
91
+ const totalCompleted = sent.current + failed.current;
92
+ const startCount = sent.start + failed.start;
93
+
94
+ const sentInWindow = totalCompleted - startCount;
95
+ this.msgsPerSecond = sentInWindow / time;
96
+
97
+ const remaining = this.folders['outbox'].current;
98
+ const secondsRemaining = remaining / this.msgsPerSecond;
99
+
100
+ this.estimatedCompletionDate = new Date(
101
+ new Date().getTime() + secondsRemaining * 1000
102
+ );
103
+ }
104
+ }
105
+
106
+ private scheduleRefresh(time: number) {
107
+ setTimeout(() => {
108
+ this.fetchFolders();
109
+ }, time);
110
+ }
111
+
112
+ protected firstUpdated(
113
+ changes: PropertyValueMap<any> | Map<PropertyKey, unknown>
114
+ ): void {
115
+ if (changes.has('endpoint') && this.endpoint) {
116
+ this.fetchFolders();
117
+ }
118
+ }
119
+
120
+ public hasBacklog() {
121
+ return this.backlogSize > MIN_BACKLOG;
122
+ }
123
+
124
+ public render() {
125
+ const roundedRate = Math.round(this.msgsPerSecond);
126
+ if (this.hasBacklog() && this.estimatedCompletionDate && !this.isMobile()) {
127
+ return html`<div class="monitor">
128
+ <temba-alert
129
+ ><div class="header">Outbox Notice</div>
130
+ <div class="estimate">
131
+ If your outbox becomes too full, you won't be able to send new flows
132
+ or broadcasts. Your channels are currently sending at
133
+ ${roundedRate.toLocaleString()}
134
+ message${roundedRate == 1 ? '' : 's'} per second. At that rate, your
135
+ outbox will clear
136
+ <temba-date
137
+ value="${this.estimatedCompletionDate.toISOString()}"
138
+ display="duration"
139
+ ></temba-date
140
+ >.
141
+ </div></temba-alert
142
+ >
143
+ </div>`;
144
+ } else {
145
+ return null;
146
+ }
147
+ }
148
+ }
package/temba-modules.ts CHANGED
@@ -58,6 +58,7 @@ import { Toast } from './src/toast/Toast';
58
58
  import { Chat } from './src/chat/Chat';
59
59
  import { MediaPicker } from './src/mediapicker/MediaPicker';
60
60
  import { ContactNotepad } from './src/contacts/ContactNotepad';
61
+ import { OutboxMonitor } from './src/outboxmonitor/OutboxMonitor';
61
62
 
62
63
  export function addCustomElement(name: string, comp: any) {
63
64
  if (!window.customElements.get(name)) {
@@ -126,3 +127,4 @@ addCustomElement('temba-toast', Toast);
126
127
  addCustomElement('temba-chat', Chat);
127
128
  addCustomElement('temba-media-picker', MediaPicker);
128
129
  addCustomElement('temba-contact-notepad', ContactNotepad);
130
+ addCustomElement('temba-outbox-monitor', OutboxMonitor);