HEX
Server: Apache
System: Linux efa57bbe-abb1-400d-2985-3b056fbc2701.secureserver.net 6.1.147-1.el9.elrepo.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Jul 24 12:33:32 EDT 2025 x86_64
User: root (0)
PHP: 8.0.30.4
Disabled: NONE
Upload Files
File: /var/www/wp-content/plugins/image-optimization/modules/reviews/assets/src/components/rating-form.js
import styled from '@emotion/styled';
import { RadioControl, Button } from '@wordpress/components';
import { __ } from '@wordpress/i18n';
import { useSettings } from '../hooks/use-settings';
import { MoodEmpty, MoodHappy, MoodSad, MoodSadSquint, MoodSmile } from '../icons';

const RatingForm = ( { close, handleSubmitForm } ) => {
	const {
		rating,
		setRating,
		setCurrentPage,
		nextButtonDisabled,
		setNextButtonDisabled,
	} = useSettings();

	const ratingsMap = [
		{ value: '5', label: __( 'Excellent', 'image-optimization' ), icon: <MoodHappy /> },
		{ value: '4', label: __( 'Pretty good', 'image-optimization' ), icon: <MoodSmile /> },
		{ value: '3', label: __( "It's okay", 'image-optimization' ), icon: <MoodEmpty /> },
		{ value: '2', label: __( 'Could be better', 'image-optimization' ), icon: <MoodSadSquint /> },
		{ value: '1', label: __( 'Needs improvement', 'image-optimization' ), icon: <MoodSad /> },
	];

	const handleRatingChange = ( value ) => {
		setRating( value );
		setNextButtonDisabled( false );
	};

	const handleNextButton = async () => {
		if ( parseInt( rating ) < 4 ) {
			setCurrentPage( 'feedback' );
		} else {
			const submitted = await handleSubmitForm( close, true );

			if ( submitted ) {
				setCurrentPage( 'review' );
			}
		}
	};

	// Convert ratingsMap to options format expected by RadioControl
	const options = ratingsMap.map( ( { value, label, icon } ) => ( {
		label: (
			<StyledRadioOption key={ value }>
				<span className="rating-icon">{ icon }</span>
				<span className="rating-label">{ label }</span>
			</StyledRadioOption>
		),
		value,
	} ) );

	return (
		<StyledContainer>
			<StyledRadioControl
				selected={ rating }
				options={ options }
				onChange={ handleRatingChange }
			/>
			<StyledButton
				variant="primary"
				onClick={ handleNextButton }
				disabled={ nextButtonDisabled }
			>
				{ __( 'Next', 'image-optimization' ) }
			</StyledButton>
		</StyledContainer>
	);
};

export default RatingForm;

const StyledContainer = styled.div`
	display: flex;
	flex-direction: column;
	width: 100%;
`;

const StyledRadioOption = styled.div`
	display: flex;
	justify-content: space-between;
	align-items: center;
	width: 100%;
	
	.rating-icon {
		margin-right: 8px;
	}
	
	.rating-label {
		flex: 1;
	}
`;

const StyledButton = styled( Button )`
	min-width: 80px;
	align-self: flex-end;
	margin-top: 16px;
	background-color: #515962 !important;
	align-items: center;
	justify-content: center;
`;

const StyledRadioControl = styled( RadioControl )`
	.components-radio-control__option {
		display: flex;
		align-items: center;
		justify-content: space-between;
		flex-direction: row-reverse;

		.components-radio-control__input[type=radio]:checked {
			background-color: #515962 !important;
			border-color: #515962 !important;
		}
	}
`;