validate + delete user + last event + prototype chart

This commit is contained in:
p2405951 committed 2026-01-13 11:49:11 +01:00
1 parent 263e7fea46
commit b0f0aec16e
7 files changed
+194 -233

No files matched your search

+47 -123
View File
@@ -1,94 +1,8 @@
/*import React, { useState, useEffect } from "react";
import Button from "../ui/button/button";
import styles from "./PendingMembers.module.css";
import getInvalidUsers from "../../utils/users/getUserToValidate";
import getUserById from "../../utils/users/getUserById";
import validateUser from "../../utils/users/validateUser";
import deleteUser from "../../utils/users/deleteUser";
function pendingMembers() {
const [pendingMembers, setPendingMembers] = useState([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
const fetchPendingMembers = async () => {
const userIds = await getInvalidUsers();
console.log("IDs reçus :", userIds);
if (userIds && userIds.length > 0) {
const usersWithDetails = await Promise.all(
userIds.map(async (id) => {
const user = await getUserById(id);
console.log("Utilisateur récupéré :", user);
return user;
})
);
console.log("Utilisateurs avec détails :", usersWithDetails);
setPendingMembers(usersWithDetails.filter(user => user !== null));
}
setLoading(false);
};
fetchPendingMembers();
}, []);
const handleReject = async (id) => {
const res = await deleteUser(id);
if (!res.ok) {
console.error(res.status, res.data);
alert(res.data?.message || "Action refusée");
return;
}
setPendingMembers(prev => prev.filter(u => u.id !== id));
};
const handleValidate = async (id) => {
const res = await validateUser(id);
if (!res.ok) {
alert(res.data?.message || "Validation refusée");
return;
}
setPendingMembers(prev => prev.filter(u => u.id !== id));
};
if (loading) {
return <div>Chargement des membres en attente...</div>;
}
return (
<div className={`${styles.rightBlock} glassCard`}>
<h2>Membres en attente de validation</h2>
<div className={styles.membersContainer}>
{pendingMembers.map((member) => (
<div key={member.id} className={`glassCard ${styles.memberCard}`}>
<p>{member.name} {member.lastname}</p>
<div className={styles.buttonGroup}>
<Button onClick={() => handleValidate(member.id)} variant="primary">
Valider
</Button>
<Button onClick={() => handleReject(member.id)} variant="danger">
Refuser
</Button>
</div>
</div>
))}
</div>
</div>
);
}
export default pendingMembers;*/
import React, { useState, useEffect } from "react";
import Button from "../ui/button/button";
import styles from "./PendingMembers.module.css";
import getInvalidUsers from "../../utils/users/getUserToValidate";
import getUserToValidate from "../../utils/users/getUserToValidate";
import getUserById from "../../utils/users/getUserById";
import validateUser from "../../utils/users/validateUser";
import deleteUser from "../../utils/users/deleteUser";
@@ -96,46 +10,62 @@ import deleteUser from "../../utils/users/deleteUser";
function PendingMembers() {
const [pendingMembers, setPendingMembers] = useState([]);
const [loading, setLoading] = useState(true);
const [actionLoading, setActionLoading] = useState(null);
const [error, setError] = useState(null);
useEffect(() => {
const fetchPendingMembers = async () => {
setLoading(true);
const userIds = await getInvalidUsers();
const userIds = await getUserToValidate();
if (userIds && userIds.length > 0) {
const users = await Promise.all(
userIds.map((id) => getUserById(id))
);
const users = await Promise.all(userIds.map((id) => getUserById(id)));
setPendingMembers(users.filter(Boolean));
} else {
setPendingMembers([]);
}
setLoading(false);
};
fetchPendingMembers();
}, []);
const handleValidate = async (id) => {
const ok = await validateUser(id);
if (!ok) return;
setPendingMembers((prev) =>
prev.filter((member) => member.id !== id)
const removeMember = (id) => {
setPendingMembers(prevMembers =>
prevMembers.filter(member => member.id !== id)
);
};
const handleValidate = async (id) => {
setActionLoading(id);
setError(null);
try {
const result = await validateUser(id);
if (result.success) {
removeMember(id);
} else {
setError(result.message || "Échec de la validation.");
}
} catch (err) {
setError("Erreur lors de la validation.");
} finally {
setActionLoading(null);
}
};
const handleReject = async (id) => {
const ok = await deleteUser(id);
if (!ok) return;
setPendingMembers((prev) =>
prev.filter((member) => member.id !== id)
);
setActionLoading(id);
setError(null);
try {
const result = await deleteUser(id);
if (result.success) {
removeMember(id);
} else {
setError(result.message || "Échec de la suppression.");
}
} catch (err) {
setError("Erreur lors de la suppression.");
} finally {
setActionLoading(null);
}
};
if (loading) {
@@ -145,34 +75,28 @@ function PendingMembers() {
return (
<div className={`${styles.rightBlock} glassCard`}>
<h2>Membres en attente de validation</h2>
{error && <p style={{ color: "red" }}>{error}</p>}
<div className={styles.membersContainer}>
{pendingMembers.length === 0 && (
<p>Aucun membre en attente</p>
)}
{pendingMembers.length === 0 && <p>Aucun membre en attente</p>}
{pendingMembers.map((member) => (
<div
key={member.id}
className={`glassCard ${styles.memberCard}`}
>
<p>
{member.name} {member.lastname}
</p>
<div key={member.id} className={`glassCard ${styles.memberCard}`}>
<p>{member.name} {member.lastname}</p>
<div className={styles.buttonGroup}>
<Button
onClick={() => handleValidate(member.id)}
variant="primary"
disabled={actionLoading === member.id}
>
Valider
{actionLoading === member.id ? "En cours..." : "Valider"}
</Button>
<Button
onClick={() => handleReject(member.id)}
variant="danger"
disabled={actionLoading === member.id}
>
Refuser
{actionLoading === member.id ? "En cours..." : "Refuser"}
</Button>
</div>
</div>