@@ -4,15 +4,35 @@ type TEventedComponentListener = Component | ((e: Event) => void);
44
55const listeners = new WeakMap < Component , Map < string , Set < TEventedComponentListener > > > ( ) ;
66
7+ export type TEventedComponentProps = TComponentProps & { interactive ?: boolean } ;
8+
79export class EventedComponent <
8- Props extends TComponentProps = TComponentProps ,
10+ Props extends TEventedComponentProps = TEventedComponentProps ,
911 State extends TComponentState = TComponentState ,
1012 Context extends TComponentContext = TComponentContext ,
1113> extends Component < Props , State , Context > {
1214 public readonly evented : boolean = true ;
1315
1416 public cursor ?: string ;
1517
18+ constructor ( props : Props , parent : Component ) {
19+ super (
20+ {
21+ ...props ,
22+ interactive : props . interactive ?? true ,
23+ } ,
24+ parent
25+ ) ;
26+ }
27+
28+ public isInteractive ( ) {
29+ return this . props . interactive ;
30+ }
31+
32+ public setInteractive ( interactive : boolean ) {
33+ this . setProps ( { interactive } ) ;
34+ }
35+
1636 private get events ( ) {
1737 if ( ! listeners . has ( this ) ) {
1838 listeners . set ( this , new Map ( ) ) ;
@@ -50,7 +70,10 @@ export class EventedComponent<
5070 }
5171 }
5272
53- public _fireEvent ( cmp : Component , event : Event ) {
73+ protected _fireEvent ( cmp : Component , event : Event ) {
74+ if ( cmp instanceof EventedComponent && ! cmp . isInteractive ?.( ) ) {
75+ return ;
76+ }
5477 const handlers = listeners . get ( cmp ) ?. get ?.( event . type ) ;
5578
5679 handlers ?. forEach ( ( cb ) => {
@@ -65,7 +88,7 @@ export class EventedComponent<
6588 public dispatchEvent ( event : Event ) : boolean {
6689 const bubbles = event . bubbles || false ;
6790
68- if ( bubbles ) {
91+ if ( bubbles || ! this . isInteractive ( ) ) {
6992 return this . _dipping ( this , event ) ;
7093 } else if ( this . _hasListener ( this , event . type ) ) {
7194 this . _fireEvent ( this , event ) ;
@@ -74,7 +97,7 @@ export class EventedComponent<
7497 return false ;
7598 }
7699
77- public _dipping ( startParent : Component , event : Event ) {
100+ protected _dipping ( startParent : Component , event : Event ) {
78101 let stopPropagation = false ;
79102 let parent : Component = startParent ;
80103 event . stopPropagation = ( ) => {
@@ -92,7 +115,7 @@ export class EventedComponent<
92115 return true ;
93116 }
94117
95- public _hasListener ( comp : EventedComponent , type : string ) {
118+ protected _hasListener ( comp : EventedComponent , type : string ) {
96119 return listeners . get ( comp ) ?. has ?.( type ) ;
97120 }
98121}
0 commit comments