@@ -133,8 +133,13 @@ export class Button extends InSimElement {
133133 private static readonly UCID_ALL = 255 ;
134134
135135 private packet : IS_BTN = new IS_BTN ( ) ;
136- private onClickListeners : Required < ButtonElementProps > [ 'onClick' ] [ ] = [ ] ;
137- private onTypeListeners : Required < ButtonElementProps > [ 'onType' ] [ ] = [ ] ;
136+
137+ private onClick : ButtonElementProps [ 'onClick' ] ;
138+ private onClickListener : ButtonElementProps [ 'onClick' ] ;
139+
140+ private onType : ButtonElementProps [ 'onType' ] ;
141+ private onTypeListener : ButtonElementProps [ 'onType' ] ;
142+
138143 private onNewConnectionListener ?: ( packet : IS_NCN , inSim : InSim ) => void ;
139144
140145 constructor (
@@ -147,15 +152,48 @@ export class Button extends InSimElement {
147152 ) {
148153 super ( id , parent , type , [ ] , context , container ) ;
149154
150- this . assertButtonCount ( props ) ;
155+ this . onClick = props . onClick ;
156+ this . onType = props . onType ;
151157
158+ this . assertButtonCount ( props ) ;
152159 this . assertTextLength ( props ) ;
153160 this . assertDimensions ( props , { checkWidthAndHeight : true } ) ;
154161
155162 this . updateButtonPacketData ( props ) ;
156163
157- this . addOnClickListener ( props ) ;
158- this . addOnTypeListener ( props ) ;
164+ if ( this . onClick ) {
165+ this . log ( `add onClick listener` ) ;
166+
167+ const onClickListener = ( btcPacket : IS_BTC , inSim : InSim ) => {
168+ if (
169+ this . packet . ClickID === btcPacket . ClickID &&
170+ ( this . packet . UCID === btcPacket . UCID ||
171+ this . packet . UCID === Button . UCID_ALL )
172+ ) {
173+ this . onClick ?.( btcPacket , inSim ) ;
174+ }
175+ } ;
176+
177+ this . container . inSim . on ( PacketType . ISP_BTC , onClickListener ) ;
178+ this . onClickListener = onClickListener ;
179+ }
180+
181+ if ( this . onType ) {
182+ this . log ( `add onType listener` ) ;
183+
184+ const onTypeListener = ( bttPacket : IS_BTT , inSim : InSim ) => {
185+ if (
186+ this . packet . ClickID === bttPacket . ClickID &&
187+ ( this . packet . UCID === bttPacket . UCID ||
188+ this . packet . UCID === Button . UCID_ALL )
189+ ) {
190+ this . onType ?.( bttPacket , inSim ) ;
191+ }
192+ } ;
193+
194+ this . container . inSim . on ( PacketType . ISP_BTT , onTypeListener ) ;
195+ this . onTypeListener = onTypeListener ;
196+ }
159197
160198 this . reinitializeButtonAfterNewConnection ( ) ;
161199
@@ -325,14 +363,12 @@ export class Button extends InSimElement {
325363
326364 if ( onClickChanged ) {
327365 this . log ( `onClick changed` ) ;
328- this . clearOnClickListeners ( ) ;
329- this . addOnClickListener ( newProps ) ;
366+ this . onClick = newProps . onClick ;
330367 }
331368
332369 if ( onTypeChanged ) {
333370 this . log ( `onType changed` ) ;
334- this . clearOnTypeListeners ( ) ;
335- this . addOnTypeListener ( newProps ) ;
371+ this . onType = newProps . onType ;
336372 }
337373 }
338374
@@ -444,75 +480,23 @@ export class Button extends InSimElement {
444480 this . packet . ClickID = clickId + this . container . buttonClickIDStart ;
445481 }
446482
447- private addOnClickListener ( { onClick } : ButtonElementProps ) : void {
448- if ( ! onClick ) {
449- return ;
450- }
451-
452- this . log ( `add onClick listener` ) ;
453-
454- const onClickListener = ( btcPacket : IS_BTC , inSim : InSim ) => {
455- if (
456- this . packet . ClickID === btcPacket . ClickID &&
457- ( this . packet . UCID === btcPacket . UCID ||
458- this . packet . UCID === Button . UCID_ALL )
459- ) {
460- onClick ( btcPacket , inSim ) ;
461- }
462- } ;
463-
464- this . container . inSim . on ( PacketType . ISP_BTC , onClickListener ) ;
465- this . onClickListeners . push ( onClickListener ) ;
466- }
467-
468- private addOnTypeListener ( { onType } : ButtonElementProps ) : void {
469- if ( ! onType ) {
470- return ;
471- }
472-
473- this . log ( `add onType listener` ) ;
474-
475- const onTypeListener = ( bttPacket : IS_BTT , inSim : InSim ) => {
476- if (
477- this . packet . ClickID === bttPacket . ClickID &&
478- ( this . packet . UCID === bttPacket . UCID ||
479- this . packet . UCID === Button . UCID_ALL )
480- ) {
481- onType ( bttPacket , inSim ) ;
482- }
483- } ;
484-
485- this . container . inSim . on ( PacketType . ISP_BTT , onTypeListener ) ;
486- this . onTypeListeners . push ( onTypeListener ) ;
487- }
488-
489483 private clearAllListeners ( ) : void {
490- this . clearOnClickListeners ( ) ;
491- this . clearOnTypeListeners ( ) ;
484+ this . clearOnClickListener ( ) ;
485+ this . clearOnTypeListener ( ) ;
492486 this . clearOnNewConnectionListener ( ) ;
493487 }
494488
495- private clearOnClickListeners ( ) : void {
496- if ( this . onClickListeners && this . onClickListeners . length > 0 ) {
497- this . onClickListeners . forEach (
498- ( listener : ( packet : IS_BTC , inSim : InSim ) => void ) => {
499- this . log ( `remove onClick listener` ) ;
500- this . container . inSim . off ( PacketType . ISP_BTC , listener ) ;
501- } ,
502- ) ;
503- this . onClickListeners = [ ] ;
489+ private clearOnClickListener ( ) : void {
490+ if ( this . onClickListener ) {
491+ this . container . inSim . off ( PacketType . ISP_BTC , this . onClickListener ) ;
492+ this . onClickListener = undefined ;
504493 }
505494 }
506495
507- private clearOnTypeListeners ( ) : void {
508- if ( this . onTypeListeners && this . onTypeListeners . length > 0 ) {
509- this . onTypeListeners . forEach (
510- ( listener : ( packet : IS_BTT , inSim : InSim ) => void ) => {
511- this . log ( `remove onType listener` ) ;
512- this . container . inSim . off ( PacketType . ISP_BTT , listener ) ;
513- } ,
514- ) ;
515- this . onTypeListeners = [ ] ;
496+ private clearOnTypeListener ( ) : void {
497+ if ( this . onTypeListener ) {
498+ this . container . inSim . off ( PacketType . ISP_BTT , this . onTypeListener ) ;
499+ this . onTypeListener = undefined ;
516500 }
517501 }
518502
0 commit comments