141 lines
3.6 KiB
TypeScript
141 lines
3.6 KiB
TypeScript
|
/**
|
|||
|
* External dependencies
|
|||
|
*/
|
|||
|
import React, { useState, useEffect } from '@wordpress/element';
|
|||
|
import { Button } from '@wordpress/components';
|
|||
|
import { sprintf, __ } from '@wordpress/i18n';
|
|||
|
import { Spinner, Stepper, StepperProps } from '@woocommerce/components';
|
|||
|
|
|||
|
/**
|
|||
|
* Internal dependencies
|
|||
|
*/
|
|||
|
import {
|
|||
|
SendMagicLinkButton,
|
|||
|
useJetpackPluginState,
|
|||
|
JetpackPluginStates,
|
|||
|
} from './';
|
|||
|
|
|||
|
export const JetpackInstallationStepper = ( {
|
|||
|
step,
|
|||
|
sendMagicLinkHandler,
|
|||
|
}: {
|
|||
|
step: 'first' | 'second';
|
|||
|
sendMagicLinkHandler: () => void;
|
|||
|
} ) => {
|
|||
|
const { installHandler, jetpackConnectionData, state } =
|
|||
|
useJetpackPluginState();
|
|||
|
|
|||
|
const [ isWaitingForRedirect, setIsWaitingForRedirect ] = useState( false );
|
|||
|
|
|||
|
const [ stepsToDisplay, setStepsToDisplay ] = useState<
|
|||
|
StepperProps[ 'steps' ] | undefined
|
|||
|
>( undefined );
|
|||
|
// we need to generate one set of steps for the first step, and another set for the second step
|
|||
|
// because the texts are different after progressing from the first step to the second step
|
|||
|
useEffect( () => {
|
|||
|
const isInstalling =
|
|||
|
state === JetpackPluginStates.INSTALLING || isWaitingForRedirect;
|
|||
|
if ( step === 'first' ) {
|
|||
|
setStepsToDisplay( [
|
|||
|
{
|
|||
|
key: 'first',
|
|||
|
label: __( 'Connect to Jetpack', 'woocommerce' ),
|
|||
|
description: __(
|
|||
|
'To get started, install Jetpack - our free tool required to sync your store with the WooCommerce mobile app',
|
|||
|
'woocommerce'
|
|||
|
),
|
|||
|
content: (
|
|||
|
<>
|
|||
|
<Button
|
|||
|
className="install-jetpack-button"
|
|||
|
onClick={ () => {
|
|||
|
setIsWaitingForRedirect( true );
|
|||
|
installHandler();
|
|||
|
} }
|
|||
|
>
|
|||
|
{ isInstalling && (
|
|||
|
<Spinner className="install-jetpack-spinner" />
|
|||
|
) }
|
|||
|
<div
|
|||
|
style={ {
|
|||
|
visibility: isInstalling
|
|||
|
? 'hidden'
|
|||
|
: 'visible',
|
|||
|
} }
|
|||
|
className="install-jetpack-button-contents"
|
|||
|
>
|
|||
|
<div className="jetpack-icon" />
|
|||
|
<div className="install-jetpack-button-text">
|
|||
|
{ __(
|
|||
|
'Install and Connect',
|
|||
|
'woocommerce'
|
|||
|
) }
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</Button>
|
|||
|
</>
|
|||
|
),
|
|||
|
},
|
|||
|
{
|
|||
|
key: 'second',
|
|||
|
label: __( 'Sign into the app', 'woocommerce' ),
|
|||
|
description: '',
|
|||
|
content: <></>,
|
|||
|
},
|
|||
|
] );
|
|||
|
} else if ( step === 'second' ) {
|
|||
|
// this step is shown on the return callback from the WordPress.com user connection
|
|||
|
const wordpressAccountEmailAddress =
|
|||
|
jetpackConnectionData?.currentUser.wpcomUser.email;
|
|||
|
setStepsToDisplay( [
|
|||
|
{
|
|||
|
key: 'first',
|
|||
|
label: sprintf(
|
|||
|
/* translators: Reflecting to the user what their WordPress account email address is */
|
|||
|
__( 'Connected as %s', 'woocommerce' ),
|
|||
|
wordpressAccountEmailAddress
|
|||
|
),
|
|||
|
description: '',
|
|||
|
content: <></>,
|
|||
|
},
|
|||
|
{
|
|||
|
key: 'second',
|
|||
|
label: 'Sign into the app',
|
|||
|
description: sprintf(
|
|||
|
/* translators: Reflecting to the user that the magic link has been sent to their WordPress account email address */
|
|||
|
__(
|
|||
|
'We’ll send a magic link to %s. Open it on your smartphone or tablet to sign into your store instantly.',
|
|||
|
'woocommerce'
|
|||
|
),
|
|||
|
wordpressAccountEmailAddress
|
|||
|
),
|
|||
|
content: (
|
|||
|
<SendMagicLinkButton
|
|||
|
onClickHandler={ sendMagicLinkHandler }
|
|||
|
/>
|
|||
|
),
|
|||
|
},
|
|||
|
] );
|
|||
|
}
|
|||
|
}, [
|
|||
|
step,
|
|||
|
installHandler,
|
|||
|
state,
|
|||
|
isWaitingForRedirect,
|
|||
|
jetpackConnectionData?.currentUser.wpcomUser.email,
|
|||
|
sendMagicLinkHandler,
|
|||
|
] );
|
|||
|
|
|||
|
return (
|
|||
|
<div className="jetpack-stepper-wrapper">
|
|||
|
{ stepsToDisplay && (
|
|||
|
<Stepper
|
|||
|
isVertical={ true }
|
|||
|
currentStep={ step }
|
|||
|
steps={ stepsToDisplay }
|
|||
|
/>
|
|||
|
) }
|
|||
|
</div>
|
|||
|
);
|
|||
|
};
|