Search.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import { connect } from "react-redux";
  2. import { CTracks } from "../components/Playlist/SearchTracks";
  3. import { PlayerHeader } from "../components/Playlist/PlayerHeader";
  4. import { useState } from "react";
  5. import { CPreloader } from "../components/Other/Preloader";
  6. import { actionSearch, actionSetSearch } from "../actions/types";
  7. const SearchField = connect(null, {
  8. onChangeSearch: actionSearch,
  9. setSearch: actionSetSearch,
  10. })(({ onChangeSearch, setSearch }) => {
  11. const [text, setText] = useState("");
  12. return (
  13. <div className="input-group mb-3">
  14. <input
  15. type="text"
  16. className="form-control"
  17. placeholder="Поиск по всей музыке"
  18. aria-label="Поиск"
  19. aria-describedby="basic-addon2"
  20. onFocus={() => {
  21. setSearch(true);
  22. }}
  23. onChange={(e) => {
  24. setText(e.target.value);
  25. onChangeSearch(text);
  26. }}
  27. value={text}
  28. />
  29. <div className="input-group-append">
  30. <button
  31. className="btn btn-dark"
  32. type="button"
  33. onClick={() => {
  34. setSearch(false);
  35. setText("");
  36. }}
  37. >
  38. Отменить
  39. </button>
  40. </div>
  41. </div>
  42. );
  43. });
  44. const SearchResult = ({ promise, search }) =>
  45. search?.searchResult?.payload?.payload?.length !== 0 ? (
  46. <>
  47. <PlayerHeader />
  48. <CTracks tracks={search?.searchResult?.payload?.payload} search />
  49. </>
  50. ) : (
  51. <h2 className="mt-5 text-center">
  52. {promise?.myUser?.payload?.nick ? promise?.myUser?.payload?.nick : "user"}
  53. , по вашему запросу ничего не было найдено.
  54. </h2>
  55. );
  56. const CSearchResult = connect(
  57. (state) => ({ promise: state.promise, search: state.search }),
  58. null
  59. )(SearchResult);
  60. const Search = ({ search, promise, loadedTracks }) => {
  61. return (
  62. <div>
  63. <div className="d-block mx-auto mt-2 container w-50">
  64. <h1 className="text-center">Поиск по сайту</h1>
  65. <SearchField />
  66. {search?.setSearch ? (
  67. <CSearchResult />
  68. ) : loadedTracks?.loadedTracks?.length !== 0 ? (
  69. <div>
  70. <PlayerHeader />
  71. <CPreloader
  72. promiseName={"tracks"}
  73. promiseState={promise}
  74. children={<CTracks tracks={loadedTracks?.loadedTracks} />}
  75. />
  76. </div>
  77. ) : (
  78. <h2 className="mt-5 text-center">
  79. {promise?.myUser?.payload?.nick
  80. ? promise?.myUser?.payload?.nick
  81. : "user"}
  82. , по запросу не было найдено треков.
  83. </h2>
  84. )}
  85. </div>
  86. <div className="container" style={{ height: "300px" }}></div>
  87. </div>
  88. );
  89. };
  90. export const CSearch = connect(
  91. (state) => ({
  92. search: state.search,
  93. promise: state.promise,
  94. loadedTracks: state.loadedTracks,
  95. }),
  96. null
  97. )(Search);