@@ -2,10 +2,9 @@ import { Suspense, useEffect, useState } from "react";
22import { User } from "../../models/User" ;
33import { Content } from "../../models/Content" ;
44import { useSearchParams } from "react-router-dom" ;
5- import axios from "axios" ;
6- import { apiURL } from "../../scripts/api" ;
75import ContentSearchResult from "./ContentSearchResult" ;
86import UserSearchResults from "./UserSearchResult" ;
7+ import { SearchService } from "../../services/SearchService" ;
98
109function SearchListContent ( {
1110 userSearchResults,
@@ -20,14 +19,15 @@ function SearchListContent({
2019
2120 // Retrieve the search text from the url.
2221 const [ searchParams ] = useSearchParams ( ) ;
23- const param = searchParams . get ( "query" ) ;
22+ const query = searchParams . get ( "query" ) ;
23+
2424 const [ usersReturned , setUsersReturned ] = useState < User [ ] > ( [ ] ) ;
2525 const [ userDisabled , setUserDisabled ] = useState ( true ) ;
26- const [ contentReturned , setContentReturned ] = useState < Content [ ] > ( [ ] ) ;
27-
2826 const [ userStartingPoint , setUserStartingPoint ] = useState < string | null > (
2927 null
3028 ) ;
29+
30+ const [ contentReturned , setContentReturned ] = useState < Content [ ] > ( [ ] ) ;
3131 // const [contentStartingPoint, setContentStartingPoint] = useState<
3232 // string | null
3333 // >(null);
@@ -44,75 +44,71 @@ function SearchListContent({
4444 useEffect ( ( ) => {
4545 if ( userSearchResults ) {
4646 setUsersReturned ( userSearchResults ) ;
47- } else if ( param ) {
47+ } else if ( query ) {
4848 fetchUserData ( ) ;
4949 }
5050
5151 if ( contentSearchResults ) {
5252 setContentReturned ( contentSearchResults ) ;
53- } else if ( param ) {
53+ } else if ( query ) {
5454 fetchContentData ( ) ;
5555 }
56- } , [ userSearchResults , contentSearchResults , param ] ) ;
56+ } , [ userSearchResults , contentSearchResults , query ] ) ;
5757
5858 /**
5959 * fetchUserData() -> void
6060 *
6161 * @description
62- *Send a get request to the api endpoint for searching for users.
62+ * Sends a GET request to the API endpoint for searching users.
6363 *
6464 * @returns void
6565 */
6666 const fetchUserData = async ( ) => {
67- if ( ! param ) {
68- return ;
69- }
67+ if ( ! query ) return ;
7068
7169 if ( fetching ) {
72- alert ( "Already Fetching!!!! " ) ;
70+ alert ( "Already Fetching!" ) ;
7371 return ;
7472 }
73+
7574 setFetching ( true ) ;
7675
77- try {
78- const response = await axios . get ( `${ apiURL } /search/users/` , {
79- params : {
80- searchText : param ,
81- userStartingPoint : userStartingPoint ,
82- } ,
83- } ) ;
84-
85- const newDocuments = response . data . documents ;
86- // Create a set to easily check if the last query has duplicates
87- const usersSet = new Set ( usersReturned . map ( ( doc : User ) => doc . uid ) ) ;
88- // Create a get each user document id from the GET response, then check
89- // for whether at least one is not in the stored user set.
90- const uniqueDocuments = newDocuments . filter (
91- ( doc : { uid : string } ) => ! usersSet . has ( doc . uid )
92- ) ;
76+ const userSearchResults = await SearchService . searchUsers (
77+ query ,
78+ userStartingPoint
79+ ) ;
9380
94- // If there are unique documents, update the state
95- if ( uniqueDocuments . length > 0 && ! fetching ) {
96- setUsersReturned ( ( prev ) => [ ...prev , ...uniqueDocuments ] ) ;
97- // Update the starting point for the next fetch
98- setUserStartingPoint (
99- uniqueDocuments [ uniqueDocuments . length - 1 ] . usernameLower
100- ) ;
101-
102- if ( usersReturned . length < 5 ) {
103- setUserDisabled ( true ) ;
104- } else {
105- setUserDisabled ( false ) ;
106- }
107- } else {
108- // If there are no unique documents, disable the button
109- setUserDisabled ( true ) ;
110- }
111- } catch ( error ) {
112- throw new Error ( error instanceof Error ? error . message : String ( error ) ) ;
113- } finally {
81+ if ( userSearchResults instanceof Error ) {
82+ console . error ( "Error fetching user data:" , userSearchResults ) ;
11483 setFetching ( false ) ;
84+ return ;
11585 }
86+
87+ const users = userSearchResults . users || [ ] ;
88+ const existingUserIds = new Set (
89+ usersReturned . map ( ( user : User ) => user . uid )
90+ ) ;
91+
92+ // Filter out duplicate users
93+ const uniqueUsers = users . filter (
94+ ( user : { uid : string } ) => ! existingUserIds . has ( user . uid )
95+ ) ;
96+
97+ if ( uniqueUsers && uniqueUsers . length > 0 ) {
98+ setUsersReturned ( ( prev ) => [ ...prev , ...uniqueUsers ] ) ;
99+
100+ // Update the starting point for the next fetch
101+ setUserStartingPoint (
102+ uniqueUsers [ uniqueUsers . length - 1 ] ?. username . toLowerCase ( ) || null
103+ ) ;
104+
105+ // Enable or disable the "Fetch more" button based on the number of users
106+ setUserDisabled ( usersReturned . length + uniqueUsers . length < 5 ) ;
107+ } else {
108+ setUserDisabled ( true ) ; // Disable the button if no unique users are found
109+ }
110+
111+ setFetching ( false ) ;
116112 } ;
117113
118114 /**
@@ -124,56 +120,44 @@ function SearchListContent({
124120 * @returns void
125121 */
126122 const fetchContentData = async ( ) => {
127- if ( ! param ) {
123+ if ( ! query ) {
128124 return ;
129125 }
130126
131- if ( fetching ) {
132- alert ( "Already Fetching!!!!" ) ;
133- return ;
134- }
135127 setFetching ( true ) ;
136128
137- try {
138- const response = await axios . get ( `${ apiURL } /search/content/` , {
139- params : {
140- searchText : param ,
141- } ,
142- } ) ;
143-
144- // Obtain the documents from the response data.
145- const newDocuments = response . data . documents ;
146- // Create a set to easily check if the last query has duplicates
147- const contentSet = new Set (
148- contentReturned . map ( ( doc : Content ) => doc . uid )
149- ) ;
150- // Get each document id from the GET response, then check
151- // for whether at least one is not in the stored content set.
152- const uniqueDocuments = newDocuments . filter (
153- ( doc : { id : string } ) => ! contentSet . has ( doc . id )
154- ) ;
129+ const searchContentResults = await SearchService . searchContents ( query ) ;
155130
156- // If there are unique documents, update the state
157- if ( uniqueDocuments . length > 0 && ! fetching ) {
158- // Append the new data to the list of stored articles.
159- setContentReturned ( ( prev ) => [ ...prev , ...uniqueDocuments ] ) ;
160- // Update the starting point for the next fetch.
161- // setContentStartingPoint(
162- // uniqueDocuments[uniqueDocuments.length - 1].titleLower
163- // );
164- }
165- } catch ( error ) {
166- throw new Error ( error instanceof Error ? error . message : String ( error ) ) ;
167- } finally {
131+ if ( searchContentResults instanceof Error ) {
132+ console . error ( "Error fetching content data:" , searchContentResults ) ;
168133 setFetching ( false ) ;
134+ return ;
169135 }
136+
137+ const contents = searchContentResults . contents || [ ] ;
138+ const existingContentIds = new Set (
139+ contentReturned . map ( ( content : Content ) => content . uid )
140+ ) ;
141+
142+ // Filter out duplicate users
143+ const uniqueContents = contents . filter (
144+ ( content : { uid : string } ) => ! existingContentIds . has ( content . uid )
145+ ) ;
146+
147+ if ( uniqueContents && uniqueContents . length > 0 ) {
148+ setContentReturned ( ( prev ) => [ ...prev , ...uniqueContents ] ) ;
149+ } else {
150+ setUserDisabled ( true ) ; // Disable the button if no unique users are found
151+ }
152+
153+ setFetching ( false ) ;
170154 } ;
171155
172156 return (
173157 < >
174158 { /* <div className='main-content'> */ }
175159 < div className = 'searchResults' >
176- { param && < h1 > Search Results for: { param } </ h1 > }
160+ { query && < h1 > Search Results for: { query } </ h1 > }
177161 < h2 > Users</ h2 >
178162 { usersReturned ?. length === 0 ? (
179163 < p > Nothing found...</ p >
0 commit comments