@@ -17,6 +17,20 @@ export const useEventStore = createGlobalState(
17
17
return _scene . value ? _scene . value . children : [ ]
18
18
} )
19
19
20
+ function executeEventListeners ( listeners : Function | Function [ ] , intersection , event ) {
21
+ // Components with multiple event listeners will have an array of functions
22
+ if ( Array . isArray ( listeners ) ) {
23
+ for ( const listener of listeners ) {
24
+ listener ( intersection , event ) ;
25
+ }
26
+ }
27
+
28
+ // Single listener will be a function
29
+ if ( typeof listeners === 'function' ) {
30
+ listeners ( intersection , event ) ;
31
+ }
32
+ }
33
+
20
34
/**
21
35
* propogateEvent
22
36
*
@@ -26,28 +40,21 @@ export const useEventStore = createGlobalState(
26
40
* @param intersects - An array of intersections
27
41
*/
28
42
function propogateEvent ( eventName : string , event , intersects ) {
29
- // console.log(`propogateEvent: ${eventName}` , event, intersects) ;
30
-
43
+ let stopPropagating = true ;
44
+
31
45
// Loop through all intersected objects and call their event handler
32
46
if ( intersects . length ) {
33
47
for ( const intersection of intersects ) {
48
+ if ( stopPropagating ) return ;
49
+ intersection . stopPropagation = ( ) => stopPropagating = true ;
50
+
34
51
const { object } = intersection
35
- object [ eventName ] ?. ( intersection , event )
52
+ executeEventListeners ( object [ eventName ] , intersection , event )
36
53
37
- // Todo: Flesh out event modifiers, blocking, stopPropagation, etc here and below
38
- if ( "blocks-pointer-events" in object ) {
39
- return ;
40
- }
41
-
42
54
// Propogate the event up the parent chain before moving on to the next intersected object
43
55
let parent = object . parent
44
- while ( parent !== null ) {
45
- parent [ eventName ] ?.( intersection , event )
46
-
47
- if ( "blocks-pointer-events" in parent ) {
48
- return ;
49
- }
50
-
56
+ while ( parent !== null && ! stopPropagating ) {
57
+ executeEventListeners ( parent [ eventName ] , intersection , event )
51
58
parent = parent . parent
52
59
}
53
60
0 commit comments