Skip to content

Commit 80fa113

Browse files
committed
Better typings for useUIExtension
1 parent eeef2eb commit 80fa113

3 files changed

Lines changed: 16 additions & 13 deletions

File tree

x-pack/plugins/ingest_manager/common/types/ui_extensions.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,7 @@ export type UIExtensionRegistrationCallback = (extensionPoint: UIExtensionPoint)
1313
/** Internal storage for registered UI Extension Points */
1414
export interface UIExtensionsStorage {
1515
[key: string]: Partial<
16-
Record<
17-
UIExtensionPoint['type'],
18-
Partial<Record<UIExtensionPoint['view'], UIExtensionPoint['component']>>
19-
>
16+
Record<UIExtensionPoint['type'], Partial<Record<UIExtensionPoint['view'], UIExtensionPoint>>>
2017
>;
2118
}
2219

x-pack/plugins/ingest_manager/public/applications/ingest_manager/hooks/use_ui_extension.ts

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,23 @@
44
* you may not use this file except in compliance with the Elastic License.
55
*/
66

7-
import React, { ComponentType, LazyExoticComponent, useContext } from 'react';
7+
import React, { useContext } from 'react';
88
import { UIExtensionPoint, UIExtensionsStorage } from '../../../../common/types/ui_extensions';
99

1010
export const UIExtensionsContext = React.createContext<UIExtensionsStorage>({});
1111

12-
export const useUIExtension = (
12+
type SpecificExtensionPoint<A, T, V> = A extends { type: T; view: V } ? A : never;
13+
14+
export const useUIExtension = <
15+
T extends UIExtensionPoint['type'] = UIExtensionPoint['type'],
16+
V extends UIExtensionPoint['view'] = UIExtensionPoint['view']
17+
>(
1318
integration: UIExtensionPoint['integration'],
14-
type: UIExtensionPoint['type'],
15-
view: UIExtensionPoint['view']
16-
): LazyExoticComponent<ComponentType<any>> | undefined => {
17-
const extensions = useContext(UIExtensionsContext);
18-
return extensions?.[integration]?.[type]?.[view];
19+
type: T,
20+
view: V
21+
): SpecificExtensionPoint<UIExtensionPoint, T, V>['component'] | undefined => {
22+
const extension = useContext(UIExtensionsContext)?.[integration]?.[type]?.[view];
23+
if (extension) {
24+
return extension.component;
25+
}
1926
};

x-pack/plugins/ingest_manager/public/applications/ingest_manager/services/ui_extensions.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ export const createExtensionRegistrationCallback = (
2626
storage[extensionPoint.integration][extensionPoint.type] = {};
2727
}
2828

29-
storage[extensionPoint.integration][extensionPoint.type]![extensionPoint.view] =
30-
extensionPoint.component;
29+
storage[extensionPoint.integration][extensionPoint.type]![extensionPoint.view] = extensionPoint;
3130
};
3231
};

0 commit comments

Comments
 (0)