@inboxsdk/core 2.1.59 → 2.1.60

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 CHANGED
@@ -371,7 +371,7 @@ function isNotNil(value) {
371
371
 
372
372
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- SDK_VERSION is injected by webpack
373
373
  ///@ts-ignore
374
- const BUILD_VERSION = "2.1.59-1718234389875-7ae8da1c5adbea88";
374
+ const BUILD_VERSION = "2.1.60-1718718023878-64aa156f6ee5ecb1";
375
375
  if (false) {}
376
376
 
377
377
  /***/ }),
@@ -2646,7 +2646,7 @@ options.insert = htmlElement => {
2646
2646
  htmlElement.setAttribute('data-inboxsdk-version',
2647
2647
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- this is injected by webpack
2648
2648
  ///@ts-ignore
2649
- "2.1.59-1718234389875-7ae8da1c5adbea88");
2649
+ "2.1.60-1718718023878-64aa156f6ee5ecb1");
2650
2650
  document.head.append(htmlElement);
2651
2651
  };
2652
2652
  options.domAPI = (styleDomAPI_default());
@@ -10197,7 +10197,7 @@ options.insert = htmlElement => {
10197
10197
  htmlElement.setAttribute('data-inboxsdk-version',
10198
10198
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- this is injected by webpack
10199
10199
  ///@ts-ignore
10200
- "2.1.59-1718234389875-7ae8da1c5adbea88");
10200
+ "2.1.60-1718718023878-64aa156f6ee5ecb1");
10201
10201
  document.head.append(htmlElement);
10202
10202
  };
10203
10203
  options.domAPI = (styleDomAPI_default());
@@ -14926,7 +14926,7 @@ options.insert = htmlElement => {
14926
14926
  htmlElement.setAttribute('data-inboxsdk-version',
14927
14927
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- this is injected by webpack
14928
14928
  ///@ts-ignore
14929
- "2.1.59-1718234389875-7ae8da1c5adbea88");
14929
+ "2.1.60-1718718023878-64aa156f6ee5ecb1");
14930
14930
  document.head.append(htmlElement);
14931
14931
  };
14932
14932
  options.domAPI = (styleDomAPI_default());
@@ -17098,7 +17098,8 @@ const HEADING_ELEMENT_SELECTOR = '.apW';
17098
17098
  class GmailAppMenuItemView extends events.EventEmitter {
17099
17099
  static elementCss = {
17100
17100
  HOVER: 'aIk',
17101
- ACTIVE: 'apV'
17101
+ ACTIVE: 'apV',
17102
+ SDK_ACTIVE: 'inboxsdk__appMenuItem_active'
17102
17103
  };
17103
17104
  #menuItemDescriptor;
17104
17105
  #element;
@@ -17250,7 +17251,8 @@ class CollapsiblePanelView extends safe_event_emitter/* default */.A {
17250
17251
  HOVER: 'aJu',
17251
17252
  COLLAPSED_HOVER: 'bym',
17252
17253
  PANEL_LESS: 'a3W',
17253
- TOGGLE_OPEN_STATE: 'aak'
17254
+ TOGGLE_OPEN_STATE: 'aak',
17255
+ SDK_ACTIVE: 'inboxsdk__collapsiblePanel_active'
17254
17256
  };
17255
17257
  #panelDescriptor;
17256
17258
  #element;
@@ -17549,24 +17551,72 @@ class AppMenuItemView extends safe_event_emitter/* default */.A {
17549
17551
  static #routeViewDriverStream;
17550
17552
  static #menuItemToPanelMap = new Map();
17551
17553
  static #appMenuItemViews = new Set();
17552
- static #getActivePanel() {
17554
+ static getAllPanels() {
17555
+ const appMenuElement = gmail_element_getter/* default */.A.getAppMenuContainer();
17556
+ const nativePanels = appMenuElement?.querySelectorAll(`.${collapsible_panel_view_NATIVE_CLASS}`);
17557
+ return Array.from(nativePanels ?? []);
17558
+ }
17559
+ static getActivePanel() {
17560
+ let useSdkActiveSelector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
17553
17561
  const appMenuElement = gmail_element_getter/* default */.A.getAppMenuContainer();
17554
17562
  const {
17555
- ACTIVE
17563
+ ACTIVE,
17564
+ SDK_ACTIVE
17556
17565
  } = CollapsiblePanelView.elementCss;
17557
- const nativePanel = appMenuElement?.querySelector(`.${collapsible_panel_view_NATIVE_CLASS}.${ACTIVE}`);
17566
+ const nativePanel = appMenuElement?.querySelector(useSdkActiveSelector ? `.${collapsible_panel_view_NATIVE_CLASS}.${ACTIVE}.${SDK_ACTIVE}` : `.${collapsible_panel_view_NATIVE_CLASS}.${ACTIVE}`);
17558
17567
  return nativePanel;
17559
17568
  }
17560
- static #getActiveMenuItem() {
17569
+ static deactivatePanel(panel) {
17570
+ const {
17571
+ ACTIVE,
17572
+ HOVER,
17573
+ SDK_ACTIVE
17574
+ } = CollapsiblePanelView.elementCss;
17575
+ panel.style.removeProperty('height');
17576
+ if (panel.classList.contains(HOVER)) {
17577
+ panel.classList.remove(HOVER);
17578
+ }
17579
+ if (panel.classList.contains(ACTIVE)) {
17580
+ panel.classList.remove(ACTIVE);
17581
+ }
17582
+ if (panel.classList.contains(SDK_ACTIVE)) {
17583
+ panel.classList.remove(SDK_ACTIVE);
17584
+ }
17585
+ }
17586
+ static isMenuItem(element) {
17587
+ return element.classList.contains(NATIVE_CLASS);
17588
+ }
17589
+ static getAllMenuItems() {
17590
+ const appMenuElement = gmail_element_getter/* default */.A.getAppMenuContainer();
17591
+ return Array.from(appMenuElement?.querySelectorAll(`.${NATIVE_CLASS}`) ?? []);
17592
+ }
17593
+ static getActiveMenuItem() {
17561
17594
  const appMenuElement = gmail_element_getter/* default */.A.getAppMenuContainer();
17562
17595
  const {
17563
- ACTIVE
17596
+ ACTIVE,
17597
+ SDK_ACTIVE
17564
17598
  } = GmailAppMenuItemView.elementCss;
17565
- const button = appMenuElement?.querySelector(`.${NATIVE_CLASS}.${ACTIVE}`);
17599
+ const button = appMenuElement?.querySelector(`.${NATIVE_CLASS}.${ACTIVE}.${SDK_ACTIVE}`);
17566
17600
  return button;
17567
17601
  }
17602
+ static deactivateMenuItem(menuItem) {
17603
+ const {
17604
+ ACTIVE,
17605
+ HOVER,
17606
+ SDK_ACTIVE
17607
+ } = GmailAppMenuItemView.elementCss;
17608
+ if (menuItem.classList.contains(HOVER)) {
17609
+ menuItem.classList.remove(HOVER);
17610
+ }
17611
+ if (menuItem.classList.contains(ACTIVE)) {
17612
+ menuItem.classList.remove(ACTIVE);
17613
+ }
17614
+ if (menuItem.classList.contains(SDK_ACTIVE)) {
17615
+ menuItem.classList.remove(SDK_ACTIVE);
17616
+ }
17617
+ }
17568
17618
  static #isPanelLess() {
17569
- const activePanel = AppMenuItemView.#getActivePanel();
17619
+ const activePanel = AppMenuItemView.getActivePanel(false);
17570
17620
  return !activePanel;
17571
17621
  }
17572
17622
  static #adjustTooltipNub() {
@@ -17692,24 +17742,14 @@ class AppMenuItemView extends safe_event_emitter/* default */.A {
17692
17742
  static #_3 = AppMenuItemView.#menuItemChangeStream.onValue(async v => {
17693
17743
  const [type, menuItem, mouseEvent] = v;
17694
17744
  const {
17695
- ACTIVE,
17696
17745
  HOVER
17697
17746
  } = GmailAppMenuItemView.elementCss;
17698
17747
  function handleActivate() {
17699
17748
  const appMenuElement = gmail_element_getter/* default */.A.getAppMenuContainer();
17700
17749
 
17701
- // deactivate active panel
17702
- const activePanel = AppMenuItemView.#getActivePanel();
17703
- if (activePanel) {
17704
- activePanel.style.removeProperty('height');
17705
- activePanel.classList.remove(CollapsiblePanelView.elementCss.ACTIVE);
17706
- activePanel.classList.remove(CollapsiblePanelView.elementCss.HOVER);
17707
- }
17708
-
17709
17750
  // deactivate menu items and handle keyboard accessibility
17710
17751
  for (const menuItem_ of appMenuElement?.querySelectorAll(`.${NATIVE_CLASS}`) ?? []) {
17711
- menuItem_.classList.remove(ACTIVE);
17712
- menuItem_.classList.remove(HOVER);
17752
+ AppMenuItemView.deactivateMenuItem(menuItem_);
17713
17753
  // update tabindex
17714
17754
  const iconElement = menuItem_.querySelector(ICON_ELEMENT_SELECTOR);
17715
17755
  if (iconElement) {
@@ -17718,19 +17758,23 @@ class AppMenuItemView extends safe_event_emitter/* default */.A {
17718
17758
  }
17719
17759
 
17720
17760
  // activate menu item
17721
- menuItem.classList.add(ACTIVE);
17761
+ activateMenuItem(menuItem);
17722
17762
  // activate panel
17723
17763
  const panel = AppMenuItemView.#menuItemToPanelMap.get(menuItem);
17724
17764
  if (panel) {
17725
- panel.classList.add(CollapsiblePanelView.elementCss.ACTIVE);
17765
+ const otherPanels = AppMenuItemView.getAllPanels().filter(p => p !== panel);
17766
+ for (const otherPanel of otherPanels) {
17767
+ AppMenuItemView.deactivatePanel(otherPanel);
17768
+ }
17769
+ activatePanel(panel);
17726
17770
  }
17727
17771
  }
17728
17772
  switch (type) {
17729
17773
  case 'mouseenter':
17730
17774
  {
17731
17775
  const panel = AppMenuItemView.#menuItemToPanelMap.get(menuItem);
17732
- const activeMenuItem = AppMenuItemView.#getActiveMenuItem();
17733
- const activePanel = AppMenuItemView.#getActivePanel();
17776
+ const activeMenuItem = AppMenuItemView.getActiveMenuItem();
17777
+ const activePanel = AppMenuItemView.getActivePanel();
17734
17778
  const burgerMenuOpen = gmail_element_getter/* default */.A.isAppBurgerMenuOpen();
17735
17779
 
17736
17780
  // hover-styled panel is displayed for collapsed burger menu
@@ -17738,19 +17782,20 @@ class AppMenuItemView extends safe_event_emitter/* default */.A {
17738
17782
 
17739
17783
  // deactivate active panel
17740
17784
  if (activePanel) {
17741
- activePanel.style.removeProperty('height');
17742
- activePanel.classList.remove(CollapsiblePanelView.elementCss.ACTIVE);
17743
- activePanel.classList.remove(CollapsiblePanelView.elementCss.HOVER);
17785
+ AppMenuItemView.deactivatePanel(activePanel);
17744
17786
  }
17745
17787
 
17746
17788
  // activate new panel
17747
17789
  if (panel) {
17748
17790
  const height = window.innerHeight - panel.getBoundingClientRect().top;
17749
17791
  panel.style.cssText = `height: ${height}px;`;
17750
- panel.classList.add(CollapsiblePanelView.elementCss.ACTIVE);
17751
- panel.classList.add(CollapsiblePanelView.elementCss.HOVER);
17792
+ activatePanel(panel, {
17793
+ hover: true
17794
+ });
17752
17795
  // hover menu item
17753
- menuItem.classList.add(HOVER);
17796
+ if (!menuItem.classList.contains(HOVER)) {
17797
+ menuItem.classList.add(HOVER);
17798
+ }
17754
17799
  // handle burger menu collapsed
17755
17800
  if (!burgerMenuOpen) {
17756
17801
  for (const panel of document.querySelectorAll(CollapsiblePanelView.elementSelectors.NATIVE) ?? []) {
@@ -17760,7 +17805,9 @@ class AppMenuItemView extends safe_event_emitter/* default */.A {
17760
17805
  } else {
17761
17806
  // panel doesn't exist (i.e. Meet) so activate active menu item's panel instead (as Gmail currently does -- FEB 2023)
17762
17807
  const panel = activeMenuItem && AppMenuItemView.#menuItemToPanelMap.get(activeMenuItem);
17763
- panel?.classList.add(CollapsiblePanelView.elementCss.ACTIVE);
17808
+ if (panel) {
17809
+ activatePanel(panel);
17810
+ }
17764
17811
  }
17765
17812
  break;
17766
17813
  }
@@ -17769,15 +17816,17 @@ class AppMenuItemView extends safe_event_emitter/* default */.A {
17769
17816
  // Do not handle blur event when we're in one of the panel's dropdowns
17770
17817
  const isPanelDropdownShown = AppMenuItemView.#isPanelDropdownShown();
17771
17818
  if (isPanelDropdownShown) return;
17772
- const activeMenuItem = AppMenuItemView.#getActiveMenuItem();
17773
- const activePanel = AppMenuItemView.#getActivePanel();
17819
+ const activeMenuItem = AppMenuItemView.getActiveMenuItem();
17820
+ const activePanel = AppMenuItemView.getActivePanel();
17774
17821
  const activeMenuItemPanel = activeMenuItem && AppMenuItemView.#menuItemToPanelMap.get(activeMenuItem);
17775
17822
  if (mouseEvent.relatedTarget instanceof Node && (menuItem.contains(mouseEvent.relatedTarget) || activePanel?.contains(mouseEvent.relatedTarget))) return;
17776
17823
  const burgerMenuOpen = gmail_element_getter/* default */.A.isAppBurgerMenuOpen();
17777
17824
  if (activePanel === activeMenuItemPanel && burgerMenuOpen) return;
17778
17825
 
17779
17826
  // unhover menu item
17780
- menuItem.classList.remove(HOVER);
17827
+ if (menuItem.classList.contains(HOVER)) {
17828
+ menuItem.classList.remove(HOVER);
17829
+ }
17781
17830
 
17782
17831
  // handle burger menu collapsed
17783
17832
  for (const panel of document.querySelectorAll(CollapsiblePanelView.elementSelectors.NATIVE) ?? []) {
@@ -17786,14 +17835,12 @@ class AppMenuItemView extends safe_event_emitter/* default */.A {
17786
17835
 
17787
17836
  // deactivate active panel
17788
17837
  if (activePanel) {
17789
- activePanel.style.removeProperty('height');
17790
- activePanel.classList.remove(CollapsiblePanelView.elementCss.ACTIVE);
17791
- activePanel.classList.remove(CollapsiblePanelView.elementCss.HOVER);
17838
+ AppMenuItemView.deactivatePanel(activePanel);
17792
17839
  }
17793
17840
 
17794
17841
  // activate active menu item panel
17795
17842
  if (activeMenuItemPanel) {
17796
- activeMenuItemPanel.classList.add(CollapsiblePanelView.elementCss.ACTIVE);
17843
+ activatePanel(activeMenuItemPanel);
17797
17844
  }
17798
17845
  break;
17799
17846
  }
@@ -17921,12 +17968,48 @@ class AppMenuItemView extends safe_event_emitter/* default */.A {
17921
17968
  AppMenuItemView.#appMenuItemViews.delete(this);
17922
17969
  }
17923
17970
  }
17971
+ function activatePanel(panel, options) {
17972
+ const {
17973
+ ACTIVE,
17974
+ HOVER,
17975
+ SDK_ACTIVE
17976
+ } = CollapsiblePanelView.elementCss;
17977
+ if (!panel.classList.contains(ACTIVE)) {
17978
+ panel.classList.add(ACTIVE);
17979
+ }
17980
+ if (!panel.classList.contains(SDK_ACTIVE)) {
17981
+ panel.classList.add(SDK_ACTIVE);
17982
+ }
17983
+ if (options?.hover) {
17984
+ if (!panel.classList.contains(HOVER)) {
17985
+ panel.classList.add(HOVER);
17986
+ }
17987
+ } else {
17988
+ if (panel.classList.contains(HOVER)) {
17989
+ panel.classList.remove(HOVER);
17990
+ }
17991
+ }
17992
+ }
17993
+ function activateMenuItem(menuItem) {
17994
+ const {
17995
+ ACTIVE,
17996
+ SDK_ACTIVE
17997
+ } = GmailAppMenuItemView.elementCss;
17998
+ if (!menuItem.classList.contains(ACTIVE)) {
17999
+ menuItem.classList.add(ACTIVE);
18000
+ }
18001
+ if (!menuItem.classList.contains(SDK_ACTIVE)) {
18002
+ menuItem.classList.add(SDK_ACTIVE);
18003
+ }
18004
+ }
17924
18005
  ;// CONCATENATED MODULE: ./src/platform-implementation-js/namespaces/app-menu.ts
17925
18006
 
17926
18007
 
17927
18008
 
17928
18009
 
17929
18010
 
18011
+
18012
+
17930
18013
  /**
17931
18014
  * In dark themes, Gmail has different colored primary buttons depending on hover or active state
17932
18015
  */
@@ -17977,6 +18060,7 @@ class AppMenu {
17977
18060
  });
17978
18061
  constructor(driver) {
17979
18062
  this.#driver = driver;
18063
+ AppMenu.#monitorAppMenuState();
17980
18064
  }
17981
18065
 
17982
18066
  /**
@@ -18014,6 +18098,42 @@ class AppMenu {
18014
18098
  const result = await gmail_element_getter/* default */.A.getAppMenuAsync();
18015
18099
  return !!result;
18016
18100
  }
18101
+ static #monitorInitialized = false;
18102
+ static async #monitorAppMenuState() {
18103
+ /**
18104
+ * Gmail could set menu item to active asynchronously, monitor changes to the menu DOM and
18105
+ * deactivate all other menu items that don't have the SDK specific active class name.
18106
+ *
18107
+ * Same applies to menu panel. Deactivate all other panels that don't have the SDK specific active class name.
18108
+ */
18109
+
18110
+ if (this.#monitorInitialized) {
18111
+ return;
18112
+ }
18113
+ this.#monitorInitialized = true;
18114
+ kefir_esm["default"].fromPromise(gmail_element_getter/* default */.A.getAppMenuAsync()).filter(isNotNil/* default */.A).flatMap(appMenu => (0,make_mutation_observer_chunked_stream/* default */.A)(appMenu, {
18115
+ childList: true,
18116
+ subtree: true,
18117
+ attributes: true,
18118
+ attributeFilter: ['class']
18119
+ }).delay(0)).filter(mutations => mutations.some(m => m.target instanceof HTMLElement && AppMenuItemView.isMenuItem(m.target))).throttle(10, {
18120
+ leading: true,
18121
+ trailing: true
18122
+ }).map(() => {
18123
+ const activeMenuItem = AppMenuItemView.getActiveMenuItem();
18124
+ if (activeMenuItem) {
18125
+ const otherMenuItems = AppMenuItemView.getAllMenuItems().filter(menuItem => menuItem !== activeMenuItem);
18126
+ otherMenuItems.map(menuItem => AppMenuItemView.deactivateMenuItem(menuItem));
18127
+ }
18128
+ const activePanel = AppMenuItemView.getActivePanel();
18129
+ if (activePanel) {
18130
+ const otherPanels = AppMenuItemView.getAllPanels().filter(panel => panel !== activePanel);
18131
+ otherPanels.map(panel => AppMenuItemView.deactivatePanel(panel));
18132
+ }
18133
+ }).onValue(() => {
18134
+ // monitor forever
18135
+ });
18136
+ }
18017
18137
  }
18018
18138
  // EXTERNAL MODULE: ./node_modules/lodash/intersection.js
18019
18139
  var intersection = __webpack_require__(4225);
@@ -19535,7 +19655,7 @@ mole_view_module_options.insert = htmlElement => {
19535
19655
  htmlElement.setAttribute('data-inboxsdk-version',
19536
19656
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- this is injected by webpack
19537
19657
  ///@ts-ignore
19538
- "2.1.59-1718234389875-7ae8da1c5adbea88");
19658
+ "2.1.60-1718718023878-64aa156f6ee5ecb1");
19539
19659
  document.head.append(htmlElement);
19540
19660
  };
19541
19661
  mole_view_module_options.domAPI = (styleDomAPI_default());