@inboxsdk/core 0.2.28-alpha.4 → 0.2.28-alpha.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/inboxsdk.js +1 -1
- package/package.json +5 -1
- package/src/inboxsdk-js/check-requirements.js +7 -3
- package/src/inboxsdk-js/header.js +1 -0
- package/src/inboxsdk-js/inboxsdk-NONREMOTE-INTEGRATED-PAGEWORLD.js +5 -6
- package/src/inboxsdk-js/inboxsdk-NONREMOTE.js +4 -3
- package/src/inboxsdk-js/inboxsdk-REMOTE.js +3 -1
- package/src/inboxsdk-js/inboxsdk-TEST.js +4 -3
- package/src/inboxsdk-js/inboxsdk.js +33 -39
- package/src/inboxsdk-js/loading/load-platform-implementation-DEV.js +15 -18
- package/src/inboxsdk.d.ts +2 -0
- package/src/injected-js/gmail/modify-suggestions.test.js +8 -9
- package/src/injected-js/gmail/setup-gmail-interceptor.js +340 -579
- package/src/injected-js/gmail/sync-compose-request-processor.test.js +39 -49
- package/src/injected-js/gmail/thread-identifier/click-and-get-popup-url.js +20 -33
- package/src/injected-js/gmail/thread-identifier/index.js +57 -93
- package/src/injected-js/gmail/thread-identifier/thread-row-parser.js +22 -31
- package/src/injected-js/gmail/thread-identifier/thread-row-parser.test.js +12 -28
- package/src/injected-js/inbox/setupAjaxInterceptor.js +64 -121
- package/src/injected-js/inbox/setupClickAndGetNewIframeSrc.js +53 -66
- package/src/injected-js/inbox/setupComposeViewDraftIDFinder.js +20 -36
- package/src/injected-js/inbox/setupInboxFakeWindowResizeListener.js +13 -13
- package/src/injected-js/main.js +11 -24
- package/src/injected-js/message-metadata-holder.js +52 -82
- package/src/injected-js/setup-data-exposer.js +89 -148
- package/src/injected-js/setup-error-silencer.js +21 -21
- package/src/injected-js/setup-event-reemitter.js +30 -22
- package/src/injected-js/setupInboxCustomViewLinkFixer.js +24 -29
- package/src/injected-js/setupPushStateListener.js +18 -11
- package/src/injected-js/xhr-helper.js +62 -65
- package/src/injected-js/xhr-proxy-factory.js +195 -445
- package/src/injected-js/xhr-proxy-factory.test.js +824 -991
- package/src/platform-implementation-js/constants/router.js +14 -9
- package/src/platform-implementation-js/constants/toolbars.js +8 -3
- package/src/platform-implementation-js/dom-driver/gmail/custom-style.js +13 -13
- package/src/platform-implementation-js/dom-driver/gmail/gmail-butter-bar-driver.js +115 -136
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/add-toolbar-button-for-app.js +13 -14
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/create-link.js +27 -48
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/get-draft-id-for-message-id.js +31 -42
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/get-native-nav-item.js +30 -40
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/get-url-object.js +10 -18
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/getSyncThreadForOldGmailThreadId.js +21 -28
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/getSyncThreadFromSyncThreadId.js +33 -45
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/gmail-load-event.js +31 -49
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/goto-view.js +58 -65
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/keyboard-shortcut-help-modifier.js +40 -124
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/open-compose-window.js +17 -22
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/open-draft-by-message-id.test.js +10 -11
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/override-gmail-back-button.js +44 -80
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/register-search-query-rewriter.js +19 -26
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/register-search-suggestions-provider.js +71 -147
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/setup-compose-view-driver-stream.js +91 -148
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/setup-route-view-driver-stream.js +150 -166
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/setup-route-view-driver-stream.test.js +70 -120
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/show-app-id-warning.js +15 -15
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/show-custom-route-view.js +44 -67
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/show-custom-thread-list.js +230 -379
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/show-custom-thread-list.test.js +121 -307
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/show-native-route-view.js +17 -24
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/suppressAddon.js +41 -49
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/temporary-track-download-url-validity.js +30 -40
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/thread-row-identifier.js +28 -60
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/track-events.js +61 -133
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/user-info.js +30 -42
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/user-info.test.js +52 -46
- package/src/platform-implementation-js/dom-driver/gmail/gmail-driver.js +354 -694
- package/src/platform-implementation-js/dom-driver/gmail/make-xhr-interceptor.js +77 -93
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-sidebar-view/index.js +35 -82
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-sidebar-view/index.test.js +44 -94
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-sidebar-view/primary/add-companion-global-icon-area.js +12 -19
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-sidebar-view/primary/add-companion-thread-icon-area.js +17 -29
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-sidebar-view/primary/add-to-icon-area.js +26 -26
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-sidebar-view/primary/index.js +391 -797
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-toolbar-button-view/monitor-top-banner-size-and-react.js +7 -9
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-toolbar-button-view.js +60 -109
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-attachment-area-view.js +95 -135
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-attachment-card-view.js +103 -211
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-attachment-card-view.test.js +61 -61
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-backdrop.js +17 -17
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-collapsible-section-view.js +188 -541
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-button.js +67 -135
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-compose-notice.js +27 -49
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-inner-sidebar.js +7 -13
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-outer-sidebar.js +9 -22
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-recipient-row.js +36 -63
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-tooltip-to-button.js +38 -113
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/ensure-app-button-toolbars-are-closed.js +11 -16
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/ensure-grouping-is-open.js +11 -17
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/focus.js +8 -11
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/from-manager.js +27 -47
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-additional-action-toolbar.js +11 -24
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-address-changes-stream.js +59 -111
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-body-changes-stream.js +15 -14
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-formatting-area-offset-left.js +11 -17
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-minimized-stream.js +18 -24
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-response-type-changes-stream.js +19 -23
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/insert-link-into-body.js +11 -19
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/manage-button-grouping.js +141 -376
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/monitor-selection-range.js +17 -28
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/override-edit-subject.js +34 -70
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/position-formatting-toolbar.js +10 -17
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/size-fixer.js +83 -137
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/update-insert-more-area-left.js +10 -19
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view.js +632 -1190
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-message-view/get-updated-contact.js +29 -38
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-message-view.js +327 -617
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-route-view/gmail-route-processor.js +26 -49
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-route-view/gmail-route-view.js +188 -380
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-row-list-view.js +104 -194
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-thread-row-view.js +382 -811
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-thread-sidebar-view/add-icon-area.js +34 -58
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-thread-sidebar-view.js +330 -581
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-thread-sidebar-view.test.js +123 -277
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-thread-view/width-manager.js +15 -35
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-thread-view.js +216 -571
- package/src/platform-implementation-js/dom-driver/gmail/views/gmail-toolbar-view.js +152 -336
- package/src/platform-implementation-js/dom-driver/gmail/views/native-gmail-nav-item-view.js +87 -211
- package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/inbox-dropdown-button-view.js +10 -11
- package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-action-button-view.js +20 -29
- package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-label-view.js +41 -76
- package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-modal-view-driver.js +45 -99
- package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-mole-view-driver.js +76 -128
- package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-tooltip-view.js +128 -319
- package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-top-message-bar-driver.js +45 -78
- package/src/platform-implementation-js/dom-driver/inbox/__mocks__/getSidebarClassnames.js +8 -4
- package/src/platform-implementation-js/dom-driver/inbox/addNavItem.js +36 -54
- package/src/platform-implementation-js/dom-driver/inbox/addRecipientRow.js +35 -53
- package/src/platform-implementation-js/dom-driver/inbox/createLink.js +13 -15
- package/src/platform-implementation-js/dom-driver/inbox/createLink.test.js +15 -18
- package/src/platform-implementation-js/dom-driver/inbox/custom-style.js +14 -13
- package/src/platform-implementation-js/dom-driver/inbox/detection/appToolbarLocation/parser.js +14 -20
- package/src/platform-implementation-js/dom-driver/inbox/detection/attachmentCard/parser.js +14 -13
- package/src/platform-implementation-js/dom-driver/inbox/detection/attachmentOverlay/parser.js +35 -67
- package/src/platform-implementation-js/dom-driver/inbox/detection/chatSidebar/parser.js +16 -18
- package/src/platform-implementation-js/dom-driver/inbox/detection/compose/parser.js +68 -185
- package/src/platform-implementation-js/dom-driver/inbox/detection/message/parser.js +28 -56
- package/src/platform-implementation-js/dom-driver/inbox/detection/nativeDrawer/parser.js +12 -10
- package/src/platform-implementation-js/dom-driver/inbox/detection/searchBar/parser.js +16 -16
- package/src/platform-implementation-js/dom-driver/inbox/detection/thread/parser.js +24 -35
- package/src/platform-implementation-js/dom-driver/inbox/detection/thread-row/parser.js +37 -89
- package/src/platform-implementation-js/dom-driver/inbox/getComposeViewDriverLiveSet.js +56 -78
- package/src/platform-implementation-js/dom-driver/inbox/getInboxMessageIdForInboxThreadId.js +26 -32
- package/src/platform-implementation-js/dom-driver/inbox/getSidebarClassnames.js +52 -109
- package/src/platform-implementation-js/dom-driver/inbox/getSidebarClassnames.test.js +7 -8
- package/src/platform-implementation-js/dom-driver/inbox/gotoView.js +16 -20
- package/src/platform-implementation-js/dom-driver/inbox/gotoView.test.js +15 -16
- package/src/platform-implementation-js/dom-driver/inbox/inbox-butter-bar-driver.js +75 -83
- package/src/platform-implementation-js/dom-driver/inbox/inbox-driver.js +530 -822
- package/src/platform-implementation-js/dom-driver/inbox/inbox-page-communicator.js +48 -61
- package/src/platform-implementation-js/dom-driver/inbox/inboxResponseProcessor.js +9 -12
- package/src/platform-implementation-js/dom-driver/inbox/inboxResponseProcessor.test.js +12 -19
- package/src/platform-implementation-js/dom-driver/inbox/makePageParserTree.js +24 -33
- package/src/platform-implementation-js/dom-driver/inbox/pageParserOptions.js +201 -388
- package/src/platform-implementation-js/dom-driver/inbox/registerSearchSuggestionsProvider.js +249 -265
- package/src/platform-implementation-js/dom-driver/inbox/setupCustomAutocompleteSelectionHandling.js +84 -152
- package/src/platform-implementation-js/dom-driver/inbox/setupRouteViewDriverStream.js +55 -67
- package/src/platform-implementation-js/dom-driver/inbox/setupRouteViewDriverStream.test.js +43 -65
- package/src/platform-implementation-js/dom-driver/inbox/views/InboxLabelView.js +31 -56
- package/src/platform-implementation-js/dom-driver/inbox/views/InboxMoleViewDriver.js +191 -294
- package/src/platform-implementation-js/dom-driver/inbox/views/InboxToolbarButtonView.js +32 -45
- package/src/platform-implementation-js/dom-driver/inbox/views/InboxToolbarView.js +21 -39
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-app-sidebar-view.js +153 -240
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-app-toolbar-button-view.js +75 -150
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-app-toolbar-tooltip-view.js +20 -37
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-attachment-card-view.js +60 -114
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-attachment-overlay-view.js +47 -65
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-backdrop.js +41 -52
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-chat-sidebar-view.js +27 -36
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-compose-button-view.js +52 -80
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-compose-view.js +465 -649
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-custom-route-view.js +37 -58
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-custom-route-view.test.js +14 -26
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-drawer-view.js +118 -235
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-dropdown-view.js +10 -11
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-dummy-route-view.js +28 -46
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-message-view.js +131 -202
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-modal-view.js +40 -80
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-route-view.js +35 -61
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-thread-row-view.js +124 -221
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-thread-view.js +125 -213
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-thread-view.test.js +104 -126
- package/src/platform-implementation-js/dom-driver/inbox/views/inbox-tooltip-view.js +36 -51
- package/src/platform-implementation-js/dom-driver/inbox/views/inboxNavItemView.js +158 -297
- package/src/platform-implementation-js/dom-driver/inbox/waitForAnimationClickBlockerGone.js +21 -35
- package/src/platform-implementation-js/driver-common/compose/getDiscardStream.js +24 -43
- package/src/platform-implementation-js/driver-common/compose/getPresendingStream.js +39 -68
- package/src/platform-implementation-js/driver-common/getGmailMessageIdForSyncMessageId.js +14 -19
- package/src/platform-implementation-js/driver-common/getGmailThreadIdForRfcMessageId.js +27 -35
- package/src/platform-implementation-js/driver-common/getRfcMessageIdForSyncMessageId.js +16 -22
- package/src/platform-implementation-js/driver-common/getThreadIdFromMessageId.js +14 -14
- package/src/platform-implementation-js/driver-common/inboxAjax.js +12 -7
- package/src/platform-implementation-js/driver-common/requestGmailThread.js +19 -20
- package/src/platform-implementation-js/driver-common/sidebar/AppSidebar.js +197 -306
- package/src/platform-implementation-js/driver-common/sidebar/ContentPanelViewDriver.js +113 -161
- package/src/platform-implementation-js/driver-interfaces/compose-view-driver.js +1 -114
- package/src/platform-implementation-js/driver-interfaces/driver.js +1 -131
- package/src/platform-implementation-js/driver-interfaces/message-view-driver.js +4 -48
- package/src/platform-implementation-js/driver-interfaces/mole-view-driver.js +1 -29
- package/src/platform-implementation-js/driver-interfaces/route-view-driver.js +1 -32
- package/src/platform-implementation-js/driver-interfaces/thread-row-view-driver.js +1 -11
- package/src/platform-implementation-js/lib/array-to-lifetimes.js +43 -41
- package/src/platform-implementation-js/lib/array-to-lifetimes.test.js +139 -155
- package/src/platform-implementation-js/lib/copyAndValidateAutocompleteResults.js +19 -38
- package/src/platform-implementation-js/lib/css-selector-escape.js +7 -3
- package/src/platform-implementation-js/lib/dom/element-view-mapper.js +8 -11
- package/src/platform-implementation-js/lib/dom/get-selection.js +23 -52
- package/src/platform-implementation-js/lib/dom/insert-html-at-cursor.js +69 -101
- package/src/platform-implementation-js/lib/dom/is-node-in-range.js +8 -10
- package/src/platform-implementation-js/lib/dom/on-mouse-down-and-up.js +15 -17
- package/src/platform-implementation-js/lib/dom/querySelectorOne.js +8 -11
- package/src/platform-implementation-js/lib/dom/set-css.js +7 -3
- package/src/platform-implementation-js/lib/dom/set-value-and-dispatch-event.js +9 -11
- package/src/platform-implementation-js/lib/dom/simulate-drag-and-drop.js +32 -33
- package/src/platform-implementation-js/lib/extract-contact-from-email-contact-string.test.js +23 -26
- package/src/platform-implementation-js/lib/handle-compose-link-chips.js +86 -149
- package/src/platform-implementation-js/lib/insert-link-chip-into-body.js +42 -57
- package/src/platform-implementation-js/lib/make-revocable-function.js +19 -21
- package/src/platform-implementation-js/lib/make-revocable-function.test.js +20 -22
- package/src/platform-implementation-js/lib/parseParamsFromRouteID.js +15 -17
- package/src/platform-implementation-js/lib/parseParamsFromRouteID.test.js +9 -18
- package/src/platform-implementation-js/lib/populateRouteID.js +8 -9
- package/src/platform-implementation-js/lib/populateRouteID.test.js +20 -19
- package/src/platform-implementation-js/lib/react/ElementContainer.js +23 -20
- package/src/platform-implementation-js/lib/rewriteCssWithIdMap.js +10 -9
- package/src/platform-implementation-js/lib/rewriteCssWithIdMap.test.js +13 -20
- package/src/platform-implementation-js/lib/routeIDmatchesHash.js +13 -18
- package/src/platform-implementation-js/lib/routeIDmatchesHash.test.js +11 -17
- package/src/platform-implementation-js/lib/shared-style.js +14 -13
- package/src/platform-implementation-js/lib/toItemWithLifetimeStream.js +18 -17
- package/src/platform-implementation-js/lib/toLiveSet.js +17 -15
- package/src/platform-implementation-js/main-INTEGRATED-PAGEWORLD.js +6 -5
- package/src/platform-implementation-js/main.js +9 -24
- package/src/platform-implementation-js/namespaces/compose.js +37 -60
- package/src/platform-implementation-js/namespaces/conversations.js +52 -124
- package/src/platform-implementation-js/namespaces/global.js +27 -39
- package/src/platform-implementation-js/namespaces/keyboard.js +29 -33
- package/src/platform-implementation-js/namespaces/lists.js +25 -31
- package/src/platform-implementation-js/namespaces/modal.js +34 -28
- package/src/platform-implementation-js/namespaces/nav-menu.js +30 -45
- package/src/platform-implementation-js/namespaces/router.js +70 -137
- package/src/platform-implementation-js/namespaces/search.js +19 -17
- package/src/platform-implementation-js/namespaces/toolbars.js +71 -117
- package/src/platform-implementation-js/namespaces/user.js +36 -37
- package/src/platform-implementation-js/namespaces/widgets.js +54 -61
- package/src/platform-implementation-js/platform-implementation.js +98 -229
- package/src/platform-implementation-js/views/app-toolbar-button-view.js +26 -47
- package/src/platform-implementation-js/views/collapsible-section-view.js +66 -63
- package/src/platform-implementation-js/views/content-panel-view.js +28 -30
- package/src/platform-implementation-js/views/conversations/attachment-card-view.js +21 -44
- package/src/platform-implementation-js/views/conversations/custom-message-view.js +44 -104
- package/src/platform-implementation-js/views/conversations/message-view.js +131 -202
- package/src/platform-implementation-js/views/conversations/thread-view.js +75 -127
- package/src/platform-implementation-js/views/native-nav-item-view.js +32 -65
- package/src/platform-implementation-js/views/nav-item-view.js +51 -115
- package/src/platform-implementation-js/views/route-view/custom-route-view.js +25 -20
- package/src/platform-implementation-js/views/route-view/dummy-route-view-driver.js +18 -18
- package/src/platform-implementation-js/views/route-view/list-route-view.js +30 -52
- package/src/platform-implementation-js/views/route-view/route-view.js +24 -35
- package/src/platform-implementation-js/views/section-view.js +60 -52
- package/src/platform-implementation-js/views/thread-row-view.js +49 -74
- package/src/platform-implementation-js/widgets/drawer-view.js +29 -36
- package/src/platform-implementation-js/widgets/modal-view.js +39 -68
- package/src/platform-implementation-js/widgets/mole-view.js +22 -22
- package/src/platform-implementation-js/widgets/top-message-bar-view.js +13 -10
package/src/platform-implementation-js/dom-driver/inbox/registerSearchSuggestionsProvider.js
CHANGED
|
@@ -1,317 +1,301 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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 || {
|
|
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 =
|
|
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 || {
|
|
79
|
+
${result.name || {
|
|
80
|
+
__html: result.nameHTML
|
|
81
|
+
}}
|
|
84
82
|
</span>
|
|
85
|
-
${{
|
|
83
|
+
${{
|
|
84
|
+
__html: description
|
|
85
|
+
}}
|
|
86
86
|
</span>
|
|
87
87
|
`;
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|
-
|
|
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
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
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
|
-
|
|
226
|
-
.
|
|
227
|
-
|
|
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
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
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
|
+
}
|