Skip to content

Commit bd35e6d

Browse files
committed
Initialize stripe.elements on component did mount
1 parent 581499c commit bd35e6d

File tree

2 files changed

+25
-35
lines changed

2 files changed

+25
-35
lines changed

src/components/Elements.test.tsx

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,7 @@ describe('Elements', () => {
5353
expect(mockStripe.elements).toHaveBeenCalledTimes(1);
5454
});
5555

56-
// TODO(christopher): support Strict Mode first
57-
// eslint-disable-next-line jest/no-disabled-tests
58-
test.skip('only creates elements once in Strict Mode', () => {
56+
test('only creates elements once in Strict Mode', () => {
5957
const TestComponent = () => {
6058
const _ = useElements();
6159
return <div />;
@@ -83,39 +81,39 @@ describe('Elements', () => {
8381
});
8482

8583
test('provides elements and stripe with the ElementsConsumer component', () => {
86-
expect.assertions(2);
84+
const spy = jest.fn()
8785

8886
render(
8987
<Elements stripe={mockStripe}>
9088
<ElementsConsumer>
9189
{(ctx) => {
92-
expect(ctx.elements).toBe(mockElements);
93-
expect(ctx.stripe).toBe(mockStripe);
94-
90+
spy(ctx)
9591
return null;
9692
}}
9793
</ElementsConsumer>
9894
</Elements>
9995
);
96+
97+
expect(spy).toBeCalledWith({ stripe: mockStripe, elements: mockElements });
10098
});
10199

102100
test('provides elements and stripe with the ElementsConsumer component in Strict Mode', () => {
103-
expect.assertions(2);
101+
const spy = jest.fn()
104102

105103
render(
106104
<React.StrictMode>
107-
<Elements stripe={mockStripe}>
108-
<ElementsConsumer>
109-
{(ctx) => {
110-
expect(ctx.elements).toBe(mockElements);
111-
expect(ctx.stripe).toBe(mockStripe);
112-
113-
return null;
114-
}}
115-
</ElementsConsumer>
116-
</Elements>
105+
<Elements stripe={mockStripe}>
106+
<ElementsConsumer>
107+
{(ctx) => {
108+
spy(ctx)
109+
return null;
110+
}}
111+
</ElementsConsumer>
112+
</Elements>
117113
</React.StrictMode>
118114
);
115+
116+
expect(spy).toBeCalledWith({ stripe: mockStripe, elements: mockElements });
119117
});
120118

121119
test('provides given stripe instance on mount', () => {
@@ -159,8 +157,8 @@ describe('Elements', () => {
159157
<React.StrictMode>
160158
<Elements stripe={stripeProp}>
161159
<ElementsConsumer>
162-
{({stripe, elements}) => {
163-
spy({stripe, elements});
160+
{(ctx) => {
161+
spy(ctx)
164162
return null;
165163
}}
166164
</ElementsConsumer>

src/components/Elements.tsx

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,6 @@ export const parseElementsContext = (
4444
return ctx;
4545
};
4646

47-
const createElementsContext = (stripe: stripeJs.Stripe | null, options?: stripeJs.StripeElementsOptions) => {
48-
const elements = stripe ? stripe.elements(options) : null
49-
return {
50-
stripe,
51-
elements
52-
}
53-
}
54-
5547
interface ElementsProps {
5648
/**
5749
* A [Stripe object](https://stripe.com/docs/js/initializing) or a `Promise` resolving to a `Stripe` object.
@@ -116,24 +108,24 @@ export const Elements: FunctionComponent<ElementsProps> = (props: PrivateElement
116108
}, [inputs, props])
117109

118110
const [maybeStripe = null] = usePromiseResolver(inputs.rawStripe)
119-
const resolvedStripe = validateStripe(maybeStripe)
120-
const [ctx, setContext] = React.useState(() => createElementsContext(resolvedStripe, inputs.options));
111+
const stripe = validateStripe(maybeStripe)
112+
const [elements, setElements] = React.useState<stripeJs.StripeElements | null>(null);
121113

122-
const shouldInitialize = resolvedStripe !== null && ctx.stripe === null
123114
React.useEffect(() => {
124-
if (shouldInitialize) setContext(createElementsContext(resolvedStripe, inputs.options))
125-
}, [shouldInitialize, resolvedStripe, inputs.options])
115+
if (stripe) setElements(stripe ? stripe.elements(inputs.options) : null)
116+
}, [stripe, inputs.options])
126117

127118
React.useEffect(() => {
128-
const anyStripe: any = ctx.stripe;
119+
const anyStripe: any = stripe;
129120

130121
if (!anyStripe || !anyStripe._registerWrapper) {
131122
return;
132123
}
133124

134125
anyStripe._registerWrapper({name: 'react-stripe-js', version: _VERSION});
135-
}, [ctx.stripe]);
126+
}, [stripe]);
136127

128+
const ctx: ElementsContextValue = { stripe, elements }
137129
return (
138130
<ElementsContext.Provider value={ctx}>{children}</ElementsContext.Provider>
139131
);

0 commit comments

Comments
 (0)