@inboxsdk/core 0.2.29-alpha.1 → 0.2.29-alpha.3

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inboxsdk/core",
3
- "version": "0.2.29-alpha.1",
3
+ "version": "0.2.29-alpha.3",
4
4
  "description": "Library for building browser extensions for Gmail",
5
5
  "main": "inboxsdk.js",
6
6
  "author": "Streak",
@@ -19,6 +19,7 @@ declare const GmailElementGetter: {
19
19
  getMoleParent(): HTMLElement | null;
20
20
  shouldAddNavItemsInline(): boolean;
21
21
  getAppMenuAsync: () => Promise<HTMLElement | undefined>;
22
+ isAppBurgerMenuOpen(): boolean;
22
23
  getAppMenuContainer(): HTMLElement | null;
23
24
  getSeparateSectionNavItemMenuInjectionContainer(): HTMLElement | null;
24
25
  getSameSectionNavItemMenuInjectionContainer(): HTMLElement | null;
@@ -1 +1 @@
1
- {"version":3,"file":"gmail-element-getter.d.ts","sourceRoot":"","sources":["../../../../../../src/platform-implementation-js/dom-driver/gmail/gmail-element-getter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAA+B,EAC7B,mBAAmB,EACpB,MAAM,yCAAyC,CAAC;AAUjD,QAAA,MAAM,kBAAkB;yBACD,WAAW,GAAG,IAAI;uCAcJ,WAAW,GAAG,IAAI;kDAKP,WAAW,GAAG,IAAI;+CAKrB,WAAW,GAAG,IAAI;wBAIzC,WAAW,GAAG,IAAI;iCAOT,WAAW,GAAG,IAAI;gCAInB,WAAW,GAAG,SAAS,GAAG,IAAI;2CA8BnB,WAAW,GAAG,IAAI;iDAIZ,MAAM,UAAU,CAC3D,mBAAmB,EACnB,KAAK,CACN;uBAgBkB,WAAW,GAAG,IAAI;kCAIP,WAAW,GAAG,IAAI;+BAOrB,WAAW,GAAG,IAAI;0CAIP,WAAW,GAAG,IAAI;+BAI7B,WAAW,GAAG,IAAI;+CAQrC,GAAG,KACR,MAAM,UAAU,CAAC,WAAW,EAAE,KAAK,CAAC;qBAItB,WAAW,GAAG,IAAI;+BAOR,OAAO;;;uDA6EiB,WAAW,GAAG,IAAI;mDAItB,WAAW,GAAG,IAAI;0BAQ3C,WAAW,EAAE;0BAIb,WAAW,GAAG,IAAI;sBAItB,gBAAgB,GAAG,IAAI;qCAMR,WAAW,GAAG,IAAI;kCAIrB,WAAW,GAAG,IAAI;2BAIzB,WAAW,GAAG,IAAI;iCAWZ,WAAW,GAAG,IAAI;yBAI1B,WAAW;8BAIN,WAAW,GAAG,IAAI;sBAM1B,OAAO;mBAaV,OAAO;qBAIL,OAAO;oBAIR,OAAO;iCAIM,OAAO;gCAOR,OAAO;;qCASJ,WAAW,GAAG,IAAI;;gCAKrB,QAAQ,IAAI,CAAC;CAG1C,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"gmail-element-getter.d.ts","sourceRoot":"","sources":["../../../../../../src/platform-implementation-js/dom-driver/gmail/gmail-element-getter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAA+B,EAC7B,mBAAmB,EACpB,MAAM,yCAAyC,CAAC;AAUjD,QAAA,MAAM,kBAAkB;yBACD,WAAW,GAAG,IAAI;uCAcJ,WAAW,GAAG,IAAI;kDAKP,WAAW,GAAG,IAAI;+CAKrB,WAAW,GAAG,IAAI;wBAIzC,WAAW,GAAG,IAAI;iCAOT,WAAW,GAAG,IAAI;gCAInB,WAAW,GAAG,SAAS,GAAG,IAAI;2CA8BnB,WAAW,GAAG,IAAI;iDAIZ,MAAM,UAAU,CAC3D,mBAAmB,EACnB,KAAK,CACN;uBAgBkB,WAAW,GAAG,IAAI;kCAIP,WAAW,GAAG,IAAI;+BAOrB,WAAW,GAAG,IAAI;0CAIP,WAAW,GAAG,IAAI;+BAI7B,WAAW,GAAG,IAAI;+CAQrC,GAAG,KACR,MAAM,UAAU,CAAC,WAAW,EAAE,KAAK,CAAC;qBAItB,WAAW,GAAG,IAAI;+BAOR,OAAO;;;;uDAqFiB,WAAW,GAAG,IAAI;mDAItB,WAAW,GAAG,IAAI;0BAQ3C,WAAW,EAAE;0BAIb,WAAW,GAAG,IAAI;sBAItB,gBAAgB,GAAG,IAAI;qCAMR,WAAW,GAAG,IAAI;kCAIrB,WAAW,GAAG,IAAI;2BAIzB,WAAW,GAAG,IAAI;iCAWZ,WAAW,GAAG,IAAI;yBAI1B,WAAW;8BAIN,WAAW,GAAG,IAAI;sBAM1B,OAAO;mBAaV,OAAO;qBAIL,OAAO;oBAIR,OAAO;iCAIM,OAAO;gCAOR,OAAO;;qCASJ,WAAW,GAAG,IAAI;;gCAKrB,QAAQ,IAAI,CAAC;CAG1C,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -164,6 +164,11 @@ const GmailElementGetter = {
164
164
  }
165
165
  }
166
166
  }),
167
+ isAppBurgerMenuOpen() {
168
+ return (document
169
+ .querySelector('.gb_Hc[aria-expanded]')
170
+ ?.getAttribute('aria-expanded') === 'true' ?? false);
171
+ },
167
172
  getAppMenuContainer() {
168
173
  return document.querySelector('.aqk.aql.bkL');
169
174
  },
@@ -1,7 +1,7 @@
1
1
  import { AppMenuItemDescriptor } from '../../../namespaces/app-menu';
2
2
  import GmailDriver from '../gmail-driver';
3
3
  import TypedEventEmitter from 'typed-emitter';
4
- type MessageEvents = {
4
+ export type MessageEvents = {
5
5
  click: (e: MouseEvent) => void;
6
6
  blur: (e: MouseEvent) => void;
7
7
  hover: (e: MouseEvent) => void;
@@ -30,10 +30,6 @@ export declare class GmailAppMenuItemView extends GmailAppMenuItemView_base {
30
30
  * @internal
31
31
  */
32
32
  hover(): void;
33
- /**
34
- * @internal
35
- */
36
- activate(): void;
37
33
  }
38
34
  export {};
39
35
  //# sourceMappingURL=gmail-app-menu-item-view.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gmail-app-menu-item-view.d.ts","sourceRoot":"","sources":["../../../../../../../src/platform-implementation-js/dom-driver/gmail/views/gmail-app-menu-item-view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,WAAW,MAAM,iBAAiB,CAAC;AAE1C,OAAO,iBAAiB,MAAM,eAAe,CAAC;AAK9C,KAAK,aAAa,GAAG;IACnB,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IAC/B,IAAI,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IAC9B,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IAC/B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,YAAY,MAAgB,CAAC;AAC1C,eAAO,MAAM,cAAc,yBAAmC,CAAC;AAC/D,eAAO,MAAM,aAAa,4BAA+C,CAAC;mDAOL,kBAAkB,aAAa,CAAC;AAArG,qBAAa,oBAAqB,SAAQ,yBAA4D;;IACpG,MAAM,CAAC,UAAU;;;MAGN;IAOX,IAAI,OAAO,4BAEV;IAED,qBAAqB,CAAC,qBAAqB,EAAE,qBAAqB;IAKlE,IAAI,kBAAkB,sCAErB;gBAEW,MAAM,EAAE,WAAW;IAW/B,MAAM;IAON;;OAEG;IACH,IAAI;IAIJ;;OAEG;IACH,KAAK;IASL;;OAEG;IACH,QAAQ;CAiFT"}
1
+ {"version":3,"file":"gmail-app-menu-item-view.d.ts","sourceRoot":"","sources":["../../../../../../../src/platform-implementation-js/dom-driver/gmail/views/gmail-app-menu-item-view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,WAAW,MAAM,iBAAiB,CAAC;AAE1C,OAAO,iBAAiB,MAAM,eAAe,CAAC;AAK9C,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IAC/B,IAAI,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IAC9B,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IAC/B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,YAAY,MAAgB,CAAC;AAC1C,eAAO,MAAM,cAAc,yBAAmC,CAAC;AAC/D,eAAO,MAAM,aAAa,4BAA+C,CAAC;mDAOL,kBAAkB,aAAa,CAAC;AAArG,qBAAa,oBAAqB,SAAQ,yBAA4D;;IACpG,MAAM,CAAC,UAAU;;;MAGN;IAOX,IAAI,OAAO,4BAEV;IAED,qBAAqB,CAAC,qBAAqB,EAAE,qBAAqB;IAKlE,IAAI,kBAAkB,sCAErB;gBAEW,MAAM,EAAE,WAAW;IAc/B,MAAM;IAON;;OAEG;IACH,IAAI;IAIJ;;OAEG;IACH,KAAK;CAqFN"}
@@ -34,8 +34,8 @@ export class GmailAppMenuItemView extends EventEmitter {
34
34
  this.#driver = driver;
35
35
  driver.getStopper().onValue(() => this.remove());
36
36
  this.#element.addEventListener('click', (e) => this.#onClick(e));
37
- this.#element.addEventListener('mouseenter', this.#onHover);
38
37
  this.#element.addEventListener('mouseleave', this.#onBlur);
38
+ querySelector(this.#element, ICON_ELEMENT_SELECTOR).addEventListener('mouseenter', this.#onHover);
39
39
  }
40
40
  remove() {
41
41
  if (this.#destroyed)
@@ -59,19 +59,6 @@ export class GmailAppMenuItemView extends EventEmitter {
59
59
  }
60
60
  this.element?.classList.add(GmailAppMenuItemView.elementCss.HOVER);
61
61
  }
62
- /**
63
- * @internal
64
- */
65
- activate() {
66
- this.element?.classList.remove(GmailAppMenuItemView.elementCss.HOVER);
67
- this.element?.classList.add(GmailAppMenuItemView.elementCss.ACTIVE);
68
- }
69
- // /**
70
- // * @internal
71
- // */
72
- // deactivate() {
73
- // this.element?.classList.remove(GmailAppMenuItemView.elementCss.ACTIVE);
74
- // }
75
62
  #setupElement() {
76
63
  const element = document.createElement('div');
77
64
  element.className = ELEMENT_CLASS;
@@ -98,10 +85,13 @@ export class GmailAppMenuItemView extends EventEmitter {
98
85
  const iconContainerEl = querySelector(element, ICON_ELEMENT_SELECTOR);
99
86
  const { iconUrl, iconClassName } = this.#menuItemDescriptor ?? {};
100
87
  if (iconUrl) {
101
- const theme = GmailElementGetter.isDarkTheme()
88
+ const rawTheme = GmailElementGetter.isDarkTheme()
102
89
  ? iconUrl.darkTheme
103
90
  : iconUrl.lightTheme;
91
+ const theme = typeof rawTheme === 'string' ? rawTheme : rawTheme.default;
92
+ const activeImg = typeof rawTheme === 'string' ? rawTheme : rawTheme.active;
104
93
  iconContainerEl.style.setProperty('--background-image', `url(${theme})`);
94
+ iconContainerEl.style.setProperty('--background-image--active', `url(${activeImg})`);
105
95
  }
106
96
  iconContainerEl.className = cx(ICON_ELEMENT_CLASS, iconClassName);
107
97
  }
@@ -113,7 +103,7 @@ export class GmailAppMenuItemView extends EventEmitter {
113
103
  this.emit('click', e);
114
104
  this.#menuItemDescriptor?.onClick?.(e);
115
105
  if (this.#menuItemDescriptor?.routeID) {
116
- this.#driver.goto(this.#menuItemDescriptor.routeID, this.#menuItemDescriptor?.routeParams);
106
+ this.#driver.goto(this.#menuItemDescriptor.routeID, this.#menuItemDescriptor.routeParams);
117
107
  }
118
108
  }
119
109
  #onBlur = (e) => {
@@ -1,19 +1,31 @@
1
1
  import { RouteView } from '../../inboxsdk';
2
2
  import GmailDriver from '../dom-driver/gmail/gmail-driver';
3
3
  import { AppMenuItemView } from '../views/app-menu-item-view';
4
+ type ThemedIcon = string | {
5
+ active: string;
6
+ default: string;
7
+ };
4
8
  export type AppMenuItemDescriptor = {
5
9
  name: string;
6
10
  iconUrl?: {
7
- darkTheme: string;
8
- lightTheme: string;
11
+ darkTheme: ThemedIcon;
12
+ lightTheme: ThemedIcon;
9
13
  };
10
14
  className?: string;
11
15
  iconClassName?: string;
12
16
  insertIndex?: number;
13
17
  onClick?: (e?: MouseEvent) => void | null;
14
18
  onHover?: (e?: MouseEvent) => void | null;
19
+ /**
20
+ * If routeID is provided, isRouteActive should be as well.
21
+ */
15
22
  routeID?: string;
16
23
  routeParams?: {};
24
+ /**
25
+ * @example (routeView) => routeView.getRouteID() === 'inbox'
26
+ *
27
+ * @see RouteView
28
+ */
17
29
  isRouteActive: (routeView: RouteView) => boolean;
18
30
  };
19
31
  export type AppMenuItemPanelDescriptor = {
@@ -37,4 +49,5 @@ export default class AppMenu {
37
49
  addMenuItem(menuItemDescriptor: AppMenuItemDescriptor): AppMenuItemView;
38
50
  isShown(): Promise<boolean>;
39
51
  }
52
+ export {};
40
53
  //# sourceMappingURL=app-menu.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"app-menu.d.ts","sourceRoot":"","sources":["../../../../../src/platform-implementation-js/namespaces/app-menu.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,WAAW,MAAM,kCAAkC,CAAC;AAE3D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE;QACR,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI,CAAC;IAC1C,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI,CAAC;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,EAAE,CAAC;IACjB,aAAa,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,OAAO,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE;QACd,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;QACjC,OAAO,CAAC,EAAE;YACR,SAAS,EAAE,MAAM,CAAC;YAClB,UAAU,EAAE,MAAM,CAAC;SACpB,CAAC;QACF,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,OAAO;;gBAGd,MAAM,EAAE,WAAW;IAI/B,WAAW,CAAC,kBAAkB,EAAE,qBAAqB,GAAG,eAAe;IAKjE,OAAO;CAId"}
1
+ {"version":3,"file":"app-menu.d.ts","sourceRoot":"","sources":["../../../../../src/platform-implementation-js/namespaces/app-menu.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,WAAW,MAAM,kCAAkC,CAAC;AAE3D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,KAAK,UAAU,GACX,MAAM,GACN;IACE,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEN,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE;QACR,SAAS,EAAE,UAAU,CAAC;QACtB,UAAU,EAAE,UAAU,CAAC;KACxB,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI,CAAC;IAC1C,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI,CAAC;IAC1C;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,EAAE,CAAC;IACjB;;;;OAIG;IACH,aAAa,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,OAAO,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE;QACd,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;QACjC,OAAO,CAAC,EAAE;YACR,SAAS,EAAE,MAAM,CAAC;YAClB,UAAU,EAAE,MAAM,CAAC;SACpB,CAAC;QACF,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,OAAO;;gBAGd,MAAM,EAAE,WAAW;IAI/B,WAAW,CAAC,kBAAkB,EAAE,qBAAqB,GAAG,eAAe;IAKjE,OAAO;CAId"}
@@ -14,6 +14,7 @@ declare const AppMenuItemView_base: new () => TypedEmitter<MessageEvents>;
14
14
  */
15
15
  export declare class AppMenuItemView extends AppMenuItemView_base {
16
16
  #private;
17
+ get menuItemDescriptor(): AppMenuItemDescriptor;
17
18
  constructor(driver: GmailDriver, menuItemDescriptor: AppMenuItemDescriptor);
18
19
  addCollapsiblePanel(panelDescriptor: AppMenuItemPanelDescriptor): Promise<CollapsiblePanelView | undefined>;
19
20
  update(menuItemDescriptor: AppMenuItemDescriptor): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"app-menu-item-view.d.ts","sourceRoot":"","sources":["../../../../../src/platform-implementation-js/views/app-menu-item-view.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAC;AAWzC,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC3B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,WAAW,MAAM,kCAAkC,CAAC;AAI3D,KAAK,aAAa,GAAG;IACnB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;8CA2C8D,aAAa,aAAa,CAAC;AAH3F;;GAEG;AACH,qBAAa,eAAgB,SAAQ,oBAAuD;;gBA0Q9E,MAAM,EAAE,WAAW,EAAE,kBAAkB,EAAE,qBAAqB;IAiDpE,mBAAmB,CAAC,eAAe,EAAE,0BAA0B;IAkC/D,MAAM,CAAC,kBAAkB,EAAE,qBAAqB;IAKtD,MAAM;CA+BP"}
1
+ {"version":3,"file":"app-menu-item-view.d.ts","sourceRoot":"","sources":["../../../../../src/platform-implementation-js/views/app-menu-item-view.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAC;AAUzC,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC3B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,WAAW,MAAM,kCAAkC,CAAC;AAK3D,KAAK,aAAa,GAAG;IACnB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;8CAyC8D,aAAa,aAAa,CAAC;AAH3F;;GAEG;AACH,qBAAa,eAAgB,SAAQ,oBAAuD;;IAiT1F,IAAI,kBAAkB,0BAErB;gBAQW,MAAM,EAAE,WAAW,EAAE,kBAAkB,EAAE,qBAAqB;IAuDpE,mBAAmB,CAAC,eAAe,EAAE,0BAA0B;IAiC/D,MAAM,CAAC,kBAAkB,EAAE,qBAAqB;IAMtD,MAAM;CAYP"}
@@ -1,11 +1,11 @@
1
1
  import Kefir from 'kefir';
2
- import kefirStopper from 'kefir-stopper';
3
2
  import kefirBus from 'kefir-bus';
4
3
  import EventEmitter from '../lib/safe-event-emitter';
5
4
  import { GmailAppMenuItemView, NATIVE_CLASS, INBOXSDK_CLASS, } from '../dom-driver/gmail/views/gmail-app-menu-item-view';
6
5
  import { NATIVE_CLASS as PANEL_NATIVE_CLASS, CollapsiblePanelView, } from './collapsible-panel-view';
7
6
  import { addCollapsiblePanel } from '../dom-driver/gmail/gmail-driver/add-collapsible-panel';
8
7
  import GmailElementGetter from '../dom-driver/gmail/gmail-element-getter';
8
+ import defer from '../../common/defer';
9
9
  var NativeAppMenuClassName;
10
10
  (function (NativeAppMenuClassName) {
11
11
  NativeAppMenuClassName["MAIL"] = "XJ";
@@ -33,12 +33,13 @@ const routeIDtoMenuItemClass = Object.fromEntries([
33
33
  ...SPACES_ROUTES.map((route) => [route, NativeAppMenuClassName.SPACES]),
34
34
  ...MEET_ROUTES.map((route) => [route, NativeAppMenuClassName.MEET]),
35
35
  ]);
36
- const initialRoutingStateStopper = kefirStopper();
37
36
  /**
38
37
  * Contains both a native Gmail app menu item and a collapsible panel.
39
38
  */
40
39
  export class AppMenuItemView extends EventEmitter {
41
40
  static #menuItemChangeStream = Kefir.pool();
41
+ static #menuItemChangeBus = kefirBus();
42
+ static #menuItemAddedDeferred = defer();
42
43
  static #routeViewDriverStream;
43
44
  static #menuItemToPanelMap = new Map();
44
45
  static #appMenuItemViews = new Set();
@@ -58,19 +59,9 @@ export class AppMenuItemView extends EventEmitter {
58
59
  if (AppMenuItemView.#routeViewDriverStream)
59
60
  return;
60
61
  AppMenuItemView.#routeViewDriverStream = driver.getRouteViewDriverStream();
61
- const bus = kefirBus();
62
- AppMenuItemView.#menuItemChangeStream.plug(bus);
63
- AppMenuItemView.#routeViewDriverStream
64
- .takeUntilBy(initialRoutingStateStopper)
65
- .onValue(async (routeView) => {
62
+ AppMenuItemView.#routeViewDriverStream.onValue(async (routeView) => {
66
63
  const routeViewID = routeView.getRouteID();
67
64
  const routeType = routeView.getRouteType();
68
- const routeViewParams = routeView.getParams();
69
- console.debug({
70
- routeViewID,
71
- routeType,
72
- routeViewParams,
73
- });
74
65
  /* Handling custom app menu items */
75
66
  const descriptors = Array.from(AppMenuItemView.#appMenuItemViews, async (appMenuItemView) => {
76
67
  const gmailView = await appMenuItemView.#gmailViewPromise;
@@ -81,17 +72,21 @@ export class AppMenuItemView extends EventEmitter {
81
72
  return descriptor?.isRouteActive(routeView);
82
73
  }) ?? [];
83
74
  if (gmailView?.element) {
84
- bus.emit(['click', gmailView.element]);
75
+ AppMenuItemView.#menuItemChangeBus.emit(['click', gmailView.element]);
85
76
  return;
86
77
  }
87
78
  /* Handling native app menu items */
88
- const selector = `.${routeViewID
89
- ? routeIDtoMenuItemClass[routeViewID] ?? NativeAppMenuClassName.MAIL
90
- : NativeAppMenuClassName.MAIL}`;
91
- const element = document.querySelector(selector);
92
- if (element) {
93
- bus.emit(['click', element]);
94
- return;
79
+ let menuItemClass = '';
80
+ if (routeViewID) {
81
+ menuItemClass = routeIDtoMenuItemClass[routeViewID];
82
+ }
83
+ if ((!routeViewID || !menuItemClass) && routeType !== 'CUSTOM') {
84
+ menuItemClass = NativeAppMenuClassName.MAIL;
85
+ }
86
+ const menuItemElement = menuItemClass &&
87
+ document.querySelector(`.${menuItemClass}`);
88
+ if (menuItemElement) {
89
+ AppMenuItemView.#menuItemChangeBus.emit(['click', menuItemElement]);
95
90
  }
96
91
  });
97
92
  }
@@ -101,6 +96,7 @@ export class AppMenuItemView extends EventEmitter {
101
96
  if (!gmailAppMenu) {
102
97
  return;
103
98
  }
99
+ AppMenuItemView.#menuItemChangeStream.plug(AppMenuItemView.#menuItemChangeBus);
104
100
  // Set up menu item panel -> menu collapsible panel element mappings
105
101
  for (const [menuItemClass, panelClass] of nativeButtonToPanelMap) {
106
102
  const menuItemElement = document.querySelector(`.${NATIVE_CLASS}.${menuItemClass}`);
@@ -111,129 +107,161 @@ export class AppMenuItemView extends EventEmitter {
111
107
  AppMenuItemView.#menuItemToPanelMap.set(menuItemElement, panelElement ?? undefined);
112
108
  }
113
109
  }
114
- // Set up event listeners we use to control menu UI
115
- const stream = Kefir.stream((emitter) => {
116
- // We intercept some events emitted on Gmail (native) menu items to gain full control of the menu (menu items and panels).
117
- // Thus, some native event handlers won't be invoked so we replicate the Gmail's behavior by ourselves.
118
- const appMenuElement = GmailElementGetter.getAppMenuContainer();
119
- for (const nativeMenuItem of appMenuElement?.querySelectorAll(`.${NATIVE_CLASS}:not(.${INBOXSDK_CLASS})`) ?? []) {
120
- // Gmail uses this listener for panel hover state activation. It's prevented from propagation and we handle UI updates
121
- nativeMenuItem.addEventListener('mouseenter', (e) => {
122
- e.stopImmediatePropagation();
123
- emitter.emit(['mouseenter', nativeMenuItem, e]);
124
- }, true);
125
- // Gmail uses this listener for panel hover state deactivation. It's prevented from propagation and we handle UI updates
126
- nativeMenuItem.addEventListener('mouseleave', (e) => {
127
- e.stopImmediatePropagation();
128
- emitter.emit(['mouseleave', nativeMenuItem, e]);
129
- }, true);
130
- // Click event isn't prevented from propagation to let Gmail handle routing. The styling is handled by us
131
- nativeMenuItem.addEventListener('click', () => {
132
- emitter.emit(['click', nativeMenuItem]);
133
- });
134
- // Handle moving cursor out of panel. We use it to enhance the styling since it won't be handled by Gmail
135
- const panel = AppMenuItemView.#menuItemToPanelMap.get(nativeMenuItem);
136
- panel?.addEventListener('mouseleave', (e) => {
137
- emitter.emit(['mouseleave', nativeMenuItem, e]);
138
- });
139
- }
140
- });
141
- AppMenuItemView.#menuItemChangeStream.plug(stream);
142
110
  })();
143
111
  }
112
+ static {
113
+ AppMenuItemView.#menuItemAddedDeferred.promise.then(() => {
114
+ // Set up event listeners we use to control menu UI
115
+ // We intercept some events emitted on Gmail (native) menu items to gain full control of the menu (menu items and panels).
116
+ // Thus, some native event handlers won't be invoked so we replicate the Gmail's behavior by ourselves.
117
+ const appMenuElement = GmailElementGetter.getAppMenuContainer();
118
+ for (const nativeMenuItem of appMenuElement?.querySelectorAll(`.${NATIVE_CLASS}:not(.${INBOXSDK_CLASS})`) ?? []) {
119
+ // Gmail uses this listener for panel hover state activation. It's prevented from propagation and we handle UI updates
120
+ const buttonElement = nativeMenuItem.querySelector('.V6.CL');
121
+ buttonElement?.addEventListener('mouseenter', (e) => {
122
+ e.stopImmediatePropagation();
123
+ AppMenuItemView.#menuItemChangeBus.emit([
124
+ 'mouseenter',
125
+ nativeMenuItem,
126
+ e,
127
+ ]);
128
+ }, true);
129
+ // Gmail uses this listener for panel hover state deactivation. It's prevented from propagation and we handle UI updates
130
+ nativeMenuItem.addEventListener('mouseleave', (e) => {
131
+ e.stopImmediatePropagation();
132
+ AppMenuItemView.#menuItemChangeBus.emit([
133
+ 'mouseleave',
134
+ nativeMenuItem,
135
+ e,
136
+ ]);
137
+ }, true);
138
+ // Click event isn't prevented from propagation to let Gmail handle routing. The styling is handled by us
139
+ nativeMenuItem.addEventListener('click', () => {
140
+ AppMenuItemView.#menuItemChangeBus.emit(['click', nativeMenuItem]);
141
+ });
142
+ // Handle moving cursor out of panel. We use it to enhance the styling since it won't be handled by Gmail
143
+ const panel = AppMenuItemView.#menuItemToPanelMap.get(nativeMenuItem);
144
+ panel?.addEventListener('mouseleave', (e) => {
145
+ AppMenuItemView.#menuItemChangeBus.emit([
146
+ 'mouseleave',
147
+ nativeMenuItem,
148
+ e,
149
+ ]);
150
+ });
151
+ }
152
+ });
153
+ }
144
154
  static {
145
155
  AppMenuItemView.#menuItemChangeStream.onValue(async (v) => {
146
156
  const [type, menuItem, mouseEvent] = v;
147
157
  const { ACTIVE, HOVER } = GmailAppMenuItemView.elementCss;
148
- if (type === 'mouseenter') {
149
- const panel = AppMenuItemView.#menuItemToPanelMap.get(menuItem);
150
- if (mouseEvent.relatedTarget instanceof Node &&
151
- (menuItem.contains(mouseEvent.relatedTarget) ||
152
- panel?.contains(mouseEvent.relatedTarget)))
153
- return;
154
- const activeMenuItem = AppMenuItemView.#getActiveMenuItem();
155
- const activePanel = AppMenuItemView.#getActivePanel();
156
- if (activeMenuItem === menuItem && activePanel === panel)
157
- return;
158
- // deactivate active panel
159
- if (activePanel) {
160
- activePanel.style.removeProperty('height');
161
- activePanel.classList.remove(CollapsiblePanelView.elementCss.ACTIVE);
162
- activePanel.classList.remove(CollapsiblePanelView.elementCss.HOVER);
158
+ switch (type) {
159
+ case 'mouseenter': {
160
+ const panel = AppMenuItemView.#menuItemToPanelMap.get(menuItem);
161
+ const activeMenuItem = AppMenuItemView.#getActiveMenuItem();
162
+ const activePanel = AppMenuItemView.#getActivePanel();
163
+ const burgerMenuOpen = GmailElementGetter.isAppBurgerMenuOpen();
164
+ // hover-styled panel is displayed for collapsed burger menu
165
+ if (activeMenuItem === menuItem &&
166
+ activePanel === panel &&
167
+ burgerMenuOpen)
168
+ return;
169
+ // deactivate active panel
170
+ if (activePanel) {
171
+ activePanel.style.removeProperty('height');
172
+ activePanel.classList.remove(CollapsiblePanelView.elementCss.ACTIVE);
173
+ activePanel.classList.remove(CollapsiblePanelView.elementCss.HOVER);
174
+ }
175
+ // activate new panel
176
+ if (panel) {
177
+ const height = window.innerHeight - panel.getBoundingClientRect().top;
178
+ panel.style.cssText = `height: ${height}px;`;
179
+ panel.classList.add(CollapsiblePanelView.elementCss.ACTIVE);
180
+ panel.classList.add(CollapsiblePanelView.elementCss.HOVER);
181
+ // hover menu item
182
+ menuItem.classList.add(HOVER);
183
+ // handle burger menu collapsed
184
+ if (!burgerMenuOpen) {
185
+ for (const panel of document.querySelectorAll(CollapsiblePanelView.elementSelectors.NATIVE) ?? []) {
186
+ panel.classList.add(CollapsiblePanelView.elementCss.COLLAPSED_HOVER);
187
+ }
188
+ }
189
+ }
190
+ else {
191
+ // panel doesn't exist (i.e. Meet) so activate active menu item's panel instead (as Gmail currently does -- FEB 2023)
192
+ const panel = activeMenuItem &&
193
+ AppMenuItemView.#menuItemToPanelMap.get(activeMenuItem);
194
+ panel?.classList.add(CollapsiblePanelView.elementCss.ACTIVE);
195
+ }
196
+ break;
163
197
  }
164
- // activate new panel
165
- if (panel) {
166
- const height = window.innerHeight - panel.getBoundingClientRect().top;
167
- panel.style.cssText = `height: ${height}px;`;
168
- panel.classList.add(CollapsiblePanelView.elementCss.ACTIVE);
169
- panel.classList.add(CollapsiblePanelView.elementCss.HOVER);
170
- // hover menu item
171
- menuItem.classList.add(HOVER);
172
- }
173
- else {
174
- // panel doesn't exist (i.e. Meet) so activate active menu item's panel instead (as Gmail currently does -- FEB 2023)
175
- const panel = activeMenuItem &&
198
+ case 'mouseleave': {
199
+ const activeMenuItem = AppMenuItemView.#getActiveMenuItem();
200
+ const activePanel = AppMenuItemView.#getActivePanel();
201
+ const activeMenuItemPanel = activeMenuItem &&
176
202
  AppMenuItemView.#menuItemToPanelMap.get(activeMenuItem);
177
- panel?.classList.add(CollapsiblePanelView.elementCss.ACTIVE);
178
- }
179
- }
180
- if (type === 'mouseleave') {
181
- const activeMenuItem = AppMenuItemView.#getActiveMenuItem();
182
- const activePanel = AppMenuItemView.#getActivePanel();
183
- const activeMenuItemPanel = activeMenuItem &&
184
- AppMenuItemView.#menuItemToPanelMap.get(activeMenuItem);
185
- if (mouseEvent.relatedTarget instanceof Node &&
186
- (menuItem.contains(mouseEvent.relatedTarget) ||
187
- activePanel?.contains(mouseEvent.relatedTarget)))
188
- return;
189
- if (activePanel === activeMenuItemPanel)
190
- return;
191
- // unhover menu item
192
- menuItem.classList.remove(HOVER);
193
- // deactivate active panel
194
- if (activePanel) {
195
- activePanel.style.removeProperty('height');
196
- activePanel.classList.remove(CollapsiblePanelView.elementCss.ACTIVE);
197
- activePanel.classList.remove(CollapsiblePanelView.elementCss.HOVER);
198
- }
199
- // activate active menu item panel
200
- if (activeMenuItemPanel) {
201
- activeMenuItemPanel.classList.add(CollapsiblePanelView.elementCss.ACTIVE);
202
- }
203
- }
204
- if (type === 'click') {
205
- const appMenuElement = GmailElementGetter.getAppMenuContainer();
206
- // deactivate active panel
207
- const activePanel = AppMenuItemView.#getActivePanel();
208
- if (activePanel) {
209
- activePanel.style.removeProperty('height');
210
- activePanel.classList.remove(CollapsiblePanelView.elementCss.ACTIVE);
211
- activePanel.classList.remove(CollapsiblePanelView.elementCss.HOVER);
212
- }
213
- // deactivate menu items
214
- for (const menuItem_ of appMenuElement?.querySelectorAll(`.${NATIVE_CLASS}`) ?? []) {
215
- menuItem_.classList.remove(ACTIVE);
216
- menuItem_.classList.remove(HOVER);
203
+ if (mouseEvent.relatedTarget instanceof Node &&
204
+ (menuItem.contains(mouseEvent.relatedTarget) ||
205
+ activePanel?.contains(mouseEvent.relatedTarget)))
206
+ return;
207
+ const burgerMenuOpen = GmailElementGetter.isAppBurgerMenuOpen();
208
+ if (activePanel === activeMenuItemPanel && burgerMenuOpen)
209
+ return;
210
+ // unhover menu item
211
+ menuItem.classList.remove(HOVER);
212
+ // handle burger menu collapsed
213
+ for (const panel of document.querySelectorAll(CollapsiblePanelView.elementSelectors.NATIVE) ?? []) {
214
+ panel.classList.remove(CollapsiblePanelView.elementCss.COLLAPSED_HOVER);
215
+ }
216
+ // deactivate active panel
217
+ if (activePanel) {
218
+ activePanel.style.removeProperty('height');
219
+ activePanel.classList.remove(CollapsiblePanelView.elementCss.ACTIVE);
220
+ activePanel.classList.remove(CollapsiblePanelView.elementCss.HOVER);
221
+ }
222
+ // activate active menu item panel
223
+ if (activeMenuItemPanel) {
224
+ activeMenuItemPanel.classList.add(CollapsiblePanelView.elementCss.ACTIVE);
225
+ }
226
+ break;
217
227
  }
218
- // activate menu item
219
- menuItem.classList.add(ACTIVE);
220
- // activate panel
221
- const panel = AppMenuItemView.#menuItemToPanelMap.get(menuItem);
222
- if (panel) {
223
- panel.classList.add(CollapsiblePanelView.elementCss.ACTIVE);
228
+ case 'click': {
229
+ const appMenuElement = GmailElementGetter.getAppMenuContainer();
230
+ // deactivate active panel
231
+ const activePanel = AppMenuItemView.#getActivePanel();
232
+ if (activePanel) {
233
+ activePanel.style.removeProperty('height');
234
+ activePanel.classList.remove(CollapsiblePanelView.elementCss.ACTIVE);
235
+ activePanel.classList.remove(CollapsiblePanelView.elementCss.HOVER);
236
+ }
237
+ // deactivate menu items
238
+ for (const menuItem_ of appMenuElement?.querySelectorAll(`.${NATIVE_CLASS}`) ?? []) {
239
+ menuItem_.classList.remove(ACTIVE);
240
+ menuItem_.classList.remove(HOVER);
241
+ }
242
+ // activate menu item
243
+ menuItem.classList.add(ACTIVE);
244
+ // activate panel
245
+ const panel = AppMenuItemView.#menuItemToPanelMap.get(menuItem);
246
+ if (panel) {
247
+ panel.classList.add(CollapsiblePanelView.elementCss.ACTIVE);
248
+ }
224
249
  }
225
250
  }
226
251
  });
227
252
  }
253
+ get menuItemDescriptor() {
254
+ return this.#menuItemDescriptor;
255
+ }
228
256
  #driver;
229
257
  #destroyed = false;
230
258
  #gmailViewPromise;
231
259
  #collapsiblePanel;
232
- #appMenuItemStream;
233
- #collapsiblePanelStream;
260
+ #menuItemDescriptor;
234
261
  constructor(driver, menuItemDescriptor) {
235
262
  super();
236
263
  this.#driver = driver;
264
+ this.#menuItemDescriptor = menuItemDescriptor;
237
265
  const gmailAppMenuItemView = this.#driver.addAppMenuItem(menuItemDescriptor);
238
266
  this.#gmailViewPromise = gmailAppMenuItemView;
239
267
  gmailAppMenuItemView.then((gmailView) => {
@@ -244,28 +272,34 @@ export class AppMenuItemView extends EventEmitter {
244
272
  if (gmailElement) {
245
273
  AppMenuItemView.#menuItemToPanelMap.set(gmailElement, undefined);
246
274
  }
247
- this.#appMenuItemStream = Kefir.stream((emitter) => {
248
- gmailView.on('destroy', () => {
249
- emitter.end();
250
- this.remove();
251
- });
252
- gmailView.on('click', () => {
253
- emitter.emit(['click', gmailElement]);
254
- this.emit('click');
255
- });
256
- gmailView.on('hover', (e) => {
257
- emitter.emit(['mouseenter', gmailElement, e]);
258
- this.emit('hover');
259
- });
260
- gmailView.on('blur', (e) => {
261
- emitter.emit(['mouseleave', gmailElement, e]);
262
- this.emit('blur');
263
- });
275
+ gmailView.on('destroy', () => {
276
+ AppMenuItemView.#menuItemChangeBus.end();
277
+ this.remove();
278
+ });
279
+ gmailView.on('click', () => {
280
+ AppMenuItemView.#menuItemChangeBus.emit(['click', gmailElement]);
281
+ this.emit('click');
282
+ });
283
+ gmailView.on('hover', (e) => {
284
+ AppMenuItemView.#menuItemChangeBus.emit([
285
+ 'mouseenter',
286
+ gmailElement,
287
+ e,
288
+ ]);
289
+ this.emit('hover');
290
+ });
291
+ gmailView.on('blur', (e) => {
292
+ AppMenuItemView.#menuItemChangeBus.emit([
293
+ 'mouseleave',
294
+ gmailElement,
295
+ e,
296
+ ]);
297
+ this.emit('blur');
264
298
  });
265
- AppMenuItemView.#menuItemChangeStream.plug(this.#appMenuItemStream);
266
- AppMenuItemView.#setUpRouteViewDriverStream(driver);
267
- AppMenuItemView.#appMenuItemViews.add(this);
268
299
  });
300
+ AppMenuItemView.#setUpRouteViewDriverStream(driver);
301
+ AppMenuItemView.#menuItemAddedDeferred.resolve(undefined);
302
+ AppMenuItemView.#appMenuItemViews.add(this);
269
303
  }
270
304
  async addCollapsiblePanel(panelDescriptor) {
271
305
  const collapsiblePanel = await addCollapsiblePanel(this.#driver, panelDescriptor);
@@ -273,12 +307,13 @@ export class AppMenuItemView extends EventEmitter {
273
307
  this.#gmailViewPromise.then((gmailView) => {
274
308
  const gmailElement = gmailView.element;
275
309
  if (gmailElement) {
276
- this.#collapsiblePanelStream = Kefir.stream((emitter) => {
277
- collapsiblePanel.on('blur', (e) => {
278
- emitter.value(['mouseleave', gmailElement, e]);
279
- });
310
+ collapsiblePanel.on('blur', (e) => {
311
+ AppMenuItemView.#menuItemChangeBus.value([
312
+ 'mouseleave',
313
+ gmailElement,
314
+ e,
315
+ ]);
280
316
  });
281
- AppMenuItemView.#menuItemChangeStream.plug(this.#collapsiblePanelStream);
282
317
  }
283
318
  if (gmailElement && collapsiblePanel) {
284
319
  AppMenuItemView.#menuItemToPanelMap.set(gmailElement, collapsiblePanel.element);
@@ -291,6 +326,7 @@ export class AppMenuItemView extends EventEmitter {
291
326
  async update(menuItemDescriptor) {
292
327
  const gmailView = await this.#gmailViewPromise;
293
328
  gmailView.setMenuItemDescriptor(menuItemDescriptor);
329
+ this.#menuItemDescriptor = menuItemDescriptor;
294
330
  }
295
331
  remove() {
296
332
  if (this.#destroyed)
@@ -303,22 +339,6 @@ export class AppMenuItemView extends EventEmitter {
303
339
  AppMenuItemView.#menuItemToPanelMap.delete(gmailView.element);
304
340
  gmailView.remove();
305
341
  });
306
- this.#appMenuItemStream &&
307
- AppMenuItemView.#menuItemChangeStream.unplug(this.#appMenuItemStream);
308
- this.#collapsiblePanelStream &&
309
- AppMenuItemView.#menuItemChangeStream.unplug(this.#collapsiblePanelStream);
310
342
  AppMenuItemView.#appMenuItemViews.delete(this);
311
- initialRoutingStateStopper.destroy();
312
- }
313
- async #activate() {
314
- const gmailView = await this.#gmailViewPromise;
315
- const appMenuElement = GmailElementGetter.getAppMenuContainer();
316
- const { ACTIVE } = GmailAppMenuItemView.elementCss;
317
- // Note this affects both the active app menu item and the collapsible panel.
318
- for (const el of appMenuElement?.querySelectorAll(`.${ACTIVE}`) ?? []) {
319
- el.classList.remove(ACTIVE);
320
- }
321
- gmailView.activate();
322
- this.#collapsiblePanel?.activate();
323
343
  }
324
344
  }