Skip to content

Commit 038a68f

Browse files
committed
merge config prop passed to BentoProvider with the one passed at creation
1 parent 4df6883 commit 038a68f

File tree

2 files changed

+50
-5
lines changed

2 files changed

+50
-5
lines changed

packages/bento-design-system/src/BentoProvider.tsx

+10-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,16 @@ 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 value={deepmerge(config, props.config) as BentoConfig}>
96101
<OptionalThemeWrapper theme={props.theme || theme}>
97102
<SprinklesContext.Provider value={props.sprinkles ?? sprinkles}>
98103
<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("createBentoProviders", () => {
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)