diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 697910d..71a613d 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -1,8 +1,7 @@ -name: Lint +name: 'Lint Checker: PHP' + on: push: - branches: - - '**' paths: - '**.php' pull_request: @@ -24,17 +23,18 @@ jobs: - name: Checkout uses: actions/checkout@v3 - # User PHP 7.4 here for compatibility with the WordPress codesniffer rules. - name: Setup PHP uses: shivammathur/setup-php@v2 with: - php-version: '7.4' + php-version: '8.2' coverage: none tools: composer, cs2pr - uses: technote-space/get-diff-action@v6 with: - SUFFIX_FILTER: .php + PATTERNS: | + **/*.php + !build/**/*.php - name: Get Composer cache directory id: composer-cache diff --git a/components/advancedSettings/JetpackBoost/InstallActivatePluginButton.js b/components/advancedSettings/JetpackBoost/InstallActivatePluginButton.js new file mode 100644 index 0000000..3a0b0fe --- /dev/null +++ b/components/advancedSettings/JetpackBoost/InstallActivatePluginButton.js @@ -0,0 +1,85 @@ +// WordPress +import { useState } from '@wordpress/element'; + +// Newfold +import { Spinner } from '@newfold/ui-component-library'; +import { NewfoldRuntime } from '@newfold-labs/wp-module-runtime'; + +const InstallActivatePluginButton = ( { + methods, + constants, + setModuleStatus, +} ) => { + const [ isLoading, setIsLoading ] = useState( false ); + const [ isActive, setIsActive ] = useState( false ); + const [ message, setMessage ] = useState( null ); + + const handleInstallActivate = async () => { + setIsLoading( true ); + setMessage( constants.text.jetpackBoostInstalling ); + + const apiUrl = methods.NewfoldRuntime.createApiUrl( + '/newfold-installer/v1/plugins/install' + ); + const INSTALL_TOKEN = NewfoldRuntime.sdk.performance.install_token; + const plugin = 'jetpack-boost'; + + try { + await methods.apiFetch( { + url: apiUrl, + method: 'POST', + headers: { 'X-NFD-INSTALLER': INSTALL_TOKEN }, + data: { plugin, activate: true, queue: false }, + } ); + setIsActive( true ); + setModuleStatus( true ); + setMessage( constants.text.jetpackBoostInstalling ); + } catch ( error ) { + setMessage( constants.text.jetpackBoostActivationFailed ); + } finally { + setIsLoading( false ); + } + }; + + return ( +
+ +
+ ); +}; + +export default InstallActivatePluginButton; diff --git a/components/advancedSettings/JetpackBoost/SingleOption.js b/components/advancedSettings/JetpackBoost/SingleOption.js new file mode 100644 index 0000000..70c96e8 --- /dev/null +++ b/components/advancedSettings/JetpackBoost/SingleOption.js @@ -0,0 +1,184 @@ +// WordPress +import apiFetch from '@wordpress/api-fetch'; +import { useRef, useState } from '@wordpress/element'; + +// Newfold +import { + ToggleField, + Textarea, + FeatureUpsell, +} from '@newfold/ui-component-library'; +import { NewfoldRuntime } from '@newfold-labs/wp-module-runtime'; + +// Third-parts +import parse from 'html-react-parser'; + +const SingleOption = ( { params, isChild, methods, constants } ) => { + const [ optionDetails, setOptionDetails ] = useState( { + id: params.id, + label: params.label, + description: params.description, + value: params.value ? String( params.value ) : '', + type: params.type, + externalText: params.externalText, + premiumUrl: params.premiumUrl ?? '', + children: params.children, + } ); + + const [ isShown, setIsShown ] = useState( false ); + + const debounceTimeout = useRef( null ); // Mantiene il timeout tra i render + + const handleChangeOption = ( value, id ) => { + if ( typeof value === 'object' ) { + value = value.target.value; + } + + setOptionDetails( { ...optionDetails, value } ); + + // Clear the previous timeout if user types again. + if ( debounceTimeout.current ) { + clearTimeout( debounceTimeout.current ); + } + + // Set a new timeout of 2 seconds. + debounceTimeout.current = setTimeout( () => { + apiFetch( { + path: 'newfold-performance/v1/jetpack/settings', + method: 'POST', + data: { + field: { + id, + value, + }, + }, + } ) + .then( () => { + methods.makeNotice( + 'cache-level-change-notice', + constants.text.optionSet, + '', + 'success', + 5000 + ); + } ) + .catch( () => { + methods.makeNotice( + 'cache-level-change-notice', + constants.text.optionNotSet, + '', + 'error', + 5000 + ); + } ); + }, 1000 ); + }; + + const displayOption = ( option ) => { + switch ( option.type ) { + case 'toggle': + return ( + <> + { option.premiumUrl && + ! NewfoldRuntime.sdk.performance + .jetpack_boost_premium_is_active && ( + + + handleChangeOption( + value, + option.id + ) + } + /> + { option.externalText ? ( +

+ { parse( option.externalText ) } +

+ ) : null } +
+ ) } + { ( ! option.premiumUrl || + NewfoldRuntime.sdk.performance + .jetpack_boost_premium_is_active ) && ( + <> + + handleChangeOption( value, option.id ) + } + /> + { option.externalText ? ( +

+ { parse( option.externalText ) } +

+ ) : null } + + ) } + + ); + + case 'textarea': + return ( + <> +

{ option.label }

+