diff --git a/src/pages/Volunteers/VolunteerCard.jsx b/src/pages/Volunteers/VolunteerCard.jsx
deleted file mode 100644
index f69f6df..0000000
--- a/src/pages/Volunteers/VolunteerCard.jsx
+++ /dev/null
@@ -1,78 +0,0 @@
-import React, {useState} from "react";
-import styles from "./VolunteersPage.module.css";
-import formatDate from "../../utils/date/formatDate.js";
-import { useNavigate } from "react-router";
-import Button from "../../components/ui/button/button.tsx";
-
-export default function VolunteerCard({ user }) {
-
- const [isExpanded, setIsExpanded] = useState(false);
-
- const toggleExpand = () => {
- setIsExpanded(!isExpanded);
- };
-
- const navigate = useNavigate();
-
- return (
-
setIsExpanded(!isExpanded))}>
-
-
-
- {user?.name}{" "}
- {user?.lastname}
-
-
-
-
-
-
- {!isExpanded ? (
-
-
Rôle : {user?.role}
-
Membre depuis : {user?.created_at && formatDate(user.created_at)}
-
- ) : (
-
-
-

-
-
-
-
-
Rôle : {user?.role}
-
Membre depuis : {user?.created_at && formatDate(user.created_at)}
-
-
-
-
Email : {user?.email}
- {user?.phone &&
Téléphone : {user.phone}
}
-
-
-
- )}
-
-
- {isExpanded && (
-
-
-
- )}
-
-
- );
-
-
-
-}
\ No newline at end of file
diff --git a/src/pages/Volunteers/VolunteersPage.jsx b/src/pages/Volunteers/VolunteersPage.jsx
deleted file mode 100644
index 169275a..0000000
--- a/src/pages/Volunteers/VolunteersPage.jsx
+++ /dev/null
@@ -1,53 +0,0 @@
-import { useState, useEffect } from "react";
-import styles from "./VolunteersPage.module.css";
-import VolunteerCard from "./VolunteerCard.jsx";
-import getAllUser from "../../utils/users/getAllUsers.js";
-import ToolBar from "../../components/ToolBar/ToolBar.jsx";
-import filter from "../../utils/filter.js";
-import getUserById from "../../utils/users/getUserById.js";
-
-function VolunteerPage() {
- const [filters, setFilters] = useState({
- alphabetical: "asc",
- yearOrder: "desc",
- });
- const [users, setUsers] = useState([]);
-
- useEffect(() => {
- (async () => {
- const result = await getAllUser();
-
- if (result.status !== 200 || !Array.isArray(result.data)) {
- console.error("Erreur lors du chargement des utilisateurs", result);
- return;
- }
-
- const usersData = await Promise.all(
- result.data.map(async (id) => {
- const res = await getUserById(id);
-
- if (res.status === 200) {
- return res.data;
- }
- console.warn(`Utilisateur ${id} non récupéré`, res.status);
- return null;
- })
- );
-
- setUsers(usersData.filter(Boolean));
- })();
- }, []);
-
- return (
-
-
-
- {filter(users, filters, "user").map((user, index) => (
-
- ))}
-
-
- );
-}
-
-export default VolunteerPage;
diff --git a/src/pages/Volunteers/VolunteersPage.module.css b/src/pages/Volunteers/VolunteersPage.module.css
index 6ef455b..b953cb5 100644
--- a/src/pages/Volunteers/VolunteersPage.module.css
+++ b/src/pages/Volunteers/VolunteersPage.module.css
@@ -3,33 +3,18 @@
position: relative;
padding: 10px;
}
-.userName {
- display: flex;
- gap: 5px;
- font-weight: bold;
- font-size: 1rem;
- overflow: hidden;
-}
-
-.firstName {
- white-space: nowrap;
- flex-shrink: 0;
-}
-
-.lastName {
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
- flex-shrink: 1;
- max-width: 100px;
-}
.usersList {
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: 10px;
+ display: grid;
+ gap: 16px;
+ width: 100%;
+ grid-template-columns: 1fr;
}
+
+.usersList > * {
+ min-width: 0;
+}
+
.profileboard {
width: 100%;
max-width: 380px;
@@ -140,12 +125,23 @@
}
}
+.loading {
+ width: 100%;
+ text-align: center;
+ font-size: 1.1rem;
+ opacity: 1;
+ color: white;
+}
+
@media screen and (min-width: 1024px) {
.container {
padding: 20px;
}
.usersList {
gap: 20px;
+ grid-template-columns: repeat(3, 1fr);
+ padding-right: 5em;
+ padding-left: 5em;
}
.profileboard {
max-width: 700px;
diff --git a/src/pages/Volunteers/VolunteersPage.tsx b/src/pages/Volunteers/VolunteersPage.tsx
new file mode 100644
index 0000000..869d6a5
--- /dev/null
+++ b/src/pages/Volunteers/VolunteersPage.tsx
@@ -0,0 +1,83 @@
+import { useEffect, useState } from "react";
+import styles from "./VolunteersPage.module.css";
+import VolunteerCard from "./components/VolunteersCard/VolunteerCard";
+import getAllUser from "../../utils/users/getAllUsers";
+import ToolBar from "../../components/ToolBar/ToolBar";
+import filter from "../../utils/filter";
+import getUserById from "../../utils/users/getUserById";
+import User from "./interfaces/user.interface";
+
+interface Filters {
+ alphabetical: "asc" | "desc";
+ yearOrder: "asc" | "desc";
+}
+
+const VolunteerPage: React.FC = () => {
+ const [filters, setFilters] = useState({
+ alphabetical: "asc",
+ yearOrder: "desc",
+ });
+
+ const [users, setUsers] = useState([]);
+ const [loading, setLoading] = useState(true);
+
+ useEffect(() => {
+ const fetchUsers = async (): Promise => {
+ setLoading(true);
+
+ try {
+ const result = await getAllUser();
+
+ if (result.status !== 200 || !Array.isArray(result.data)) {
+ console.error("Erreur lors du chargement des utilisateurs", result);
+ return;
+ }
+
+ const usersData = await Promise.all(
+ result.data.map(async (id: number): Promise => {
+ const res = await getUserById(id);
+
+ if (res.status === 200) {
+ return res.data as User;
+ }
+
+ console.warn(`Utilisateur ${id} non récupéré`, res.status);
+ return null;
+ })
+ );
+
+ setUsers(usersData.filter((user): user is User => user !== null));
+ } catch (error) {
+ console.error("Erreur réseau", error);
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ fetchUsers();
+ }, []);
+
+
+ return (
+
+
+
+
+ {loading ? (
+
Chargement des bénévoles…
+ ) : (
+ filter(users, filters, "user").map((user: User) => (
+
+ ))
+ )}
+
+
+
+ );
+};
+
+export default VolunteerPage;
diff --git a/src/pages/Volunteers/components/VolunteersCard/VolunteerCard.tsx b/src/pages/Volunteers/components/VolunteersCard/VolunteerCard.tsx
new file mode 100644
index 0000000..a3d5f01
--- /dev/null
+++ b/src/pages/Volunteers/components/VolunteersCard/VolunteerCard.tsx
@@ -0,0 +1,29 @@
+import styles from "./VolunteersCard.module.css";
+import { useNavigate } from "react-router";
+import Button from "../../../../components/ui/button/button";
+import User from "../../interfaces/user.interface"
+
+
+interface VolunteersCardProps {
+ user: User;
+}
+
+export default function VolunteerCard({ user }: VolunteersCardProps) {
+
+ const navigate = useNavigate();
+
+ const handleNavigate = (): void => { navigate(`/profile/${user.id}`) }
+
+ return (
+
+
+

+
{user.name} {user.lastname}
+
+
+
+ );
+}
diff --git a/src/pages/Volunteers/components/VolunteersCard/VolunteersCard.module.css b/src/pages/Volunteers/components/VolunteersCard/VolunteersCard.module.css
new file mode 100644
index 0000000..4ed1ccf
--- /dev/null
+++ b/src/pages/Volunteers/components/VolunteersCard/VolunteersCard.module.css
@@ -0,0 +1,47 @@
+.volunteerCard {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+}
+
+.header {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ min-width: 0;
+}
+
+.header p {
+ flex: 1;
+ min-width: 0;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.content {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ min-width: 0;
+}
+
+.content p {
+ flex: 1;
+ min-width: 0;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.content button {
+ flex-shrink: 0;
+}
+
+.profilePicture {
+ background-color: #1d1d1f;
+ border-radius: 20px;
+ width: 40px;
+ height: 40px;
+ flex-shrink: 0;
+}
diff --git a/src/pages/Volunteers/interfaces/task.interface.ts b/src/pages/Volunteers/interfaces/task.interface.ts
new file mode 100644
index 0000000..b6206c9
--- /dev/null
+++ b/src/pages/Volunteers/interfaces/task.interface.ts
@@ -0,0 +1,16 @@
+export default interface Task {
+ id: number;
+ name: string;
+ description: string;
+ location: string;
+ start: string;
+ end: string;
+ max_participants: number;
+ events_id: number;
+ created_at: string;
+ updated_at: string;
+ pivot: {
+ user_id: number;
+ task_id: number;
+ }
+}
\ No newline at end of file
diff --git a/src/pages/Volunteers/interfaces/user.interface.ts b/src/pages/Volunteers/interfaces/user.interface.ts
new file mode 100644
index 0000000..e22a1cd
--- /dev/null
+++ b/src/pages/Volunteers/interfaces/user.interface.ts
@@ -0,0 +1,16 @@
+import Task from "./task.interface";
+
+export default interface User {
+ id: number;
+ name: string;
+ lastname: string;
+ email: string;
+ role: string;
+ isAdmin: boolean;
+ phone: string | null;
+ created_at: string;
+ updated_at: string;
+ verified_at: string | null;
+ validate: number;
+ tasks: Task[];
+}
\ No newline at end of file
diff --git a/src/router.js b/src/router.js
index b9137b0..9d40c88 100644
--- a/src/router.js
+++ b/src/router.js
@@ -3,7 +3,7 @@ import Layout from "./layout.jsx";
import HomePage from "./pages/Home/HomePage";
import LoginPage from "./pages/Login/LoginPage";
import RegisterPage from "./pages/Register/RegisterPage.jsx";
-import VolunteersPage from "./pages/Volunteers/VolunteersPage";
+import VolunteersPage from "./pages/Volunteers/VolunteersPage.tsx";
import ProfilePage from "./pages/Profile/ProfilePage";
import EventsPage from "./pages/Events/EventsPage.jsx";
import AdminPage from "./pages/Admin/AdminPage.jsx";