@inboxsdk/core 0.2.28-alpha.3 → 0.2.28-alpha.5

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 (398) hide show
  1. package/inboxsdk.js +1 -1
  2. package/inboxsdk.js.map +1 -1
  3. package/package.json +5 -1
  4. package/src/build/exec.js +26 -0
  5. package/src/build/spawn.js +17 -0
  6. package/src/common/ajax.js +90 -0
  7. package/src/common/cachebust-url.js +10 -0
  8. package/src/common/censorHTMLstring.js +37 -0
  9. package/src/common/censorHTMLtree.js +28 -0
  10. package/src/common/censorJSONTree.js +15 -0
  11. package/src/common/connectivity-test.js +21 -0
  12. package/src/common/defer.js +11 -0
  13. package/src/common/find-parent.js +10 -0
  14. package/src/common/get-extension-id.js +7 -0
  15. package/src/common/get-or-fail.js +8 -0
  16. package/src/common/get-session-id.js +14 -0
  17. package/src/common/get-stack-trace.js +6 -0
  18. package/src/common/html-to-text.js +7 -0
  19. package/src/common/isElementVisible.js +6 -0
  20. package/src/common/load-script.js +127 -0
  21. package/src/common/log-error.js +191 -0
  22. package/src/common/quoted-split.js +18 -0
  23. package/src/common/rate-limit-queuer.js +57 -0
  24. package/src/common/rate-limit.js +14 -0
  25. package/src/common/version.js +6 -0
  26. package/src/inboxsdk-js/check-requirements.js +7 -3
  27. package/src/inboxsdk-js/header.js +1 -0
  28. package/src/inboxsdk-js/inboxsdk-NONREMOTE-INTEGRATED-PAGEWORLD.js +5 -6
  29. package/src/inboxsdk-js/inboxsdk-NONREMOTE.js +4 -3
  30. package/src/inboxsdk-js/inboxsdk-REMOTE.js +3 -1
  31. package/src/inboxsdk-js/inboxsdk-TEST.js +4 -3
  32. package/src/inboxsdk-js/inboxsdk.js +33 -39
  33. package/src/inboxsdk-js/loading/load-platform-implementation-DEV.js +15 -18
  34. package/src/inboxsdk-js/loading/platform-implementation-loader.js +27 -0
  35. package/src/injected-js/gmail/constants.js +2 -0
  36. package/src/injected-js/gmail/modify-suggestions.js +106 -0
  37. package/src/injected-js/gmail/modify-suggestions.test.js +8 -9
  38. package/src/injected-js/gmail/setup-gmail-interceptor.js +340 -579
  39. package/src/injected-js/gmail/setup-gmonkey-handler.js +49 -0
  40. package/src/injected-js/gmail/sync-compose-processor-20220909.js +298 -0
  41. package/src/injected-js/gmail/sync-compose-processor.js +55 -0
  42. package/src/injected-js/gmail/sync-compose-request-processor.js +110 -0
  43. package/src/injected-js/gmail/sync-compose-request-processor.test.js +39 -49
  44. package/src/injected-js/gmail/thread-identifier/click-and-get-popup-url.js +20 -33
  45. package/src/injected-js/gmail/thread-identifier/index.js +57 -93
  46. package/src/injected-js/gmail/thread-identifier/thread-row-parser.js +22 -31
  47. package/src/injected-js/gmail/thread-identifier/thread-row-parser.test.js +12 -28
  48. package/src/injected-js/inbox/setupAjaxInterceptor.js +64 -121
  49. package/src/injected-js/inbox/setupClickAndGetNewIframeSrc.js +53 -66
  50. package/src/injected-js/inbox/setupComposeViewDraftIDFinder.js +20 -36
  51. package/src/injected-js/inbox/setupInboxFakeWindowResizeListener.js +13 -13
  52. package/src/injected-js/injected-logger.js +50 -0
  53. package/src/injected-js/main.js +11 -24
  54. package/src/injected-js/message-metadata-holder.js +52 -82
  55. package/src/injected-js/setup-data-exposer.js +89 -148
  56. package/src/injected-js/setup-error-silencer.js +21 -21
  57. package/src/injected-js/setup-event-reemitter.js +30 -22
  58. package/src/injected-js/setupCustomViewEventAssassin.js +90 -0
  59. package/src/injected-js/setupInboxCustomViewLinkFixer.js +24 -29
  60. package/src/injected-js/setupPushStateListener.js +18 -11
  61. package/src/injected-js/xhr-helper.js +62 -65
  62. package/src/injected-js/xhr-proxy-factory.js +195 -445
  63. package/src/injected-js/xhr-proxy-factory.test.js +824 -991
  64. package/src/platform-implementation-js/constants/nav-item-types.js +19 -0
  65. package/src/platform-implementation-js/constants/router.js +14 -9
  66. package/src/platform-implementation-js/constants/toolbars.js +8 -3
  67. package/src/platform-implementation-js/dom-driver/gmail/custom-style.js +13 -13
  68. package/src/platform-implementation-js/dom-driver/gmail/gmail-butter-bar-driver.js +115 -136
  69. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/add-app-menu-item.js +21 -0
  70. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/add-collapsible-panel.js +28 -0
  71. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/add-nav-item.js +98 -0
  72. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/add-support-item.js +4 -0
  73. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/add-toolbar-button-for-app.js +13 -14
  74. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/create-link.js +27 -48
  75. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/encodeDraftUrlId.js +8 -0
  76. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/get-draft-id-for-message-id.js +31 -42
  77. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/get-native-nav-item.js +30 -40
  78. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/get-rfc-message-id-for-gmail-message-id.js +12 -0
  79. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/get-rfc-message-id-for-gmail-thread-id.js +33 -0
  80. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/get-url-object.js +10 -18
  81. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/getSyncThreadForOldGmailThreadId.js +21 -28
  82. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/getSyncThreadFromSyncThreadId.js +33 -45
  83. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/gmail-load-event.js +31 -49
  84. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/goto-view.js +58 -65
  85. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/isIntegratedViewGmail.js +4 -0
  86. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/keyboard-shortcut-help-modifier.js +40 -124
  87. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/open-compose-window.js +17 -22
  88. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/open-draft-by-message-id.js +44 -0
  89. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/open-draft-by-message-id.test.js +10 -11
  90. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/override-gmail-back-button.js +44 -80
  91. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/register-search-query-rewriter.js +19 -26
  92. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/register-search-suggestions-provider.js +71 -147
  93. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/setup-compose-view-driver-stream.js +91 -148
  94. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/setup-route-view-driver-stream.js +150 -166
  95. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/setup-route-view-driver-stream.test.js +70 -120
  96. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/show-app-id-warning.js +15 -15
  97. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/show-custom-route-view.js +44 -67
  98. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/show-custom-thread-list.js +230 -379
  99. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/show-custom-thread-list.test.js +121 -307
  100. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/show-native-route-view.js +17 -24
  101. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/suppressAddon.js +41 -49
  102. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/temporary-track-download-url-validity.js +30 -40
  103. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/thread-row-identifier.js +28 -60
  104. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/track-events.js +61 -133
  105. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/track-gmail-styles.js +95 -0
  106. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/user-info.js +30 -42
  107. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/user-info.test.js +52 -46
  108. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver.js +354 -694
  109. package/src/platform-implementation-js/dom-driver/gmail/gmail-element-getter/get-main-content-element-changed-stream.js +38 -0
  110. package/src/platform-implementation-js/dom-driver/gmail/gmail-element-getter/wait-for-gmail-mode-to-settle.js +12 -0
  111. package/src/platform-implementation-js/dom-driver/gmail/gmail-element-getter.js +253 -0
  112. package/src/platform-implementation-js/dom-driver/gmail/gmail-page-communicator.js +200 -0
  113. package/src/platform-implementation-js/dom-driver/gmail/gmail-response-processor.js +533 -0
  114. package/src/platform-implementation-js/dom-driver/gmail/gmail-sync-response-processor.js +289 -0
  115. package/src/platform-implementation-js/dom-driver/gmail/is-compose-titlebar-light-color.js +21 -0
  116. package/src/platform-implementation-js/dom-driver/gmail/make-xhr-interceptor.js +77 -93
  117. package/src/platform-implementation-js/dom-driver/gmail/makePageParserTree.js +28 -0
  118. package/src/platform-implementation-js/dom-driver/gmail/pageParserOptions.js +19 -0
  119. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-menu-item-view.js +126 -0
  120. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-sidebar-view/index.js +35 -82
  121. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-sidebar-view/index.test.js +44 -94
  122. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-sidebar-view/primary/add-companion-global-icon-area.js +12 -19
  123. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-sidebar-view/primary/add-companion-thread-icon-area.js +17 -29
  124. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-sidebar-view/primary/add-to-icon-area.js +26 -26
  125. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-sidebar-view/primary/index.js +391 -797
  126. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-toolbar-button-view/monitor-top-banner-size-and-react.js +7 -9
  127. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-toolbar-button-view.js +60 -109
  128. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-attachment-area-view.js +95 -135
  129. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-attachment-card-view.js +103 -211
  130. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-attachment-card-view.test.js +61 -61
  131. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-backdrop.js +17 -17
  132. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-collapsible-section-view.js +188 -541
  133. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-button.js +67 -135
  134. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-compose-notice.js +27 -49
  135. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-inner-sidebar.js +7 -13
  136. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-outer-sidebar.js +9 -22
  137. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-recipient-row.js +36 -63
  138. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-status-bar.js +101 -0
  139. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-tooltip-to-button.js +38 -113
  140. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/detectClassicRecipientsArea.js +38 -0
  141. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/ensure-app-button-toolbars-are-closed.js +11 -16
  142. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/ensure-grouping-is-open.js +11 -17
  143. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/focus.js +8 -11
  144. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/from-manager.js +27 -47
  145. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-additional-action-toolbar.js +11 -24
  146. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-address-changes-stream.js +59 -111
  147. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-address-information-extractor.js +28 -0
  148. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-body-changes-stream.js +15 -14
  149. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-formatting-area-offset-left.js +11 -17
  150. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-minimized-stream.js +18 -24
  151. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-recipients.js +22 -0
  152. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-response-type-changes-stream.js +19 -23
  153. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/gmail-compose-button-view.js +233 -0
  154. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/insert-link-into-body.js +11 -19
  155. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/manage-button-grouping.js +141 -376
  156. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/monitor-selection-range.js +17 -28
  157. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/override-edit-subject.js +34 -70
  158. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/page-parser.js +223 -0
  159. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/position-formatting-toolbar.js +10 -17
  160. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/set-recipients.js +157 -0
  161. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/setupLinkPopovers.js +109 -0
  162. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/size-fixer.js +83 -137
  163. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/update-insert-more-area-left.js +10 -19
  164. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view.js +632 -1190
  165. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-message-view/attachment-icon.js +5 -0
  166. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-message-view/get-updated-contact.js +29 -38
  167. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-message-view.js +327 -617
  168. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-nav-item-view.js +759 -0
  169. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-route-view/gmail-route-processor.js +26 -49
  170. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-route-view/gmail-route-view.js +188 -380
  171. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-row-list-view.js +104 -194
  172. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-support-item-view.js +84 -0
  173. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-thread-row-view.js +382 -811
  174. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-thread-sidebar-view/add-icon-area.js +34 -58
  175. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-thread-sidebar-view.js +330 -581
  176. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-thread-sidebar-view.test.js +123 -277
  177. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-thread-view/width-manager.js +15 -35
  178. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-thread-view.js +216 -571
  179. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-toolbar-view.js +152 -336
  180. package/src/platform-implementation-js/dom-driver/gmail/views/native-gmail-nav-item-view.js +87 -211
  181. package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/button-color-classes.js +33 -0
  182. package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/button-view.js +325 -0
  183. package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/create-accessory-button-view.js +58 -0
  184. package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/create-parent-accessory-button-view.js +55 -0
  185. package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/inbox-dropdown-button-view.js +10 -11
  186. package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/modal-button-view.js +96 -0
  187. package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/more-dropdown-button-view.js +30 -0
  188. package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/more-parent-accessory-button-view.js +10 -0
  189. package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-action-button-view.js +20 -29
  190. package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-dropdown-view.js +22 -0
  191. package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-label-view.js +41 -76
  192. package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-modal-view-driver.js +45 -99
  193. package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-mole-view-driver.js +76 -128
  194. package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-tooltip-view.js +128 -319
  195. package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-top-message-bar-driver.js +45 -78
  196. package/src/platform-implementation-js/dom-driver/inbox/__mocks__/getSidebarClassnames.js +8 -4
  197. package/src/platform-implementation-js/dom-driver/inbox/addNavItem.js +36 -54
  198. package/src/platform-implementation-js/dom-driver/inbox/addRecipientRow.js +35 -53
  199. package/src/platform-implementation-js/dom-driver/inbox/createLink.js +13 -15
  200. package/src/platform-implementation-js/dom-driver/inbox/createLink.test.js +15 -18
  201. package/src/platform-implementation-js/dom-driver/inbox/custom-style.js +14 -13
  202. package/src/platform-implementation-js/dom-driver/inbox/detection/appToolbarLocation/parser.js +14 -20
  203. package/src/platform-implementation-js/dom-driver/inbox/detection/attachmentCard/parser.js +14 -13
  204. package/src/platform-implementation-js/dom-driver/inbox/detection/attachmentOverlay/parser.js +35 -67
  205. package/src/platform-implementation-js/dom-driver/inbox/detection/chatSidebar/parser.js +16 -18
  206. package/src/platform-implementation-js/dom-driver/inbox/detection/compose/parser.js +68 -185
  207. package/src/platform-implementation-js/dom-driver/inbox/detection/message/parser.js +28 -56
  208. package/src/platform-implementation-js/dom-driver/inbox/detection/nativeDrawer/parser.js +12 -10
  209. package/src/platform-implementation-js/dom-driver/inbox/detection/searchBar/parser.js +16 -16
  210. package/src/platform-implementation-js/dom-driver/inbox/detection/thread/parser.js +24 -35
  211. package/src/platform-implementation-js/dom-driver/inbox/detection/thread-row/parser.js +37 -89
  212. package/src/platform-implementation-js/dom-driver/inbox/getComposeViewDriverLiveSet.js +56 -78
  213. package/src/platform-implementation-js/dom-driver/inbox/getInboxMessageIdForInboxThreadId.js +26 -32
  214. package/src/platform-implementation-js/dom-driver/inbox/getSidebarClassnames.js +52 -109
  215. package/src/platform-implementation-js/dom-driver/inbox/getSidebarClassnames.test.js +7 -8
  216. package/src/platform-implementation-js/dom-driver/inbox/gotoView.js +16 -20
  217. package/src/platform-implementation-js/dom-driver/inbox/gotoView.test.js +15 -16
  218. package/src/platform-implementation-js/dom-driver/inbox/inbox-butter-bar-driver.js +75 -83
  219. package/src/platform-implementation-js/dom-driver/inbox/inbox-driver.js +530 -822
  220. package/src/platform-implementation-js/dom-driver/inbox/inbox-page-communicator.js +48 -61
  221. package/src/platform-implementation-js/dom-driver/inbox/inboxResponseProcessor.js +9 -12
  222. package/src/platform-implementation-js/dom-driver/inbox/inboxResponseProcessor.test.js +12 -19
  223. package/src/platform-implementation-js/dom-driver/inbox/makePageParserTree.js +24 -33
  224. package/src/platform-implementation-js/dom-driver/inbox/pageParserOptions.js +201 -388
  225. package/src/platform-implementation-js/dom-driver/inbox/registerSearchSuggestionsProvider.js +249 -265
  226. package/src/platform-implementation-js/dom-driver/inbox/setupCustomAutocompleteSelectionHandling.js +84 -152
  227. package/src/platform-implementation-js/dom-driver/inbox/setupRouteViewDriverStream.js +55 -67
  228. package/src/platform-implementation-js/dom-driver/inbox/setupRouteViewDriverStream.test.js +43 -65
  229. package/src/platform-implementation-js/dom-driver/inbox/views/InboxLabelView.js +31 -56
  230. package/src/platform-implementation-js/dom-driver/inbox/views/InboxMoleViewDriver.js +191 -294
  231. package/src/platform-implementation-js/dom-driver/inbox/views/InboxToolbarButtonView.js +32 -45
  232. package/src/platform-implementation-js/dom-driver/inbox/views/InboxToolbarView.js +21 -39
  233. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-app-sidebar-view.js +153 -240
  234. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-app-toolbar-button-view.js +75 -150
  235. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-app-toolbar-tooltip-view.js +20 -37
  236. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-attachment-card-view.js +60 -114
  237. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-attachment-overlay-view.js +47 -65
  238. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-backdrop.js +41 -52
  239. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-chat-sidebar-view.js +27 -36
  240. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-compose-button-view.js +52 -80
  241. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-compose-view.js +465 -649
  242. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-custom-route-view.js +37 -58
  243. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-custom-route-view.test.js +14 -26
  244. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-drawer-view.js +118 -235
  245. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-dropdown-view.js +10 -11
  246. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-dummy-route-view.js +28 -46
  247. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-message-view.js +131 -202
  248. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-modal-view.js +40 -80
  249. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-route-view.js +35 -61
  250. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-thread-row-view.js +124 -221
  251. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-thread-view.js +125 -213
  252. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-thread-view.test.js +104 -126
  253. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-tooltip-view.js +36 -51
  254. package/src/platform-implementation-js/dom-driver/inbox/views/inboxNavItemView.js +158 -297
  255. package/src/platform-implementation-js/dom-driver/inbox/waitForAnimationClickBlockerGone.js +21 -35
  256. package/src/platform-implementation-js/driver-common/compose/getDiscardStream.js +24 -43
  257. package/src/platform-implementation-js/driver-common/compose/getPresendingStream.js +39 -68
  258. package/src/platform-implementation-js/driver-common/getAccountUrlPart.js +17 -0
  259. package/src/platform-implementation-js/driver-common/getGmailMessageIdForSyncMessageId.js +14 -19
  260. package/src/platform-implementation-js/driver-common/getGmailThreadIdForRfcMessageId.js +27 -35
  261. package/src/platform-implementation-js/driver-common/getOriginalMessagePage.js +33 -0
  262. package/src/platform-implementation-js/driver-common/getRfcMessageIdForSyncMessageId.js +16 -22
  263. package/src/platform-implementation-js/driver-common/getSyncThreadsForSearch.js +49 -0
  264. package/src/platform-implementation-js/driver-common/getThreadIdFromMessageId.js +14 -14
  265. package/src/platform-implementation-js/driver-common/gmailAjax.js +65 -0
  266. package/src/platform-implementation-js/driver-common/inboxAjax.js +12 -7
  267. package/src/platform-implementation-js/driver-common/render-custom-icon.js +16 -0
  268. package/src/platform-implementation-js/driver-common/requestGmailThread.js +19 -20
  269. package/src/platform-implementation-js/driver-common/sidebar/AppSidebar.js +197 -306
  270. package/src/platform-implementation-js/driver-common/sidebar/ContentPanelViewDriver.js +113 -161
  271. package/src/platform-implementation-js/driver-common/update-icon.js +90 -0
  272. package/src/platform-implementation-js/driver-interfaces/compose-view-driver.js +1 -114
  273. package/src/platform-implementation-js/driver-interfaces/driver.js +1 -131
  274. package/src/platform-implementation-js/driver-interfaces/message-view-driver.js +4 -48
  275. package/src/platform-implementation-js/driver-interfaces/mole-view-driver.js +1 -29
  276. package/src/platform-implementation-js/driver-interfaces/route-view-driver.js +1 -32
  277. package/src/platform-implementation-js/driver-interfaces/thread-row-view-driver.js +1 -11
  278. package/src/platform-implementation-js/lib/ErrorCollector.js +47 -0
  279. package/src/platform-implementation-js/lib/Membrane.js +22 -0
  280. package/src/platform-implementation-js/lib/ScrollableContainByScreen.js +30 -0
  281. package/src/platform-implementation-js/lib/array-to-lifetimes.js +43 -41
  282. package/src/platform-implementation-js/lib/array-to-lifetimes.test.js +139 -155
  283. package/src/platform-implementation-js/lib/attemptWithRetries.js +16 -0
  284. package/src/platform-implementation-js/lib/common-page-communicator.js +137 -0
  285. package/src/platform-implementation-js/lib/copyAndValidateAutocompleteResults.js +19 -38
  286. package/src/platform-implementation-js/lib/css-selector-escape.js +7 -3
  287. package/src/platform-implementation-js/lib/delay-asap.js +12 -0
  288. package/src/platform-implementation-js/lib/delay-idle.js +16 -0
  289. package/src/platform-implementation-js/lib/dom/block-and-reemit-keyboard-events.js +36 -0
  290. package/src/platform-implementation-js/lib/dom/element-view-mapper.js +8 -11
  291. package/src/platform-implementation-js/lib/dom/generic-button-view.js +39 -0
  292. package/src/platform-implementation-js/lib/dom/get-insert-before-element.js +39 -0
  293. package/src/platform-implementation-js/lib/dom/get-selection.js +23 -52
  294. package/src/platform-implementation-js/lib/dom/insert-element-in-order.js +38 -0
  295. package/src/platform-implementation-js/lib/dom/insert-html-at-cursor.js +69 -101
  296. package/src/platform-implementation-js/lib/dom/is-node-in-range.js +8 -10
  297. package/src/platform-implementation-js/lib/dom/keyboard-shortcut-stream.js +12 -0
  298. package/src/platform-implementation-js/lib/dom/make-element-child-stream.js +79 -0
  299. package/src/platform-implementation-js/lib/dom/make-element-stream-merger.js +28 -0
  300. package/src/platform-implementation-js/lib/dom/make-element-view-stream.js +15 -0
  301. package/src/platform-implementation-js/lib/dom/make-mutation-observer-chunked-stream.js +15 -0
  302. package/src/platform-implementation-js/lib/dom/make-mutation-observer-stream.js +5 -0
  303. package/src/platform-implementation-js/lib/dom/on-mouse-down-and-up.js +15 -17
  304. package/src/platform-implementation-js/lib/dom/outsideClicksAndEscape.js +39 -0
  305. package/src/platform-implementation-js/lib/dom/parentNodes.js +8 -0
  306. package/src/platform-implementation-js/lib/dom/querySelectorOne.js +8 -11
  307. package/src/platform-implementation-js/lib/dom/querySelectorOrFail.js +6 -0
  308. package/src/platform-implementation-js/lib/dom/reemitClickEventForReact.js +22 -0
  309. package/src/platform-implementation-js/lib/dom/set-css.js +7 -3
  310. package/src/platform-implementation-js/lib/dom/set-value-and-dispatch-event.js +9 -11
  311. package/src/platform-implementation-js/lib/dom/simulate-drag-and-drop.js +32 -33
  312. package/src/platform-implementation-js/lib/dom/simulate-key.js +46 -0
  313. package/src/platform-implementation-js/lib/dom/simulate-mouse-event.js +16 -0
  314. package/src/platform-implementation-js/lib/dom/trigger-relay-event.js +7 -0
  315. package/src/platform-implementation-js/lib/extract-contact-from-email-contact-string.js +25 -0
  316. package/src/platform-implementation-js/lib/extract-contact-from-email-contact-string.test.js +23 -26
  317. package/src/platform-implementation-js/lib/fake-window-resize.js +5 -0
  318. package/src/platform-implementation-js/lib/from-event-target-capture.js +12 -0
  319. package/src/platform-implementation-js/lib/fromEventsWithOptions.js +10 -0
  320. package/src/platform-implementation-js/lib/handle-compose-link-chips.js +86 -149
  321. package/src/platform-implementation-js/lib/handler-registry.js +67 -0
  322. package/src/platform-implementation-js/lib/idMap.js +45 -0
  323. package/src/platform-implementation-js/lib/imageRequest.js +8 -0
  324. package/src/platform-implementation-js/lib/incrementName.js +7 -0
  325. package/src/platform-implementation-js/lib/inject-script-EMBEDDED.js +14 -0
  326. package/src/platform-implementation-js/lib/inject-script.js +33 -0
  327. package/src/platform-implementation-js/lib/insert-link-chip-into-body.js +42 -57
  328. package/src/platform-implementation-js/lib/is-valid-app-id.js +27 -0
  329. package/src/platform-implementation-js/lib/is-valid-email.js +14 -0
  330. package/src/platform-implementation-js/lib/isNotNil.js +5 -0
  331. package/src/platform-implementation-js/lib/isStreakAppId.js +11 -0
  332. package/src/platform-implementation-js/lib/logger.js +441 -0
  333. package/src/platform-implementation-js/lib/make-revocable-function.js +19 -21
  334. package/src/platform-implementation-js/lib/make-revocable-function.test.js +20 -22
  335. package/src/platform-implementation-js/lib/parseParamsFromRouteID.js +15 -17
  336. package/src/platform-implementation-js/lib/parseParamsFromRouteID.test.js +9 -18
  337. package/src/platform-implementation-js/lib/persistent-queue.js +107 -0
  338. package/src/platform-implementation-js/lib/populateRouteID.js +8 -9
  339. package/src/platform-implementation-js/lib/populateRouteID.test.js +20 -19
  340. package/src/platform-implementation-js/lib/react/ElementContainer.js +23 -20
  341. package/src/platform-implementation-js/lib/rewriteCssWithIdMap.js +10 -9
  342. package/src/platform-implementation-js/lib/rewriteCssWithIdMap.test.js +13 -20
  343. package/src/platform-implementation-js/lib/routeIDmatchesHash.js +13 -18
  344. package/src/platform-implementation-js/lib/routeIDmatchesHash.test.js +11 -17
  345. package/src/platform-implementation-js/lib/safe-event-emitter.js +17 -0
  346. package/src/platform-implementation-js/lib/shared-style.js +14 -13
  347. package/src/platform-implementation-js/lib/stopper-pool.js +41 -0
  348. package/src/platform-implementation-js/lib/stream-wait-for.js +30 -0
  349. package/src/platform-implementation-js/lib/toItemWithLifetimeStream.js +18 -17
  350. package/src/platform-implementation-js/lib/toLiveSet.js +17 -15
  351. package/src/platform-implementation-js/lib/wait-for.js +28 -0
  352. package/src/platform-implementation-js/lib/waitForAsync.js +19 -0
  353. package/src/platform-implementation-js/main-INTEGRATED-PAGEWORLD.js +6 -5
  354. package/src/platform-implementation-js/main.js +9 -24
  355. package/src/platform-implementation-js/namespaces/app-menu.d.ts.map +1 -1
  356. package/src/platform-implementation-js/namespaces/app-menu.js +31 -0
  357. package/src/platform-implementation-js/namespaces/butter-bar.js +163 -0
  358. package/src/platform-implementation-js/namespaces/compose.js +37 -60
  359. package/src/platform-implementation-js/namespaces/conversations.js +52 -124
  360. package/src/platform-implementation-js/namespaces/global.js +27 -39
  361. package/src/platform-implementation-js/namespaces/keyboard.js +29 -33
  362. package/src/platform-implementation-js/namespaces/lists.js +25 -31
  363. package/src/platform-implementation-js/namespaces/modal.js +34 -28
  364. package/src/platform-implementation-js/namespaces/nav-menu.js +30 -45
  365. package/src/platform-implementation-js/namespaces/router.js +70 -137
  366. package/src/platform-implementation-js/namespaces/search.js +19 -17
  367. package/src/platform-implementation-js/namespaces/toolbars.js +71 -117
  368. package/src/platform-implementation-js/namespaces/user.js +36 -37
  369. package/src/platform-implementation-js/namespaces/widgets.js +54 -61
  370. package/src/platform-implementation-js/platform-implementation.js +98 -229
  371. package/src/platform-implementation-js/views/SimpleElementView.js +16 -0
  372. package/src/platform-implementation-js/views/app-menu-item-view.js +257 -0
  373. package/src/platform-implementation-js/views/app-toolbar-button-view.js +26 -47
  374. package/src/platform-implementation-js/views/collapsible-panel-view.js +222 -0
  375. package/src/platform-implementation-js/views/collapsible-section-view.js +66 -63
  376. package/src/platform-implementation-js/views/compose-button-view.js +45 -0
  377. package/src/platform-implementation-js/views/compose-view.js +312 -0
  378. package/src/platform-implementation-js/views/content-panel-view.js +28 -30
  379. package/src/platform-implementation-js/views/conversations/attachment-card-view.js +21 -44
  380. package/src/platform-implementation-js/views/conversations/custom-message-view.js +44 -104
  381. package/src/platform-implementation-js/views/conversations/message-view.js +131 -202
  382. package/src/platform-implementation-js/views/conversations/thread-view.js +75 -127
  383. package/src/platform-implementation-js/views/keyboard-shortcut-handle.js +14 -0
  384. package/src/platform-implementation-js/views/native-nav-item-view.js +32 -65
  385. package/src/platform-implementation-js/views/nav-item-view.js +51 -115
  386. package/src/platform-implementation-js/views/route-view/custom-route-view.js +25 -20
  387. package/src/platform-implementation-js/views/route-view/dummy-route-view-driver.js +18 -18
  388. package/src/platform-implementation-js/views/route-view/list-route-view.js +30 -52
  389. package/src/platform-implementation-js/views/route-view/route-view.js +24 -35
  390. package/src/platform-implementation-js/views/section-view.js +60 -52
  391. package/src/platform-implementation-js/views/thread-row-view.js +49 -74
  392. package/src/platform-implementation-js/widgets/buttons/basic-button-view-controller.js +39 -0
  393. package/src/platform-implementation-js/widgets/buttons/dropdown-button-view-controller.js +98 -0
  394. package/src/platform-implementation-js/widgets/buttons/dropdown-view.js +122 -0
  395. package/src/platform-implementation-js/widgets/drawer-view.js +29 -36
  396. package/src/platform-implementation-js/widgets/modal-view.js +39 -68
  397. package/src/platform-implementation-js/widgets/mole-view.js +22 -22
  398. package/src/platform-implementation-js/widgets/top-message-bar-view.js +13 -10
@@ -1,317 +1,301 @@
1
- /* @flow */
2
-
3
- import type InboxDriver from './inbox-driver';
4
- import type { AutocompleteSearchResult } from '../../../injected-js/gmail/modify-suggestions';
5
-
6
- import Kefir from 'kefir';
7
- import kefirBus from 'kefir-bus';
8
- import kefirStopper from 'kefir-stopper';
9
- import toItemWithLifetimeStream from '../../lib/toItemWithLifetimeStream';
10
- import makeMutationObserverChunkedStream from '../../lib/dom/make-mutation-observer-chunked-stream';
11
- import fromEventTargetCapture from '../../lib/from-event-target-capture';
12
- import insertElementInOrder from '../../lib/dom/insert-element-in-order';
13
- import searchBarParser from './detection/searchBar/parser';
14
- import copyAndValidateAutocompleteResults from '../../lib/copyAndValidateAutocompleteResults';
15
- import setupCustomAutocompleteSelectionHandling from './setupCustomAutocompleteSelectionHandling';
16
- import autoHtml from 'auto-html';
17
-
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = registerSearchSuggestionsProvider;
8
+ var _kefir = _interopRequireDefault(require("kefir"));
9
+ var _kefirBus = _interopRequireDefault(require("kefir-bus"));
10
+ var _kefirStopper = _interopRequireDefault(require("kefir-stopper"));
11
+ var _toItemWithLifetimeStream = _interopRequireDefault(require("../../lib/toItemWithLifetimeStream"));
12
+ var _makeMutationObserverChunkedStream = _interopRequireDefault(require("../../lib/dom/make-mutation-observer-chunked-stream"));
13
+ var _fromEventTargetCapture = _interopRequireDefault(require("../../lib/from-event-target-capture"));
14
+ var _insertElementInOrder = _interopRequireDefault(require("../../lib/dom/insert-element-in-order"));
15
+ var _parser = _interopRequireDefault(require("./detection/searchBar/parser"));
16
+ var _copyAndValidateAutocompleteResults = _interopRequireDefault(require("../../lib/copyAndValidateAutocompleteResults"));
17
+ var _setupCustomAutocompleteSelectionHandling = _interopRequireDefault(require("./setupCustomAutocompleteSelectionHandling"));
18
+ var _autoHtml = _interopRequireDefault(require("auto-html"));
18
19
  const ORDERING_ATTR = 'data-inboxsdk-search-provider-count';
19
- const DEFAULT_RESULT_ICON =
20
- '//www.gstatic.com/images/icons/material/system/2x/search_black_24dp.png';
21
-
20
+ const DEFAULT_RESULT_ICON = '//www.gstatic.com/images/icons/material/system/2x/search_black_24dp.png';
22
21
  const getProviderOrder = () => {
23
- const { documentElement } = document;
22
+ const {
23
+ documentElement
24
+ } = document;
24
25
  if (!documentElement) {
25
26
  throw new Error();
26
27
  }
27
28
  const orderAttr = documentElement.getAttribute(ORDERING_ATTR);
28
29
  const providerOrder = (orderAttr ? parseInt(orderAttr) + 1 : 0).toString();
29
-
30
30
  documentElement.setAttribute(ORDERING_ATTR, providerOrder);
31
-
32
31
  return providerOrder;
33
32
  };
34
-
35
- const handleResultChosen = ({ driver, searchInput, result, event }) => {
33
+ const handleResultChosen = _ref => {
34
+ let {
35
+ driver,
36
+ searchInput,
37
+ result,
38
+ event
39
+ } = _ref;
36
40
  if (typeof result.onClick === 'function') {
37
41
  result.onClick();
38
42
  }
39
-
40
43
  if (typeof result.externalURL === 'string') {
41
44
  window.open(result.externalURL);
42
45
  }
43
-
44
46
  if (result.routeName && result.routeParams) {
45
47
  driver.goto(result.routeName, result.routeParams);
46
48
  }
47
-
48
49
  if (typeof result.searchTerm === 'string') {
49
50
  searchInput.value = result.searchTerm;
50
51
  searchInput.dispatchEvent(new Event('input'));
51
52
  }
52
53
  };
53
-
54
- const renderResultsList = ({
55
- driver,
56
- searchInput,
57
- removalStream,
58
- results,
59
- providerOrder,
60
- }) => {
54
+ const renderResultsList = _ref2 => {
55
+ let {
56
+ driver,
57
+ searchInput,
58
+ removalStream,
59
+ results,
60
+ providerOrder
61
+ } = _ref2;
61
62
  const container = document.createElement('div');
62
-
63
63
  container.setAttribute('data-order-hint', providerOrder);
64
64
  container.classList.add('inboxsdk__search_suggestion_group');
65
-
66
- results.forEach((result) => {
65
+ results.forEach(result => {
67
66
  const listItem = document.createElement('li');
68
-
69
- const description =
70
- result.description || result.descriptionHTML
71
- ? autoHtml`
67
+ const description = result.description || result.descriptionHTML ? (0, _autoHtml.default)`
72
68
  <span class="inboxsdk__search_suggestion_desc">
73
- ${result.description || { __html: (result.descriptionHTML: any) }}
69
+ ${result.description || {
70
+ __html: result.descriptionHTML
71
+ }}
74
72
  </span>
75
- `
76
- : '';
77
-
73
+ ` : '';
78
74
  listItem.classList.add('inboxsdk__search_suggestion');
79
- listItem.innerHTML = autoHtml`
75
+ listItem.innerHTML = (0, _autoHtml.default)`
80
76
  <img src="${result.iconUrl || DEFAULT_RESULT_ICON}">
81
77
  <span>
82
78
  <span class="inboxsdk__search_suggestion_name" role="option">
83
- ${result.name || { __html: (result.nameHTML: any) }}
79
+ ${result.name || {
80
+ __html: result.nameHTML
81
+ }}
84
82
  </span>
85
- ${{ __html: description }}
83
+ ${{
84
+ __html: description
85
+ }}
86
86
  </span>
87
87
  `;
88
-
89
- Kefir.fromEvents(listItem, 'click')
90
- .takeUntilBy(removalStream)
91
- .onValue((event: MouseEvent) =>
92
- handleResultChosen({ driver, searchInput, result, event })
93
- );
94
-
88
+ _kefir.default.fromEvents(listItem, 'click').takeUntilBy(removalStream).onValue(event => handleResultChosen({
89
+ driver,
90
+ searchInput,
91
+ result,
92
+ event
93
+ }));
95
94
  container.appendChild(listItem);
96
95
  });
97
-
98
96
  return container;
99
97
  };
100
-
101
- export default function registerSearchSuggestionsProvider(
102
- driver: InboxDriver,
103
- handler: (string) => Promise<Array<AutocompleteSearchResult>>
104
- ) {
105
- const stopper = kefirStopper();
98
+ function registerSearchSuggestionsProvider(driver, handler) {
99
+ const stopper = (0, _kefirStopper.default)();
106
100
  const providerOrder = getProviderOrder();
107
-
108
- toItemWithLifetimeStream(driver.getTagTree().getAllByTag('searchBar'))
109
- .flatMap(({ el, removalStream }) => {
110
- const { searchInput } = searchBarParser(el.getValue()).elements;
111
- if (searchInput instanceof HTMLInputElement) {
112
- return Kefir.constant({
113
- searchInput,
114
- searchInputRemovalStream: removalStream,
115
- });
116
- } else {
117
- return Kefir.never();
118
- }
119
- })
120
- .flatMap(({ searchInput, searchInputRemovalStream }) =>
121
- toItemWithLifetimeStream(
122
- driver.getTagTree().getAllByTag('searchAutocompleteResults')
123
- )
124
- .takeUntilBy(searchInputRemovalStream)
125
- .map(({ el, removalStream }) => ({
126
- searchInput,
127
- searchInputRemovalStream,
128
- resultsEl: el.getValue(),
129
- resultsElRemovalStream: removalStream,
130
- }))
131
- )
132
- .flatMap(
133
- ({
101
+ (0, _toItemWithLifetimeStream.default)(driver.getTagTree().getAllByTag('searchBar')).flatMap(_ref3 => {
102
+ let {
103
+ el,
104
+ removalStream
105
+ } = _ref3;
106
+ const {
107
+ searchInput
108
+ } = (0, _parser.default)(el.getValue()).elements;
109
+ if (searchInput instanceof HTMLInputElement) {
110
+ return _kefir.default.constant({
134
111
  searchInput,
135
- searchInputRemovalStream,
136
- resultsEl,
137
- resultsElRemovalStream,
138
- }) => {
139
- const inputs: Kefir.Observable<{ target: HTMLInputElement } & Event> =
140
- Kefir.fromEvents(searchInput, 'input')
141
- .takeUntilBy(searchInputRemovalStream)
142
- .takeUntilBy(resultsElRemovalStream);
143
-
144
- const enterAndTabPresses: Kefir.Observable<KeyboardEvent> =
145
- Kefir.fromEvents(searchInput, 'keydown')
146
- .filter(({ keyCode }) => keyCode === 13 || keyCode === 9)
147
- .takeUntilBy(searchInputRemovalStream)
148
- .takeUntilBy(resultsElRemovalStream);
149
-
150
- return inputs.map((event) => ({
151
- event,
152
- searchInput,
153
- resultsEl,
154
- inputStream: inputs,
155
- enterAndTabPresses,
156
- resultsElRemovalStream,
157
- }));
158
- }
159
- )
160
- .flatMapLatest((item) => {
161
- const suggestionsResponse = driver
162
- .getPageCommunicator()
163
- .ajaxInterceptStream.filter(
164
- ({ type }) => type === 'searchSuggestionsReceieved'
165
- );
166
-
167
- const removalStream = Kefir.merge([
168
- // Handle cleanup when a new search query is entered. We want to wait
169
- // to remove our old results until *after* Inbox's results from the new
170
- // query have come back, since that will allow our modifications to
171
- // switch from old -> new in sync with Inbox's native suggestions.
172
- // If we didn't wait on `suggestionsResponse` to trigger cleanup,
173
- // Our modifications would disappear the moment the user started typing,
174
- // which ends up looking jarring and inconsistent with Inbox's results
175
- // which stick around until the new results are ready.
176
- item.inputStream.take(1).flatMap(() => suggestionsResponse),
177
-
178
- // Handle cleanup when the user deletes their entire search query.
179
- item.inputStream.filter(({ target: { value } }) => value === ''),
180
- item.resultsElRemovalStream,
181
- ]).take(1);
182
-
183
- return Kefir.combine([
184
- Kefir.fromPromise(Promise.resolve(handler(item.event.target.value))),
185
- // Wait to send results to the UI until Inbox's results have come back
186
- // to avoid rendering too soon.
187
- suggestionsResponse.take(1),
188
- ])
189
- .takeUntilBy(removalStream)
190
- .map(([results, _ignored]: [Array<AutocompleteSearchResult>, any]) => ({
191
- ...item,
192
- removalStream,
193
- results,
194
- }));
195
- })
196
- .takeUntilBy(stopper)
197
- .flatMap(
198
- ({
199
- resultsEl,
112
+ searchInputRemovalStream: removalStream
113
+ });
114
+ } else {
115
+ return _kefir.default.never();
116
+ }
117
+ }).flatMap(_ref4 => {
118
+ let {
119
+ searchInput,
120
+ searchInputRemovalStream
121
+ } = _ref4;
122
+ return (0, _toItemWithLifetimeStream.default)(driver.getTagTree().getAllByTag('searchAutocompleteResults')).takeUntilBy(searchInputRemovalStream).map(_ref5 => {
123
+ let {
124
+ el,
125
+ removalStream
126
+ } = _ref5;
127
+ return {
200
128
  searchInput,
201
- resultsElRemovalStream,
202
- removalStream,
203
- enterAndTabPresses,
204
- results,
205
- }) => {
206
- try {
207
- const validatedResults = copyAndValidateAutocompleteResults(
208
- driver,
209
- results
210
- );
211
-
212
- return Kefir.constant({
213
- resultsEl,
214
- searchInput,
215
- resultsElRemovalStream,
216
- removalStream,
217
- enterAndTabPresses,
218
- results: validatedResults,
219
- });
220
- } catch (error) {
221
- return Kefir.constantError(error);
129
+ searchInputRemovalStream,
130
+ resultsEl: el.getValue(),
131
+ resultsElRemovalStream: removalStream
132
+ };
133
+ });
134
+ }).flatMap(_ref6 => {
135
+ let {
136
+ searchInput,
137
+ searchInputRemovalStream,
138
+ resultsEl,
139
+ resultsElRemovalStream
140
+ } = _ref6;
141
+ const inputs = _kefir.default.fromEvents(searchInput, 'input').takeUntilBy(searchInputRemovalStream).takeUntilBy(resultsElRemovalStream);
142
+ const enterAndTabPresses = _kefir.default.fromEvents(searchInput, 'keydown').filter(_ref7 => {
143
+ let {
144
+ keyCode
145
+ } = _ref7;
146
+ return keyCode === 13 || keyCode === 9;
147
+ }).takeUntilBy(searchInputRemovalStream).takeUntilBy(resultsElRemovalStream);
148
+ return inputs.map(event => ({
149
+ event,
150
+ searchInput,
151
+ resultsEl,
152
+ inputStream: inputs,
153
+ enterAndTabPresses,
154
+ resultsElRemovalStream
155
+ }));
156
+ }).flatMapLatest(item => {
157
+ const suggestionsResponse = driver.getPageCommunicator().ajaxInterceptStream.filter(_ref8 => {
158
+ let {
159
+ type
160
+ } = _ref8;
161
+ return type === 'searchSuggestionsReceieved';
162
+ });
163
+ const removalStream = _kefir.default.merge([
164
+ // Handle cleanup when a new search query is entered. We want to wait
165
+ // to remove our old results until *after* Inbox's results from the new
166
+ // query have come back, since that will allow our modifications to
167
+ // switch from old -> new in sync with Inbox's native suggestions.
168
+ // If we didn't wait on `suggestionsResponse` to trigger cleanup,
169
+ // Our modifications would disappear the moment the user started typing,
170
+ // which ends up looking jarring and inconsistent with Inbox's results
171
+ // which stick around until the new results are ready.
172
+ item.inputStream.take(1).flatMap(() => suggestionsResponse),
173
+ // Handle cleanup when the user deletes their entire search query.
174
+ item.inputStream.filter(_ref9 => {
175
+ let {
176
+ target: {
177
+ value
222
178
  }
223
- }
224
- )
225
- .filter(({ results }) => results.length > 0)
226
- .onError((error) => driver.getLogger().error(error))
227
- .onValue(
228
- ({
179
+ } = _ref9;
180
+ return value === '';
181
+ }), item.resultsElRemovalStream]).take(1);
182
+ return _kefir.default.combine([_kefir.default.fromPromise(Promise.resolve(handler(item.event.target.value))),
183
+ // Wait to send results to the UI until Inbox's results have come back
184
+ // to avoid rendering too soon.
185
+ suggestionsResponse.take(1)]).takeUntilBy(removalStream).map(_ref10 => {
186
+ let [results, _ignored] = _ref10;
187
+ return {
188
+ ...item,
189
+ removalStream,
190
+ results
191
+ };
192
+ });
193
+ }).takeUntilBy(stopper).flatMap(_ref11 => {
194
+ let {
195
+ resultsEl,
196
+ searchInput,
197
+ resultsElRemovalStream,
198
+ removalStream,
199
+ enterAndTabPresses,
200
+ results
201
+ } = _ref11;
202
+ try {
203
+ const validatedResults = (0, _copyAndValidateAutocompleteResults.default)(driver, results);
204
+ return _kefir.default.constant({
229
205
  resultsEl,
230
206
  searchInput,
231
207
  resultsElRemovalStream,
232
208
  removalStream,
233
209
  enterAndTabPresses,
234
- results,
235
- }) => {
236
- setupCustomAutocompleteSelectionHandling({
237
- resultsEl,
238
- resultsElRemovalStream,
239
- searchInput,
240
- });
241
-
242
- const suggestionsElement = renderResultsList({
243
- driver,
244
- searchInput,
245
- removalStream,
246
- results,
247
- providerOrder,
248
- });
249
-
250
- insertElementInOrder(resultsEl, suggestionsElement);
251
-
252
- // NOTE: Because we're manually overriding the 'display' property, we've
253
- // basically taken responsibility for showing/hiding `resultsEl`
254
- // since Inbox no longer knows when the element is truly visible.
255
- // When we want to show results for a search term but Inbox doesn't have
256
- // any results, we need to force the results element to be displayed.
257
- // When Inbox hides the element it also removes a class that applies
258
- // some padding adjustments, so we have to force that as well.
259
- resultsEl.style.display = 'block';
260
- resultsEl.style.padding = '6px 0';
261
-
262
- removalStream.onValue(() => {
263
- suggestionsElement.remove();
264
-
265
- // Because we've mostly overridden Inbox's native show/hide logic we're
266
- // responsible for hiding `resultsEl` in a couple removal cases:
267
- // 1) when we go directly from only custom results to having
268
- // no text in the search box.
269
- // 2) when there are only custom results and the user subsequently
270
- // enters a search that returns no results of any type.
271
- if (searchInput.value === '' || resultsEl.matches(':empty')) {
272
- resultsEl.style.display = 'none';
273
- }
274
- });
275
-
276
- // We have to take over responsibility for hiding `resultsEl` when
277
- // the user presses enter or tab because our other overrides prevent Inbox
278
- // from handling this sensibly.
279
- enterAndTabPresses
280
- .takeUntilBy(removalStream)
281
- .take(1)
282
- .onValue(() => {
283
- resultsEl.style.display = 'none';
284
- });
285
-
286
- // When Inbox gets the *first* set of suggestions after opening search,
287
- // it clears away the current children of the `resultsEl` element.
288
- // When this happens, our modifications will get cleared away if
289
- // we've already added them — this can happen if Inbox skips a turn of
290
- // the event loop between getting the AJAX response back and rendering to
291
- // the DOM. To handle this case, we watch `resultsEl` for mutations
292
- // and re-add our modifications if they've been cleared.
293
- // We also force `resultsEl` to show because the first time
294
- // we display modifications that aren't accompanied by native results
295
- // Inbox hides `resultsEl` after we force it to show. Because Inbox
296
- // removes the previous search's results in the same event loop tick as
297
- // hiding `resultsEl`, we can hook into the child element removal and
298
- // re-show it before the hidden state gets painted to the screen.
299
- // We need to stop this entire process when tab or enter is pressed,
300
- // because if a custom result was selected when the key was pressed
301
- // then Inbox will remove the native results that no longer match the
302
- // search term — causing this observer to fire and subsequently
303
- // re-show `resultsEl` just as we're trying to manually hide it.
304
- makeMutationObserverChunkedStream(resultsEl, { childList: true })
305
- .takeUntilBy(enterAndTabPresses)
306
- .takeUntilBy(removalStream)
307
- .onValue(() => {
308
- resultsEl.style.display = 'block';
309
- if (suggestionsElement.parentElement !== resultsEl) {
310
- insertElementInOrder(resultsEl, suggestionsElement);
311
- }
312
- });
210
+ results: validatedResults
211
+ });
212
+ } catch (error) {
213
+ return _kefir.default.constantError(error);
214
+ }
215
+ }).filter(_ref12 => {
216
+ let {
217
+ results
218
+ } = _ref12;
219
+ return results.length > 0;
220
+ }).onError(error => driver.getLogger().error(error)).onValue(_ref13 => {
221
+ let {
222
+ resultsEl,
223
+ searchInput,
224
+ resultsElRemovalStream,
225
+ removalStream,
226
+ enterAndTabPresses,
227
+ results
228
+ } = _ref13;
229
+ (0, _setupCustomAutocompleteSelectionHandling.default)({
230
+ resultsEl,
231
+ resultsElRemovalStream,
232
+ searchInput
233
+ });
234
+ const suggestionsElement = renderResultsList({
235
+ driver,
236
+ searchInput,
237
+ removalStream,
238
+ results,
239
+ providerOrder
240
+ });
241
+ (0, _insertElementInOrder.default)(resultsEl, suggestionsElement);
242
+
243
+ // NOTE: Because we're manually overriding the 'display' property, we've
244
+ // basically taken responsibility for showing/hiding `resultsEl`
245
+ // since Inbox no longer knows when the element is truly visible.
246
+ // When we want to show results for a search term but Inbox doesn't have
247
+ // any results, we need to force the results element to be displayed.
248
+ // When Inbox hides the element it also removes a class that applies
249
+ // some padding adjustments, so we have to force that as well.
250
+ resultsEl.style.display = 'block';
251
+ resultsEl.style.padding = '6px 0';
252
+ removalStream.onValue(() => {
253
+ suggestionsElement.remove();
254
+
255
+ // Because we've mostly overridden Inbox's native show/hide logic we're
256
+ // responsible for hiding `resultsEl` in a couple removal cases:
257
+ // 1) when we go directly from only custom results to having
258
+ // no text in the search box.
259
+ // 2) when there are only custom results and the user subsequently
260
+ // enters a search that returns no results of any type.
261
+ if (searchInput.value === '' || resultsEl.matches(':empty')) {
262
+ resultsEl.style.display = 'none';
313
263
  }
314
- );
315
-
264
+ });
265
+
266
+ // We have to take over responsibility for hiding `resultsEl` when
267
+ // the user presses enter or tab because our other overrides prevent Inbox
268
+ // from handling this sensibly.
269
+ enterAndTabPresses.takeUntilBy(removalStream).take(1).onValue(() => {
270
+ resultsEl.style.display = 'none';
271
+ });
272
+
273
+ // When Inbox gets the *first* set of suggestions after opening search,
274
+ // it clears away the current children of the `resultsEl` element.
275
+ // When this happens, our modifications will get cleared away if
276
+ // we've already added them — this can happen if Inbox skips a turn of
277
+ // the event loop between getting the AJAX response back and rendering to
278
+ // the DOM. To handle this case, we watch `resultsEl` for mutations
279
+ // and re-add our modifications if they've been cleared.
280
+ // We also force `resultsEl` to show because the first time
281
+ // we display modifications that aren't accompanied by native results
282
+ // Inbox hides `resultsEl` after we force it to show. Because Inbox
283
+ // removes the previous search's results in the same event loop tick as
284
+ // hiding `resultsEl`, we can hook into the child element removal and
285
+ // re-show it before the hidden state gets painted to the screen.
286
+ // We need to stop this entire process when tab or enter is pressed,
287
+ // because if a custom result was selected when the key was pressed
288
+ // then Inbox will remove the native results that no longer match the
289
+ // search term — causing this observer to fire and subsequently
290
+ // re-show `resultsEl` just as we're trying to manually hide it.
291
+ (0, _makeMutationObserverChunkedStream.default)(resultsEl, {
292
+ childList: true
293
+ }).takeUntilBy(enterAndTabPresses).takeUntilBy(removalStream).onValue(() => {
294
+ resultsEl.style.display = 'block';
295
+ if (suggestionsElement.parentElement !== resultsEl) {
296
+ (0, _insertElementInOrder.default)(resultsEl, suggestionsElement);
297
+ }
298
+ });
299
+ });
316
300
  return () => stopper.destroy();
317
- }
301
+ }