tracking-code-which-will-go-to-the-HEAD FLAMEAL Documentation client/src/components/SearchTransaction/SearchTransaction.js

Source

client/src/components/SearchTransaction/SearchTransaction.js

  1. import React, { useEffect, useState } from "react";
  2. import "./Searchtransaction.css";
  3. import { RiSearchEyeLine } from "react-icons/ri";
  4. import GridLoader from "react-spinners/GridLoader";
  5. import useSearch from "./useSearch";
  6. import TransItem from "../TransactionItem/TransItem";
  7. import validateSearch from "./validateSearch";
  8. /**
  9. * The component that handles the search transaction feature using the {@link useSearch} function,
  10. * the input is validated using the {@link validateSearch}
  11. * function and the results are displayed using the {@link TransItem} component.
  12. *
  13. * TODO: Make the search more efficient (Lazy loading, infinite scroll or any other better way)
  14. * @category Search Transactions
  15. * @component
  16. * @returns {ReactComponent} the search transaction component
  17. */
  18. const SearchTransaction = () => {
  19. const [searchValue, setSearchValue] = useState("");
  20. const [storeSearch, setStoreSearch] = useState("");
  21. const [error, setError] = useState("");
  22. const { handleSearch, results, isFetching, found } = useSearch(error);
  23. return (
  24. <>
  25. <div className="search-trans-container">
  26. <h1>Search Transactions</h1>
  27. <div className="search-container">
  28. <input
  29. value={searchValue}
  30. onChange={(e) => {
  31. setSearchValue(e.target.value);
  32. setError(validateSearch(e.target.value));
  33. }}
  34. onClick={() => {
  35. setSearchValue("");
  36. }}
  37. className="search-input"
  38. placeholder="Sender or Receiver address"
  39. />
  40. <button
  41. className="search-button"
  42. onClick={() => {
  43. setStoreSearch(searchValue);
  44. handleSearch(searchValue);
  45. }}
  46. >
  47. <RiSearchEyeLine className="search-icon" />
  48. </button>
  49. </div>
  50. <div className="error">{error && <p>{error}</p>}</div>
  51. <div className="error">{!found && <p>Address not found</p>}</div>
  52. {isFetching && (
  53. <div className="loader">
  54. <GridLoader color={"#fff"} size={"30px"} />
  55. </div>
  56. )}
  57. <div className="search-results">
  58. {results.map((result, index) => (
  59. <div key={index * 123123}>
  60. <TransItem result={result} index={index} searched={storeSearch} />
  61. </div>
  62. ))}
  63. </div>
  64. </div>
  65. </>
  66. );
  67. };
  68. export default SearchTransaction;