From 9ea372084d6c12649463bce4a4636e537d2b47c9 Mon Sep 17 00:00:00 2001 From: Allen Benny Date: Thu, 8 Dec 2022 11:28:28 +0530 Subject: [PATCH 01/10] Added a POST Call to The Interstitial Page --- src/OnboardingSPA/pages/Steps/Complete/index.js | 16 +++++++++++++--- src/OnboardingSPA/store/selectors.js | 10 ++++++++++ src/OnboardingSPA/utils/api/plugins.js | 13 +++++++++++++ 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/OnboardingSPA/pages/Steps/Complete/index.js b/src/OnboardingSPA/pages/Steps/Complete/index.js index 35b016bf3..426cba152 100644 --- a/src/OnboardingSPA/pages/Steps/Complete/index.js +++ b/src/OnboardingSPA/pages/Steps/Complete/index.js @@ -3,10 +3,11 @@ import { useSelect, useDispatch } from '@wordpress/data'; import { useEffect, useState } from '@wordpress/element'; import { useNavigate } from 'react-router-dom'; -import { StepLoader } from '../../../components/Loaders'; +import getContents from './contents'; import { completeFlow } from '../../../utils/api/flow'; +import { StepLoader } from '../../../components/Loaders'; +import { setSiteFeatures } from '../../../utils/api/plugins'; import { StepErrorState } from '../../../components/ErrorState'; -import getContents from './contents'; import { DesignStateHandler } from '../../../components/StateHandlers'; const StepComplete = () => { @@ -16,10 +17,12 @@ const StepComplete = () => { const navigate = useNavigate(); const [ isError, setIsError ] = useState( false ); - const { nextStep, brandName } = useSelect( ( select ) => { + const { nextStep, brandName, currentData, pluginInstallHash } = useSelect( ( select ) => { return { nextStep: select( nfdOnboardingStore ).getNextStep(), brandName: select( nfdOnboardingStore ).getNewfoldBrandName(), + currentData: select(nfdOnboardingStore).getCurrentOnboardingData(), + pluginInstallHash: select(nfdOnboardingStore).getPluginInstallHash(), }; }, [] ); @@ -31,6 +34,13 @@ const StepComplete = () => { setIsHeaderNavigationEnabled( true ); return setIsError( true ); } + if ( currentData?.data.siteFeatures ){ + const siteFeaturesResponse = await setSiteFeatures(pluginInstallHash, { 'plugins': currentData?.data.siteFeatures }); + if (siteFeaturesResponse?.error) { + setIsHeaderNavigationEnabled( true ); + return setIsError( true ); + } + } navigate( nextStep.path ); }; diff --git a/src/OnboardingSPA/store/selectors.js b/src/OnboardingSPA/store/selectors.js index b3c5c9ad4..014a57d1e 100644 --- a/src/OnboardingSPA/store/selectors.js +++ b/src/OnboardingSPA/store/selectors.js @@ -262,3 +262,13 @@ export function getStepPreviewData( state ) { export function getHeaderMenuData( state ) { return state.header.menu; } + +/** + * Gets the Plugin Install Hash for security + * + * @param {*} state + * @return string + */ +export function getPluginInstallHash(state) { + return state.runtime.pluginInstallHash; +} diff --git a/src/OnboardingSPA/utils/api/plugins.js b/src/OnboardingSPA/utils/api/plugins.js index 7716ad275..79cd62f23 100644 --- a/src/OnboardingSPA/utils/api/plugins.js +++ b/src/OnboardingSPA/utils/api/plugins.js @@ -37,4 +37,17 @@ export const getSiteFeatures = async () => { url: onboardingRestURL( 'plugins/site-features' ), } ) ); +}; + +export const setSiteFeatures = async ( pluginInstallHash, data ) => { + return await resolve( + apiFetch({ + url: onboardingRestURL('plugins/site-features'), + method: 'POST', + headers: { + 'X-NFD-ONBOARDING': pluginInstallHash, + }, + data, + }) + ); }; From 46380fccd103aa2a7467ca851445ae5add171052 Mon Sep 17 00:00:00 2001 From: Allen Benny Date: Thu, 8 Dec 2022 12:38:29 +0530 Subject: [PATCH 02/10] Update index.js --- src/OnboardingSPA/pages/Steps/Complete/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OnboardingSPA/pages/Steps/Complete/index.js b/src/OnboardingSPA/pages/Steps/Complete/index.js index 426cba152..cf92e28ca 100644 --- a/src/OnboardingSPA/pages/Steps/Complete/index.js +++ b/src/OnboardingSPA/pages/Steps/Complete/index.js @@ -34,8 +34,8 @@ const StepComplete = () => { setIsHeaderNavigationEnabled( true ); return setIsError( true ); } - if ( currentData?.data.siteFeatures ){ - const siteFeaturesResponse = await setSiteFeatures(pluginInstallHash, { 'plugins': currentData?.data.siteFeatures }); + if ( currentData?.data?.siteFeatures ){ + const siteFeaturesResponse = await setSiteFeatures(pluginInstallHash, { 'plugins': currentData?.data?.siteFeatures }); if (siteFeaturesResponse?.error) { setIsHeaderNavigationEnabled( true ); return setIsError( true ); From 60a9296ed01a232ef800e7c3e225971f70454d7d Mon Sep 17 00:00:00 2001 From: Allen Benny Date: Thu, 8 Dec 2022 12:42:54 +0530 Subject: [PATCH 03/10] Linting Added --- .../pages/Steps/Complete/index.js | 30 ++++++++++++------- src/OnboardingSPA/store/selectors.js | 2 +- src/OnboardingSPA/utils/api/plugins.js | 8 ++--- 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/src/OnboardingSPA/pages/Steps/Complete/index.js b/src/OnboardingSPA/pages/Steps/Complete/index.js index cf92e28ca..6a080a558 100644 --- a/src/OnboardingSPA/pages/Steps/Complete/index.js +++ b/src/OnboardingSPA/pages/Steps/Complete/index.js @@ -17,14 +17,19 @@ const StepComplete = () => { const navigate = useNavigate(); const [ isError, setIsError ] = useState( false ); - const { nextStep, brandName, currentData, pluginInstallHash } = useSelect( ( select ) => { - return { - nextStep: select( nfdOnboardingStore ).getNextStep(), - brandName: select( nfdOnboardingStore ).getNewfoldBrandName(), - currentData: select(nfdOnboardingStore).getCurrentOnboardingData(), - pluginInstallHash: select(nfdOnboardingStore).getPluginInstallHash(), - }; - }, [] ); + const { nextStep, brandName, currentData, pluginInstallHash } = useSelect( + ( select ) => { + return { + nextStep: select( nfdOnboardingStore ).getNextStep(), + brandName: select( nfdOnboardingStore ).getNewfoldBrandName(), + currentData: + select( nfdOnboardingStore ).getCurrentOnboardingData(), + pluginInstallHash: + select( nfdOnboardingStore ).getPluginInstallHash(), + }; + }, + [] + ); const contents = getContents( brandName ); @@ -34,9 +39,12 @@ const StepComplete = () => { setIsHeaderNavigationEnabled( true ); return setIsError( true ); } - if ( currentData?.data?.siteFeatures ){ - const siteFeaturesResponse = await setSiteFeatures(pluginInstallHash, { 'plugins': currentData?.data?.siteFeatures }); - if (siteFeaturesResponse?.error) { + if ( currentData?.data?.siteFeatures ) { + const siteFeaturesResponse = await setSiteFeatures( + pluginInstallHash, + { plugins: currentData?.data?.siteFeatures } + ); + if ( siteFeaturesResponse?.error ) { setIsHeaderNavigationEnabled( true ); return setIsError( true ); } diff --git a/src/OnboardingSPA/store/selectors.js b/src/OnboardingSPA/store/selectors.js index 014a57d1e..f8480e8aa 100644 --- a/src/OnboardingSPA/store/selectors.js +++ b/src/OnboardingSPA/store/selectors.js @@ -269,6 +269,6 @@ export function getHeaderMenuData( state ) { * @param {*} state * @return string */ -export function getPluginInstallHash(state) { +export function getPluginInstallHash( state ) { return state.runtime.pluginInstallHash; } diff --git a/src/OnboardingSPA/utils/api/plugins.js b/src/OnboardingSPA/utils/api/plugins.js index 79cd62f23..5b36def29 100644 --- a/src/OnboardingSPA/utils/api/plugins.js +++ b/src/OnboardingSPA/utils/api/plugins.js @@ -37,17 +37,17 @@ export const getSiteFeatures = async () => { url: onboardingRestURL( 'plugins/site-features' ), } ) ); -}; +}; export const setSiteFeatures = async ( pluginInstallHash, data ) => { return await resolve( - apiFetch({ - url: onboardingRestURL('plugins/site-features'), + apiFetch( { + url: onboardingRestURL( 'plugins/site-features' ), method: 'POST', headers: { 'X-NFD-ONBOARDING': pluginInstallHash, }, data, - }) + } ) ); }; From 0fcd5245cf2122c2d3bdc6f7f49400fafea042a5 Mon Sep 17 00:00:00 2001 From: Allen Benny Date: Thu, 8 Dec 2022 12:44:07 +0530 Subject: [PATCH 04/10] Update index.js --- src/OnboardingSPA/pages/Steps/Complete/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OnboardingSPA/pages/Steps/Complete/index.js b/src/OnboardingSPA/pages/Steps/Complete/index.js index 6a080a558..bfb7ba6aa 100644 --- a/src/OnboardingSPA/pages/Steps/Complete/index.js +++ b/src/OnboardingSPA/pages/Steps/Complete/index.js @@ -39,7 +39,7 @@ const StepComplete = () => { setIsHeaderNavigationEnabled( true ); return setIsError( true ); } - if ( currentData?.data?.siteFeatures ) { + if ( pluginInstallHash && currentData?.data?.siteFeatures ) { const siteFeaturesResponse = await setSiteFeatures( pluginInstallHash, { plugins: currentData?.data?.siteFeatures } From 1f0cc77a9fac91049965615e67b5497718d40dab Mon Sep 17 00:00:00 2001 From: Allen Benny Date: Thu, 8 Dec 2022 13:14:37 +0530 Subject: [PATCH 05/10] Update index.js --- src/OnboardingSPA/pages/Steps/Complete/index.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/OnboardingSPA/pages/Steps/Complete/index.js b/src/OnboardingSPA/pages/Steps/Complete/index.js index bfb7ba6aa..4dc396ba9 100644 --- a/src/OnboardingSPA/pages/Steps/Complete/index.js +++ b/src/OnboardingSPA/pages/Steps/Complete/index.js @@ -35,10 +35,8 @@ const StepComplete = () => { const checkFlowComplete = async () => { const flowCompletionResponse = await completeFlow(); - if ( flowCompletionResponse?.error ) { - setIsHeaderNavigationEnabled( true ); - return setIsError( true ); - } + + // Executing the second API Call before we check for Error if ( pluginInstallHash && currentData?.data?.siteFeatures ) { const siteFeaturesResponse = await setSiteFeatures( pluginInstallHash, @@ -49,6 +47,10 @@ const StepComplete = () => { return setIsError( true ); } } + if ( flowCompletionResponse?.error ) { + setIsHeaderNavigationEnabled( true ); + return setIsError( true ); + } navigate( nextStep.path ); }; From d3af4dfc4ba6e74b3a998e74f734e89572758442 Mon Sep 17 00:00:00 2001 From: Allen Benny Date: Thu, 8 Dec 2022 13:22:25 +0530 Subject: [PATCH 06/10] Update index.js --- src/OnboardingSPA/pages/Steps/Complete/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/OnboardingSPA/pages/Steps/Complete/index.js b/src/OnboardingSPA/pages/Steps/Complete/index.js index 4dc396ba9..fcc55471a 100644 --- a/src/OnboardingSPA/pages/Steps/Complete/index.js +++ b/src/OnboardingSPA/pages/Steps/Complete/index.js @@ -37,7 +37,7 @@ const StepComplete = () => { const flowCompletionResponse = await completeFlow(); // Executing the second API Call before we check for Error - if ( pluginInstallHash && currentData?.data?.siteFeatures ) { + if (pluginInstallHash && !Array.isArray(currentData?.data?.siteFeatures) ) { const siteFeaturesResponse = await setSiteFeatures( pluginInstallHash, { plugins: currentData?.data?.siteFeatures } @@ -47,6 +47,7 @@ const StepComplete = () => { return setIsError( true ); } } + if ( flowCompletionResponse?.error ) { setIsHeaderNavigationEnabled( true ); return setIsError( true ); From 82781f71c4a8b7db48c53ff953a610f76450b1d1 Mon Sep 17 00:00:00 2001 From: Allen Benny Date: Thu, 8 Dec 2022 14:02:42 +0530 Subject: [PATCH 07/10] Used Promise.all() for asynchronous calls --- .../pages/Steps/Complete/index.js | 44 ++++++++++++------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/src/OnboardingSPA/pages/Steps/Complete/index.js b/src/OnboardingSPA/pages/Steps/Complete/index.js index fcc55471a..0f23c4cd4 100644 --- a/src/OnboardingSPA/pages/Steps/Complete/index.js +++ b/src/OnboardingSPA/pages/Steps/Complete/index.js @@ -34,27 +34,37 @@ const StepComplete = () => { const contents = getContents( brandName ); const checkFlowComplete = async () => { - const flowCompletionResponse = await completeFlow(); - - // Executing the second API Call before we check for Error - if (pluginInstallHash && !Array.isArray(currentData?.data?.siteFeatures) ) { - const siteFeaturesResponse = await setSiteFeatures( - pluginInstallHash, - { plugins: currentData?.data?.siteFeatures } - ); - if ( siteFeaturesResponse?.error ) { - setIsHeaderNavigationEnabled( true ); - return setIsError( true ); - } - } + Promise.all( [ completeFlowRequest(), setSiteFeaturesRequest() ] ).then( + ( values ) => + values.forEach( ( value ) => { + // If any Request returns False then Show Error + if ( ! value ) { + setIsHeaderNavigationEnabled( true ); + return setIsError( true ); + } + } ) + ); - if ( flowCompletionResponse?.error ) { - setIsHeaderNavigationEnabled( true ); - return setIsError( true ); - } navigate( nextStep.path ); }; + async function completeFlowRequest() { + const flowCompletionResponse = await completeFlow(); + if ( flowCompletionResponse?.error ) return false; + return true; + } + + async function setSiteFeaturesRequest() { + if ( Array.isArray( currentData?.data?.siteFeatures ) ) return true; + + const siteFeaturesResponse = await setSiteFeatures( pluginInstallHash, { + plugins: currentData?.data?.siteFeatures, + } ); + if ( siteFeaturesResponse?.error ) return false; + + return true; + } + useEffect( () => { setIsHeaderNavigationEnabled( false ); setIsDrawerSuppressed( true ); From cb9a067642200e2229f90a41018289864481edba Mon Sep 17 00:00:00 2001 From: Allen Benny Date: Fri, 9 Dec 2022 19:36:10 +0530 Subject: [PATCH 08/10] Added Await to show the loader --- src/OnboardingSPA/pages/Steps/Complete/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OnboardingSPA/pages/Steps/Complete/index.js b/src/OnboardingSPA/pages/Steps/Complete/index.js index 0f23c4cd4..3de550af1 100644 --- a/src/OnboardingSPA/pages/Steps/Complete/index.js +++ b/src/OnboardingSPA/pages/Steps/Complete/index.js @@ -34,7 +34,7 @@ const StepComplete = () => { const contents = getContents( brandName ); const checkFlowComplete = async () => { - Promise.all( [ completeFlowRequest(), setSiteFeaturesRequest() ] ).then( + await Promise.all( [ completeFlowRequest(), setSiteFeaturesRequest() ] ).then( ( values ) => values.forEach( ( value ) => { // If any Request returns False then Show Error From 8add4bf99ae7ad5740897f0dff6d089c7d597cee Mon Sep 17 00:00:00 2001 From: Allen Benny Date: Mon, 12 Dec 2022 13:10:44 +0530 Subject: [PATCH 09/10] Refactored Code --- includes/Services/PluginUninstaller.php | 7 ------- includes/TaskManagers/PluginUninstallTaskManager.php | 9 +++++++++ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/includes/Services/PluginUninstaller.php b/includes/Services/PluginUninstaller.php index 9b5c4406e..08d668376 100644 --- a/includes/Services/PluginUninstaller.php +++ b/includes/Services/PluginUninstaller.php @@ -13,13 +13,6 @@ class PluginUninstaller { public static function uninstall( $plugin ) { - $position_in_queue = PluginInstallTaskManager::status( $plugin ); - if ( $position_in_queue !== false && $position_in_queue !== 0 ) { - PluginInstallTaskManager::remove_from_queue( - $plugin, - ); - } - $plugin_list = Plugins::get_squashed(); // Gets the specified path for the Plugin from the predefined list $plugin_path = $plugin_list[ $plugin ]['path']; diff --git a/includes/TaskManagers/PluginUninstallTaskManager.php b/includes/TaskManagers/PluginUninstallTaskManager.php index 74ea563fd..7cef0b4bd 100644 --- a/includes/TaskManagers/PluginUninstallTaskManager.php +++ b/includes/TaskManagers/PluginUninstallTaskManager.php @@ -109,6 +109,15 @@ public static function add_to_queue( PluginUninstallTask $plugin_uninstall_task converted to an associative array before storing it in the option. */ $plugins = \get_option( Options::get_option_name( self::$queue_name ), array() ); + $position_in_queue = PluginInstallTaskManager::status( $plugin_uninstall_task->get_slug() ); + if ( $position_in_queue !== false && $position_in_queue !== 0 ) { + PluginInstallTaskManager::remove_from_queue( + $plugin_uninstall_task->get_slug(), + ); + + return true; + } + $queue = new PriorityQueue(); foreach ( $plugins as $queued_plugin ) { From bd80ffde2e4a751fb8864ab7b78e03c83c57e4d3 Mon Sep 17 00:00:00 2001 From: Allen Benny Date: Mon, 12 Dec 2022 13:49:20 +0530 Subject: [PATCH 10/10] Update PluginUninstallTaskManager.php --- includes/TaskManagers/PluginUninstallTaskManager.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/includes/TaskManagers/PluginUninstallTaskManager.php b/includes/TaskManagers/PluginUninstallTaskManager.php index 7cef0b4bd..fc7409284 100644 --- a/includes/TaskManagers/PluginUninstallTaskManager.php +++ b/includes/TaskManagers/PluginUninstallTaskManager.php @@ -1,9 +1,11 @@ get_slug() ]['path']; + + if (!PluginUninstaller::is_plugin_installed($plugin_path)) + return true; + $queue = new PriorityQueue(); foreach ( $plugins as $queued_plugin ) {