File "RequiredPlugins.js"
Full Path: /home/fresvfqn/waterdamagerestorationandrepairsmithtown.com/wp-content/plugins/astra-sites/inc/lib/onboarding/assets/src/steps/features/RequiredPlugins.js
File size: 3.42 KB
MIME-type: text/x-java
Charset: utf-8
import { __ } from '@wordpress/i18n';
import { useState, useEffect } from '@wordpress/element';
const { imageDir } = starterTemplates;
// Plugin icon path mapper - O(1) lookup performance.
const PLUGIN_ICON_MAP = {
'astra-addon': 'astra.svg',
cartflows: 'cartflows.svg',
elementor: 'elementor.svg',
'header-footer-elementor': 'uae.svg',
latepoint: 'latepoint.svg',
'presto-player': 'presto-player.svg',
'spectra-pro': 'spectra.svg',
surecart: 'surecart.svg',
sureforms: 'sureforms.svg',
suremails: 'suremails.svg',
surerank: 'surerank.svg',
suretriggers: 'ottokit.svg',
'ultimate-addons-for-gutenberg': 'spectra.svg',
'ultimate-elementor': 'uae.svg',
'variation-swatches-woo': 'variation-swatches-woo.svg',
woocommerce: 'woocommerce.svg',
'woocommerce-payments': 'woopayments.png',
'woo-cart-abandonment-recovery': 'cartflows-ca.png',
wpforms: 'wpforms.png',
'wpforms-lite': 'wpforms.png',
'wp-live-chat-support': '3cx.png',
};
const RequiredPlugins = ( { pluginsList } ) => {
const [ loadedImages, setLoadedImages ] = useState( {} );
// Initialize loadedImages state for each plugin in pluginsList.
useEffect( () => {
pluginsList?.forEach( ( { slug } ) => {
loadedImages[ slug ] = loadedImages?.[ slug ] ?? false;
} );
}, [ pluginsList ] );
// Handle image load event to update local state.
const handleImageLoad = ( slug ) => {
// Update local state.
setLoadedImages( ( prev ) => ( {
...prev,
[ slug ]: true,
} ) );
};
return (
pluginsList?.length && (
<div className="pt-3 pb-2 !max-w-[55rem] w-full mx-auto flex flex-col gap-4 text-left bg-st-background-secondary border-[1px] border-solid border-button-disabled rounded">
<div className="px-3 flex flex-col md:flex-row items-start md:items-center gap-2 justify-between">
<p className="text-sm !font-medium">
{ __(
'The following plugins will be installed and activated for the selected features:',
'astra-sites'
) }
</p>
<p className="!text-xs opacity-90 self-end">
<span className="text-alert-error">{ '* ' }</span>
{ __(
'Required plugins for the website',
'astra-sites'
) }
</p>
</div>
<div className="px-3 flex flex-nowrap overflow-x-auto gap-2 pb-[2px] plugin-list">
{ pluginsList?.map( ( { compulsory, name, slug } ) => (
<div
key={ slug }
className="px-1.5 py-1 flex items-center gap-0.5 border-[0.5px] border-solid border-button-disabled rounded cursor-pointer"
>
{ PLUGIN_ICON_MAP?.[ slug ] && (
<div className="relative w-4 h-4">
{ /* Skeleton/Loading state */ }
{ ! loadedImages?.[ slug ] && (
<div className="absolute inset-0 bg-[#6B7280]/50 rounded animate-pulse" />
) }
{ /* Actual image */ }
<img
className={ `w-4 h-4 transition-opacity duration-200 ${
loadedImages?.[ slug ]
? 'opacity-100'
: 'opacity-0'
}` }
src={ `${ imageDir }/grayscale/${ PLUGIN_ICON_MAP[ slug ] }` }
alt={ name }
onLoad={ () => handleImageLoad( slug ) }
/>
</div>
) }
<span className="px-1 text-sm font-medium text-[#1F2937] whitespace-nowrap">
{ name }
{ compulsory && (
<span className="text-alert-error">
{ ' *' }
</span>
) }
</span>
</div>
) ) }
</div>
</div>
)
);
};
export default RequiredPlugins;