validate + delete user + last event + prototype chart
This commit is contained in:
1 parent
263e7fea46
commit
b0f0aec16e
7 files changed
+194
-233
No files matched your search
@@ -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>
|
||||
|
||||
Reference in new issue
Block a user