searchPage.js 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import { faCompactDisc, faSearch } from "@fortawesome/free-solid-svg-icons"
  2. import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"
  3. import { useEffect, useState } from "react"
  4. import { Button, Form, InputGroup } from "react-bootstrap"
  5. import { actionSearch } from "../store/promiseReducer"
  6. import { store } from "../store/store"
  7. import { PlaylistsAll } from "../components/Playlist";
  8. import { TracksAll } from "../components/Tracks";
  9. import { connect } from "react-redux"
  10. import { Link } from "react-router-dom"
  11. export const SearchPage = ({albums, tracks, artists}) => {
  12. const getAnswer = () => {
  13. store.dispatch(actionSearch(''));
  14. };
  15. useEffect(() => {
  16. getAnswer();
  17. }, []);
  18. return(
  19. <>
  20. <Form>
  21. <InputGroup className="mb-3">
  22. <Form.Control
  23. name="search"
  24. placeholder="Search"
  25. aria-label="Recipient's username"
  26. aria-describedby="basic-addon2"
  27. onKeyUp={(e) => {
  28. setTimeout(() => store.dispatch(actionSearch(e.target.value)), 300)
  29. }}
  30. />
  31. <Button variant="light" id="button-addon2" type="submit">
  32. <FontAwesomeIcon icon={faSearch}/>
  33. </Button>
  34. </InputGroup>
  35. </Form>
  36. {(albums.length !== 0) && <><div className="d-flex justify-content-between align-items-center py-3">
  37. <h3 className="text-uppercase"> <FontAwesomeIcon icon={faCompactDisc} className="me-2"/>Albums</h3>
  38. </div>
  39. <CSearchAlbums/></>}
  40. {(tracks.length !== 0) && <><div className="d-flex justify-content-between align-items-center py-3">
  41. <h3 className="text-uppercase"> <FontAwesomeIcon icon={faCompactDisc} className="me-2"/>Tracks</h3>
  42. </div>
  43. <CSearchTracks/></>}
  44. <Artists artists={artists}/>
  45. </>
  46. )
  47. }
  48. const CSearchAlbums = connect(state => ({playlists: state.promise?.searchResult?.payload?.albums|| []} ), )(PlaylistsAll);
  49. const CSearchTracks = connect(state => ({tracks: state.promise?.searchResult?.payload?.tracks || [],
  50. playlist: state.promise.searchResult?.payload || {},} ), )(TracksAll);
  51. export const CSearchPage = connect(state => ({tracks: state.promise?.searchResult?.payload?.tracks || [],
  52. albums: state.promise.searchResult?.payload?.albums || [],
  53. artists: state.promise.searchResult?.payload?.artists || []} ), )(SearchPage);
  54. const Artist = ({artist}) => {
  55. return(
  56. <>
  57. <div className=" playlist-img-box me-2 mb-2 rounded-circle position-relative d-flex justify-content-center align-items-center"
  58. style={{backgroundImage: `url(${"https://www.pngitem.com/pimgs/m/427-4279206_title-detail-mexican-musician-logo-hd-png-download.png"})`, backgroundSize: "cover", backgroundRepeat: "no-repeat", backgroundPosition: "center", width:250, height:250}}
  59. >
  60. <div className="playlist-grey-box"></div>
  61. <Link to={`/artists/${artist?.id}`} className="artist-search-name text-white text-decoration-none">{artist?.name}</Link>
  62. </div>
  63. </>
  64. )
  65. }
  66. const Artists = ({artists}) =>
  67. <div className="d-flex flex-wrap">
  68. {artists.map((artist, i) => <Artist key={i} artist={artist}/>)}
  69. </div>