Skip to content

Commit 1cb1d62

Browse files
committed
Store onClick and onType callbacks as button instance properties
1 parent 4d0edd7 commit 1cb1d62

1 file changed

Lines changed: 55 additions & 71 deletions

File tree

src/lib/renderer/inSim/elements/Button.tsx

Lines changed: 55 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)