| 
									
										
										
										
											2020-01-15 21:36:01 +01:00
										 |  |  | export default class Component { | 
					
						
							|  |  |  |     /** @param {AppContext} appContext */ | 
					
						
							|  |  |  |     constructor(appContext) { | 
					
						
							| 
									
										
										
										
											2020-01-18 18:01:16 +01:00
										 |  |  |         this.componentId = `component-${this.constructor.name}`; | 
					
						
							| 
									
										
										
										
											2020-01-15 21:36:01 +01:00
										 |  |  |         this.appContext = appContext; | 
					
						
							|  |  |  |         /** @type Component[] */ | 
					
						
							|  |  |  |         this.children = []; | 
					
						
							| 
									
										
										
										
											2020-01-18 18:01:16 +01:00
										 |  |  |         this.initialized = Promise.resolve(); | 
					
						
							| 
									
										
										
										
											2020-01-15 21:36:01 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-19 20:18:02 +01:00
										 |  |  |     async eventReceived(name, data, sync = false) { | 
					
						
							| 
									
										
										
										
											2020-01-18 18:01:16 +01:00
										 |  |  |         await this.initialized; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-18 20:49:49 +01:00
										 |  |  | //        console.log(`Received ${name} to ${this.componentId}`);
 | 
					
						
							| 
									
										
										
										
											2020-01-18 18:01:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-15 21:36:01 +01:00
										 |  |  |         const fun = this[name + 'Listener']; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-18 19:46:30 +01:00
										 |  |  |         let propagateToChildren = true; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-15 21:36:01 +01:00
										 |  |  |         if (typeof fun === 'function') { | 
					
						
							| 
									
										
										
										
											2020-01-18 19:46:30 +01:00
										 |  |  |             propagateToChildren = await fun.call(this, data) !== false; | 
					
						
							| 
									
										
										
										
											2020-01-15 21:36:01 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-18 19:46:30 +01:00
										 |  |  |         if (propagateToChildren) { | 
					
						
							| 
									
										
										
										
											2020-01-24 20:15:53 +01:00
										 |  |  |             const promise = this.triggerChildren(name, data, sync); | 
					
						
							| 
									
										
										
										
											2020-01-19 20:18:02 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-24 20:15:53 +01:00
										 |  |  |             if (sync) { | 
					
						
							|  |  |  |                 await promise; | 
					
						
							| 
									
										
										
										
											2020-01-18 19:46:30 +01:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2020-01-15 21:36:01 +01:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-19 20:18:02 +01:00
										 |  |  |     trigger(name, data, sync = false) { | 
					
						
							|  |  |  |         this.appContext.trigger(name, data, sync); | 
					
						
							| 
									
										
										
										
											2020-01-15 21:36:01 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-01-24 20:15:53 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     async triggerChildren(name, data, sync = false) { | 
					
						
							|  |  |  |         for (const child of this.children) { | 
					
						
							|  |  |  |             let promise = child.eventReceived(name, data, sync); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (sync) { | 
					
						
							|  |  |  |                 await promise; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-01-15 21:36:01 +01:00
										 |  |  | } |