File "search-input.js"

Full Path: /home/warrior1/public_html/wp-content/plugins/elementor/app/modules/kit-library/assets/js/components/search-input.js
File size: 1.58 KB
MIME-type: text/x-java
Charset: utf-8

import useDebouncedCallback from '../hooks/use-debounced-callback';
import { Icon, Button } from '@elementor/app-ui';
import { useState, useEffect } from 'react';

import './search-input.scss';

export default function SearchInput( props ) {
	const [ localValue, setLocalValue ] = useState( props.value || '' );
	const debouncedOnChange = useDebouncedCallback( ( value ) => props.onChange( value ), props.debounceTimeout );

	useEffect( () => {
		if ( props.value !== localValue ) {
			setLocalValue( props.value );
		}
	}, [ props.value ] );

	return (
		<div className={ `eps-search-input__container ${ props.className }` }>
			<input
				className={ `eps-search-input eps-search-input--${ props.size }` }
				placeholder={ props.placeholder }
				value={ localValue }
				onChange={ ( e ) => {
					setLocalValue( e.target.value );
					debouncedOnChange( e.target.value );
				} }
			/>
			<Icon className={ `eicon-search-bold eps-search-input__icon eps-search-input__icon--${ props.size }` } />
			{
				props.value &&
				<Button
					text={ __( 'Clear', 'elementor' ) }
					hideText={ true }
					className={ `eicon-close-circle eps-search-input__clear-icon eps-search-input__clear-icon--${ props.size }` }
					onClick={ () => props.onChange( '' ) }
				/>
			}
		</div>
	);
}

SearchInput.propTypes = {
	placeholder: PropTypes.string,
	value: PropTypes.string.isRequired,
	onChange: PropTypes.func.isRequired,
	className: PropTypes.string,
	size: PropTypes.oneOf( [ 'md', 'sm' ] ),
	debounceTimeout: PropTypes.number,
};

SearchInput.defaultProps = {
	className: '',
	size: 'md',
	debounceTimeout: 300,
};