Search.jsx 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import './css/Search.css'
  2. import Sidebar from './Components/Sidebar'
  3. import { default as axios } from 'axios'
  4. import Cookies from 'js-cookie'
  5. import SearchIcon from './icons/SearchIcon'
  6. import VideoSearchResult from './Components/VideoSearchResult'
  7. import { config } from './main'
  8. import React, { useRef } from 'react'
  9. import { createRoot } from 'react-dom/client';
  10. let searchResults;
  11. let searched;
  12. let searchResultsRef;
  13. let searchStatusRef;
  14. async function search2() {
  15. const searchBar = document.getElementById("search-bar");
  16. if(searchBar.value.trim() != "") {
  17. if(!searched) searchResults = createRoot(searchResultsRef.current);
  18. if(searched) { searchResults.unmount(); searchResults = createRoot(searchResultsRef.current); }
  19. searched = true;
  20. searchStatusRef.current.innerText = "searching!!";
  21. const response = await axios.post(`${config.serverURL}/video/search`, {
  22. "query": searchBar.value
  23. })
  24. if(!response.error) {
  25. if(response.data.length === 0) {
  26. return searchStatusRef.current.innerText = "no results :(";
  27. }
  28. response.data.forEach(video => {
  29. console.log(video)
  30. searchResults.render(<VideoSearchResult
  31. id={video.id}
  32. title={video.title}
  33. author={video.author.username}
  34. likes={video.likes}
  35. dislikes={video.dislikes}
  36. comments={video.comments}
  37. shares={video.shares}
  38. />)
  39. })
  40. } else {
  41. searchStatusRef.current.innerText = `search error: ${response.error}`;
  42. }
  43. } else {
  44. searchStatusRef.current.innerText = `no`;
  45. }
  46. }
  47. function Search() {
  48. searchResultsRef = useRef(null);
  49. searchStatusRef = useRef(null);
  50. return (
  51. <>
  52. <div className="main">
  53. <Sidebar />
  54. <div className="search-container">
  55. <div className="search-bar-container">
  56. <button className="search-button" onClick={() => {search2(searchResults)}}>
  57. <SearchIcon size={50} />
  58. </button>
  59. <input type="text" placeholder="Search" className="search-bar" id="search-bar" />
  60. </div>
  61. <div className="search-results" id="search-results" ref={searchResultsRef}>
  62. <div className="search-status" ref={searchStatusRef}>
  63. </div>
  64. </div>
  65. </div>
  66. </div>
  67. </>
  68. )
  69. }
  70. export default Search