@@ -5,7 +5,9 @@ import { createSelector } from 'reselect';
55
66import { isEqualAddress , mapAddressFromFormValues } from '../address' ;
77import { withCheckout , CheckoutContextProps } from '../checkout' ;
8+ import CheckoutStepStatus from '../checkout/CheckoutStepStatus' ;
89import { EMPTY_ARRAY } from '../common/utility' ;
10+ import { PaymentMethodId } from '../payment/paymentMethod' ;
911import { LoadingOverlay } from '../ui/loading' ;
1012
1113import { UnassignItemError } from './errors' ;
@@ -20,6 +22,7 @@ export interface ShippingProps {
2022 isBillingSameAsShipping : boolean ;
2123 cartHasChanged : boolean ;
2224 isMultiShippingMode : boolean ;
25+ step : CheckoutStepStatus ;
2326 onCreateAccount ( ) : void ;
2427 onToggleMultiShipping ( ) : void ;
2528 onReady ?( ) : void ;
@@ -40,12 +43,15 @@ export interface WithCheckoutShippingProps {
4043 isGuest : boolean ;
4144 isInitializing : boolean ;
4245 isLoading : boolean ;
46+ isStripeLoading : boolean ;
47+ isStripeAutoStep : boolean ;
4348 isShippingStepPending : boolean ;
4449 methodId ?: string ;
4550 shippingAddress ?: Address ;
4651 shouldShowAddAddressInCheckout : boolean ;
4752 shouldShowMultiShipping : boolean ;
4853 shouldShowOrderComments : boolean ;
54+ isStripeLinkEnabled ?: boolean ;
4955 assignItem ( consignment : ConsignmentAssignmentRequestBody ) : Promise < CheckoutSelectors > ;
5056 deinitializeShippingMethod ( options : ShippingRequestOptions ) : Promise < CheckoutSelectors > ;
5157 deleteConsignments ( ) : Promise < Address | undefined > ;
@@ -59,10 +65,13 @@ export interface WithCheckoutShippingProps {
5965 updateBillingAddress ( address : Partial < Address > ) : Promise < CheckoutSelectors > ;
6066 updateCheckout ( payload : CheckoutRequestBody ) : Promise < CheckoutSelectors > ;
6167 updateShippingAddress ( address : Partial < Address > ) : Promise < CheckoutSelectors > ;
68+ loadPaymentMethods ( ) : Promise < CheckoutSelectors > ;
6269}
6370
6471interface ShippingState {
6572 isInitializing : boolean ;
73+ isStripeLoading : boolean ;
74+ isStripeAutoStep : boolean ;
6675}
6776
6877class Shipping extends Component < ShippingProps & WithCheckoutShippingProps , ShippingState > {
@@ -71,13 +80,17 @@ class Shipping extends Component<ShippingProps & WithCheckoutShippingProps, Ship
7180
7281 this . state = {
7382 isInitializing : true ,
83+ isStripeLoading : true ,
84+ isStripeAutoStep : false ,
85+
7486 } ;
7587 }
7688
7789 async componentDidMount ( ) : Promise < void > {
7890 const {
7991 loadShippingAddressFields,
8092 loadShippingOptions,
93+ loadPaymentMethods,
8194 onReady = noop ,
8295 onUnhandledError = noop ,
8396 } = this . props ;
@@ -89,6 +102,7 @@ class Shipping extends Component<ShippingProps & WithCheckoutShippingProps, Ship
89102 ] ) ;
90103
91104 onReady ( ) ;
105+ await loadPaymentMethods ( ) ;
92106 } catch ( error ) {
93107 onUnhandledError ( error ) ;
94108 } finally {
@@ -108,43 +122,106 @@ class Shipping extends Component<ShippingProps & WithCheckoutShippingProps, Ship
108122 deinitializeShippingMethod,
109123 isMultiShippingMode,
110124 onToggleMultiShipping,
125+ isStripeLinkEnabled,
126+ step,
111127 ...shippingFormProps
112128 } = this . props ;
113129
114130 const {
115131 isInitializing,
132+ isStripeLoading,
133+ isStripeAutoStep,
116134 } = this . state ;
117135
118- return (
119- < div className = "checkout-form" >
120- < ShippingHeader
121- isGuest = { isGuest }
122- isMultiShippingMode = { isMultiShippingMode }
123- onMultiShippingChange = { this . handleMultiShippingModeSwitch }
124- shouldShowMultiShipping = { shouldShowMultiShipping }
125- />
126-
127- < LoadingOverlay
128- isLoading = { isInitializing }
129- unmountContentWhenLoading
130- >
131- < ShippingForm
132- { ...shippingFormProps }
133- addresses = { customer . addresses }
134- deinitialize = { deinitializeShippingMethod }
135- initialize = { initializeShippingMethod }
136- isBillingSameAsShipping = { isBillingSameAsShipping }
136+ const renderShipping = ( ) => {
137+ if ( isStripeLinkEnabled && ! customer . email ) {
138+ return < div className = "checkout-form" >
139+ < div style = { { display : isStripeAutoStep ? 'none' : undefined , } } >
140+ < LoadingOverlay
141+ hideContentWhenLoading
142+ isLoading = { isStripeLoading }
143+ >
144+ < ShippingHeader
145+ isGuest = { isGuest }
146+ isMultiShippingMode = { isMultiShippingMode }
147+ onMultiShippingChange = { this . handleMultiShippingModeSwitch }
148+ shouldShowMultiShipping = { shouldShowMultiShipping }
149+ />
150+
151+ < LoadingOverlay
152+ isLoading = { isInitializing }
153+ unmountContentWhenLoading
154+ >
155+ < ShippingForm
156+ { ...shippingFormProps }
157+ addresses = { customer . addresses }
158+ customerEmail = { customer . email }
159+ deinitialize = { deinitializeShippingMethod }
160+ initialize = { initializeShippingMethod }
161+ isBillingSameAsShipping = { isBillingSameAsShipping }
162+ isGuest = { isGuest }
163+ isMultiShippingMode = { isMultiShippingMode }
164+ isStripeAutoStep = { this . handleIsAutoStep }
165+ isStripeLinkEnabled = { isStripeLinkEnabled }
166+ isStripeLoading = { this . handleIsStripeLoading }
167+ onMultiShippingSubmit = { this . handleMultiShippingSubmit }
168+ onSingleShippingSubmit = { this . handleSingleShippingSubmit }
169+ onUseNewAddress = { this . handleUseNewAddress }
170+ shouldShowSaveAddress = { ! isGuest }
171+ step = { step }
172+ updateAddress = { updateShippingAddress }
173+ />
174+ </ LoadingOverlay >
175+ </ LoadingOverlay >
176+ </ div >
177+ </ div >
178+ }
179+
180+ return < div className = "checkout-form" >
181+ < ShippingHeader
137182 isGuest = { isGuest }
138183 isMultiShippingMode = { isMultiShippingMode }
139- onMultiShippingSubmit = { this . handleMultiShippingSubmit }
140- onSingleShippingSubmit = { this . handleSingleShippingSubmit }
141- onUseNewAddress = { this . handleUseNewAddress }
142- shouldShowSaveAddress = { ! isGuest }
143- updateAddress = { updateShippingAddress }
184+ onMultiShippingChange = { this . handleMultiShippingModeSwitch }
185+ shouldShowMultiShipping = { shouldShowMultiShipping }
144186 />
145- </ LoadingOverlay >
187+
188+ < LoadingOverlay
189+ isLoading = { isInitializing }
190+ unmountContentWhenLoading
191+ >
192+ < ShippingForm
193+ { ...shippingFormProps }
194+ addresses = { customer . addresses }
195+ customerEmail = { customer . email }
196+ deinitialize = { deinitializeShippingMethod }
197+ initialize = { initializeShippingMethod }
198+ isBillingSameAsShipping = { isBillingSameAsShipping }
199+ isGuest = { isGuest }
200+ isMultiShippingMode = { isMultiShippingMode }
201+ isStripeAutoStep = { this . handleIsAutoStep }
202+ isStripeLinkEnabled = { isStripeLinkEnabled }
203+ isStripeLoading = { this . handleIsStripeLoading }
204+ onMultiShippingSubmit = { this . handleMultiShippingSubmit }
205+ onSingleShippingSubmit = { this . handleSingleShippingSubmit }
206+ onUseNewAddress = { this . handleUseNewAddress }
207+ shouldShowSaveAddress = { ! isGuest }
208+ step = { step }
209+ updateAddress = { updateShippingAddress }
210+ />
211+ </ LoadingOverlay >
146212 </ div >
147- ) ;
213+
214+ }
215+
216+ return ( renderShipping ( ) ) ;
217+ }
218+
219+ private handleIsStripeLoading : ( ) => void = ( ) => {
220+ this . setState ( { isStripeLoading : false } ) ;
221+ }
222+
223+ private handleIsAutoStep : ( ) => void = ( ) => {
224+ this . setState ( { isStripeAutoStep : true } ) ;
148225 }
149226
150227 private handleMultiShippingModeSwitch : ( ) => void = async ( ) => {
@@ -284,6 +361,7 @@ const deleteConsignmentsSelector = createSelector(
284361 }
285362) ;
286363
364+ // tslint:disable-next-line:cyclomatic-complexity
287365export function mapToShippingProps ( {
288366 checkoutService,
289367 checkoutState,
@@ -299,6 +377,7 @@ export function mapToShippingProps({
299377 getBillingAddress,
300378 getShippingAddressFields,
301379 getShippingCountries,
380+ getPaymentMethod,
302381 } ,
303382 statuses : {
304383 isShippingStepPending,
@@ -350,6 +429,11 @@ export function mapToShippingProps({
350429 shippableItemsCount < 50
351430 ) ;
352431 const countriesWithAutocomplete = [ 'US' , 'CA' , 'AU' , 'NZ' ] ;
432+ const stripeUpe = getPaymentMethod ( 'card' , PaymentMethodId . StripeUPE ) ;
433+ const linkEnabled = stripeUpe ?. initializationData . enableLink || false ;
434+ const stripeUpeSupportedCurrency = cart ?. currency . code === 'USD' || false ;
435+ const stripeUpeLinkEnabled = linkEnabled && stripeUpeSupportedCurrency ;
436+
353437
354438 if ( features [ 'CHECKOUT-4183.checkout_google_address_autocomplete_uk' ] ) {
355439 countriesWithAutocomplete . push ( 'GB' ) ;
@@ -375,6 +459,8 @@ export function mapToShippingProps({
375459 isGuest : customer . isGuest ,
376460 isInitializing : isLoadingShippingCountries ( ) || isLoadingShippingOptions ( ) ,
377461 isLoading,
462+ isStripeLoading : false ,
463+ isStripeAutoStep : false ,
378464 isShippingStepPending : isShippingStepPending ( ) ,
379465 loadShippingAddressFields : checkoutService . loadShippingAddressFields ,
380466 loadShippingOptions : checkoutService . loadShippingOptions ,
@@ -388,6 +474,8 @@ export function mapToShippingProps({
388474 updateBillingAddress : checkoutService . updateBillingAddress ,
389475 updateCheckout : checkoutService . updateCheckout ,
390476 updateShippingAddress : checkoutService . updateShippingAddress ,
477+ isStripeLinkEnabled : stripeUpeLinkEnabled ,
478+ loadPaymentMethods : checkoutService . loadPaymentMethods ,
391479 } ;
392480}
393481
0 commit comments