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' ;
1213import { assertInjector } from 'ngxtension/assert-injector' ;
13- import { injectAutoEffect } from 'ngxtension/auto-effect' ;
1414import { Object3D } from 'three' ;
15- import { supportedEvents } from '../dom/events' ;
16- import { NgtDomEvent , NgtThreeEvent } from '../types' ;
15+ import { NgtEventHandlers , NgtThreeEvent } from '../types' ;
1716import { 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
6568export const NgtObjectEventsHostDirective = {
@@ -84,29 +87,25 @@ export const NgtObjectEventsHostDirective = {
8487
8588export 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