source: frontend/src/pages/AllUsers.tsx@ 16aed54

main
Last change on this file since 16aed54 was 4e5cf92, checked in by Filip Gavrilovski <filipgavrilovski28@…>, 6 months ago

refactor frontend file structure

  • Property mode set to 100644
File size: 2.3 KB
Line 
1import React, { useEffect, useState } from "react";
2import { useNavigate } from "react-router-dom";
3import axiosInstance from "../api/axiosInstance";
4
5interface User {
6 id: number;
7 username: string;
8 fullName: string;
9}
10
11const 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();
16
17 useEffect(() => {
18 const fetchUsers = async () => {
19 const response = axiosInstance.get("/users/all");
20 setUsers((await response).data);
21 };
22 fetchUsers();
23 }, []);
24
25 const handleUserClick = (userId: number) => {
26 navigate(`/users/${userId}`);
27 };
28
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 };
41
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 }
51
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 <input
57 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 <button
64 type="submit"
65 className="bg-blue-600 text-white px-6 py-2 rounded hover:bg-blue-700 transition-colors"
66 >
67 Search
68 </button>
69 </form>
70
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 );
86};
87
88export default AllUsers;
Note: See TracBrowser for help on using the repository browser.