@@ -14,10 +14,25 @@ import { findComponents, registerComponent, unregisterComponent } from '../Compo
14
14
15
15
declare const Turbo : any ;
16
16
17
- export type ComponentHookName = 'connect' | 'disconnect' | 'request:started' | 'render:started' | 'render:finished' | 'response:error' | 'loading.state:started' | 'loading.state:finished' | 'model:set' ;
18
-
19
17
type MaybePromise < T = void > = T | Promise < T > ;
20
18
19
+ export type ComponentHooks = {
20
+ 'connect' : ( component : Component ) => MaybePromise ,
21
+ 'disconnect' : ( component : Component ) => MaybePromise ,
22
+ 'request:started' : ( requestConfig : any ) => MaybePromise ,
23
+ 'render:finished' : ( component : Component ) => MaybePromise ,
24
+ 'response:error' : ( backendResponse : BackendResponse , controls : { displayError : boolean } ) => MaybePromise ,
25
+ 'loading.state.started' : ( element : HTMLElement , request : BackendRequest ) => MaybePromise ,
26
+ 'loading.state.finished' : ( element : HTMLElement ) => MaybePromise ,
27
+ 'model:set' : ( model : string , value : any , component : Component ) => MaybePromise ,
28
+ } ;
29
+
30
+ export type ComponentHookName = keyof ComponentHooks ;
31
+
32
+ export type ComponentHookCallback < T extends string = ComponentHookName > = T extends ComponentHookName
33
+ ? ComponentHooks [ T ]
34
+ : ( ...args : any [ ] ) => MaybePromise ;
35
+
21
36
export default class Component {
22
37
readonly element : HTMLElement ;
23
38
readonly name : string ;
@@ -113,44 +128,11 @@ export default class Component {
113
128
this . externalMutationTracker . stop ( ) ;
114
129
}
115
130
116
- /**
117
- * Add a named hook to the component. Available hooks are:
118
- *
119
- * * connect (component: Component) => {}
120
- * * disconnect (component: Component) => {}
121
- * * request:started (requestConfig: any) => {}
122
- * * render:started (html: string, response: BackendResponse, controls: { shouldRender: boolean }) => {}
123
- * * render:finished (component: Component) => {}
124
- * * response:error (backendResponse: BackendResponse, controls: { displayError: boolean }) => {}
125
- * * loading.state:started (element: HTMLElement, request: BackendRequest) => {}
126
- * * loading.state:finished (element: HTMLElement) => {}
127
- * * model:set (model: string, value: any, component: Component) => {}
128
- */
129
- on ( hookName : 'connect' , callback : ( component : Component ) => MaybePromise ) : void ;
130
- on ( hookName : 'disconnect' , callback : ( component : Component ) => MaybePromise ) : void ;
131
- on ( hookName : 'request:started' , callback : ( requestConfig : any ) => MaybePromise ) : void ;
132
- on ( hookName : 'render:started' , callback : ( html : string , response : BackendResponse , controls : { shouldRender : boolean } ) => MaybePromise ) : void ;
133
- on ( hookName : 'render:finished' , callback : ( component : Component ) => MaybePromise ) : void ;
134
- on ( hookName : 'response:error' , callback : ( backendResponse : BackendResponse , controls : { displayError : boolean } ) => MaybePromise ) : void ;
135
- on ( hookName : 'loading.state:started' , callback : ( element : HTMLElement , request : BackendRequest ) => MaybePromise ) : void ;
136
- on ( hookName : 'loading.state:finished' , callback : ( element : HTMLElement ) => MaybePromise ) : void ;
137
- on ( hookName : 'model:set' , callback : ( model : string , value : any , component : Component ) => MaybePromise ) : void ;
138
- on ( hookName : string , callback : ( ...args : any [ ] ) => MaybePromise ) : void ;
139
- on ( hookName : ComponentHookName , callback : ( ...args : any [ ] ) => MaybePromise ) : void {
131
+ on < T extends string | ComponentHookName = ComponentHookName > ( hookName : T , callback : ComponentHookCallback < T > ) : void {
140
132
this . hooks . register ( hookName , callback ) ;
141
133
}
142
134
143
- off ( hookName : 'connect' , callback : ( component : Component ) => MaybePromise ) : void ;
144
- off ( hookName : 'disconnect' , callback : ( component : Component ) => MaybePromise ) : void ;
145
- off ( hookName : 'request:started' , callback : ( requestConfig : any ) => MaybePromise ) : void ;
146
- off ( hookName : 'render:started' , callback : ( html : string , response : BackendResponse , controls : { shouldRender : boolean } ) => MaybePromise ) : void ;
147
- off ( hookName : 'render:finished' , callback : ( component : Component ) => MaybePromise ) : void ;
148
- off ( hookName : 'response:error' , callback : ( backendResponse : BackendResponse , controls : { displayError : boolean } ) => MaybePromise ) : void ;
149
- off ( hookName : 'loading.state:started' , callback : ( element : HTMLElement , request : BackendRequest ) => MaybePromise ) : void ;
150
- off ( hookName : 'loading.state:finished' , callback : ( element : HTMLElement ) => MaybePromise ) : void ;
151
- off ( hookName : 'model:set' , callback : ( model : string , value : any , component : Component ) => MaybePromise ) : void ;
152
- off ( hookName : string , callback : ( ...args : any [ ] ) => MaybePromise ) : void ;
153
- off ( hookName : ComponentHookName , callback : ( ...args : any [ ] ) => MaybePromise ) : void {
135
+ off < T extends string | ComponentHookName = ComponentHookName > ( hookName : T , callback : ComponentHookCallback < T > ) : void {
154
136
this . hooks . unregister ( hookName , callback ) ;
155
137
}
156
138
0 commit comments