Skip to content

Commit 1fcf43a

Browse files
committed
fix(core): clean up NgtObjectEvents; do not use afterNextRender in injectObjectEvents
The directive NgtObjectEvents should control the afterNextRender instead of CIF injectObjectEvents
1 parent f42a9fe commit 1fcf43a

File tree

1 file changed

+29
-30
lines changed

1 file changed

+29
-30
lines changed

libs/core/src/lib/utils/object-events.ts

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {
22
afterNextRender,
33
DestroyRef,
44
Directive,
5+
effect,
56
ElementRef,
67
inject,
78
Injector,
@@ -10,10 +11,8 @@ import {
1011
Renderer2,
1112
} from '@angular/core';
1213
import { assertInjector } from 'ngxtension/assert-injector';
13-
import { injectAutoEffect } from 'ngxtension/auto-effect';
1414
import { Object3D } from 'three';
15-
import { supportedEvents } from '../dom/events';
16-
import { NgtDomEvent, NgtThreeEvent } from '../types';
15+
import { NgtEventHandlers, NgtThreeEvent } from '../types';
1716
import { resolveRef } from './resolve-ref';
1817

1918
@Directive({ standalone: true, selector: '[ngtObjectEvents]' })
@@ -42,24 +41,28 @@ export class NgtObjectEvents {
4241
injectObjectEvents(
4342
this.ngtObjectEvents,
4443
{
45-
click: (event) => this.click.emit(event),
46-
dblclick: (event) => this.dblclick.emit(event),
47-
contextmenu: (event) => this.contextmenu.emit(event),
48-
pointerup: (event) => this.pointerup.emit(event as NgtThreeEvent<PointerEvent>),
49-
pointerdown: (event) => this.pointerdown.emit(event as NgtThreeEvent<PointerEvent>),
50-
pointerover: (event) => this.pointerover.emit(event as NgtThreeEvent<PointerEvent>),
51-
pointerout: (event) => this.pointerout.emit(event as NgtThreeEvent<PointerEvent>),
52-
pointerenter: (event) => this.pointerenter.emit(event as NgtThreeEvent<PointerEvent>),
53-
pointerleave: (event) => this.pointerleave.emit(event as NgtThreeEvent<PointerEvent>),
54-
pointermove: (event) => this.pointermove.emit(event as NgtThreeEvent<PointerEvent>),
55-
pointermissed: (event) => this.pointermissed.emit(event),
56-
pointercancel: (event) => this.pointercancel.emit(event as NgtThreeEvent<PointerEvent>),
57-
wheel: (event) => this.wheel.emit(event as NgtThreeEvent<WheelEvent>),
44+
click: this.emitEvent('click'),
45+
dblclick: this.emitEvent('dblclick'),
46+
contextmenu: this.emitEvent('contextmenu'),
47+
pointerup: this.emitEvent('pointerup'),
48+
pointerdown: this.emitEvent('pointerdown'),
49+
pointerover: this.emitEvent('pointerover'),
50+
pointerout: this.emitEvent('pointerout'),
51+
pointerenter: this.emitEvent('pointerenter'),
52+
pointerleave: this.emitEvent('pointerleave'),
53+
pointermove: this.emitEvent('pointermove'),
54+
pointermissed: this.emitEvent('pointermissed'),
55+
pointercancel: this.emitEvent('pointercancel'),
56+
wheel: this.emitEvent('wheel'),
5857
},
5958
{ injector },
6059
);
6160
});
6261
}
62+
63+
private emitEvent<TEvent extends keyof NgtEventHandlers>(eventName: TEvent) {
64+
return this[eventName].emit.bind(this[eventName]) as NgtEventHandlers[TEvent];
65+
}
6366
}
6467

6568
export const NgtObjectEventsHostDirective = {
@@ -84,29 +87,25 @@ export const NgtObjectEventsHostDirective = {
8487

8588
export function injectObjectEvents(
8689
target: () => ElementRef<Object3D> | Object3D | null | undefined,
87-
events: {
88-
[K in (typeof supportedEvents)[number]]?: (event: NgtThreeEvent<NgtDomEvent>) => void;
89-
},
90+
events: NgtEventHandlers,
9091
{ injector }: { injector?: Injector } = {},
9192
) {
9293
return assertInjector(injectObjectEvents, injector, () => {
93-
const autoEffect = injectAutoEffect();
9494
const renderer = inject(Renderer2);
9595

9696
const cleanUps: Array<() => void> = [];
9797

98-
afterNextRender(() => {
99-
autoEffect(() => {
100-
const targetRef = resolveRef(target());
101-
if (!targetRef) return;
98+
effect((onCleanup) => {
99+
const targetRef = resolveRef(target());
102100

103-
Object.entries(events).forEach(([eventName, eventHandler]) => {
104-
cleanUps.push(renderer.listen(targetRef, eventName, eventHandler));
105-
});
101+
if (!targetRef) return;
102+
103+
Object.entries(events).forEach(([eventName, eventHandler]) => {
104+
cleanUps.push(renderer.listen(targetRef, eventName, eventHandler));
105+
});
106106

107-
return () => {
108-
cleanUps.forEach((cleanUp) => cleanUp());
109-
};
107+
onCleanup(() => {
108+
cleanUps.forEach((cleanUp) => cleanUp());
110109
});
111110
});
112111

0 commit comments

Comments
 (0)