source: frontend/src/pages/AllUsers.tsx@ 765e166

main
Last change on this file since 765e166 was dc30259, checked in by Filip Gavrilovski <filipgavrilovski28@…>, 5 months ago

add loading spinner; don't show sidebar for unauthenticated users

  • 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";
4import LoadingSpinner from "../components/LoadingSpinner";
5
6interface User {
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/na/all");
20 setUsers((await response).data);
21 };
22 fetchUsers();
23 }, []);
24
25 const handleUserClick = (username: string) => {
26 navigate(`/users/${username}`);
27 };
28
29 const handleSearch = async (e: React.FormEvent) => {
30 e.preventDefault();
31 try {
32 const response = await axiosInstance.get(`/users/na/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) {
43 return <LoadingSpinner />;
44 }
45 if (error) {
46 return (
47 <div className="p-6 bg-red-50 border border-red-200 text-red-700 rounded-lg">
48 <h2 className="font-bold">Error</h2>
49 <p>{error}</p>
50 </div>
51 );
52 }
53
54 return (
55 <div className="container mx-auto p-6">
56 <h1 className="text-3xl font-bold mb-6">All Users</h1>
57 <form onSubmit={handleSearch} className="flex gap-2 mb-10">
58 <input
59 type="text"
60 value={searchedUser}
61 onChange={(e) => setSearchedUser(e.target.value)}
62 className="border p-2 rounded w-full"
63 placeholder="Search for a user..."
64 />
65 <button
66 type="submit"
67 className="bg-blue-600 text-white px-6 py-2 rounded hover:bg-blue-700 transition-colors"
68 >
69 Search
70 </button>
71 </form>
72
73 <div className="grid gap-4">
74 {users.map((u) => (
75 <div
76 key={u.username}
77 onClick={() => handleUserClick(u.username)}
78 className="bg-white shadow-md rounded-lg p-4 hover:shadow-lg hover:bg-gray-50 cursor-pointer transition-all"
79 >
80 <h2 className="text-xl font-semibold">{u.fullName}</h2>
81 <p className="text-gray-600">@{u.username}</p>
82 </div>
83 ))}
84 </div>
85 </div>
86 );
87};
88
89export default AllUsers;
Note: See TracBrowser for help on using the repository browser.