From a1ec31894e7f9526208c90db3cf0aa755fc72705 Mon Sep 17 00:00:00 2001 From: Dion Hulse Date: Mon, 8 May 2023 06:58:33 +0000 Subject: [PATCH 1/8] Add a Paste handler for the TOTP interface. --- settings/src/components/auto-tabbing-input.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/settings/src/components/auto-tabbing-input.js b/settings/src/components/auto-tabbing-input.js index 1e00e12e..3ab524b5 100644 --- a/settings/src/components/auto-tabbing-input.js +++ b/settings/src/components/auto-tabbing-input.js @@ -45,8 +45,18 @@ const AutoTabbingInput = ( props ) => { } }, [] ); + const handlePaste = useCallback( ( event ) => { + const paste = event.clipboardData.getData('Text').replace( /[^0-9]/g, '' ) + + if ( inputs.length == paste.length ) { + event.preventDefault(); + setInputs( paste.split('') ); + onComplete( true ); + } + }, [] ); + return ( -
+
{ inputs.map( ( value, index ) => ( Date: Mon, 8 May 2023 07:09:03 +0000 Subject: [PATCH 2/8] Make Prettier happy. --- settings/src/components/auto-tabbing-input.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/settings/src/components/auto-tabbing-input.js b/settings/src/components/auto-tabbing-input.js index 3ab524b5..2727bb92 100644 --- a/settings/src/components/auto-tabbing-input.js +++ b/settings/src/components/auto-tabbing-input.js @@ -46,17 +46,20 @@ const AutoTabbingInput = ( props ) => { }, [] ); const handlePaste = useCallback( ( event ) => { - const paste = event.clipboardData.getData('Text').replace( /[^0-9]/g, '' ) + const paste = event.clipboardData.getData( 'Text' ).replace( /[^0-9]/g, '' ); - if ( inputs.length == paste.length ) { + if ( inputs.length === paste.length ) { event.preventDefault(); - setInputs( paste.split('') ); + setInputs( paste.split( '' ) ); onComplete( true ); } }, [] ); return ( -
+
{ inputs.map( ( value, index ) => ( Date: Mon, 8 May 2023 07:14:18 +0000 Subject: [PATCH 3/8] Disable the Enable button when Clear is used. --- settings/src/components/totp.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/settings/src/components/totp.js b/settings/src/components/totp.js index 3c158ad7..3d9eac13 100644 --- a/settings/src/components/totp.js +++ b/settings/src/components/totp.js @@ -231,7 +231,10 @@ function SetupForm( { handleEnable, qrCodeUrl, secretKey, inputs, setInputs, err }, [ error, inputs ] ); const handleComplete = useCallback( ( isComplete ) => setIsInputComplete( isComplete ), [] ); - const handleClearClick = useCallback( () => setInputs( Array( 6 ).fill( '' ) ), [] ); + const handleClearClick = useCallback( () => { + setInputs( Array( 6 ).fill( '' ) ); + setIsInputComplete( false ); + }, [] ); const canSubmit = qrCodeUrl && secretKey && isInputComplete; From 1296fb3b1f25f2cbf7c33dd65bb7686d84a1bdf0 Mon Sep 17 00:00:00 2001 From: Adam Wood Date: Mon, 15 May 2023 14:21:11 +1200 Subject: [PATCH 4/8] Derive completed state from input values --- settings/src/components/auto-tabbing-input.js | 19 ++----------------- settings/src/components/totp.js | 13 ++----------- 2 files changed, 4 insertions(+), 28 deletions(-) diff --git a/settings/src/components/auto-tabbing-input.js b/settings/src/components/auto-tabbing-input.js index 2727bb92..21f1d731 100644 --- a/settings/src/components/auto-tabbing-input.js +++ b/settings/src/components/auto-tabbing-input.js @@ -9,27 +9,13 @@ import { useCallback } from '@wordpress/element'; import NumericControl from './numeric-control'; const AutoTabbingInput = ( props ) => { - const { inputs, setInputs, onComplete, error } = props; + const { inputs, setInputs, error } = props; const handleChange = useCallback( ( value, event, index, inputRef ) => { setInputs( ( prevInputs ) => { const newInputs = [ ...prevInputs ]; - // Clean input - if ( value.trim() === '' ) { - event.target.value = ''; - value = ''; - } - - newInputs[ index ] = value; - - // Check if all inputs are filled - const allFilled = newInputs.every( ( input ) => '' !== input ); - if ( allFilled && onComplete ) { - onComplete( true ); - } else { - onComplete( false ); - } + newInputs[ index ] = value.trim() === '' ? '' : value; return newInputs; } ); @@ -51,7 +37,6 @@ const AutoTabbingInput = ( props ) => { if ( inputs.length === paste.length ) { event.preventDefault(); setInputs( paste.split( '' ) ); - onComplete( true ); } }, [] ); diff --git a/settings/src/components/totp.js b/settings/src/components/totp.js index 3d9eac13..bcbbe748 100644 --- a/settings/src/components/totp.js +++ b/settings/src/components/totp.js @@ -222,21 +222,17 @@ function createQrCode( data ) { * @param props.setError */ function SetupForm( { handleEnable, qrCodeUrl, secretKey, inputs, setInputs, error, setError } ) { - const [ isInputComplete, setIsInputComplete ] = useState( false ); - useEffect( () => { if ( error && inputs.some( ( input ) => input === '' ) ) { setError( '' ); } }, [ error, inputs ] ); - const handleComplete = useCallback( ( isComplete ) => setIsInputComplete( isComplete ), [] ); const handleClearClick = useCallback( () => { setInputs( Array( 6 ).fill( '' ) ); - setIsInputComplete( false ); }, [] ); - const canSubmit = qrCodeUrl && secretKey && isInputComplete; + const canSubmit = qrCodeUrl && secretKey && inputs.every( ( input ) => !! input ); return (

Enter the six digit code provided by the app:

- +