68 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
| import { useCallback, useState, useEffect, useRef } from 'react';
 | |
| 
 | |
| import { FormattedMessage } from 'react-intl';
 | |
| 
 | |
| export const ColumnSearchHeader: React.FC<{
 | |
|   onBack: () => void;
 | |
|   onSubmit: (value: string) => void;
 | |
|   onActivate: () => void;
 | |
|   placeholder: string;
 | |
|   active: boolean;
 | |
| }> = ({ onBack, onActivate, onSubmit, placeholder, active }) => {
 | |
|   const inputRef = useRef<HTMLInputElement>(null);
 | |
|   const [value, setValue] = useState('');
 | |
| 
 | |
|   useEffect(() => {
 | |
|     if (!active) {
 | |
|       setValue('');
 | |
|     }
 | |
|   }, [active]);
 | |
| 
 | |
|   const handleChange = useCallback(
 | |
|     ({ target: { value } }: React.ChangeEvent<HTMLInputElement>) => {
 | |
|       setValue(value);
 | |
|       onSubmit(value);
 | |
|     },
 | |
|     [setValue, onSubmit],
 | |
|   );
 | |
| 
 | |
|   const handleKeyUp = useCallback(
 | |
|     (e: React.KeyboardEvent<HTMLInputElement>) => {
 | |
|       if (e.key === 'Escape') {
 | |
|         e.preventDefault();
 | |
|         onBack();
 | |
|         inputRef.current?.blur();
 | |
|       }
 | |
|     },
 | |
|     [onBack],
 | |
|   );
 | |
| 
 | |
|   const handleFocus = useCallback(() => {
 | |
|     onActivate();
 | |
|   }, [onActivate]);
 | |
| 
 | |
|   const handleSubmit = useCallback(() => {
 | |
|     onSubmit(value);
 | |
|   }, [onSubmit, value]);
 | |
| 
 | |
|   return (
 | |
|     <form className='column-search-header' onSubmit={handleSubmit}>
 | |
|       <input
 | |
|         ref={inputRef}
 | |
|         type='search'
 | |
|         value={value}
 | |
|         onChange={handleChange}
 | |
|         onKeyUp={handleKeyUp}
 | |
|         placeholder={placeholder}
 | |
|         onFocus={handleFocus}
 | |
|       />
 | |
| 
 | |
|       {active && (
 | |
|         <button type='button' className='link-button' onClick={onBack}>
 | |
|           <FormattedMessage id='column_search.cancel' defaultMessage='Cancel' />
 | |
|         </button>
 | |
|       )}
 | |
|     </form>
 | |
|   );
 | |
| };
 |