@telia-ace/widget-runtime-flamingo 1.1.2 → 1.1.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.
Files changed (70) hide show
  1. package/component-platform-factory.d.ts +13 -0
  2. package/context/children.context.d.ts +4 -0
  3. package/context/component-node.context.d.ts +4 -0
  4. package/context/container.context.d.ts +4 -0
  5. package/context/context.context.d.ts +3 -0
  6. package/context/layout.context.d.ts +3 -0
  7. package/context/properties.context.d.ts +3 -0
  8. package/controllers/actions-controller.d.ts +14 -0
  9. package/core/create-lit-component.d.ts +11 -0
  10. package/core/get-render-state.d.ts +4 -0
  11. package/data-provider/data-provider.d.ts +24 -0
  12. package/data-provider/providers/guide-provider.plugin.d.ts +2 -0
  13. package/index-4be3f206.mjs +3409 -0
  14. package/index-5087564d.mjs +335 -0
  15. package/index-6dd00f59.js +1 -0
  16. package/index-e07bd0fb.js +206 -0
  17. package/{src/index.ts → index.d.ts} +1 -13
  18. package/index.js +1 -0
  19. package/index.mjs +17 -0
  20. package/mixins/widget-component.mixin.d.ts +24 -0
  21. package/package.json +1 -1
  22. package/render-049911af.mjs +458 -0
  23. package/render-f343a6c5.js +120 -0
  24. package/services.d.ts +5 -0
  25. package/ui/area.d.ts +9 -0
  26. package/ui/branding.d.ts +1 -0
  27. package/ui/get-css-props.d.ts +5 -0
  28. package/ui/get-layout-props.d.ts +9 -0
  29. package/ui/html-element-handlers.d.ts +14 -0
  30. package/ui/prepare-dom.d.ts +21 -0
  31. package/ui/render.d.ts +3 -0
  32. package/ui/trigger-component.d.ts +20 -0
  33. package/ui/view-outlet.d.ts +36 -0
  34. package/ui/wrapper.d.ts +21 -0
  35. package/widget.d.ts +54 -0
  36. package/.eslintrc.json +0 -30
  37. package/README.md +0 -11
  38. package/project.json +0 -48
  39. package/src/component-platform-factory.ts +0 -163
  40. package/src/context/children.context.ts +0 -4
  41. package/src/context/component-node.context.ts +0 -6
  42. package/src/context/container.context.ts +0 -6
  43. package/src/context/context.context.ts +0 -3
  44. package/src/context/layout.context.ts +0 -3
  45. package/src/context/properties.context.ts +0 -3
  46. package/src/controllers/actions-controller.ts +0 -55
  47. package/src/core/create-lit-component.ts +0 -31
  48. package/src/core/get-render-state.ts +0 -25
  49. package/src/data-provider/data-provider.ts +0 -87
  50. package/src/data-provider/providers/guide-provider.plugin.ts +0 -64
  51. package/src/declaration.d.ts +0 -2
  52. package/src/mixins/widget-component.mixin.ts +0 -231
  53. package/src/services.ts +0 -27
  54. package/src/ui/area.ts +0 -97
  55. package/src/ui/branding.ts +0 -25
  56. package/src/ui/get-css-props.ts +0 -23
  57. package/src/ui/get-layout-props.ts +0 -41
  58. package/src/ui/html-element-handlers.ts +0 -140
  59. package/src/ui/index.ts +0 -6
  60. package/src/ui/prepare-dom.ts +0 -164
  61. package/src/ui/render.ts +0 -19
  62. package/src/ui/trigger-component.ts +0 -200
  63. package/src/ui/view-outlet.ts +0 -172
  64. package/src/ui/wrapper.ts +0 -247
  65. package/src/vite.env.d.ts +0 -1
  66. package/src/widget.ts +0 -748
  67. package/tsconfig.json +0 -23
  68. package/tsconfig.lib.json +0 -10
  69. package/tsconfig.spec.json +0 -19
  70. package/vite.config.ts +0 -56
package/src/widget.ts DELETED
@@ -1,748 +0,0 @@
1
- import {
2
- ActionResolver,
3
- ComponentPlatform,
4
- WidgetRenderState,
5
- WidgetSettings,
6
- } from '@telia-ace/widget-core';
7
- import {
8
- StorageCategory,
9
- StorageMedium,
10
- StorageScope,
11
- createStorageWriter,
12
- readStorage,
13
- } from '@telia-ace/widget-services';
14
- import { uuid } from '@telia-ace/widget-utilities';
15
- import {
16
- BootstrappingActivationData,
17
- supportBootstrapping,
18
- } from '@webprovisions/bootstrapping';
19
- import {
20
- Container,
21
- EventSubscriptionCancellation,
22
- WidgetType,
23
- } from '@webprovisions/platform';
24
- import {
25
- BadgeOptions,
26
- ViewOutlet,
27
- ViewOutletOptions,
28
- } from '././ui/view-outlet';
29
- import {
30
- createActionResolver,
31
- createComponentPlatform,
32
- createComponentResolver,
33
- createStorageService,
34
- } from './services';
35
- import { setActive, setInactive } from './ui/html-element-handlers';
36
- import {
37
- TriggerType,
38
- determineTriggerType,
39
- prepareDOMElements,
40
- } from './ui/prepare-dom';
41
-
42
- const SETTINGS_STORAGE_KEY = '$settings';
43
- const OPEN_STORAGE_KEY = 'open';
44
- const STICKY_WIDGET_STORAGE_KEY = 'activeStickyWidget';
45
-
46
- export enum InitialRenderState {
47
- Open = 'open',
48
- Closed = 'closed',
49
- Hidden = 'hidden',
50
- Storage = 'storage',
51
- }
52
-
53
- export type RenderData = {
54
- widgetDOMElement?: HTMLElement;
55
- triggerDOMElement?: HTMLElement;
56
- key?: string;
57
- open?: boolean;
58
- withRenderState?: InitialRenderState;
59
- };
60
-
61
- export type AttachData = {
62
- widgetDOMElement?: HTMLElement;
63
- triggerDOMElement?: HTMLElement;
64
- key?: string;
65
- withRenderState?: InitialRenderState;
66
- };
67
-
68
- export default class Widget extends WidgetType {
69
- outlets = new Map<string, ViewOutlet>();
70
- activated: Promise<void> | undefined = undefined;
71
- subs: EventSubscriptionCancellation[] = [];
72
-
73
- constructor(container: Container) {
74
- super(container);
75
-
76
- this.container.registerAsync('storage', () =>
77
- createStorageService(this.container)
78
- );
79
-
80
- this.container.registerFactory('settings', () => {
81
- return readStorage<Partial<WidgetSettings>>(
82
- this.container,
83
- SETTINGS_STORAGE_KEY,
84
- StorageMedium.Local
85
- ).then((settings = {}) => {
86
- return {
87
- ...this.container.get('$settings'),
88
- ...settings,
89
- };
90
- });
91
- });
92
-
93
- supportBootstrapping(this as any, 'load', this.handleBootstrapping);
94
-
95
- this.container.registerAsync('componentResolver', () =>
96
- createComponentResolver(this.container)
97
- );
98
- this.container.registerAsync('actionResolver', () =>
99
- createActionResolver(this.container)
100
- );
101
- this.container.register('matchMedia', window.matchMedia);
102
- this.container.registerAsync('components', () =>
103
- createComponentPlatform(this.container)
104
- );
105
- }
106
-
107
- handleBootstrapping = (activationData: BootstrappingActivationData) => {
108
- const options = {
109
- triggerDOMElement: activationData.sourceDOMElement,
110
- withRenderState: InitialRenderState.Storage,
111
- };
112
-
113
- this.container.get('settings').then((settings: any) => {
114
- const { activate } = settings;
115
- const shouldActivate =
116
- typeof activate === 'undefined' ||
117
- activate === null ||
118
- activate === true;
119
-
120
- if (shouldActivate) {
121
- this.activated = (this.activated || this.widget.activate()).then(() =>
122
- this.attach(options)
123
- );
124
- }
125
- });
126
- };
127
-
128
- initialize() {
129
- const promises = this.container.getManyAsync(
130
- 'actionResolver',
131
- 'components'
132
- ) as Promise<{
133
- actionResolver: ActionResolver;
134
- components: ComponentPlatform;
135
- }>;
136
-
137
- const cspSettings: { nonce: string } | undefined =
138
- this.container.get('csp');
139
- if (cspSettings) {
140
- if (!(window as any).webprovisionsEnvironmentVariables) {
141
- (window as any).webprovisionsEnvironmentVariables = {};
142
- }
143
- (window as any).webprovisionsEnvironmentVariables['cspNonce'] =
144
- cspSettings.nonce;
145
- }
146
-
147
- return Promise.all([promises, this.container.get('settings')]).then(
148
- ([{ actionResolver, components }, _settings]) => {
149
- actionResolver.subscribe(this.widget.name, (_origin, action, value) =>
150
- this.onAction(action, value)
151
- );
152
-
153
- const switchViewNodes = (routeName: string) => {
154
- components.nodes.query({ type: 'view' }).forEach((viewNode) => {
155
- components.setSwitch(viewNode, routeName);
156
- });
157
- };
158
-
159
- // const initialRoute = router.getInitialRoute()?.name || 'index';
160
- const initialRoute = 'index';
161
- switchViewNodes(initialRoute);
162
-
163
- this.events.subscribe('widget:data-loaded', (_e, { element }) => {
164
- if (this.widget.container.get('seoConfiguration')) {
165
- this.events.dispatch('widget:preloaded-replaced', {
166
- element,
167
- });
168
- }
169
- });
170
-
171
- // this.events.subscribe(
172
- // 'router:change',
173
- // (_e, { previous = { routeData: {} }, next = { routeData: {} } }) => {
174
- // const { routeData: prevData }: { routeData: RouteData } = previous;
175
- // const { routeData: nextData }: { routeData: RouteData } = next;
176
-
177
- // const notFoundView = Object.keys(settings.views).reduce(
178
- // (acc, key) => {
179
- // const view = settings.views[key];
180
- // if (typeof view.path === 'undefined') {
181
- // return key;
182
- // }
183
- // return acc;
184
- // },
185
- // ''
186
- // );
187
-
188
- // // route not found
189
- // if (!nextData.name && notFoundView) {
190
- // switchViewNodes(notFoundView);
191
- // } else {
192
- // switchViewNodes(nextData.name);
193
- // }
194
-
195
- // removeNullAndUndefinedValues(prevData && prevData.params);
196
- // removeNullAndUndefinedValues(nextData && nextData.params);
197
-
198
- // this.container
199
- // .getAsync('actionResolver')
200
- // .then((actionResolver: ActionResolver) => {
201
- // actionResolver.action(this.widget.name, 'routeChange', {
202
- // next: nextData,
203
- // previous: prevData,
204
- // });
205
- // });
206
- // }
207
- // );
208
-
209
- // return router.initialize();
210
- return Promise.resolve();
211
- }
212
- );
213
- }
214
-
215
- attach(attachData: AttachData = {}) {
216
- return this.container
217
- .get('settings')
218
- .then(async ({ trigger }: WidgetSettings) => {
219
- const {
220
- widgetDOMElement,
221
- key = uuid(),
222
- triggerDOMElement,
223
- withRenderState,
224
- } = attachData;
225
-
226
- const triggerType = determineTriggerType(trigger);
227
-
228
- // This could probably be defined already when bootstrapping occurs,
229
- // Webprovisions knows when a widget is prerendered,
230
- // see "queryPrerenderedTargets in @webprovisions/bootstrapping"
231
- const waitWithReplace =
232
- triggerType === TriggerType.Inline &&
233
- (triggerDOMElement?.childElementCount || 0) > 0;
234
-
235
- const outletOptions = await prepareDOMElements(
236
- this.container,
237
- this.widget.name,
238
- widgetDOMElement,
239
- triggerDOMElement,
240
- trigger,
241
- waitWithReplace
242
- );
243
-
244
- if (this.outlets.size < 1 && !withRenderState) {
245
- this.setRenderState('unset');
246
- }
247
-
248
- const swap = () => {
249
- const isReady = () =>
250
- widgetDOMElement.querySelectorAll('[data-loading=true]').length ===
251
- 0;
252
- const [widgetDOMElement] =
253
- this.widget.container.get('widgetDOMElements');
254
-
255
- const watcher = (
256
- _mutations: MutationRecord[],
257
- observer: MutationObserver
258
- ) => {
259
- if (isReady()) {
260
- if (outletOptions.callback) {
261
- outletOptions.callback();
262
- }
263
- observer.disconnect();
264
- }
265
- };
266
- const options = {
267
- attributes: true,
268
- subtree: true,
269
- childList: true,
270
- };
271
-
272
- if (isReady()) {
273
- outletOptions.callback && outletOptions.callback();
274
- }
275
- const observer = new MutationObserver(watcher);
276
-
277
- observer.observe(widgetDOMElement, options);
278
- };
279
-
280
- if (waitWithReplace) {
281
- this.widget.container
282
- .getAsync('dataClient')
283
- .then(({ events }: any) => {
284
- events.subscribe(
285
- 'data-client:fetched',
286
- (_event: any, data: any) => {
287
- if (data.unresolvedQueries === 0) {
288
- swap();
289
- }
290
- }
291
- );
292
- });
293
- }
294
-
295
- const outlet = this.getOrCreateViewOutlet(key, outletOptions);
296
- this.outlets.set(key, outlet);
297
- this.widget.events.dispatch('widget:attached', {}, { bubbles: true });
298
-
299
- if (outletOptions.triggerType === TriggerType.Badge && trigger) {
300
- outletOptions.triggerDOMElement?.setAttribute(
301
- 'aria-expanded',
302
- 'false'
303
- );
304
- outlet?.renderBadge(trigger);
305
- }
306
-
307
- if (outletOptions.triggerType !== TriggerType.Inline) {
308
- outletOptions.triggerDOMElement?.addEventListener(
309
- 'click',
310
- (event: any) => {
311
- event.preventDefault();
312
- this.container
313
- .get('settings')
314
- .then(({ trigger: updatedTrigger }: WidgetSettings) => {
315
- outlet
316
- .render()
317
- .then(() => this.renderState())
318
- .then((renderState) => {
319
- if (
320
- updatedTrigger &&
321
- updatedTrigger.action &&
322
- updatedTrigger.action === 'hide'
323
- ) {
324
- return renderState === WidgetRenderState.open
325
- ? this.hide()
326
- : this.open();
327
- }
328
- return renderState === WidgetRenderState.open
329
- ? this.close()
330
- : this.open();
331
- });
332
- });
333
- }
334
- );
335
- }
336
-
337
- if (this.outlets.size > 1) {
338
- return this.renderState().then((state: WidgetRenderState) => {
339
- // new outlets should have the same state as existing ones
340
- this.triggerStateIfApplicable(state);
341
- });
342
- }
343
-
344
- if (withRenderState) {
345
- if (withRenderState === InitialRenderState.Storage) {
346
- return this.renderState().then((state: WidgetRenderState) => {
347
- if (outletOptions.triggerType === TriggerType.Inline) {
348
- this.triggerStateIfApplicable('open');
349
- return;
350
- }
351
- this.triggerStateIfApplicable(state);
352
- });
353
- }
354
- return this.triggerStateIfApplicable(withRenderState);
355
- }
356
-
357
- return;
358
- });
359
- }
360
-
361
- detach(key?: string) {
362
- if (key) {
363
- if (this.outlets.has(key)) {
364
- const outlet = this.outlets.get(key);
365
- outlet?.dispose();
366
- this.outlets.delete(key);
367
- return;
368
- }
369
- if (process.env.NODE_ENV !== 'production') {
370
- console.warn(`detach(): Could not find View Outlet with key ${key}`);
371
- }
372
- return;
373
- }
374
- this.outlets.forEach((outlet) => {
375
- outlet.dispose();
376
- });
377
- this.outlets.clear();
378
- }
379
-
380
- private triggerStateIfApplicable(input: string) {
381
- switch (input) {
382
- case 'closed':
383
- this.close();
384
- break;
385
- case 'open':
386
- this.open();
387
- break;
388
- case 'hidden':
389
- this.hide();
390
- break;
391
- default:
392
- return;
393
- }
394
- }
395
-
396
- private getOrCreateViewOutlet(
397
- key: string,
398
- options: ViewOutletOptions
399
- ): ViewOutlet {
400
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
401
- return (
402
- this.outlets.has(key)
403
- ? this.outlets.get(key)
404
- : new ViewOutlet(this.container, options)
405
- )!;
406
- }
407
-
408
- render(renderData: RenderData = {}) {
409
- if (process.env.NODE_ENV !== 'production') {
410
- console.warn(
411
- 'widget.render() is deprecated. Use widget.attach() instead.'
412
- );
413
- }
414
- if (renderData.open) {
415
- const options: AttachData = {
416
- ...renderData,
417
- withRenderState: InitialRenderState.Open,
418
- };
419
- return this.attach(options);
420
- }
421
- return this.attach(renderData);
422
- }
423
-
424
- activate(data?: Record<string, any>) {
425
- if (data?.override) {
426
- this.setSettings(() => data.override);
427
- }
428
- // TODO: this is considered a hack, remove apiNotificationPriorityBy
429
- // when there is a better way to get notifications from backend
430
- if (data?.apiNotificationPriorityBy) {
431
- this.container.register(
432
- 'apiNotificationPriorityBy',
433
- data.apiNotificationPriorityBy
434
- );
435
- }
436
- }
437
-
438
- setSettings(
439
- fn: (settings: WidgetSettings) => Promise<Partial<WidgetSettings>>
440
- ): Promise<WidgetSettings> {
441
- return Promise.all([
442
- this.container.get('settings'),
443
- createStorageWriter(
444
- this.container,
445
- SETTINGS_STORAGE_KEY,
446
- StorageCategory.Necessary,
447
- {
448
- medium: StorageMedium.Local,
449
- }
450
- ),
451
- ]).then(([settings, write]) => {
452
- return Promise.resolve(fn(settings)).then((override) => {
453
- return write(override).then(() => {
454
- const updated = { ...settings, ...override };
455
- this.widget.events.dispatch('widget:settings-updated', updated);
456
- return updated;
457
- });
458
- });
459
- });
460
- }
461
-
462
- clearSettings(): Promise<void> {
463
- return createStorageWriter(
464
- this.container,
465
- SETTINGS_STORAGE_KEY,
466
- StorageCategory.Necessary,
467
- { medium: StorageMedium.Local }
468
- )
469
- .then((write) => write())
470
- .then(() => this.container.get('settings'))
471
- .then((settings) => {
472
- this.widget.events.dispatch('widget:settings-updated', settings);
473
- });
474
- }
475
-
476
- action({ action, value }: { action: string; value?: any }) {
477
- return this.container
478
- .getAsync('actionResolver')
479
- .then((actionResolver: ActionResolver) => {
480
- actionResolver.action(this.widget.name, action, value);
481
- });
482
- }
483
-
484
- renderState(): Promise<WidgetRenderState> {
485
- // if (onWidgetUrl(this.container)) {
486
- // return Promise.resolve(WidgetRenderState.open);
487
- // }
488
- const readSessionOpen = () =>
489
- readStorage<WidgetRenderState>(
490
- this.container,
491
- OPEN_STORAGE_KEY,
492
- StorageMedium.Session
493
- ).then((value = WidgetRenderState.closed) => value);
494
-
495
- // const readLocalOpen = () =>
496
- // readStorage<WidgetRenderState>(
497
- // this.container,
498
- // OPEN_STORAGE_KEY,
499
- // StorageMedium.Session
500
- // ).then((value = WidgetRenderState.closed) => value);
501
-
502
- // return this.container.getAsync('router').then((routing: RoutingService) => {
503
- // if (routing.isSticky()) {
504
- // return readLocalOpen().then((localOpen) => {
505
- // return localOpen === WidgetRenderState.open
506
- // ? localOpen
507
- // : readSessionOpen();
508
- // });
509
- // }
510
- // return readSessionOpen();
511
- // });
512
- return readSessionOpen();
513
- }
514
-
515
- hide(): Promise<void> {
516
- if (this.outlets.size < 1) {
517
- if (process.env.NODE_ENV !== 'production') {
518
- console.warn(
519
- 'hide(): No-op as no view outlets are registered. Invoke the attach() command first.'
520
- );
521
- }
522
- return Promise.resolve();
523
- }
524
- this.outlets.forEach((outlet) => outlet.render());
525
- return this.action({ action: 'hide' }).then(() => {
526
- this.setTriggerState(false);
527
- });
528
- }
529
-
530
- open(): Promise<void> {
531
- if (this.outlets.size < 1) {
532
- if (process.env.NODE_ENV !== 'production') {
533
- console.warn(
534
- 'open(): No-op as no view outlets are registered. Invoke the attach() command first.'
535
- );
536
- }
537
- return Promise.resolve();
538
- }
539
- this.outlets.forEach((outlet) => outlet.render());
540
- return this.action({ action: 'open' }).then(() => {
541
- this.widget.events.dispatch('tracking:widget-rendered', {});
542
- return this.onOpen();
543
- });
544
- }
545
-
546
- close(): Promise<void> {
547
- if (this.outlets.size < 1) {
548
- if (process.env.NODE_ENV !== 'production') {
549
- console.warn(
550
- 'close(): No-op as no view outlets are registered. Invoke the attach() command first.'
551
- );
552
- }
553
- return Promise.resolve();
554
- }
555
- return this.action({ action: 'close' }).then(() => this.onClose());
556
- }
557
-
558
- show(): Promise<void> {
559
- if (process.env.NODE_ENV !== 'production') {
560
- console.warn(
561
- 'show(): Command is deprecated and will be removed in the future. Use open() instead.'
562
- );
563
- }
564
- return this.open();
565
- }
566
-
567
- private onAction(action: string, _value: any) {
568
- switch (action) {
569
- case 'close':
570
- case 'open':
571
- case 'hide':
572
- // eslint-disable-next-line no-case-declarations
573
- const newState =
574
- action === 'open'
575
- ? WidgetRenderState.open
576
- : action === 'close'
577
- ? WidgetRenderState.closed
578
- : WidgetRenderState.hidden;
579
-
580
- return this.setRenderState(newState).then(() => {
581
- this.setTriggerState(newState === WidgetRenderState.open);
582
- if (newState !== WidgetRenderState.hidden) {
583
- newState === WidgetRenderState.open
584
- ? this.onOpen()
585
- : this.onClose();
586
- } else {
587
- this.outlets.forEach((outlet) =>
588
- outlet.options.triggerDOMElement?.setAttribute(
589
- 'aria-expanded',
590
- 'false'
591
- )
592
- );
593
- }
594
- });
595
- }
596
- return;
597
- }
598
-
599
- private setRenderState(newState: string): Promise<void> {
600
- const { invoke, events } = this.container.get('$widget');
601
- return Promise.all([
602
- createStorageWriter(
603
- this.container,
604
- OPEN_STORAGE_KEY,
605
- StorageCategory.Necessary,
606
- {
607
- medium: StorageMedium.Session,
608
- }
609
- ),
610
- createStorageWriter(
611
- this.container,
612
- OPEN_STORAGE_KEY,
613
- StorageCategory.Necessary,
614
- {
615
- medium: StorageMedium.Local,
616
- duration: { minutes: 5 },
617
- }
618
- ),
619
- invoke('renderState'),
620
- ]).then(([writeSessionOpen, writeLocalOpen, previousRenderState]) => {
621
- if (newState === 'unset' || !newState) {
622
- writeLocalOpen();
623
- writeSessionOpen();
624
- } else {
625
- writeSessionOpen(newState);
626
- }
627
- events.dispatch('widget:render-state-changed', {
628
- previous: previousRenderState,
629
- next: newState,
630
- });
631
- });
632
- }
633
-
634
- private onOpen(): Promise<void> {
635
- // return this.container.getAsync('router').then((router: RoutingService) => {
636
- // this.outlets.forEach(
637
- // (outlet) =>
638
- // outlet.options.triggerDOMElement?.setAttribute(
639
- // 'aria-expanded',
640
- // 'true'
641
- // )
642
- // );
643
- // return router.start();
644
- // });
645
-
646
- this.outlets.forEach((outlet) =>
647
- outlet.options.triggerDOMElement?.setAttribute('aria-expanded', 'true')
648
- );
649
- return Promise.resolve();
650
- }
651
-
652
- private onClose(): Promise<void> {
653
- const services = this.container.getManyAsync('components') as Promise<{
654
- components: ComponentPlatform;
655
- }>;
656
-
657
- const resetActivateProp = () => {
658
- return this.container
659
- .get('settings')
660
- .then((widgetSettings: WidgetSettings) => {
661
- const { activate } = this.container.get('$settings');
662
- if (widgetSettings.activate !== activate) {
663
- return this.setSettings(() => Promise.resolve({ activate }));
664
- }
665
- return Promise.resolve();
666
- });
667
- };
668
-
669
- return resetActivateProp()
670
- .then(() => {
671
- return services;
672
- })
673
- .then(
674
- ({ components: _components }: { components: ComponentPlatform }) => {
675
- // const visibleNodes = components.nodes.visible;
676
- this.outlets.forEach((outlet) =>
677
- outlet.options.triggerDOMElement?.setAttribute(
678
- 'aria-expanded',
679
- 'false'
680
- )
681
- );
682
-
683
- // if (
684
- // visibleNodes.filter(
685
- // (c) =>
686
- // c.attributes.properties.animation &&
687
- // c.attributes.properties.animation !== 'none'
688
- // ).length
689
- // ) {
690
- // return new Promise<RoutingService>((resolve) => {
691
- // setTimeout(() => {
692
- // resolve(router);
693
- // }, 200);
694
- // });
695
- // }
696
-
697
- // return Promise.resolve(router);
698
- }
699
- );
700
- // .then((router: RoutingService) => router.stop());
701
- }
702
-
703
- private setTriggerState(open: boolean) {
704
- this.outlets.forEach((outlet) => {
705
- const {
706
- options: { triggerDOMElement, triggerOptions },
707
- } = outlet;
708
- const { openTooltip, closedTooltip } =
709
- (triggerOptions as BadgeOptions) || {};
710
- if (triggerDOMElement) {
711
- open
712
- ? setActive(triggerDOMElement, openTooltip)
713
- : setInactive(triggerDOMElement, closedTooltip);
714
- }
715
- });
716
- }
717
-
718
- deactivate() {
719
- this.subs.forEach((s) => s());
720
-
721
- const promises: Promise<void>[] = [];
722
- this.outlets.forEach((outlet) => promises.push(outlet.dispose()));
723
-
724
- return readStorage<string>(
725
- this.container,
726
- STICKY_WIDGET_STORAGE_KEY,
727
- StorageMedium.Local
728
- ).then((value) => {
729
- /**
730
- * Remove stored sticky widget from implementation's localStorage if applicable
731
- */
732
- if (value === this.widget.name) {
733
- return createStorageWriter(
734
- this.container,
735
- STICKY_WIDGET_STORAGE_KEY,
736
- StorageCategory.Necessary,
737
- {
738
- medium: StorageMedium.Local,
739
- scope: StorageScope.Implementation,
740
- }
741
- )
742
- .then((write) => write())
743
- .then(() => Promise.all(promises));
744
- }
745
- return Promise.all(promises);
746
- });
747
- }
748
- }