8000 fix(core): clean up event handling in ViewCommon (#10534) · CatchABus/NativeScript@4a7e40d · GitHub
[go: up one dir, main page]

Skip to content

Commit 4a7e40d

Browse files
authored
fix(core): clean up event handling in ViewCommon (NativeScript#10534)
1 parent 53e958e commit 4a7e40d

File tree

1 file changed

+45
-53
lines changed

1 file changed

+45
-53
lines changed

packages/core/ui/core/view/view-common.ts

Lines changed: 45 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ export abstract class ViewCommon extends ViewBase implements ViewDefinition {
123123
_setMinWidthNative: (value: CoreTypes.LengthType) => void;
124124
_setMinHeightNative: (value: CoreTypes.LengthType) => void;
125125

126-
public _gestureObservers = {};
126+
public readonly _gestureObservers = {} as Record<GestureTypes, Array<GesturesObserver>>;
127127

128128
_androidContentDescriptionUpdated?: boolean;
129129

@@ -177,7 +177,7 @@ export abstract class ViewCommon extends ViewBase implements ViewDefinition {
177177

178178
onLoaded() {
179179
if (!this.isLoaded) {
180-
const hasTap = this.hasListeners('tap') || this.hasListeners('tapChange') || this.getGestureObservers(GestureTypes.tap);
180+
const hasTap = this.hasListeners('tap') || this.hasListeners('tapChange') || !!this.getGestureObservers(GestureTypes.tap);
181181
const enableTapAnimations = TouchManager.enableGlobalTapAnimations && hasTap;
182182
if (!this.ignoreTouchAnimation && (this.touchAnimation || enableTapAnimations)) {
183183
TouchManager.addAnimations(this);
@@ -286,62 +286,52 @@ export abstract class ViewCommon extends ViewBase implements ViewDefinition {
286286
this._gestureObservers[type].push(gestureObserve(this, type, callback, thisArg));
287287
}
288288

289-
public getGestureObservers(type: GestureTypes): Array<GesturesObserver> {
289+
public getGestureObservers(type: GestureTypes): Array<GesturesObserver> | undefined {
290290
return this._gestureObservers[type];
291291
}
292292

293293
public addEventListener(arg: string | GestureTypes, callback: (data: EventData) => void, thisArg?: any) {
294-
if (typeof arg === 'string') {
295-
arg = getEventOrGestureName(arg);
294+
if (typeof arg === 'number') {
295+
this._observe(arg, callback as unknown as (data: GestureEventData) => void, thisArg);
296+
return;
297+
}
296298

297-
const gesture = gestureFromString(arg);
298-
if (gesture && !this._isEvent(arg)) {
299-
this._observe(gesture, callback as unknown as (data: GestureEventData) => void, thisArg);
300-
} else {
301-
const events = arg.split(',');
302-
if (events.length > 0) {
303-
for (let i = 0; i < events.length; i++) {
304-
const evt = events[i].trim();
305-
const gst = gestureFromString(evt);
306-
if (gst && !this._isEvent(arg)) {
307-
this._observe(gst, callback as unknown as (data: GestureEventData) => void, thisArg);
308-
} else {
309-
super.addEventListener(evt, callback, thisArg);
310-
}
311-
}
312-
} else {
313-
super.addEventListener(arg, callback, thisArg);
314-
}
315-
}
316-
} else if (typeof arg === 'number') {
317-
this._observe(<GestureTypes>arg, callback as unknown as (data: GestureEventData) => void, thisArg);
299+
// Normalize "ontap" -> "tap"
300+
const normalizedName = getEventOrGestureName(arg);
301+
302+
// Coerce "tap" -> GestureTypes.tap
303+
// Coerce "loaded" -> undefined
304+
const gesture: GestureTypes | undefined = gestureFromString(normalizedName);
305+
306+
// If it's a gesture (and this Observable declares e.g. `static tapEvent`)
307+
if (gesture && !this._isEvent(normalizedName)) {
308+
this._observe(gesture, callback as unknown as (data: GestureEventData) => void, thisArg);
309+
return;
318310
}
311+
312+
super.addEventListener(normalizedName, callback, thisArg);
319313
}
320314

321315
public removeEventListener(arg: string | GestureTypes, callback?: (data: EventData) => void, thisArg?: any) {
322-
if (typeof arg === 'string') {
323-
const gesture = gestureFromString(arg);
324-
if (gesture && !this._isEvent(arg)) {
325-
this._disconnectGestureObservers(gesture);
326-
} else {
327-
const events = arg.split(',');
328-
if (events.length > 0) {
329-
for (let i = 0; i < events.length; i++) {
330-
const evt = events[i].trim();
331-
const gst = gestureFromString(evt);
332-
if (gst && !this._isEvent(arg)) {
333-
this._disconnectGestureObservers(gst);
334-
} else {
335-
super.removeEventListener(evt, callback, thisArg);
336-
}
337-
}
338-
} else {
339-
super.removeEventListener(arg, callback, thisArg);
340-
}
341-
}
342-
} else if (typeof arg === 'number') {
343-
this._disconnectGestureObservers(<GestureTypes>arg);
316+
if (typeof arg === 'number') {
317+
this._disconnectGestureObservers(arg);
318+
return;
344319
}
320+
321+
// Normalize "ontap" -> "tap"
322+
const normalizedName = getEventOrGestureName(arg);
323+
324+
// Coerce "tap" -> GestureTypes.tap
325+
// Coerce "loaded" -> undefined
326+
const gesture: GestureTypes | undefined = gestureFromString(normalizedName);
327+
328+
// If it's a gesture (and this Observable declares e.g. `static tapEvent`)
329+
if (gesture && !this._isEvent(normalizedName)) {
330+
this._disconnectGestureObservers(gesture);
331+
return;
332+
}
333+
334+
super.removeEventListener(normalizedName, callback, thisArg);
345335
}
346336

347337
public onBackPressed(): boolean {
@@ -379,7 +369,7 @@ export abstract class ViewCommon extends ViewBase implements ViewDefinition {
379369
const firstArgument = args[0];
380370
const view = firstArgument instanceof ViewCommon ? firstArgument : <ViewCommon>Builder.createViewFromEntry({
381371
moduleName: firstArgument,
382-
});
372+
});
383373

384374
return { view, options };
385375
}
@@ -501,10 +491,12 @@ export abstract class ViewCommon extends ViewBase implements ViewDefinition {
501491

502492
private _disconnectGestureObservers(type: GestureTypes): void {
503493
const observers = this.getGestureObservers(type);
504-
if (observers) {
505-
for (let i = 0; i < observers.length; i++) {
506-
observers[i].disconnect();
507-
}
494+
if (!observers) {
495+
return;
496+
}
497+
498+
for (const observer of observers) {
499+
observer.disconnect();
508500
}
509501
}
510502

0 commit comments

Comments
 (0)
0