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>
 | 
						|
  );
 | 
						|
};
 |