HEX
Server: LiteSpeed
System: Linux server902.web-hosting.com 4.18.0-553.54.1.lve.el8.x86_64 #1 SMP Wed Jun 4 13:01:13 UTC 2025 x86_64
User: deshuvsd (2181)
PHP: 8.1.33
Disabled: NONE
Upload Files
File: /home/deshuvsd/www/wp-content/plugins/surerank/src/apps/admin-dashboard/plugin-card.js
import { Button, Loader, Text } from '@bsf/force-ui';
import { cn } from '@Functions/utils';
import { FETCH_STATUS, themesAndPlugins } from './dashboard-constants';
import { __, sprintf } from '@wordpress/i18n';

export const PluginCard = ( {
	item,
	onInstall,
	fetchStatus,
	getPluginStatus,
	getProgressStatus,
	renderInstallButtonText,
} ) => {
	const pluginStatus = getPluginStatus( item );
	const isInstalled = pluginStatus === 'active';
	const isProgressing = getProgressStatus( item );

	const getInstallButtonText = ( pluginItem ) => {
		const status = getPluginStatus( pluginItem );

		if ( status === 'active' ) {
			return __( 'Activated', 'surerank' );
		}

		const product = themesAndPlugins.find(
			( themesAndPlugin ) => themesAndPlugin.slug === pluginItem.slug
		);

		if ( status === 'activate' ) {
			return product
				? sprintf(
						// translators: %s is the product name
						__( 'Activate %s', 'surerank' ),
						product.name
				  )
				: __( 'Activate', 'surerank' );
		}

		return product
			? sprintf(
					// translators: %s is the product name
					__( 'Install %s', 'surerank' ),
					product.name
			  )
			: __( 'Install', 'surerank' );
	};

	// Show card for all states now, since we handle the logic in dashboard.js

	return (
		<div className="bg-background-primary border border-border-subtle rounded-xl p-3 flex-1 min-h-0 shadow-sm">
			<div className="flex flex-col gap-2 h-full">
				{ /* Header with logo */ }
				<div className="flex items-center gap-1.5 p-1">
					<div className="w-[122px] h-6 flex items-center justify-start flex-shrink-0">
						<item.icon className="max-w-full max-h-full object-contain" />
					</div>
				</div>

				{ /* Title and Description */ }
				<div className="flex flex-col gap-1 p-1 flex-grow">
					<div className="flex items-center gap-1.5">
						<h3 className="text-base font-semibold text-text-primary leading-6">
							{ item.title || item.name }
						</h3>
					</div>
					<Text className="text-sm font-normal text-text-secondary leading-5">
						{ item.long_description || item.description }
					</Text>
				</div>

				{ /* Install Button */ }
				<div className="flex gap-1 p-1">
					{ fetchStatus.status === FETCH_STATUS.LOADING ? (
						<div className="w-24 h-8 bg-misc-skeleton-background animate-pulse rounded" />
					) : (
						<Button
							className={ cn(
								'flex justify-center items-center gap-0.5 px-2 py-2 h-auto border rounded shadow-sm text-xs font-semibold focus:outline-none focus:ring-0',
								isInstalled
									? 'border-badge-border-green bg-badge-background-green text-badge-color-green cursor-default'
									: 'border-border-subtle text-text-primary hover:bg-background-secondary',
								isProgressing && 'opacity-75'
							) }
							size="sm"
							variant="outline"
							onClick={ () => ! isInstalled && onInstall( item ) }
							icon={
								isProgressing && (
									<Loader className="text-icon-primary" />
								)
							}
							iconPosition="left"
							loading={ isProgressing }
							disabled={ isProgressing || isInstalled }
						>
							{ renderInstallButtonText
								? renderInstallButtonText( item )
								: getInstallButtonText( item ) }
						</Button>
					) }
				</div>
			</div>
		</div>
	);
};