1
- import { LitElement , html , PropertyValues , TemplateResult } from 'lit' ;
1
+ import { LitElement , html , TemplateResult } from 'lit' ;
2
2
import { property } from 'lit/decorators/property.js' ;
3
3
import { cache } from 'lit/directives/cache.js' ;
4
+ import { EventsController } from './controllers/events-controller.js' ;
4
5
import { renderEvents } from './lib/demo-events.js' ;
5
6
import { renderSnippet } from './lib/demo-snippet.js' ;
6
7
import { renderer } from './lib/renderer.js' ;
@@ -23,11 +24,10 @@ class ApiViewerDemo extends ApiDemoKnobsMixin(LitElement) {
23
24
@property ( { attribute : false } )
24
25
events : EventInfo [ ] = [ ] ;
25
26
26
- @property ( { attribute : false } )
27
- eventLog ! : CustomEvent [ ] ;
28
-
29
27
private _whenDefined : Record < string , Promise < unknown > > = { } ;
30
28
29
+ private eventsController ! : EventsController ;
30
+
31
31
protected createRenderRoot ( ) : this {
32
32
return this ;
33
33
}
@@ -51,6 +51,7 @@ class ApiViewerDemo extends ApiDemoKnobsMixin(LitElement) {
51
51
</ div >
52
52
` ;
53
53
}
54
+
54
55
const [ noCss , noEvents , noSlots , noCustomKnobs , noProps ] = [
55
56
this . cssProps ,
56
57
this . events ,
@@ -60,7 +61,7 @@ class ApiViewerDemo extends ApiDemoKnobsMixin(LitElement) {
60
61
] . map ( ( arr ) => arr . length === 0 ) ;
61
62
62
63
const id = this . vid as number ;
63
- const log = this . eventLog ;
64
+ const log = this . eventsController ?. log || [ ] ;
64
65
const slots = this . processedSlots ;
65
66
const hideSlots = noSlots || hasTemplate ( id , this . tag , TemplateTypes . SLOT ) ;
66
67
@@ -165,18 +166,9 @@ class ApiViewerDemo extends ApiDemoKnobsMixin(LitElement) {
165
166
` ;
166
167
}
167
168
168
- willUpdate ( props : PropertyValues ) {
169
- super . willUpdate ( props ) ;
170
-
171
- // Reset state if tag changed
172
- if ( props . has ( 'tag' ) ) {
173
- this . eventLog = [ ] ;
174
- }
175
- }
176
-
177
169
private _onLogClear ( ) : void {
178
- this . eventLog = [ ] ;
179
- const tab = this . renderRoot . querySelector ( '#events' ) as HTMLElement ;
170
+ this . eventsController . clear ( ) ;
171
+ const tab = this . querySelector ( '#events' ) as HTMLElement ;
180
172
if ( tab ) {
181
173
tab . focus ( ) ;
182
174
}
@@ -211,21 +203,19 @@ class ApiViewerDemo extends ApiDemoKnobsMixin(LitElement) {
211
203
private onRendered ( e : CustomEvent ) : void {
212
204
const { component } = e . detail ;
213
205
214
- this . initKnobs ( e . detail . component ) ;
206
+ this . initKnobs ( component ) ;
215
207
216
- this . events . forEach ( ( event ) => {
217
- component . addEventListener ( event . name , ( ( evt : CustomEvent ) => {
218
- const s = '-changed' ;
219
- if ( event . name . endsWith ( s ) ) {
220
- const { knob } = this . getKnob ( event . name . replace ( s , '' ) ) ;
221
- if ( knob ) {
222
- this . syncKnob ( component , knob ) ;
223
- }
224
- }
208
+ this . initEvents ( component ) ;
209
+ }
210
+
211
+ private initEvents ( component : HTMLElement ) {
212
+ const controller = this . eventsController ;
213
+ if ( controller ) {
214
+ controller . clear ( ) ;
215
+ this . removeController ( controller ) ;
216
+ }
225
217
226
- this . eventLog = [ ...this . eventLog , evt ] ;
227
- } ) as EventListener ) ;
228
- } ) ;
218
+ this . eventsController = new EventsController ( this , component , this . events ) ;
229
219
}
230
220
231
221
private _onCssChanged ( e : CustomEvent ) : void {
0 commit comments