Skip to content

Commit 79e98f4

Browse files
committed
fix(react-composition): improve composition scope resolution
1 parent 741cf53 commit 79e98f4

File tree

4 files changed

+23
-16
lines changed

4 files changed

+23
-16
lines changed

packages/react-composition/__tests__/composition.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ describe("Decoration of Hooks and Components", () => {
8181
return <span>{label}</span>;
8282
};
8383

84-
const DecorateHook = createDecorator(useLabel, baseHook => {
84+
const DecorateHook = useLabel.createDecorator(baseHook => {
8585
return params => {
8686
return { ...baseHook(params), label: "Decorated Label" };
8787
};

packages/react-composition/src/Compose.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,11 @@ export const Compose = (props: ComposeProps) => {
2727
}
2828

2929
const decorators = Array.isArray(props.with) ? props.with : [props.with];
30-
return composeComponent(targetFn.original, decorators as Enumerable<ComposeWith>, scope);
30+
return composeComponent(
31+
targetFn.original,
32+
decorators as Enumerable<ComposeWith>,
33+
scope[scope.length - 1]
34+
);
3135
}, [props.with]);
3236

3337
return null;
Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React from "react";
22

33
export interface CompositionScopeContext {
4-
name: string;
4+
scope: string[];
55
}
66

77
const CompositionScopeContext = React.createContext<CompositionScopeContext | undefined>(undefined);
@@ -12,8 +12,10 @@ interface CompositionScopeProps {
1212
}
1313

1414
export const CompositionScope = ({ name, children }: CompositionScopeProps) => {
15+
const parentScope = useCompositionScope();
16+
1517
return (
16-
<CompositionScopeContext.Provider value={{ name }}>
18+
<CompositionScopeContext.Provider value={{ scope: [...parentScope, name] }}>
1719
{children}
1820
</CompositionScopeContext.Provider>
1921
);
@@ -22,7 +24,7 @@ export const CompositionScope = ({ name, children }: CompositionScopeProps) => {
2224
export function useCompositionScope() {
2325
const context = React.useContext(CompositionScopeContext);
2426
if (!context) {
25-
return undefined;
27+
return [];
2628
}
27-
return context.name;
29+
return context.scope;
2830
}

packages/react-composition/src/Context.tsx

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ type ComponentScopes = Map<string, ComposedComponents>;
5252
export type DecoratableTypes = DecoratableComponent | DecoratableHook;
5353

5454
interface CompositionContextGetComponentCallable {
55-
(component: ComponentType<unknown>, scope?: string):
55+
(component: ComponentType<unknown>, scope: string[]):
5656
| ComposedFunction
5757
| GenericComponent
5858
| undefined;
@@ -128,16 +128,17 @@ export const CompositionProvider = ({ children }: CompositionProviderProps) => {
128128
);
129129

130130
const getComponent = useCallback<CompositionContextGetComponentCallable>(
131-
(Component, scope = "*") => {
132-
const scopeMap: ComposedComponents = components.get(scope) || new Map();
133-
const composedComponent = scopeMap.get(Component);
134-
if (!composedComponent && scope !== "*") {
135-
// Check if a default scope component exists
136-
const defaultScopeMap: ComposedComponents = components.get("*") || new Map();
137-
const defaultComponent = defaultScopeMap.get(Component);
138-
return defaultComponent ? defaultComponent.component : undefined;
131+
(Component, scope = []) => {
132+
const scopesToResolve = ["*", ...scope].reverse();
133+
for (const scope of scopesToResolve) {
134+
const scopeMap: ComposedComponents = components.get(scope) || new Map();
135+
const composedComponent = scopeMap.get(Component);
136+
if (composedComponent) {
137+
return composedComponent.component;
138+
}
139139
}
140-
return composedComponent ? composedComponent.component : undefined;
140+
141+
return undefined;
141142
},
142143
[components]
143144
);

0 commit comments

Comments
 (0)