Skip to content

Commit

Permalink
(feat) Allow useConfig() to load configuration from other modules
Browse files Browse the repository at this point in the history
  • Loading branch information
ibacher committed Aug 16, 2023
1 parent 33f4a16 commit 1c1d4a5
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 13 deletions.
10 changes: 8 additions & 2 deletions packages/framework/esm-framework/docs/API.md
Original file line number Diff line number Diff line change
Expand Up @@ -1715,15 +1715,21 @@ ___

### useConfig

**useConfig**<`T`\>(): `T`
**useConfig**<`T`\>(`moduleName?`): `T`

Use this React Hook to obtain your module's configuration.

#### Type parameters

| Name | Type |
| :------ | :------ |
| `T` | `Omit`<[`ConfigObject`](interfaces/ConfigObject.md), ``"Display conditions"`` \| ``"Translation overrides"``\> |
| `T` | `Record`<`string`, `any`\> |

#### Parameters

| Name | Type | Default value |
| :------ | :------ | :------ |
| `moduleName` | `undefined` \| ``null`` \| `string` | `undefined` |

#### Returns

Expand Down
24 changes: 13 additions & 11 deletions packages/framework/esm-react-utils/src/useConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -160,26 +160,28 @@ function useNormalConfig(moduleName: string) {
/**
* Use this React Hook to obtain your module's configuration.
*/
export function useConfig<
T = Omit<ConfigObject, "Display conditions" | "Translation overrides">
>() {
export function useConfig<T = Record<string, any>>(
moduleName: string | null | undefined = undefined
) {
// This hook uses the config of the MF defining the component.
// If the component is used in an extension slot then the slot
// may override (part of) its configuration.
const { moduleName, extension } = useContext(ComponentContext);
const { moduleName: contextModuleName, extension } =
useContext(ComponentContext);
const finalModuleName = moduleName ?? contextModuleName;

if (!moduleName && !extension) {
if (!finalModuleName && !extension) {
throw Error(errorMessage);
}

const normalConfig = useNormalConfig(moduleName);
const normalConfig = useNormalConfig(finalModuleName);
const extensionConfig = useExtensionConfig(extension);
const config = useMemo(
() => ({
...normalConfig,
...extensionConfig,
}),
[normalConfig, extensionConfig]
() =>
finalModuleName === moduleName
? { ...normalConfig }
: { ...normalConfig, ...extensionConfig },
[moduleName, finalModuleName, normalConfig, extensionConfig]
);

return config as T;
Expand Down

0 comments on commit 1c1d4a5

Please sign in to comment.