@inboxsdk/core 1.1.0 → 1.1.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.
Files changed (68) hide show
  1. package/inboxsdk.js +7 -34
  2. package/inboxsdk.js.map +1 -1
  3. package/package.json +1 -1
  4. package/pageWorld.js +1 -1
  5. package/pageWorld.js.map +1 -1
  6. package/src/injected-js/main.js +0 -9
  7. package/src/platform-implementation-js/platform-implementation.d.ts +0 -3
  8. package/src/platform-implementation-js/platform-implementation.js +1 -9
  9. package/src/injected-js/inbox/setupAjaxInterceptor.js +0 -211
  10. package/src/injected-js/inbox/setupClickAndGetNewIframeSrc.js +0 -67
  11. package/src/injected-js/inbox/setupComposeViewDraftIDFinder.js +0 -35
  12. package/src/injected-js/inbox/setupInboxFakeWindowResizeListener.js +0 -29
  13. package/src/platform-implementation-js/dom-driver/inbox/__mocks__/getSidebarClassnames.js +0 -13
  14. package/src/platform-implementation-js/dom-driver/inbox/addNavItem.js +0 -38
  15. package/src/platform-implementation-js/dom-driver/inbox/addRecipientRow.js +0 -55
  16. package/src/platform-implementation-js/dom-driver/inbox/createLink.js +0 -19
  17. package/src/platform-implementation-js/dom-driver/inbox/createLink.test.js +0 -27
  18. package/src/platform-implementation-js/dom-driver/inbox/detection/appToolbarLocation/parser.js +0 -43
  19. package/src/platform-implementation-js/dom-driver/inbox/detection/attachmentCard/parser.js +0 -34
  20. package/src/platform-implementation-js/dom-driver/inbox/detection/attachmentOverlay/parser.js +0 -53
  21. package/src/platform-implementation-js/dom-driver/inbox/detection/chatSidebar/parser.js +0 -31
  22. package/src/platform-implementation-js/dom-driver/inbox/detection/compose/parser.js +0 -103
  23. package/src/platform-implementation-js/dom-driver/inbox/detection/message/parser.js +0 -69
  24. package/src/platform-implementation-js/dom-driver/inbox/detection/nativeDrawer/parser.js +0 -32
  25. package/src/platform-implementation-js/dom-driver/inbox/detection/searchBar/parser.js +0 -28
  26. package/src/platform-implementation-js/dom-driver/inbox/detection/thread/parser.js +0 -49
  27. package/src/platform-implementation-js/dom-driver/inbox/detection/thread-row/parser.js +0 -100
  28. package/src/platform-implementation-js/dom-driver/inbox/getComposeViewDriverLiveSet.js +0 -99
  29. package/src/platform-implementation-js/dom-driver/inbox/getInboxMessageIdForInboxThreadId.js +0 -36
  30. package/src/platform-implementation-js/dom-driver/inbox/getSidebarClassnames.js +0 -114
  31. package/src/platform-implementation-js/dom-driver/inbox/getSidebarClassnames.test.js +0 -73
  32. package/src/platform-implementation-js/dom-driver/inbox/gotoView.js +0 -39
  33. package/src/platform-implementation-js/dom-driver/inbox/gotoView.test.js +0 -28
  34. package/src/platform-implementation-js/dom-driver/inbox/inbox-butter-bar-driver.js +0 -148
  35. package/src/platform-implementation-js/dom-driver/inbox/inbox-driver.js +0 -863
  36. package/src/platform-implementation-js/dom-driver/inbox/inbox-page-communicator.js +0 -62
  37. package/src/platform-implementation-js/dom-driver/inbox/inboxResponseProcessor.js +0 -12
  38. package/src/platform-implementation-js/dom-driver/inbox/inboxResponseProcessor.test.js +0 -18
  39. package/src/platform-implementation-js/dom-driver/inbox/makePageParserTree.js +0 -33
  40. package/src/platform-implementation-js/dom-driver/inbox/pageParserOptions.js +0 -265
  41. package/src/platform-implementation-js/dom-driver/inbox/registerSearchSuggestionsProvider.js +0 -301
  42. package/src/platform-implementation-js/dom-driver/inbox/setupCustomAutocompleteSelectionHandling.js +0 -183
  43. package/src/platform-implementation-js/dom-driver/inbox/setupRouteViewDriverStream.js +0 -64
  44. package/src/platform-implementation-js/dom-driver/inbox/setupRouteViewDriverStream.test.js +0 -72
  45. package/src/platform-implementation-js/dom-driver/inbox/views/InboxLabelView.js +0 -78
  46. package/src/platform-implementation-js/dom-driver/inbox/views/InboxMoleViewDriver.js +0 -296
  47. package/src/platform-implementation-js/dom-driver/inbox/views/InboxToolbarButtonView.js +0 -91
  48. package/src/platform-implementation-js/dom-driver/inbox/views/InboxToolbarView.js +0 -53
  49. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-app-sidebar-view.js +0 -271
  50. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-app-toolbar-button-view.js +0 -160
  51. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-app-toolbar-tooltip-view.js +0 -57
  52. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-attachment-card-view.js +0 -197
  53. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-attachment-overlay-view.js +0 -83
  54. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-chat-sidebar-view.js +0 -45
  55. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-compose-button-view.js +0 -116
  56. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-compose-view.js +0 -842
  57. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-custom-route-view.js +0 -75
  58. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-dropdown-view.js +0 -25
  59. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-dummy-route-view.js +0 -63
  60. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-message-view.js +0 -274
  61. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-modal-view.js +0 -112
  62. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-route-view.js +0 -96
  63. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-thread-row-view.js +0 -315
  64. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-thread-view.js +0 -218
  65. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-thread-view.test.js +0 -171
  66. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-tooltip-view.js +0 -127
  67. package/src/platform-implementation-js/dom-driver/inbox/views/inboxNavItemView.js +0 -311
  68. package/src/platform-implementation-js/dom-driver/inbox/waitForAnimationClickBlockerGone.js +0 -26
@@ -1,863 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.default = void 0;
8
- var _once = _interopRequireDefault(require("lodash/once"));
9
- var _constant = _interopRequireDefault(require("lodash/constant"));
10
- var _includes = _interopRequireDefault(require("lodash/includes"));
11
- var _autoHtml = _interopRequireDefault(require("auto-html"));
12
- var _kefir = _interopRequireDefault(require("kefir"));
13
- var _kefirBus = _interopRequireDefault(require("kefir-bus"));
14
- var _kefirStopper = _interopRequireDefault(require("kefir-stopper"));
15
- var _ud = require("ud");
16
- var _liveSet = _interopRequireDefault(require("live-set"));
17
- var _filter = _interopRequireDefault(require("live-set/filter"));
18
- var _merge = _interopRequireDefault(require("live-set/merge"));
19
- var _flatMap = _interopRequireDefault(require("live-set/flatMap"));
20
- var _mapWithRemoval = _interopRequireDefault(require("live-set/mapWithRemoval"));
21
- var _toValueObservable = _interopRequireDefault(require("live-set/toValueObservable"));
22
- var _makePageParserTree = _interopRequireDefault(require("./makePageParserTree"));
23
- var _logger = _interopRequireDefault(require("../../lib/logger"));
24
- var _toItemWithLifetimeStream = _interopRequireDefault(require("../../lib/toItemWithLifetimeStream"));
25
- var _injectScript = require("../../lib/inject-script");
26
- var _fromEventTargetCapture = _interopRequireDefault(require("../../lib/from-event-target-capture"));
27
- var _bimapcache = _interopRequireDefault(require("bimapcache"));
28
- var _getInboxMessageIdForInboxThreadId = _interopRequireDefault(require("./getInboxMessageIdForInboxThreadId"));
29
- var _getGmailMessageIdForSyncMessageId = _interopRequireDefault(require("../../driver-common/getGmailMessageIdForSyncMessageId"));
30
- var _getThreadIdFromMessageId = _interopRequireDefault(require("../../driver-common/getThreadIdFromMessageId"));
31
- var _gmailAjax = _interopRequireDefault(require("../../driver-common/gmailAjax"));
32
- var _getAccountUrlPart = _interopRequireDefault(require("../../driver-common/getAccountUrlPart"));
33
- var _simulateKey = _interopRequireDefault(require("../../lib/dom/simulate-key"));
34
- var _setCss = _interopRequireDefault(require("../../lib/dom/set-css"));
35
- var _querySelectorOrFail = _interopRequireDefault(require("../../lib/dom/querySelectorOrFail"));
36
- var _censorHTMLstring = _interopRequireDefault(require("../../../common/censorHTMLstring"));
37
- var _censorHTMLtree = _interopRequireDefault(require("../../../common/censorHTMLtree"));
38
- var _getComposeViewDriverLiveSet = _interopRequireDefault(require("./getComposeViewDriverLiveSet"));
39
- var _addNavItem = _interopRequireDefault(require("./addNavItem"));
40
- var _querySelectorOne = _interopRequireDefault(require("../../lib/dom/querySelectorOne"));
41
- var _idMap = _interopRequireDefault(require("../../lib/idMap"));
42
- var _makeMutationObserverChunkedStream = _interopRequireDefault(require("../../lib/dom/make-mutation-observer-chunked-stream"));
43
- var _getSidebarClassnames = _interopRequireDefault(require("./getSidebarClassnames"));
44
- var _inboxButterBarDriver = _interopRequireDefault(require("./inbox-butter-bar-driver"));
45
- var _createLink = _interopRequireDefault(require("./createLink"));
46
- var _gotoView = _interopRequireDefault(require("./gotoView"));
47
- var _parser = _interopRequireDefault(require("./detection/thread/parser"));
48
- var _parser2 = _interopRequireDefault(require("./detection/thread-row/parser"));
49
- var _parser3 = _interopRequireDefault(require("./detection/message/parser"));
50
- var _parser4 = _interopRequireDefault(require("./detection/attachmentCard/parser"));
51
- var _parser5 = _interopRequireDefault(require("./detection/attachmentOverlay/parser"));
52
- var _parser6 = _interopRequireDefault(require("./detection/nativeDrawer/parser"));
53
- var _parser7 = _interopRequireDefault(require("./detection/searchBar/parser"));
54
- var _parser8 = _interopRequireDefault(require("./detection/chatSidebar/parser"));
55
- var _parser9 = _interopRequireDefault(require("./detection/appToolbarLocation/parser"));
56
- var _setupRouteViewDriverStream = _interopRequireDefault(require("./setupRouteViewDriverStream"));
57
- var _inboxThreadView = _interopRequireDefault(require("./views/inbox-thread-view"));
58
- var _inboxThreadRowView = _interopRequireDefault(require("./views/inbox-thread-row-view"));
59
- var _inboxMessageView = _interopRequireDefault(require("./views/inbox-message-view"));
60
- var _inboxAttachmentCardView = _interopRequireDefault(require("./views/inbox-attachment-card-view"));
61
- var _inboxAttachmentOverlayView = _interopRequireDefault(require("./views/inbox-attachment-overlay-view"));
62
- var _inboxChatSidebarView = _interopRequireDefault(require("./views/inbox-chat-sidebar-view"));
63
- var _InboxToolbarView = _interopRequireDefault(require("./views/InboxToolbarView"));
64
- var _InboxMoleViewDriver = _interopRequireDefault(require("./views/InboxMoleViewDriver"));
65
- var _inboxAppSidebarView = _interopRequireDefault(require("./views/inbox-app-sidebar-view"));
66
- var _registerSearchSuggestionsProvider = _interopRequireDefault(require("./registerSearchSuggestionsProvider"));
67
- var _inboxAppToolbarButtonView = _interopRequireDefault(require("./views/inbox-app-toolbar-button-view"));
68
- var _inboxPageCommunicator = _interopRequireDefault(require("./inbox-page-communicator"));
69
- var _inboxModalView = _interopRequireDefault(require("./views/inbox-modal-view"));
70
- var _inboxDrawerView = _interopRequireDefault(require("./views/inbox-drawer-view"));
71
- var _inboxBackdrop = _interopRequireDefault(require("./views/inbox-backdrop"));
72
- /* eslint-disable flowtype/require-valid-file-annotation -- flow support is deprecated and this file existed for a Google product that no longer exists */
73
-
74
- class InboxDriver {
75
- _threadViewElements = new WeakMap();
76
- _messageViewElements = new WeakMap();
77
- _butterBarDriver = new _inboxButterBarDriver.default();
78
- _lastInteractedAttachmentCardView = null;
79
- _lastInteractedAttachmentCardViewSet = (0, _kefirBus.default)();
80
- _appSidebarView = null;
81
- _customRouteIDs = new Set();
82
- constructor(appId, LOADER_VERSION, IMPL_VERSION, logger, opts, envData) {
83
- this; // interface check
84
- this._appId = appId;
85
- this._logger = logger;
86
- this._opts = opts;
87
- this._envData = envData;
88
- this._stopper = (0, _kefirStopper.default)();
89
- this._pageCommunicator = new _inboxPageCommunicator.default();
90
- this._page = (0, _makePageParserTree.default)(this, document);
91
- this._stopper.onValue(() => this._page.dump());
92
- this.onready = (0, _injectScript.injectScript)().then(() => {
93
- this._logger.setUserEmailAddress(this.getUserEmailAddress());
94
- });
95
- this._setupThreadIdStats();
96
- {
97
- if (global.localStorage) {
98
- // We used to not always identify the ids of messages correctly, so we
99
- // just drop the old cache and use a new one.
100
- global.localStorage.removeItem('inboxsdk__cached_gmail_and_inbox_message_ids');
101
- }
102
- const gmailMessageIdForInboxMessageIdCache = new _bimapcache.default({
103
- key: 'inboxsdk__cached_gmail_and_inbox_message_ids_2',
104
- getAfromB: inboxMessageId => (0, _getGmailMessageIdForSyncMessageId.default)(this, inboxMessageId),
105
- getBfromA() {
106
- throw new Error('should not happen');
107
- }
108
- });
109
- this.getGmailMessageIdForSyncMessageId = inboxMessageId => gmailMessageIdForInboxMessageIdCache.getAfromB(inboxMessageId);
110
- }
111
- {
112
- const inboxMessageIdForInboxThreadIdCache = new _bimapcache.default({
113
- key: 'inboxsdk__cached_inbox_message_and_inbox_thread_ids',
114
- getAfromB: inboxThreadId => {
115
- this._threadIdStats.threadRows.threadsWithFetch += 1;
116
- return (0, _getInboxMessageIdForInboxThreadId.default)(this, inboxThreadId);
117
- },
118
- getBfromA() {
119
- throw new Error('should not happen');
120
- }
121
- });
122
- this.getInboxMessageIdForInboxThreadId = inboxThreadId => inboxMessageIdForInboxThreadIdCache.getAfromB(inboxThreadId);
123
- }
124
- {
125
- const threadIdFromMessageIdCache = new _bimapcache.default({
126
- key: 'inboxsdk__cached_thread_and_message_ids',
127
- getAfromB: messageId => (0, _getThreadIdFromMessageId.default)(this, messageId),
128
- getBfromA() {
129
- throw new Error('should not happen');
130
- }
131
- });
132
- this.getThreadIdFromMessageId = messageId => threadIdFromMessageIdCache.getAfromB(messageId);
133
- }
134
- this._threadRowViewDriverLiveSet = (0, _mapWithRemoval.default)(this._page.tree.getAllByTag('collapsedThreadRow'), (node, removal) => {
135
- const el = node.getValue();
136
- const parsed = (0, _parser2.default)(el);
137
- if (parsed.errors.length) {
138
- this._logger.errorSite(new Error('parse errors (threadRow)'), {
139
- score: parsed.score,
140
- errors: parsed.errors,
141
- html: (0, _censorHTMLtree.default)(el)
142
- });
143
- }
144
- const view = new _inboxThreadRowView.default(el, this, parsed);
145
- removal.then(() => {
146
- view.destroy();
147
- });
148
- return view;
149
- });
150
- this._threadViewDriverLiveSet = (0, _flatMap.default)(this._page.tree.getAllByTag('thread'), node => {
151
- const el = node.getValue();
152
- let parsed = (0, _parser.default)(el);
153
- if (parsed.errors.length) {
154
- this._logger.errorSite(new Error('parse errors (thread)'), {
155
- score: parsed.score,
156
- errors: parsed.errors,
157
- html: (0, _censorHTMLtree.default)(el)
158
- });
159
- }
160
- return new _liveSet.default({
161
- read() {
162
- throw new Error();
163
- },
164
- listen: (setValues, controller) => {
165
- setValues(new Set());
166
- const unsub = (0, _kefirStopper.default)();
167
-
168
- // If the InboxThreadView is destroyed before the element is removed,
169
- // then make a new InboxThreadView out of the same element.
170
- const newView = firstRun => {
171
- if (!firstRun) {
172
- parsed = (0, _parser.default)(el);
173
- if (parsed.errors.length > 0) {
174
- this._logger.errorSite(new Error('thread reparse errors'), {
175
- score: parsed.score,
176
- errors: parsed.errors,
177
- html: (0, _censorHTMLtree.default)(el)
178
- });
179
- }
180
- }
181
- const view = new _inboxThreadView.default(el, this, parsed);
182
- view.getStopper().takeUntilBy(unsub).onValue(() => {
183
- controller.remove(view);
184
- newView(false);
185
- });
186
- unsub.takeUntilBy(view.getStopper()).onValue(() => {
187
- view.destroy();
188
- });
189
- controller.add(view);
190
- };
191
- newView(true);
192
- return () => {
193
- unsub.destroy();
194
- };
195
- }
196
- });
197
- });
198
- this._messageViewDriverLiveSet = (0, _flatMap.default)(this._page.tree.getAllByTag('message'), node => {
199
- const el = node.getValue();
200
- let parsed = (0, _parser3.default)(el);
201
- if (parsed.errors.length > 0) {
202
- this._logger.errorSite(new Error('parse errors (message)'), {
203
- score: parsed.score,
204
- errors: parsed.errors,
205
- html: (0, _censorHTMLtree.default)(el)
206
- });
207
- }
208
- if (parsed.attributes.isDraft) return _liveSet.default.constant(new Set());
209
- return new _liveSet.default({
210
- read() {
211
- throw new Error();
212
- },
213
- listen: (setValues, controller) => {
214
- setValues(new Set());
215
- const unsub = (0, _kefirStopper.default)();
216
-
217
- // If the InboxMessageView is destroyed before the element is removed,
218
- // then make a new InboxMessageView out of the same element. Inbox re-uses
219
- // elements for different messages in some cases.
220
- const newView = firstRun => {
221
- if (!firstRun) {
222
- parsed = (0, _parser3.default)(el);
223
- if (parsed.errors.length > 0) {
224
- this._logger.errorSite(new Error(`message reparse errors`), {
225
- score: parsed.score,
226
- errors: parsed.errors,
227
- html: (0, _censorHTMLtree.default)(el)
228
- });
229
- }
230
- }
231
- const view = new _inboxMessageView.default(el, this, parsed);
232
- view.getStopper().takeUntilBy(unsub).onValue(() => {
233
- controller.remove(view);
234
- newView(false);
235
- });
236
- unsub.takeUntilBy(view.getStopper()).onValue(() => {
237
- view.destroy();
238
- });
239
- controller.add(view);
240
- };
241
- newView(true);
242
- return () => {
243
- unsub.destroy();
244
- };
245
- }
246
- });
247
- });
248
- this._attachmentCardViewDriverLiveSet = (0, _mapWithRemoval.default)(this._page.tree.getAllByTag('attachmentCard'), (node, removal) => {
249
- const el = node.getValue();
250
- const parsed = (0, _parser4.default)(el);
251
- if (parsed.errors.length) {
252
- this._logger.errorSite(new Error('parse errors (attachmentCard)'), {
253
- score: parsed.score,
254
- errors: parsed.errors,
255
- html: (0, _censorHTMLtree.default)(el)
256
- });
257
- }
258
- const view = new _inboxAttachmentCardView.default({
259
- element: el,
260
- parsed
261
- }, this);
262
- removal.then(() => {
263
- view.destroy();
264
- });
265
- return view;
266
- });
267
- this._attachmentOverlayViewDriverLiveSet = (0, _flatMap.default)(this._page.tree.getAllByTag('attachmentOverlay'), node => {
268
- const el = node.getValue();
269
- const parsed = (0, _parser5.default)(el);
270
- if (parsed.errors.length) {
271
- this._logger.errorSite(new Error('parse errors (attachmentOverlay)'), {
272
- score: parsed.score,
273
- errors: parsed.errors,
274
- html: (0, _censorHTMLtree.default)(el)
275
- });
276
- }
277
- const cardView = this.getLastInteractedAttachmentCardView();
278
- if (!cardView) {
279
- this._logger.error(new Error('Encountered overlay without knowing cardView'));
280
- return _liveSet.default.constant(new Set());
281
- }
282
- return new _liveSet.default({
283
- read() {
284
- throw new Error();
285
- },
286
- listen: setValues => {
287
- const view = new _inboxAttachmentOverlayView.default(this, el, parsed, cardView);
288
- setValues(new Set([view]));
289
- return () => {
290
- view.destroy();
291
- };
292
- }
293
- });
294
- });
295
- this._attachmentOverlayViewDriverLiveSet.subscribe({});
296
- // force activation because nothing outside of the driver is going to
297
- // subscribe to this, unlike some of the other livesets.
298
-
299
- this._composeViewDriverLiveSet = (0, _getComposeViewDriverLiveSet.default)(this, this._page.tree);
300
- this._chatSidebarViewLiveSet = (0, _mapWithRemoval.default)(this._page.tree.getAllByTag('chatSidebar'), (node, removal) => {
301
- const el = node.getValue();
302
- const parsed = (0, _parser8.default)(el);
303
- if (parsed.errors.length) {
304
- this._logger.errorSite(new Error('parse errors (chatSidebar)'), {
305
- score: parsed.score,
306
- errors: parsed.errors,
307
- html: (0, _censorHTMLtree.default)(el)
308
- });
309
- }
310
- const view = new _inboxChatSidebarView.default(el, parsed);
311
- removal.then(() => {
312
- view.destroy();
313
- });
314
- return view;
315
- });
316
- this._chatSidebarViewLiveSet.subscribe({});
317
- // force activation because nothing outside of the driver is going to
318
- // subscribe to this, unlike some of the other livesets.
319
-
320
- this._routeViewDriverStream = (0, _setupRouteViewDriverStream.default)(this);
321
- this._routeViewDriverStream.takeUntilBy(this._stopper).onValue(routeViewDriver => {
322
- this._currentRouteViewDriver = routeViewDriver;
323
- });
324
- this._rowListViewDriverStream = _kefir.default.never();
325
- _kefir.default.later(30 * 1000).takeUntilBy((0, _toItemWithLifetimeStream.default)(this._page.tree.getAllByTag('appToolbarLocation'))).onValue(() => {
326
- this._logger.errorSite(new Error('Failed to find appToolbarLocation'));
327
- });
328
- (0, _toValueObservable.default)(this._page.tree.getAllByTag('searchBar')).subscribe(_ref => {
329
- let {
330
- value: node
331
- } = _ref;
332
- const el = node.getValue();
333
- const parsed = (0, _parser7.default)(el);
334
- if (parsed.errors.length) {
335
- this._logger.errorSite(new Error('parse errors (searchBar)'), {
336
- score: parsed.score,
337
- errors: parsed.errors,
338
- html: (0, _censorHTMLtree.default)(el)
339
- });
340
- }
341
- });
342
- _kefir.default.later(30 * 1000).takeUntilBy((0, _toItemWithLifetimeStream.default)(this._page.tree.getAllByTag('searchBar'))).onValue(() => {
343
- this._logger.errorSite(new Error('Failed to find searchBar'));
344
- });
345
- (0, _toValueObservable.default)(this._page.tree.getAllByTag('nativeDrawer')).subscribe(_ref2 => {
346
- let {
347
- value: node
348
- } = _ref2;
349
- const el = node.getValue();
350
- const parsed = (0, _parser6.default)(el);
351
- if (parsed.errors.length) {
352
- this._logger.errorSite(new Error('parse errors (nativeDrawer)'), {
353
- score: parsed.score,
354
- errors: parsed.errors,
355
- html: (0, _censorHTMLtree.default)(el)
356
- });
357
- }
358
- });
359
-
360
- // When a user goes from one thread to another, a new thread view is made
361
- // but the old thread view doesn't get destroyed until it finishes
362
- // animating out. We need to clear the old thread view's sidebar
363
- // immediately when a new thread view comes in.
364
- let _currentThreadView = null;
365
- this._threadViewDriverLiveSet.subscribe(changes => {
366
- changes.forEach(change => {
367
- if (change.type === 'add') {
368
- const threadView = change.value;
369
- if (_currentThreadView) {
370
- _currentThreadView.removePanels();
371
- }
372
- _currentThreadView = threadView;
373
- }
374
- });
375
- });
376
- this._toolbarViewDriverLiveSet = (0, _merge.default)([(0, _mapWithRemoval.default)(this._page.tree.getAllByTag('listToolBar'), (node, removal) => {
377
- const el = node.getValue();
378
- const view = new _InboxToolbarView.default(el, this, null);
379
- removal.then(() => {
380
- view.destroy();
381
- });
382
- return view;
383
- }), (0, _mapWithRemoval.default)(this._threadViewDriverLiveSet, (inboxThreadView, removal) => {
384
- const el = inboxThreadView.getToolbarElement();
385
- const view = new _InboxToolbarView.default(el, this, inboxThreadView);
386
- removal.then(() => {
387
- view.destroy();
388
- });
389
- return view;
390
- })]);
391
- }
392
- _setupThreadIdStats() {
393
- this._resetThreadIdStats();
394
- setInterval(() => {
395
- if (this._threadIdStats.threadRows.totalCalls === 0) return;
396
- const {
397
- threadRows
398
- } = this._threadIdStats;
399
- const stats = {};
400
- stats.threadRows = Object.assign({}, threadRows, {
401
- totalThreads: threadRows.totalThreads.size,
402
- threadsWithoutGmailId: threadRows.threadsWithoutGmailId.size
403
- });
404
- this._logger.eventSdkPassive('inboxThreadIdStats', stats);
405
- this._resetThreadIdStats();
406
- }, 1000 * 60 * 60);
407
- }
408
- _resetThreadIdStats() {
409
- this._threadIdStats = {
410
- threadRows: {
411
- totalThreads: new Set(),
412
- totalCalls: 0,
413
- threadsWithoutGmailId: new Set(),
414
- callsWithoutGmailId: 0,
415
- threadsWithFetch: 0
416
- }
417
- };
418
- }
419
- trackThreadRowIdCall(hasGmailId, inboxThreadId) {
420
- this._threadIdStats.threadRows.totalCalls += 1;
421
- this._threadIdStats.threadRows.totalThreads.add(inboxThreadId);
422
- if (!hasGmailId) {
423
- this._threadIdStats.threadRows.callsWithoutGmailId += 1;
424
- this._threadIdStats.threadRows.threadsWithoutGmailId.add(inboxThreadId);
425
- }
426
- }
427
- destroy() {
428
- this._stopper.destroy();
429
- }
430
- getAppId() {
431
- return this._appId;
432
- }
433
- getOpts() {
434
- return this._opts;
435
- }
436
- getLogger() {
437
- return this._logger;
438
- }
439
- getStopper() {
440
- return this._stopper;
441
- }
442
- getRouteViewDriverStream() {
443
- return this._routeViewDriverStream;
444
- }
445
- getCurrentRouteViewDriver() {
446
- return this._currentRouteViewDriver;
447
- }
448
- getRowListViewDriverStream() {
449
- return _kefir.default.never();
450
- }
451
- getComposeViewDriverLiveSet() {
452
- return this._composeViewDriverLiveSet;
453
- }
454
- getComposeViewDriverStream() {
455
- return (0, _toItemWithLifetimeStream.default)(this._composeViewDriverLiveSet).map(_ref3 => {
456
- let {
457
- el
458
- } = _ref3;
459
- return el;
460
- });
461
- }
462
- getThreadRowViewDriverLiveSet() {
463
- return this._threadRowViewDriverLiveSet;
464
- }
465
- getThreadRowViewDriverStream() {
466
- return (0, _toItemWithLifetimeStream.default)(this._threadRowViewDriverLiveSet).map(_ref4 => {
467
- let {
468
- el
469
- } = _ref4;
470
- return el;
471
- });
472
- }
473
- getThreadViewDriverStream() {
474
- return (0, _toItemWithLifetimeStream.default)(this._threadViewDriverLiveSet).map(_ref5 => {
475
- let {
476
- el
477
- } = _ref5;
478
- return el;
479
- });
480
- }
481
- getMessageViewDriverStream() {
482
- return (0, _toItemWithLifetimeStream.default)(this._messageViewDriverLiveSet).map(_ref6 => {
483
- let {
484
- el
485
- } = _ref6;
486
- return el;
487
- });
488
- }
489
- getAttachmentCardViewDriverStream() {
490
- return (0, _toItemWithLifetimeStream.default)(this._attachmentCardViewDriverLiveSet).map(_ref7 => {
491
- let {
492
- el
493
- } = _ref7;
494
- return el;
495
- });
496
- }
497
- getButterBarDriver() {
498
- return this._butterBarDriver;
499
- }
500
- getButterBar() {
501
- return this._butterBar;
502
- }
503
- setButterBar(bb) {
504
- this._butterBar = bb;
505
- }
506
- getPageCommunicator() {
507
- return this._pageCommunicator;
508
- }
509
- getThreadViewElementsMap() {
510
- return this._threadViewElements;
511
- }
512
- getMessageViewElementsMap() {
513
- return this._messageViewElements;
514
- }
515
- getTagTree() {
516
- return this._page.tree;
517
- }
518
- getCustomRouteIDs() {
519
- return this._customRouteIDs;
520
- }
521
- getCurrentChatSidebarView() {
522
- const view = Array.from(this._chatSidebarViewLiveSet.values())[0];
523
- if (!view) throw new Error('No chat sidebar found');
524
- return view;
525
- }
526
- getAppSidebarView() {
527
- if (!this._appSidebarView) {
528
- this._appSidebarView = new _inboxAppSidebarView.default(this);
529
- }
530
- return this._appSidebarView;
531
- }
532
- getChatSidebarButton() {
533
- const appToolbarLocationNode = Array.from(this._page.tree.getAllByTag('appToolbarLocation').values())[0];
534
- const parsed = appToolbarLocationNode ? (0, _parser9.default)(appToolbarLocationNode.getValue()) : null;
535
- const el = parsed ? parsed.elements.chatSidebarButton : null;
536
- if (!el) throw new Error('No chat sidebar button found');
537
- return el;
538
- }
539
- getLastInteractedAttachmentCardView() {
540
- return this._lastInteractedAttachmentCardView;
541
- }
542
- setLastInteractedAttachmentCardView(card) {
543
- this._lastInteractedAttachmentCardViewSet.emit();
544
- this._lastInteractedAttachmentCardView = card;
545
- if (card) {
546
- card.getStopper().merge((0, _fromEventTargetCapture.default)(document.body, 'click')).take(1).takeUntilBy(this._lastInteractedAttachmentCardViewSet).takeUntilBy(this._stopper).onValue(() => {
547
- this._lastInteractedAttachmentCardView = null;
548
- });
549
- }
550
- }
551
- openNewComposeViewDriver() {
552
- const composeViewDriverPromise = this.getNextComposeViewDriver();
553
- const fabButton = (0, _querySelectorOne.default)(document.body, 'nav[role=banner] ~ div[aria-expanded] button:not([tabindex="-1"])');
554
- fabButton.click();
555
- return composeViewDriverPromise;
556
- }
557
- getNextComposeViewDriver() {
558
- let timeout = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 10 * 1000;
559
- const s = _kefir.default.stream(em => {
560
- const subscription = this._composeViewDriverLiveSet.subscribe({
561
- next: changes => {
562
- const newComposeChange = changes.filter(change => change.type === 'add')[0];
563
- if (newComposeChange) {
564
- // make flow happy
565
- if (newComposeChange.type !== 'add') throw new Error('should not happen');
566
- em.value(newComposeChange.value);
567
- }
568
- },
569
- complete: em.end
570
- });
571
- return () => subscription.unsubscribe();
572
- });
573
- return s.merge(_kefir.default.later(timeout, new Error('Reached timeout while waiting for getNextComposeViewDriver'))).beforeEnd(() => new Error('Driver was shut down before a new compose was found')).flatMap(x => x instanceof Error ? _kefir.default.constantError(x) : _kefir.default.constant(x)).take(1).takeErrors(1).toPromise();
574
- }
575
- activateShortcut(keyboardShortcutHandle, appName, appIconUrl) {
576
- console.warn('activateShortcut not implemented');
577
- }
578
- getGmailActionToken = (0, _once.default)(async () => {
579
- const response = await (0, _gmailAjax.default)({
580
- url: `https://mail.google.com/mail${(0, _getAccountUrlPart.default)()}/`,
581
- xhrFields: {
582
- withCredentials: true
583
- },
584
- canRetry: true
585
- });
586
- const tokenVarMatch = response.text.match(/var GM_ACTION_TOKEN=("[^"]+")/);
587
- if (!tokenVarMatch) {
588
- throw new Error('Could not find GM_ACTION_TOKEN');
589
- }
590
- return JSON.parse(tokenVarMatch[1]);
591
- });
592
- getUserEmailAddress() {
593
- const s = document.head.getAttribute('data-inboxsdk-user-email-address');
594
- if (s == null) throw new Error('should not happen');
595
- return s;
596
- }
597
- isConversationViewDisabled() {
598
- return Promise.resolve(false);
599
- }
600
- getUserLanguage() {
601
- return this._pageCommunicator.getUserLanguage();
602
- }
603
- getUserContact() {
604
- return {
605
- emailAddress: this.getUserEmailAddress(),
606
- name: this.getUserEmailAddress()
607
- };
608
- }
609
- getAccountSwitcherContactList() {
610
- console.log('getAccountSwitcherContactList not implemented');
611
- return [this.getUserContact()];
612
- }
613
- registerThreadButton(options) {
614
- const unregister = (0, _kefirStopper.default)();
615
- const removeButtonOnUnregister = button => {
616
- unregister.takeUntilBy(button.getStopper()).onValue(() => {
617
- button.destroy();
618
- });
619
- };
620
- const toolbarViewSub = (0, _toValueObservable.default)(this._toolbarViewDriverLiveSet).subscribe(_ref8 => {
621
- let {
622
- value: inboxToolbarView
623
- } = _ref8;
624
- if (inboxToolbarView.isForThread()) {
625
- if (!options.positions || (0, _includes.default)(options.positions, 'THREAD')) {
626
- if (options.threadSection === 'OTHER') {
627
- console.warn('registerThreadButton does not support OTHER section items in Inbox yet.');
628
- return;
629
- }
630
- removeButtonOnUnregister(inboxToolbarView.addButton({
631
- ...options,
632
- onClick: event => {
633
- options.onClick({
634
- position: 'THREAD',
635
- dropdown: event.dropdown,
636
- selectedThreadViewDrivers: [inboxToolbarView.getThreadViewDriver()],
637
- selectedThreadRowViewDrivers: []
638
- });
639
- }
640
- }));
641
- }
642
- } else if (inboxToolbarView.isForRowList()) {
643
- if (!options.positions || (0, _includes.default)(options.positions, 'LIST')) {
644
- if (options.listSection === 'OTHER') {
645
- console.warn('registerThreadButton does not support OTHER section items in Inbox yet.');
646
- return;
647
- }
648
- removeButtonOnUnregister(inboxToolbarView.addButton({
649
- ...options,
650
- onClick: event => {
651
- options.onClick({
652
- position: 'LIST',
653
- dropdown: event.dropdown,
654
- selectedThreadViewDrivers: [],
655
- selectedThreadRowViewDrivers: this.getSelectedThreadRowViewDrivers()
656
- });
657
- }
658
- }));
659
- }
660
- }
661
- });
662
- unregister.onValue(() => {
663
- toolbarViewSub.unsubscribe();
664
- });
665
- if (!options.positions || (0, _includes.default)(options.positions, 'ROW')) {
666
- const threadRowViewSub = (0, _toValueObservable.default)(this._threadRowViewDriverLiveSet).subscribe(_ref9 => {
667
- let {
668
- value: inboxThreadRowView
669
- } = _ref9;
670
- removeButtonOnUnregister(inboxThreadRowView.addToolbarButton({
671
- ...options,
672
- onClick: event => {
673
- options.onClick({
674
- position: 'ROW',
675
- dropdown: event.dropdown,
676
- selectedThreadViewDrivers: [],
677
- selectedThreadRowViewDrivers: [inboxThreadRowView]
678
- });
679
- }
680
- }));
681
- });
682
- unregister.onValue(() => {
683
- threadRowViewSub.unsubscribe();
684
- });
685
- }
686
- return () => {
687
- unregister.destroy();
688
- };
689
- }
690
- getSelectedThreadRowViewDrivers() {
691
- return Array.from(this.getThreadRowViewDriverLiveSet().values()).filter(threadRowViewDriver => threadRowViewDriver.isSelected());
692
- }
693
- async addNavItem(appId, navItemDescriptor) {
694
- if (!this._navMenuContainer) {
695
- this._navMenuContainer = document.createElement('div');
696
- this._navMenuContainer.classList.add('inboxsdk__navItem_appContainer');
697
- }
698
- return (0, _addNavItem.default)(navItemDescriptor, this._page.tree.getAllByTag('leftNav'), this._navMenuContainer);
699
- }
700
- addSupportItem(supportItemDescriptor) {}
701
- getSentMailNativeNavItem() {
702
- // stub, never resolve
703
- // console.log('getSentMailNativeNavItem not implemented');
704
- return new Promise((resolve, reject) => {});
705
- }
706
- createLink(routeID, params) {
707
- return (0, _createLink.default)(this, routeID, params);
708
- }
709
- async goto(routeID, params) {
710
- (0, _gotoView.default)(this, routeID, params);
711
- }
712
- addCustomRouteID(routeID) {
713
- this._customRouteIDs.add(routeID);
714
- this._pageCommunicator.registerAllowedHashLinkStartTerm(routeID.split('/')[0]);
715
- return () => {
716
- this._customRouteIDs.delete(routeID);
717
- };
718
- }
719
- addCustomListRouteID(routeID, handler) {
720
- console.log('addCustomListRouteID not implemented');
721
- return () => {};
722
- }
723
- showCustomRouteView(el) {
724
- let customViewBase = document.querySelector('body > .inboxsdk__custom_view');
725
- if (!customViewBase) {
726
- const _customViewBase = customViewBase = document.createElement('div');
727
- customViewBase.className = 'inboxsdk__custom_view';
728
- const {
729
- chat,
730
- nav
731
- } = (0, _getSidebarClassnames.default)();
732
- (0, _setCss.default)('custom_view_base_margins', `
733
- .inboxsdk__custom_view.${nav || 'nav_sidebar'} >
734
- .${(0, _idMap.default)('custom_view_container')}.${(0, _idMap.default)('custom_view_min_margins')} {
735
- margin-left: 232px;
736
- }
737
- .inboxsdk__custom_view.${chat || 'chat_sidebar'} >
738
- .${(0, _idMap.default)('custom_view_container')}.${(0, _idMap.default)('custom_view_min_margins')} {
739
- margin-right: 232px;
740
- }
741
- `);
742
-
743
- // Mirror the nav and chat sidebar classnames onto the inboxsdk__custom_view
744
- // element so that if the custom_view_container element also has the centerList
745
- // classname, then Inbox's margin rules for centerList will apply to it.
746
- const main = (0, _querySelectorOrFail.default)(document, 'body > div[class][id][jsaction][jslog]');
747
- (0, _makeMutationObserverChunkedStream.default)(main, {
748
- attributes: true,
749
- attributeFilter: ['class']
750
- }).toProperty(() => null).onValue(() => {
751
- [chat, nav].filter(Boolean).forEach(className => {
752
- if (main.classList.contains(className)) {
753
- _customViewBase.classList.add(className);
754
- } else {
755
- _customViewBase.classList.remove(className);
756
- }
757
- });
758
- });
759
- document.body.appendChild(customViewBase);
760
- }
761
- customViewBase.innerHTML = '';
762
- customViewBase.appendChild(el);
763
- customViewBase.style.display = '';
764
- document.body.classList.add('inboxsdk__custom_view_active');
765
- const main = document.querySelector('[id][jsaction] > div[token][class]');
766
- if (main) {
767
- main.style.display = 'none';
768
- }
769
- }
770
- showNativeRouteView() {
771
- document.body.classList.remove('inboxsdk__custom_view_active');
772
- const customViewBase = document.querySelector('body > .inboxsdk__custom_view');
773
- if (customViewBase) {
774
- customViewBase.style.display = 'none';
775
- customViewBase.innerHTML = '';
776
- }
777
- const main = document.querySelector('[id][jsaction] > div[token][class]');
778
- if (main) {
779
- main.style.display = '';
780
- }
781
- }
782
- setShowNativeNavMarker(isNative) {
783
- // stub
784
- }
785
- setShowNativeAddonSidebar(isNative) {
786
- // stub
787
- }
788
- registerSearchSuggestionsProvider(handler) {
789
- (0, _registerSearchSuggestionsProvider.default)(this, handler);
790
- }
791
- registerSearchQueryRewriter(obj) {
792
- console.log('registerSearchQueryRewriter not implemented');
793
- }
794
- addToolbarButtonForApp(buttonDescriptor) {
795
- const view = new _inboxAppToolbarButtonView.default(buttonDescriptor, this._page.tree.getAllByTag('appToolbarLocation'), this._page.tree.getAllByTag('searchBar'));
796
- return view.waitForReady();
797
- }
798
- addGlobalSidebarContentPanel(buttonDescriptor) {
799
- // stub
800
- return Promise.resolve(null);
801
- }
802
- isRunningInPageContext() {
803
- return !!(global.gbar && global.gbar._CONFIG);
804
- }
805
- showAppIdWarning() {
806
- const topDiv = document.createElement('div');
807
- topDiv.className = 'inboxsdk__appid_warning';
808
- topDiv.innerHTML = `
809
- <button type="button" value="" title="Close" class="inboxsdk__close_button"></button>
810
- <div class="inboxsdk__appid_warning_main">
811
- <div class="topline">InboxSDK Developer Warning: Invalid AppId</div>
812
- <div>You've loaded the InboxSDK with an unregistered appId. Registration is free but necessary to load the SDK.</div>
813
- </div>
814
- <a class="inboxsdk__appid_register" target="_blank" href="https://www.inboxsdk.com/register">Register Your App</a>
815
- `;
816
- document.body.insertBefore(topDiv, document.body.firstChild);
817
- const closeBtn = topDiv.querySelector('.inboxsdk__close_button');
818
- if (!closeBtn) throw new Error('Should not happen');
819
- closeBtn.addEventListener('click', function (e) {
820
- topDiv.remove();
821
- });
822
- }
823
- openDraftByMessageID(messageID) {
824
- throw new Error('Not implemented');
825
- }
826
- createMoleViewDriver(options) {
827
- return new _InboxMoleViewDriver.default(options, this);
828
- }
829
- createModalViewDriver(options) {
830
- return new _inboxModalView.default(options);
831
- }
832
- createTopMessageBarDriver(options) {
833
- throw new Error('Not implemented');
834
- }
835
- createDrawerViewDriver(options) {
836
- const drawerView = new _inboxDrawerView.default(options);
837
- // TODO if a native drawer was already open, we should close the native
838
- // drawer istead of the new one.
839
-
840
- // If a nativeDrawer is opened while the new SDK drawer is open, then close
841
- // the SDK drawer.
842
- _kefir.default.fromESObservable(this._page.tree.getAllByTag('nativeDrawer')).takeUntilBy(drawerView.getClosingStream()).onValue(changes => {
843
- for (let change of changes) {
844
- if (change.type === 'add') {
845
- drawerView.close();
846
- break;
847
- }
848
- }
849
- });
850
- return drawerView;
851
- }
852
- createBackdrop(zIndex, target) {
853
- return new _inboxBackdrop.default(zIndex, target);
854
- }
855
- closeOpenThread() {
856
- (0, _simulateKey.default)(document.body, 27, 27);
857
- }
858
- registerThreadRowViewSelectionHandler(handler) {
859
- return () => {};
860
- }
861
- }
862
- var _default = (0, _ud.defn)(module, InboxDriver);
863
- exports.default = _default;