From 386a2872f8c9adbbc492c5f484cc03f3a4cb8452 Mon Sep 17 00:00:00 2001 From: Himad M Date: Fri, 29 Nov 2024 11:46:14 -0400 Subject: [PATCH] New Settings UI: Validate advanced options client ID --- .../reusable-components/_button.scss | 2 +- .../screens/onboarding/_step-welcome.scss | 6 ++ .../Components/AdvancedOptionsForm.js | 61 +++++++------------ 3 files changed, 30 insertions(+), 39 deletions(-) diff --git a/modules/ppcp-settings/resources/css/components/reusable-components/_button.scss b/modules/ppcp-settings/resources/css/components/reusable-components/_button.scss index 9815633e3..0afb0a304 100644 --- a/modules/ppcp-settings/resources/css/components/reusable-components/_button.scss +++ b/modules/ppcp-settings/resources/css/components/reusable-components/_button.scss @@ -5,7 +5,7 @@ button.components-button, a.components-button { } &:disabled { - color: $color-white; + color: $color-gray-700; } border-radius: 50px; diff --git a/modules/ppcp-settings/resources/css/components/screens/onboarding/_step-welcome.scss b/modules/ppcp-settings/resources/css/components/screens/onboarding/_step-welcome.scss index 394b2bd10..3399a1bc9 100644 --- a/modules/ppcp-settings/resources/css/components/screens/onboarding/_step-welcome.scss +++ b/modules/ppcp-settings/resources/css/components/screens/onboarding/_step-welcome.scss @@ -26,6 +26,12 @@ border: none; } + .client-id-error { + color: #cc1818; + margin: -16px 0 24px; + @include font(11, 16, 450); + } + .onboarding-advanced-options { max-width: 800px; } diff --git a/modules/ppcp-settings/resources/js/Components/Screens/Onboarding/Components/AdvancedOptionsForm.js b/modules/ppcp-settings/resources/js/Components/Screens/Onboarding/Components/AdvancedOptionsForm.js index b18edc6fb..025eb2659 100644 --- a/modules/ppcp-settings/resources/js/Components/Screens/Onboarding/Components/AdvancedOptionsForm.js +++ b/modules/ppcp-settings/resources/js/Components/Screens/Onboarding/Components/AdvancedOptionsForm.js @@ -1,6 +1,6 @@ import { __, sprintf } from '@wordpress/i18n'; import { Button, TextControl } from '@wordpress/components'; -import { useRef } from '@wordpress/element'; +import { useRef, useMemo } from '@wordpress/element'; import { useDispatch } from '@wordpress/data'; import { store as noticesStore } from '@wordpress/notices'; @@ -29,38 +29,13 @@ const AdvancedOptionsForm = ( { setCompleted } ) => { const refClientId = useRef( null ); const refClientSecret = useRef( null ); - const handleFormValidation = () => { - const fields = [ - { - ref: refClientId, - value: clientId, - errorMessage: __( - 'Please enter your Client ID', - 'woocommerce-paypal-payments' - ), - }, - { - ref: refClientSecret, - value: clientSecret, - errorMessage: __( - 'Please enter your Secret Key', - 'woocommerce-paypal-payments' - ), - }, - ]; + const isValidClientId = useMemo( () => { + return clientId ? /^A[\w-]{79}$/.test( clientId ) : true; + }, [ clientId ] ); - for ( const { ref, value, errorMessage } of fields ) { - if ( value ) { - continue; - } - - ref?.current?.focus(); - createErrorNotice( errorMessage ); - return false; - } - - return true; - }; + const isFormValid = useMemo( () => { + return isValidClientId && clientId && clientSecret; + }, [ isValidClientId, clientId, clientSecret ] ); const handleServerError = ( res, genericMessage ) => { console.error( 'Connection error', res ); @@ -71,7 +46,6 @@ const AdvancedOptionsForm = ( { setCompleted } ) => { createSuccessNotice( __( 'Connected to PayPal', 'woocommerce-paypal-payments' ) ); - setCompleted( true ); }; @@ -103,10 +77,6 @@ const AdvancedOptionsForm = ( { setCompleted } ) => { }; const handleManualConnect = async () => { - if ( ! handleFormValidation() ) { - return; - } - const res = await connectViaIdAndSecret(); if ( res.success ) { @@ -177,7 +147,18 @@ const AdvancedOptionsForm = ( { setCompleted } ) => { } value={ clientId } onChange={ setClientId } + className={ + clientId && ! isValidClientId ? 'has-error' : '' + } /> + { clientId && ! isValidClientId && ( +

+ { __( + 'Please enter a valid Client ID', + 'woocommerce-paypal-payments' + ) } +

+ ) } { onChange={ setClientSecret } type="password" /> -