Changeset 0792d02 for frontend/src/pages
- Timestamp:
- 02/05/26 10:29:09 (5 months ago)
- Branches:
- main
- Children:
- 3de009b
- Parents:
- d2af1a6
- Location:
- frontend/src/pages
- Files:
-
- 2 edited
-
AllUsers.tsx (modified) (1 diff)
-
UserDetail.tsx (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
frontend/src/pages/AllUsers.tsx
rd2af1a6 r0792d02 4 4 5 5 interface User { 6 id: number; 7 username: string; 8 fullName: string; 6 username: string; 7 fullName: string; 9 8 } 10 9 11 10 const AllUsers = () => { 12 const [users, setUsers] = useState<User[]>([]);13 const [searchedUser, setSearchedUser] = useState<string>("");14 const [error, setError] = useState<string | null>(null);15 const navigate = useNavigate();11 const [users, setUsers] = useState<User[]>([]); 12 const [searchedUser, setSearchedUser] = useState<string>(""); 13 const [error, setError] = useState<string | null>(null); 14 const navigate = useNavigate(); 16 15 17 useEffect(() => {18 const fetchUsers = async () => {19 const response = axiosInstance.get("/users/all");20 setUsers((await response).data);21 };22 fetchUsers();23 }, []);16 useEffect(() => { 17 const fetchUsers = async () => { 18 const response = axiosInstance.get("/users/all"); 19 setUsers((await response).data); 20 }; 21 fetchUsers(); 22 }, []); 24 23 25 const handleUserClick = (userId: number) => {26 navigate(`/users/${userId}`);27 };24 const handleUserClick = (username: string) => { 25 navigate(`/users/${username}`); 26 }; 28 27 29 const handleSearch = async (e: React.FormEvent) => {30 e.preventDefault();31 try {32 const response = await axiosInstance.get(`/users/search`, {33 params: { name: searchedUser },34 });35 setUsers(response.data);36 } catch (err: any) {37 const errorMessage = err.response?.data?.error || "Search failed";38 setError(errorMessage);39 }40 };28 const handleSearch = async (e: React.FormEvent) => { 29 e.preventDefault(); 30 try { 31 const response = await axiosInstance.get(`/users/search`, { 32 params: { name: searchedUser }, 33 }); 34 setUsers(response.data); 35 } catch (err: any) { 36 const errorMessage = err.response?.data?.error || "Search failed"; 37 setError(errorMessage); 38 } 39 }; 41 40 42 if (users.length == 0) return <div className="p-6">Loading...</div>;43 if (error) {44 return (45 <div className="p-6 bg-red-50 border border-red-200 text-red-700 rounded-lg">46 <h2 className="font-bold">Error</h2>47 <p>{error}</p>48 </div>49 );50 }41 if (users.length == 0) return <div className="p-6">Loading...</div>; 42 if (error) { 43 return ( 44 <div className="p-6 bg-red-50 border border-red-200 text-red-700 rounded-lg"> 45 <h2 className="font-bold">Error</h2> 46 <p>{error}</p> 47 </div> 48 ); 49 } 51 50 52 return (53 <div className="container mx-auto p-6">54 <h1 className="text-3xl font-bold mb-6">All Users</h1>55 <form onSubmit={handleSearch} className="flex gap-2 mb-10">56 <input57 type="text"58 value={searchedUser}59 onChange={(e) => setSearchedUser(e.target.value)}60 className="border p-2 rounded w-full"61 placeholder="Search for a user..."62 />63 <button64 type="submit"65 className="bg-blue-600 text-white px-6 py-2 rounded hover:bg-blue-700 transition-colors"66 >67 Search68 </button>69 </form>51 return ( 52 <div className="container mx-auto p-6"> 53 <h1 className="text-3xl font-bold mb-6">All Users</h1> 54 <form onSubmit={handleSearch} className="flex gap-2 mb-10"> 55 <input 56 type="text" 57 value={searchedUser} 58 onChange={(e) => setSearchedUser(e.target.value)} 59 className="border p-2 rounded w-full" 60 placeholder="Search for a user..." 61 /> 62 <button 63 type="submit" 64 className="bg-blue-600 text-white px-6 py-2 rounded hover:bg-blue-700 transition-colors" 65 > 66 Search 67 </button> 68 </form> 70 69 71 <div className="grid gap-4"> 72 {users.map((u) => ( 73 <div 74 key={u.id} 75 onClick={() => handleUserClick(u.id)} 76 className="bg-white shadow-md rounded-lg p-4 hover:shadow-lg hover:bg-gray-50 cursor-pointer transition-all" 77 > 78 <h2 className="text-xl font-semibold">{u.fullName}</h2> 79 <p className="text-gray-600">@{u.username}</p> 80 <p className="text-gray-600">{u.id}</p> 81 </div> 82 ))} 83 </div> 84 </div> 85 ); 70 <div className="grid gap-4"> 71 {users.map((u) => ( 72 <div 73 key={u.username} 74 onClick={() => handleUserClick(u.username)} 75 className="bg-white shadow-md rounded-lg p-4 hover:shadow-lg hover:bg-gray-50 cursor-pointer transition-all" 76 > 77 <h2 className="text-xl font-semibold">{u.fullName}</h2> 78 <p className="text-gray-600">@{u.username}</p> 79 </div> 80 ))} 81 </div> 82 </div> 83 ); 86 84 }; 87 85 -
frontend/src/pages/UserDetail.tsx
rd2af1a6 r0792d02 27 27 likedEntities: MusicalEntity[]; 28 28 createdPlaylists: Playlist[]; 29 savedPlaylists: Playlist[]; 29 30 } 30 31 … … 34 35 // user refers to the selected user NOT to the user from context 35 36 const baseURL = import.meta.env.VITE_API_BASE_URL; 36 const { user Id} = useParams();37 const { username } = useParams(); 37 38 const navigate = useNavigate(); 38 39 const [user, setUser] = useState<UserProfile | null>(null); … … 50 51 try { 51 52 const response = await axiosInstance.post<FollowStatus>( 52 `/users/${user Id}/follow`,53 `/users/${username}/follow`, 53 54 ); 54 55 setUser((prev) => { … … 68 69 }; 69 70 70 const handleFollowInModal = async (target Id: number) => {71 const handleFollowInModal = async (targetUsername: string) => { 71 72 try { 72 73 const response = await axiosInstance.post<FollowStatus>( 73 `/users/${ targetId}/follow`,74 `/users/${username}/follow`, 74 75 ); 75 76 76 77 setModalUsers((prevUsers) => 77 78 prevUsers.map((u) => 78 u. id === targetId79 u.username === targetUsername 79 80 ? { ...u, isFollowedByCurrentUser: response.data.isFollowing } 80 81 : u, … … 100 101 setIsLoadingModal(true); 101 102 try { 102 const response = await axiosInstance.get(`/users/${user Id}/followers`);103 const response = await axiosInstance.get(`/users/${username}/followers`); 103 104 setModalUsers(response.data); 104 105 setModalTitle("Followers"); … … 113 114 setIsLoadingModal(true); 114 115 try { 115 const response = await axiosInstance.get(`/users/${user Id}/following`);116 const response = await axiosInstance.get(`/users/${username}/following`); 116 117 setModalUsers(response.data); 117 118 setModalTitle("Following"); … … 128 129 setError(null); 129 130 try { 130 const response = await axiosInstance.get(`/users/${user Id}`);131 const response = await axiosInstance.get(`/users/${username}`); 131 132 console.log(response.data); 132 133 setUser(response.data); … … 136 137 }; 137 138 fetchUser(); 138 }, [user Id]);139 }, [username]); 139 140 140 141 if (error) { … … 233 234 <ListenerView 234 235 likedEntities={user.likedEntities} 235 playlists={user.createdPlaylists} 236 createdPlaylists={user.createdPlaylists} 237 savedPlaylists={user.savedPlaylists} 236 238 /> 237 239 )}
Note:
See TracChangeset
for help on using the changeset viewer.
