Advertisement
Guest User

Untitled

a guest
Apr 14th, 2022
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import { useEffect, useRef, useState } from "react";
  2. import { useOnClickOutside } from "../../hooks";
  3. import useDebounce from "../../hooks/useDebounce";
  4. import { ISearchProps } from "./search.props";
  5. import { SearchWrapper } from "./Search.style";
  6.  
  7. const Search: React.FC<ISearchProps> = ({onChange, placeholder = "Search by..."}) => {
  8.  
  9.     const [value, setValue] = useState<string>("");
  10.     const debouncedValue = useDebounce(value, 500);
  11.     const [expandInput, setExpandInput] = useState(false);
  12.     const ref = useRef(null);
  13.     const [input, setInput] = useState<HTMLInputElement | null>();
  14.  
  15.     useEffect(()=>{
  16.         onChange(debouncedValue);
  17.         // window.localStorage.setItem('SAVE_SEARCH', JSON.stringify(value));
  18.     }, [debouncedValue]);
  19.  
  20.     useEffect(()=>{
  21.         const data = window.localStorage.getItem('SAVE_SEARCH');
  22.         if (data !== null)
  23.         setValue(JSON.parse(data))
  24.     }, [setValue]);
  25.  
  26.     useEffect(()=>{
  27.         expandInput && input?.focus();
  28.     }, [expandInput]);
  29.  
  30.     const searchHandler = (e: React.ChangeEvent<HTMLInputElement>) => {      
  31.         setValue(e.target.value);
  32.         window.localStorage.setItem('SAVE_SEARCH', JSON.stringify(e.target.value));      
  33.     }
  34.  
  35.     useOnClickOutside(ref, () => value === "" && setExpandInput(false));
  36.  
  37.  
  38.     return(
  39.         <SearchWrapper expandInput={expandInput} ref={ref}>
  40.             <input ref={inputEl => setInput(inputEl)} type="text" onChange={(e) => searchHandler(e)} value={value} placeholder={placeholder} />
  41.             { (expandInput && (value.length > 0)) && <i className="ico-Exit" onClick={()=> setValue("")} ></i>}
  42.             <button className="search-button" onClick={() => setExpandInput(true)}>
  43.                 <i className="ico-Search"></i>
  44.             </button>
  45.         </SearchWrapper>
  46.     )
  47. }
  48.  
  49. export default Search;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement