Skip to content

Commit 21392ca

Browse files
authored
Merge pull request #999 from buildo/parent-config
merge config prop passed to BentoProvider with the one passed at creation
2 parents d12e114 + 35ef996 commit 21392ca

File tree

2 files changed

+52
-5
lines changed

2 files changed

+52
-5
lines changed

Diff for: packages/bento-design-system/src/BentoProvider.tsx

+12-5
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
import { Children, PartialBentoConfig } from ".";
1+
import { BentoConfig, Children, PartialBentoConfig } from ".";
22
import { bentoSprinkles } from "./internal";
33
import { ToastProvider } from "./Toast/ToastProvider";
44
import { OverlayProvider } from "@react-aria/overlays";
55
import { DefaultMessages, DefaultMessagesContext } from "./DefaultMessagesContext";
66
import { LinkComponentContext, LinkComponentProps } from "./util/link";
7-
import { ComponentType, useContext } from "react";
7+
import { ComponentType, useContext, useMemo } from "react";
88
import { I18nProvider } from "@react-aria/i18n";
9-
import { BentoConfigProvider } from "./BentoConfigContext";
9+
import { BentoConfigProvider, deepmerge } from "./BentoConfigContext";
1010
import { SprinklesFn } from "./util/ConfigurableTypes";
1111
import { SprinklesContext } from "./SprinklesContext";
1212
import { BentoTheme, BentoThemeProvider } from "./BentoThemeContext";
@@ -88,11 +88,18 @@ export function createBentoProvider(
8888
...props
8989
}: Props) {
9090
const linkComponentFromContext = useContext(LinkComponentContext);
91+
const defaultMessagesValue = useMemo(() => {
92+
return {
93+
defaultMessages,
94+
};
95+
}, [defaultMessages]);
9196
return (
9297
<I18nProvider locale={locale}>
9398
<OverlayProvider style={{ height: "100%" }}>
94-
<DefaultMessagesContext.Provider value={{ defaultMessages }}>
95-
<BentoConfigProvider value={props.config ?? config}>
99+
<DefaultMessagesContext.Provider value={defaultMessagesValue}>
100+
<BentoConfigProvider
101+
value={props.config ? (deepmerge(config, props.config) as BentoConfig) : config}
102+
>
96103
<OptionalThemeWrapper theme={props.theme || theme}>
97104
<SprinklesContext.Provider value={props.sprinkles ?? sprinkles}>
98105
<LinkComponentContext.Provider value={linkComponent ?? linkComponentFromContext}>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { renderHook } from "@testing-library/react";
2+
import { BentoConfigProvider, Children, createBentoProvider, useBentoConfig } from "../src";
3+
import { defaultMessages } from "../src/defaultMessages/en";
4+
5+
describe("createBentoProvider", () => {
6+
test("the config passed as prop is merged with the one passed at creation", () => {
7+
const BentoProvider = createBentoProvider({ button: { uppercaseLabel: true } });
8+
9+
const wrapper = ({ children }: { children: React.ReactNode }) => (
10+
<BentoProvider defaultMessages={defaultMessages} config={{ chip: { uppercase: true } }}>
11+
{children as Children}
12+
</BentoProvider>
13+
);
14+
15+
const { result } = renderHook(() => useBentoConfig(), { wrapper });
16+
17+
expect(result.current.button.uppercaseLabel).toBe(true);
18+
expect(result.current.chip.uppercase).toBe(true);
19+
});
20+
21+
test("nested BentoConfigProvider partially overrides the BentoProvider config", () => {
22+
const BentoProvider = createBentoProvider();
23+
24+
const wrapper = ({ children }: { children: React.ReactNode }) => (
25+
<BentoProvider
26+
defaultMessages={defaultMessages}
27+
config={{ button: { uppercaseLabel: true } }}
28+
>
29+
<BentoConfigProvider value={{ chip: { uppercase: true } }}>
30+
{children as Children}
31+
</BentoConfigProvider>
32+
</BentoProvider>
33+
);
34+
35+
const { result } = renderHook(() => useBentoConfig(), { wrapper });
36+
37+
expect(result.current.button.uppercaseLabel).toBe(true);
38+
expect(result.current.chip.uppercase).toBe(true);
39+
});
40+
});

0 commit comments

Comments
 (0)