File "RecommendationCard.jsx"

Full Path: /home/safaelji/recrut.automotomaroc.com/wp-content/plugins/extendify/src/Assist/components/dashboard/RecommendationCard.jsx
File size: 4.51 KB
MIME-type: text/html
Charset: utf-8

import { Button } from '@wordpress/components';
import { useEffect, useState } from '@wordpress/element';
import { __, sprintf } from '@wordpress/i18n';
import { Icon, check, warning } from '@wordpress/icons';
import { recordPluginActivity } from '@shared/api/DataApi';
import { installPlugin, activatePlugin } from '@shared/api/wp';
import { useActivityStore } from '@shared/state/activity';

export const RecommendationCard = ({ recommendation }) => {
	if (recommendation.pluginSlug) {
		return <InstallCard recommendation={recommendation} />;
	}
	return <LinkCard recommendation={recommendation} />;
};

const LinkCard = ({ recommendation }) => {
	const { by, slug, description, image, title, linkType } = recommendation;
	const { incrementActivity } = useActivityStore();
	if (!recommendation?.[linkType]) return null;

	return (
		<a
			href={recommendation[linkType]?.replace(
				'{APEXDOMAIN}',
				window.extSharedData?.apexDomain ?? '',
			)}
			onClick={() => incrementActivity(`recommendations-${slug}`)}
			target="_blank"
			className="cursor-pointer rounded border border-gray-200 bg-transparent p-4 text-left text-base no-underline hover:border-design-main hover:bg-gray-50 rtl:text-right">
			<div className="h-full w-full">
				<img
					className="h-8 w-8 rounded fill-current"
					alt={
						by
							? /* translators: %s: The name of the company/author */
								sprintf(__('Logo for %s', 'extendify-local'), by)
							: undefined
					}
					src={image}
				/>
				<div className="mt-2 font-semibold">{title}</div>
				{by && <div className="text-sm text-gray-700">{by}</div>}
				<div className="mt-2 text-sm text-gray-800">{description}</div>
			</div>
		</a>
	);
};

const InstallCard = ({ recommendation }) => {
	const { by, slug, description, image, title, pluginSlug } = recommendation;
	const { incrementActivity } = useActivityStore();
	return (
		<div
			onClick={() => incrementActivity(`recommendations-install-${slug}`)}
			className="rounded border border-gray-200 bg-transparent p-4 text-left text-base rtl:text-right">
			<div className="h-full w-full">
				<img
					className="h-8 w-8 rounded fill-current"
					alt={
						by ? sprintf(__('Logo for %s', 'extendify-local'), by) : undefined
					}
					src={image}
				/>
				<div className="mt-2 font-semibold">{title}</div>
				{by && <div className="text-sm text-gray-700">{by}</div>}
				<div className="mb-3 mt-2 text-sm text-gray-800">{description}</div>
				<InstallButton slug={pluginSlug} />
			</div>
		</div>
	);
};

const InstallButton = ({ slug }) => {
	const [installing, setInstalling] = useState(false);
	const [status, setStatus] = useState('');

	useEffect(() => {
		const { installedPlugins, activePlugins } = window.extSharedData;
		const hasPlugin = (p) => p?.includes(slug);
		const installed = Object.values(installedPlugins).some(hasPlugin);
		const active = Object.values(activePlugins).some(hasPlugin);
		if (installed) setStatus('inactive');
		if (active) setStatus('active');
	}, [slug, setStatus]);

	const handleClick = async () => {
		setInstalling(true);
		try {
			await installPlugin(slug);
			recordPluginActivity({
				slug,
				source: 'assist-recommendation-card',
			});
		} catch (_) {
			// Fail silently if the plugin is already installed
			console.error('Error installing plugin:', _);
		}
		try {
			await activatePlugin(slug);
			setStatus('active');
		} catch (_) {
			setStatus('error');
			setTimeout(() => {
				setStatus(status);
			}, 1500);
		}
		setInstalling(false);
	};

	if (status === 'error') {
		return (
			<>
				<p
					className="flex items-center fill-wp-alert-red text-wp-alert-red"
					style={{ fontSize: '13px' }}>
					<Icon icon={warning} />
					{__('Error', 'extendify-local')}
				</p>
			</>
		);
	}

	if (status === 'active') {
		return (
			<>
				<p
					className="flex items-center fill-wp-alert-green text-wp-alert-green"
					style={{ fontSize: '13px' }}>
					<Icon icon={check} />
					{__('Active', 'extendify-local')}
				</p>
			</>
		);
	}

	if (status === 'inactive') {
		return (
			<Button
				onClick={handleClick}
				type="button"
				variant="secondary"
				size="compact"
				disabled={installing}
				isBusy={installing}>
				{installing
					? __('Activating...', 'extendify-local')
					: __('Activate', 'extendify-local')}
			</Button>
		);
	}

	return (
		<Button
			onClick={handleClick}
			type="button"
			variant="secondary"
			size="compact"
			disabled={installing}
			isBusy={installing}>
			{installing
				? __('Installing...', 'extendify-local')
				: __('Install Now', 'extendify-local')}
		</Button>
	);
};