@@ -85,16 +85,17 @@ interface PrivateElementsProps {
8585 *
8686 * @docs https://stripe.com/docs/stripe-js/react#elements-provider
8787 */
88- export const Elements : FunctionComponent < ElementsProps > = ( {
89- stripe : rawStripeProp ,
90- options : optionsProp ,
91- children,
92- } : PrivateElementsProps ) => {
93- const [ inputs , setInputs ] = React . useState ( { rawStripe : rawStripeProp , options : optionsProp } )
94- const { rawStripe, options } = inputs
88+ export const Elements : FunctionComponent < ElementsProps > = ( props : PrivateElementsProps ) => {
89+ const { children } = props
90+
91+ if ( props . stripe === undefined ) throw new Error ( INVALID_STRIPE_ERROR ) ;
92+
93+ const [ inputs , setInputs ] = React . useState ( { rawStripe : props . stripe , options : props . options } )
9594 React . useEffect ( ( ) => {
96- const hasRawStripeChanged = rawStripe !== rawStripeProp
97- const hasOptionsChanged = ! isEqual ( options , optionsProp )
95+ const { stripe : previousRawStripe , options : previousOptions } = props
96+ const { rawStripe, options } = inputs
97+ const hasRawStripeChanged = rawStripe !== previousRawStripe
98+ const hasOptionsChanged = ! isEqual ( options , previousOptions )
9899 const canUpdate = rawStripe === null
99100
100101 if ( hasRawStripeChanged && ! canUpdate ) {
@@ -109,27 +110,27 @@ export const Elements: FunctionComponent<ElementsProps> = ({
109110 ) ;
110111 }
111112
112- if ( hasRawStripeChanged && canUpdate ) setInputs ( { rawStripe : rawStripeProp , options : optionsProp } )
113- } , [ rawStripe , options , rawStripeProp , optionsProp ] )
113+ if ( hasRawStripeChanged && canUpdate ) setInputs ( { rawStripe : previousRawStripe , options : previousOptions } )
114+ } , [ inputs , props ] )
114115
115- const maybeStripe = usePromiseResolver ( rawStripe )
116- const stripe = validateStripe ( maybeStripe )
117- const [ ctx , setContext ] = React . useState < ElementsContextValue > ( ( ) => createElementsContext ( null ) ) ;
116+ const [ maybeStripe = null ] = usePromiseResolver ( inputs . rawStripe )
117+ const resolvedStripe = validateStripe ( maybeStripe )
118+ const [ ctx , setContext ] = React . useState ( ( ) => createElementsContext ( resolvedStripe , inputs . options ) ) ;
118119
120+ const shouldInitialize = resolvedStripe !== null && ctx . stripe === null
121+ React . useEffect ( ( ) => {
122+ if ( shouldInitialize ) setContext ( createElementsContext ( resolvedStripe , inputs . options ) )
123+ } , [ shouldInitialize , resolvedStripe , inputs . options ] )
119124
120125 React . useEffect ( ( ) => {
121- const anyStripe : any = stripe ;
126+ const anyStripe : any = ctx . stripe ;
122127
123128 if ( ! anyStripe || ! anyStripe . _registerWrapper ) {
124129 return ;
125130 }
126131
127132 anyStripe . _registerWrapper ( { name : 'react-stripe-js' , version : _VERSION } ) ;
128- } , [ stripe ] ) ;
129-
130- React . useEffect ( ( ) => {
131- if ( stripe ) setContext ( createElementsContext ( stripe , options ) )
132- } , [ stripe , options ] )
133+ } , [ ctx . stripe ] ) ;
133134
134135 return (
135136 < ElementsContext . Provider value = { ctx } > { children } </ ElementsContext . Provider >
0 commit comments