Set isBusy state for FromScratch buttons

[MAILPOET-4918]
This commit is contained in:
David Remer
2023-01-11 10:17:37 +02:00
committed by Aschepikov
parent 0bbd65ac61
commit dad40e262f

View File

@@ -1,4 +1,4 @@
import { Dispatch, SetStateAction, useCallback, useState } from 'react'; import { Dispatch, useCallback, useState } from 'react';
import { __ } from '@wordpress/i18n'; import { __ } from '@wordpress/i18n';
import { Button } from '@wordpress/components'; import { Button } from '@wordpress/components';
import { Hooks } from 'wp-js-hooks'; import { Hooks } from 'wp-js-hooks';
@@ -9,21 +9,19 @@ import { FromScratchHookType } from '../../types/filters';
type FromScratchPremiumModalProps = { type FromScratchPremiumModalProps = {
showModal: boolean; showModal: boolean;
setShowModal: Dispatch<SetStateAction<boolean>>; onClose: () => void;
}; };
function FromScratchPremiumModal({ function FromScratchPremiumModal({
showModal, showModal,
setShowModal, onClose,
}: FromScratchPremiumModalProps): JSX.Element | null { }: FromScratchPremiumModalProps): JSX.Element | null {
if (!showModal) { if (!showModal) {
return null; return null;
} }
return ( return (
<PremiumModal <PremiumModal
onRequestClose={() => { onRequestClose={onClose}
setShowModal(false);
}}
tracking={{ tracking={{
utm_medium: 'upsell_modal', utm_medium: 'upsell_modal',
utm_campaign: 'create_automation_from_scratch', utm_campaign: 'create_automation_from_scratch',
@@ -47,11 +45,17 @@ function fromScratchHook(callback: () => void, errorHandler: Dispatch<string>) {
export function FromScratchButton(): JSX.Element { export function FromScratchButton(): JSX.Element {
const [showModal, setShowModal] = useState(false); const [showModal, setShowModal] = useState(false);
const [error, errorHandler] = useState(null); const [error, errorHandler] = useState(null);
const [isBusy, setIsBusy] = useState(false);
const onClickScratchButton = useCallback(() => { const onClickScratchButton = useCallback(() => {
fromScratchHook(() => { fromScratchHook(() => {
setShowModal(true); setShowModal(true);
}, errorHandler); }, errorHandler);
}, []); }, []);
const premiumClose = () => {
setShowModal(false);
setIsBusy(false);
};
return ( return (
<> <>
{error && ( {error && (
@@ -59,25 +63,37 @@ export function FromScratchButton(): JSX.Element {
<p>{error}</p> <p>{error}</p>
</Notice> </Notice>
)} )}
<Button variant="secondary" onClick={() => onClickScratchButton()}> <Button
variant="secondary"
isBusy={isBusy}
disabled={isBusy}
onClick={() => {
setIsBusy(true);
onClickScratchButton();
}}
>
{__('From scratch', 'mailpoet')} {__('From scratch', 'mailpoet')}
</Button> </Button>
<FromScratchPremiumModal <FromScratchPremiumModal showModal={showModal} onClose={premiumClose} />
showModal={showModal}
setShowModal={setShowModal}
/>
</> </>
); );
} }
export function FromScratchListItem(): JSX.Element { export function FromScratchListItem(): JSX.Element {
const [showModal, setShowModal] = useState(false); const [showModal, setShowModal] = useState(false);
const [isBusy, setIsBusy] = useState(false);
const [error, errorHandler] = useState(null); const [error, errorHandler] = useState(null);
const onClickScratchButton = useCallback(() => { const onClickScratchButton = useCallback(() => {
fromScratchHook(() => { fromScratchHook(() => {
setShowModal(true); setShowModal(true);
}, errorHandler); }, errorHandler);
}, []); }, []);
const premiumClose = () => {
setShowModal(false);
setIsBusy(false);
};
return ( return (
<li className="mailpoet-automation-template-list-item mailpoet-automation-from-scratch"> <li className="mailpoet-automation-template-list-item mailpoet-automation-from-scratch">
{error && ( {error && (
@@ -85,14 +101,18 @@ export function FromScratchListItem(): JSX.Element {
<p>{error}</p> <p>{error}</p>
</Notice> </Notice>
)} )}
<Button onClick={() => onClickScratchButton()}> <Button
isBusy={isBusy}
disabled={isBusy}
onClick={() => {
setIsBusy(true);
onClickScratchButton();
}}
>
<Icon width="50px" height="50px" icon={plusCircleFilled} /> <Icon width="50px" height="50px" icon={plusCircleFilled} />
{__('Create from scratch', 'mailpoet')} {__('Create from scratch', 'mailpoet')}
</Button> </Button>
<FromScratchPremiumModal <FromScratchPremiumModal showModal={showModal} onClose={premiumClose} />
showModal={showModal}
setShowModal={setShowModal}
/>
</li> </li>
); );
} }