source: frontend/src/components/userProfile/AllUsersHelper.tsx@ 0f71490

main
Last change on this file since 0f71490 was 0f71490, checked in by Dimitar Arsov <dimitararsov04@…>, 6 months ago

show follow/following button

  • Property mode set to 100644
File size: 2.5 KB
Line 
1import React, { useEffect, useState } from "react";
2import { useNavigate } from "react-router-dom";
3import axiosInstance from "../../api/axiosInstance";
4interface User {
5 id: number;
6 username: string;
7 fullName: string;
8}
9
10const AllUsers = () => {
11 const [users, setUsers] = useState<User[]>([]);
12 const [searchedUser, setSearchedUser] = useState<string>("");
13 const [error, setError] = useState<string | null>(null);
14 const navigate = useNavigate();
15
16 useEffect(() => {
17 const fetchUsers = async () => {
18 const response = axiosInstance.get("/users/all");
19 setUsers((await response).data);
20 };
21 fetchUsers();
22 }, []);
23
24 const handleUserClick = (userId: number) => {
25 navigate(`/users/${userId}`);
26 };
27
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 };
40
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 }
50
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>
69
70 <div className="grid gap-4">
71 {users.map((u) => (
72 <div
73 key={u.id}
74 onClick={() => handleUserClick(u.id)}
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 <p className="text-gray-600">{u.id}</p>
80 </div>
81 ))}
82 </div>
83 </div>
84 );
85};
86
87export default AllUsers;
Note: See TracBrowser for help on using the repository browser.