@triptease/tt-navbar 0.0.45 → 0.0.46

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.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @triptease/tt-navbar v0.0.45
2
+ * @triptease/tt-navbar v0.0.46
3
3
  */
4
4
 
5
5
  // src/urlMappings.ts
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "Webcomponent tt-navbar following open-wc recommendations",
4
4
  "license": "MIT",
5
5
  "author": "tt-navbar",
6
- "version": "0.0.45",
6
+ "version": "0.0.46",
7
7
  "type": "module",
8
8
  "main": "dist/src/index.js",
9
9
  "module": "dist/src/index.js",
package/src/TtNavbar.ts CHANGED
@@ -19,7 +19,6 @@ import { styles } from './styles.js';
19
19
  import { tripteaseLogo } from './triptease-logo.js';
20
20
  import { urlMappings } from './urlMappings.js';
21
21
  import { Routes } from './Routes.js';
22
- import { NavbarController } from './NavbarController.js';
23
22
 
24
23
  const jsonArrayConverter = (value: string | null) => {
25
24
  if (!value) return [];
@@ -51,6 +50,12 @@ export class TtNavbar extends LitElement {
51
50
  @property({ type: Array, converter: jsonArrayConverter })
52
51
  clients: { clientKey: string; displayName: string }[] = [];
53
52
 
53
+ @property({ type: String, attribute: 'initial-state' })
54
+ initialState: 'open' | 'closed' | undefined = undefined;
55
+
56
+ @state()
57
+ isOpen: boolean = true;
58
+
54
59
  @property({ type: Object })
55
60
  onClientChange: ((clientKeySelected: string) => void) | undefined;
56
61
 
@@ -60,11 +65,6 @@ export class TtNavbar extends LitElement {
60
65
  @queryAll('a')
61
66
  protected allNavLinks!: Array<HTMLAnchorElement>;
62
67
 
63
- @state()
64
- private sidebarOpen = true;
65
-
66
- private navbarController = new NavbarController(this);
67
-
68
68
  protected firstUpdated() {
69
69
  this.setActiveState();
70
70
  }
@@ -77,6 +77,10 @@ export class TtNavbar extends LitElement {
77
77
  window.addEventListener('tetris:navigate', this.setActiveState);
78
78
 
79
79
  super.connectedCallback();
80
+
81
+ if (this.initialState) {
82
+ this.isOpen = this.initialState === 'open';
83
+ }
80
84
  }
81
85
 
82
86
  public disconnectedCallback() {
@@ -173,16 +177,18 @@ export class TtNavbar extends LitElement {
173
177
 
174
178
  private toggleSidebar = () => {
175
179
  this.closeAllDetails();
176
- this.navbarController.toggle();
180
+ this.isOpen = !this.isOpen;
181
+
182
+ // TODO - Set cookie
177
183
  };
178
184
 
179
- private handleToggle = (e: ToggleEvent) => {
185
+ private handleDetailsToggle = (e: ToggleEvent) => {
180
186
  const { newState } = e;
181
187
  const target = e.currentTarget as HTMLDetailsElement;
182
188
 
183
189
  if (newState === 'open') {
184
- if (!this.navbarController.isOpen) {
185
- this.navbarController.toggle();
190
+ if (!this.isOpen) {
191
+ this.toggleSidebar();
186
192
  }
187
193
 
188
194
  this.closeAllDetails(target);
@@ -216,8 +222,8 @@ export class TtNavbar extends LitElement {
216
222
 
217
223
  render() {
218
224
  return html`
219
- <nav id=${this.id} class="${this.navbarController.isOpen ? '' : 'sidebar-closed'}">
220
- <div class="sidebar-header ${this.navbarController.isOpen ? '' : 'sidebar-closed'}">
225
+ <nav id=${this.id} class="${this.isOpen ? '' : 'sidebar-closed'}">
226
+ <div class="sidebar-header ${this.isOpen ? '' : 'sidebar-closed'}">
221
227
  <div class="logo">
222
228
  ${unsafeSVG(tripteaseLogo)}
223
229
  </div>
@@ -230,7 +236,7 @@ export class TtNavbar extends LitElement {
230
236
  </button>
231
237
  </div>
232
238
 
233
- <div class="nav-items ${this.navbarController.isOpen ? '' : 'sidebar-closed'}">
239
+ <div class="nav-items ${this.isOpen ? '' : 'sidebar-closed'}">
234
240
  <a
235
241
  class="nav-item"
236
242
  href=${this.buildUrl('/')}
@@ -249,7 +255,7 @@ export class TtNavbar extends LitElement {
249
255
  data-intercom-target="channels"
250
256
  >${unsafeSVG(channels)}<span>Channels</span></a
251
257
  >
252
- <details id="market-insights" @toggle=${this.handleToggle} data-intercom-target="market-insights">
258
+ <details id="market-insights" @toggle=${this.handleDetailsToggle} data-intercom-target="market-insights">
253
259
  <summary>
254
260
  ${unsafeSVG(graph)}
255
261
  <span>Market Insights</span>
@@ -272,7 +278,7 @@ export class TtNavbar extends LitElement {
272
278
  >
273
279
  </div>
274
280
  </details>
275
- <details id="settings" @toggle=${this.handleToggle} data-intercom-target="settings">
281
+ <details id="settings" @toggle=${this.handleDetailsToggle} data-intercom-target="settings">
276
282
  <summary>
277
283
  ${unsafeSVG(gear)}
278
284
  <span>Settings</span>
@@ -310,7 +316,7 @@ export class TtNavbar extends LitElement {
310
316
  </div>
311
317
  </details>
312
318
  <hr />
313
- <details id="account" @toggle=${this.handleToggle} data-intercom-target="account">
319
+ <details id="account" @toggle=${this.handleDetailsToggle} data-intercom-target="account">
314
320
  <summary>
315
321
  ${unsafeSVG(user)}
316
322
  <span>Account</span>
@@ -333,7 +339,7 @@ export class TtNavbar extends LitElement {
333
339
  >
334
340
  </div>
335
341
  </details>
336
- <details id="billing-routes" @toggle=${this.handleToggle} data-intercom-target="billing">
342
+ <details id="billing-routes" @toggle=${this.handleDetailsToggle} data-intercom-target="billing">
337
343
  <summary>
338
344
  ${unsafeSVG(wallet)}
339
345
  <span>Billing</span>
@@ -357,7 +363,7 @@ export class TtNavbar extends LitElement {
357
363
  </div>
358
364
  </details>
359
365
  </div>
360
- <div class="tertiary-nav ${this.navbarController.isOpen ? '' : 'sidebar-closed'}">
366
+ <div class="tertiary-nav ${this.isOpen ? '' : 'sidebar-closed'}">
361
367
  <div id="external-links" class="nav-items">
362
368
  <a
363
369
  class="nav-item external-link"
@@ -1,4 +1,3 @@
1
- import { Clerk } from '@clerk/clerk-js';
2
1
  import '../src/tt-navbar.js';
3
2
  import {
4
3
  elementUpdated,
@@ -7,7 +6,6 @@ import {
7
6
  nextFrame,
8
7
  waitUntil,
9
8
  } from '@open-wc/testing';
10
- import { Resources } from '@clerk/types';
11
9
  import { TtNavbar } from '../src/index.js';
12
10
  import { Routes } from '../src/Routes.js';
13
11
 
@@ -400,98 +398,36 @@ describe('TtNavbar', () => {
400
398
  expect(anchor!.textContent).to.include('Booking reconciliation');
401
399
  });
402
400
 
403
- it('should default to open when Clerk is not available', async () => {
401
+ it("should default to 'open' when the 'initial-state' attribute is not provided", async () => {
404
402
  const navbar = await fixture<TtNavbar>(
405
403
  `<tt-navbar client-key=${CLIENT_KEY}></tt-navbar>`,
406
404
  );
407
405
 
408
406
  const logo = navbar.shadowRoot!.querySelector('.logo');
409
407
 
410
- expect(window.Clerk).to.be.undefined;
411
408
  expect(logo).to.exist;
412
409
  expect(logo!.checkVisibility()).to.be.true;
413
410
  });
414
411
 
415
- it('should default to state stored in Clerk when set', async () => {
416
- const mockUser = {
417
- unsafeMetadata: { preferences: { ui: { navigationOpen: false } } },
418
- };
419
-
420
- const mockAddListener = (func: (resources: Resources) => void) => {
421
- func({ user: mockUser } as unknown as Resources);
422
- };
423
-
424
- window.Clerk = {
425
- addListener: mockAddListener,
426
- user: mockUser,
427
- } as Clerk;
428
-
412
+ it("should default to 'open' when the 'initial-state' attribute is 'open", async () => {
429
413
  const navbar = await fixture<TtNavbar>(
430
- `<tt-navbar client-key=${CLIENT_KEY}></tt-navbar>`,
414
+ `<tt-navbar client-key=${CLIENT_KEY} initial-state="open"></tt-navbar>`,
431
415
  );
432
416
 
433
417
  const logo = navbar.shadowRoot!.querySelector('.logo');
434
418
 
435
419
  expect(logo).to.exist;
436
- expect(logo!.checkVisibility()).to.be.false;
437
-
438
- window.Clerk = undefined; // Cleanup
420
+ expect(logo!.checkVisibility()).to.be.true;
439
421
  });
440
422
 
441
- it('should update Clerk state when toggling if Clerk is available', async () => {
442
- let timesCalled = 0;
443
- let calledWith: unknown;
444
-
445
- const mockUpdate = (args: unknown) => {
446
- timesCalled += 1;
447
- calledWith = args;
448
- };
449
-
450
- const mockUser = {
451
- update: mockUpdate,
452
- unsafeMetadata: {
453
- foo: 'foo',
454
- preferences: {
455
- bar: 'bar',
456
- ui: { duck: 'duck', navigationOpen: false },
457
- },
458
- },
459
- };
460
-
461
- const mockAddListener = (func: (resources: Resources) => void) => {
462
- func({ user: mockUser } as unknown as Resources);
463
- };
464
-
465
- window.Clerk = {
466
- addListener: mockAddListener,
467
- user: mockUser,
468
- } as unknown as Clerk;
469
-
423
+ it("should default to 'closed' when the 'initial-state' attribute is 'closed", async () => {
470
424
  const navbar = await fixture<TtNavbar>(
471
- `<tt-navbar client-key=${CLIENT_KEY}></tt-navbar>`,
425
+ `<tt-navbar client-key=${CLIENT_KEY} initial-state="closed"></tt-navbar>`,
472
426
  );
473
427
 
474
- const navbarToggleBtn = navbar.shadowRoot!.querySelector(
475
- '#navbar-toggle-btn',
476
- ) as HTMLButtonElement;
477
-
478
- navbarToggleBtn.click();
479
- await elementUpdated(navbar);
480
-
481
- await expect(timesCalled).to.equal(1);
482
- expect(calledWith).to.deep.equal({
483
- unsafeMetadata: {
484
- foo: 'foo',
485
- preferences: {
486
- bar: 'bar',
487
- ui: {
488
- duck: 'duck',
489
- navigationOpen: true,
490
- },
491
- },
492
- },
493
- });
428
+ const logo = navbar.shadowRoot!.querySelector('.logo');
494
429
 
495
- window.Clerk = undefined; // Cleanup
430
+ expect(logo).to.exist;
431
+ expect(logo!.checkVisibility()).to.be.false;
496
432
  });
497
433
  });
@@ -1,12 +0,0 @@
1
- import { ReactiveController, ReactiveControllerHost } from 'lit';
2
- export declare class NavbarController implements ReactiveController {
3
- host: ReactiveControllerHost;
4
- private _isOpen;
5
- private _hasInitialized;
6
- private _removeClerkListener?;
7
- constructor(host: ReactiveControllerHost);
8
- get isOpen(): boolean;
9
- hostUpdate(): void;
10
- hostDisconnected(): void;
11
- toggle(): Promise<void>;
12
- }
@@ -1,49 +0,0 @@
1
- export class NavbarController {
2
- constructor(host) {
3
- this._isOpen = true;
4
- this._hasInitialized = false;
5
- (this.host = host).addController(this);
6
- }
7
- get isOpen() {
8
- return this._isOpen;
9
- }
10
- hostUpdate() {
11
- if (!this._hasInitialized && window.Clerk) {
12
- this._removeClerkListener = window.Clerk.addListener(resources => {
13
- const { user } = resources;
14
- if (user && !this._hasInitialized) {
15
- const navigationOpen = user.unsafeMetadata?.preferences?.ui?.navigationOpen;
16
- if (navigationOpen !== undefined) {
17
- this._isOpen = navigationOpen;
18
- this.host.requestUpdate();
19
- }
20
- this._hasInitialized = true;
21
- }
22
- });
23
- }
24
- }
25
- hostDisconnected() {
26
- if (this._removeClerkListener) {
27
- this._removeClerkListener();
28
- }
29
- }
30
- async toggle() {
31
- this._isOpen = !this._isOpen;
32
- if (window.Clerk) {
33
- window.Clerk.user?.update({
34
- unsafeMetadata: {
35
- ...window.Clerk.user?.unsafeMetadata,
36
- preferences: {
37
- ...window.Clerk.user?.unsafeMetadata?.preferences,
38
- ui: {
39
- ...window.Clerk.user?.unsafeMetadata?.preferences?.ui,
40
- navigationOpen: this.isOpen,
41
- },
42
- },
43
- },
44
- });
45
- }
46
- this.host.requestUpdate();
47
- }
48
- }
49
- //# sourceMappingURL=NavbarController.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"NavbarController.js","sourceRoot":"","sources":["../../src/NavbarController.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,gBAAgB;IAS3B,YAAY,IAA4B;QANhC,YAAO,GAAG,IAAI,CAAC;QAEf,oBAAe,GAAG,KAAK,CAAC;QAK9B,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,UAAU;QACR,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAC1C,IAAI,CAAC,oBAAoB,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE;gBAC/D,MAAM,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC;gBAC3B,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;oBAClC,MAAM,cAAc,GAClB,IAAI,CAAC,cAAc,EAAE,WAAW,EAAE,EAAE,EAAE,cAAc,CAAC;oBAEvD,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;wBACjC,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC;wBAC9B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;oBAC5B,CAAC;oBAED,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;gBAC9B,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,gBAAgB;QACd,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9B,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;QAE7B,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC;gBACxB,cAAc,EAAE;oBACd,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,cAAc;oBACpC,WAAW,EAAE;wBACX,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,cAAc,EAAE,WAAW;wBACjD,EAAE,EAAE;4BACF,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,EAAE;4BACrD,cAAc,EAAE,IAAI,CAAC,MAAM;yBAC5B;qBACF;iBACF;aACF,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IAC5B,CAAC;CACF","sourcesContent":["import { ReactiveController, ReactiveControllerHost } from 'lit';\nimport { UnsubscribeCallback } from '@clerk/types';\n\nexport class NavbarController implements ReactiveController {\n host: ReactiveControllerHost;\n\n private _isOpen = true;\n\n private _hasInitialized = false;\n\n private _removeClerkListener?: UnsubscribeCallback;\n\n constructor(host: ReactiveControllerHost) {\n (this.host = host).addController(this);\n }\n\n get isOpen() {\n return this._isOpen;\n }\n\n hostUpdate() {\n if (!this._hasInitialized && window.Clerk) {\n this._removeClerkListener = window.Clerk.addListener(resources => {\n const { user } = resources;\n if (user && !this._hasInitialized) {\n const navigationOpen =\n user.unsafeMetadata?.preferences?.ui?.navigationOpen;\n\n if (navigationOpen !== undefined) {\n this._isOpen = navigationOpen;\n this.host.requestUpdate();\n }\n\n this._hasInitialized = true;\n }\n });\n }\n }\n\n hostDisconnected() {\n if (this._removeClerkListener) {\n this._removeClerkListener();\n }\n }\n\n async toggle() {\n this._isOpen = !this._isOpen;\n\n if (window.Clerk) {\n window.Clerk.user?.update({\n unsafeMetadata: {\n ...window.Clerk.user?.unsafeMetadata,\n preferences: {\n ...window.Clerk.user?.unsafeMetadata?.preferences,\n ui: {\n ...window.Clerk.user?.unsafeMetadata?.preferences?.ui,\n navigationOpen: this.isOpen,\n },\n },\n },\n });\n }\n\n this.host.requestUpdate();\n }\n}\n"]}
@@ -1,57 +0,0 @@
1
- /**
2
- * @triptease/tt-navbar v0.0.45
3
- */
4
-
5
- // src/NavbarController.ts
6
- var NavbarController = class {
7
- constructor(host) {
8
- this._isOpen = true;
9
- this._hasInitialized = false;
10
- (this.host = host).addController(this);
11
- }
12
- get isOpen() {
13
- return this._isOpen;
14
- }
15
- hostUpdate() {
16
- if (!this._hasInitialized && window.Clerk) {
17
- this._removeClerkListener = window.Clerk.addListener((resources) => {
18
- const { user } = resources;
19
- if (user && !this._hasInitialized) {
20
- const navigationOpen = user.unsafeMetadata?.preferences?.ui?.navigationOpen;
21
- if (navigationOpen !== void 0) {
22
- this._isOpen = navigationOpen;
23
- this.host.requestUpdate();
24
- }
25
- this._hasInitialized = true;
26
- }
27
- });
28
- }
29
- }
30
- hostDisconnected() {
31
- if (this._removeClerkListener) {
32
- this._removeClerkListener();
33
- }
34
- }
35
- async toggle() {
36
- this._isOpen = !this._isOpen;
37
- if (window.Clerk) {
38
- window.Clerk.user?.update({
39
- unsafeMetadata: {
40
- ...window.Clerk.user?.unsafeMetadata,
41
- preferences: {
42
- ...window.Clerk.user?.unsafeMetadata?.preferences,
43
- ui: {
44
- ...window.Clerk.user?.unsafeMetadata?.preferences?.ui,
45
- navigationOpen: this.isOpen
46
- }
47
- }
48
- }
49
- });
50
- }
51
- this.host.requestUpdate();
52
- }
53
- };
54
- export {
55
- NavbarController
56
- };
57
- //# sourceMappingURL=NavbarController.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/NavbarController.ts"],
4
- "sourcesContent": ["import { ReactiveController, ReactiveControllerHost } from 'lit';\nimport { UnsubscribeCallback } from '@clerk/types';\n\nexport class NavbarController implements ReactiveController {\n host: ReactiveControllerHost;\n\n private _isOpen = true;\n\n private _hasInitialized = false;\n\n private _removeClerkListener?: UnsubscribeCallback;\n\n constructor(host: ReactiveControllerHost) {\n (this.host = host).addController(this);\n }\n\n get isOpen() {\n return this._isOpen;\n }\n\n hostUpdate() {\n if (!this._hasInitialized && window.Clerk) {\n this._removeClerkListener = window.Clerk.addListener(resources => {\n const { user } = resources;\n if (user && !this._hasInitialized) {\n const navigationOpen =\n user.unsafeMetadata?.preferences?.ui?.navigationOpen;\n\n if (navigationOpen !== undefined) {\n this._isOpen = navigationOpen;\n this.host.requestUpdate();\n }\n\n this._hasInitialized = true;\n }\n });\n }\n }\n\n hostDisconnected() {\n if (this._removeClerkListener) {\n this._removeClerkListener();\n }\n }\n\n async toggle() {\n this._isOpen = !this._isOpen;\n\n if (window.Clerk) {\n window.Clerk.user?.update({\n unsafeMetadata: {\n ...window.Clerk.user?.unsafeMetadata,\n preferences: {\n ...window.Clerk.user?.unsafeMetadata?.preferences,\n ui: {\n ...window.Clerk.user?.unsafeMetadata?.preferences?.ui,\n navigationOpen: this.isOpen,\n },\n },\n },\n });\n }\n\n this.host.requestUpdate();\n }\n}\n"],
5
- "mappings": ";;;;;AAGO,IAAM,mBAAN,MAAqD;AAAA,EAS1D,YAAY,MAA8B;AAN1C,SAAQ,UAAU;AAElB,SAAQ,kBAAkB;AAKxB,KAAC,KAAK,OAAO,MAAM,cAAc,IAAI;AAAA,EACvC;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,aAAa;AACX,QAAI,CAAC,KAAK,mBAAmB,OAAO,OAAO;AACzC,WAAK,uBAAuB,OAAO,MAAM,YAAY,eAAa;AAChE,cAAM,EAAE,KAAK,IAAI;AACjB,YAAI,QAAQ,CAAC,KAAK,iBAAiB;AACjC,gBAAM,iBACJ,KAAK,gBAAgB,aAAa,IAAI;AAExC,cAAI,mBAAmB,QAAW;AAChC,iBAAK,UAAU;AACf,iBAAK,KAAK,cAAc;AAAA,UAC1B;AAEA,eAAK,kBAAkB;AAAA,QACzB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,mBAAmB;AACjB,QAAI,KAAK,sBAAsB;AAC7B,WAAK,qBAAqB;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAM,SAAS;AACb,SAAK,UAAU,CAAC,KAAK;AAErB,QAAI,OAAO,OAAO;AAChB,aAAO,MAAM,MAAM,OAAO;AAAA,QACxB,gBAAgB;AAAA,UACd,GAAG,OAAO,MAAM,MAAM;AAAA,UACtB,aAAa;AAAA,YACX,GAAG,OAAO,MAAM,MAAM,gBAAgB;AAAA,YACtC,IAAI;AAAA,cACF,GAAG,OAAO,MAAM,MAAM,gBAAgB,aAAa;AAAA,cACnD,gBAAgB,KAAK;AAAA,YACvB;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAEA,SAAK,KAAK,cAAc;AAAA,EAC1B;AACF;",
6
- "names": []
7
- }
@@ -1,66 +0,0 @@
1
- import { ReactiveController, ReactiveControllerHost } from 'lit';
2
- import { UnsubscribeCallback } from '@clerk/types';
3
-
4
- export class NavbarController implements ReactiveController {
5
- host: ReactiveControllerHost;
6
-
7
- private _isOpen = true;
8
-
9
- private _hasInitialized = false;
10
-
11
- private _removeClerkListener?: UnsubscribeCallback;
12
-
13
- constructor(host: ReactiveControllerHost) {
14
- (this.host = host).addController(this);
15
- }
16
-
17
- get isOpen() {
18
- return this._isOpen;
19
- }
20
-
21
- hostUpdate() {
22
- if (!this._hasInitialized && window.Clerk) {
23
- this._removeClerkListener = window.Clerk.addListener(resources => {
24
- const { user } = resources;
25
- if (user && !this._hasInitialized) {
26
- const navigationOpen =
27
- user.unsafeMetadata?.preferences?.ui?.navigationOpen;
28
-
29
- if (navigationOpen !== undefined) {
30
- this._isOpen = navigationOpen;
31
- this.host.requestUpdate();
32
- }
33
-
34
- this._hasInitialized = true;
35
- }
36
- });
37
- }
38
- }
39
-
40
- hostDisconnected() {
41
- if (this._removeClerkListener) {
42
- this._removeClerkListener();
43
- }
44
- }
45
-
46
- async toggle() {
47
- this._isOpen = !this._isOpen;
48
-
49
- if (window.Clerk) {
50
- window.Clerk.user?.update({
51
- unsafeMetadata: {
52
- ...window.Clerk.user?.unsafeMetadata,
53
- preferences: {
54
- ...window.Clerk.user?.unsafeMetadata?.preferences,
55
- ui: {
56
- ...window.Clerk.user?.unsafeMetadata?.preferences?.ui,
57
- navigationOpen: this.isOpen,
58
- },
59
- },
60
- },
61
- });
62
- }
63
-
64
- this.host.requestUpdate();
65
- }
66
- }