@@ -14,6 +14,25 @@ import { findComponents, registerComponent, unregisterComponent } from '../Compo
1414
1515declare const Turbo : any ;
1616
17+ type MaybePromise < T = void > = T | Promise < T > ;
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+
1736export default class Component {
1837 readonly element : HTMLElement ;
1938 readonly name : string ;
@@ -109,24 +128,11 @@ export default class Component {
109128 this . externalMutationTracker . stop ( ) ;
110129 }
111130
112- /**
113- * Add a named hook to the component. Available hooks are:
114- *
115- * * connect (component: Component) => {}
116- * * disconnect (component: Component) => {}
117- * * request:started (requestConfig: any) => {}
118- * * render:started (html: string, response: BackendResponse, controls: { shouldRender: boolean }) => {}
119- * * render:finished (component: Component) => {}
120- * * response:error (backendResponse: BackendResponse, controls: { displayError: boolean }) => {}
121- * * loading.state:started (element: HTMLElement, request: BackendRequest) => {}
122- * * loading.state:finished (element: HTMLElement) => {}
123- * * model:set (model: string, value: any, component: Component) => {}
124- */
125- on ( hookName : string , callback : ( ...args : any [ ] ) => void ) : void {
131+ on < T extends string | ComponentHookName = ComponentHookName > ( hookName : T , callback : ComponentHookCallback < T > ) : void {
126132 this . hooks . register ( hookName , callback ) ;
127133 }
128134
129- off ( hookName : string , callback : ( ... args : any [ ] ) => void ) : void {
135+ off < T extends string | ComponentHookName = ComponentHookName > ( hookName : T , callback : ComponentHookCallback < T > ) : void {
130136 this . hooks . unregister ( hookName , callback ) ;
131137 }
132138
0 commit comments