Create registerMember admin component
This commit is contained in:
1 parent
f6def2f817
commit
d79f9f5c84
6 files changed
+98
-10
No files matched your search
@@ -0,0 +1,4 @@
|
|||||||
|
export default interface Response<T> {
|
||||||
|
status: number;
|
||||||
|
data: T;
|
||||||
|
}
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
import { useState, useContext } from "react";
|
import { useContext } from "react";
|
||||||
import styles from "./AdminPage.module.css";
|
import styles from "./AdminPage.module.css";
|
||||||
import ParticipationChart from "./components/chart/ParticipationChart.jsx";
|
|
||||||
import IncompleteEvents from "./components/IncompleteEvent/IncompleteEvent.jsx";
|
import IncompleteEvents from "./components/IncompleteEvent/IncompleteEvent.jsx";
|
||||||
import PendingMembers from "./components/pendingMembers/PendingMembers.jsx";
|
import PendingMembers from "./components/pendingMembers/PendingMembers.jsx";
|
||||||
import { AuthContext } from "../../contexts/auth/AuthContext.js";
|
import { AuthContext } from "../../contexts/auth/AuthContext.js";
|
||||||
import { useNavigate } from "react-router";
|
import { useNavigate } from "react-router";
|
||||||
|
import RegisterMember from "./components/registerMember/registerMember.tsx";
|
||||||
|
|
||||||
|
|
||||||
function AdminPage() {
|
function AdminPage() {
|
||||||
@@ -12,18 +12,11 @@ function AdminPage() {
|
|||||||
const { user } = useContext(AuthContext);
|
const { user } = useContext(AuthContext);
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
const [selected, setSelected] = useState("3");
|
|
||||||
const [participationRate] = useState(89);
|
|
||||||
|
|
||||||
if(!user.isAdmin) navigate("/");
|
if(!user.isAdmin) navigate("/");
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={styles.container}>
|
<div className={styles.container}>
|
||||||
<ParticipationChart
|
<RegisterMember />
|
||||||
selected={selected}
|
|
||||||
setSelected={setSelected}
|
|
||||||
participationRate={participationRate}
|
|
||||||
/>
|
|
||||||
<div className={styles.rightSection}>
|
<div className={styles.rightSection}>
|
||||||
<IncompleteEvents />
|
<IncompleteEvents />
|
||||||
<PendingMembers />
|
<PendingMembers />
|
||||||
|
|||||||
@@ -0,0 +1,27 @@
|
|||||||
|
.leftBlock {
|
||||||
|
width: 40%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
height: 100%;
|
||||||
|
min-height: calc(100vh - 260px);
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 20px;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.registerMemberHeader {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 100%;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.registerForm {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 10px;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
import React, { useState } from "react"
|
||||||
|
import styles from "./registerMember.module.css"
|
||||||
|
import TextInput from "../../../../components/ui/input/input"
|
||||||
|
import Button from "../../../../components/ui/button/button";
|
||||||
|
import Response from "../../../../interfaces/response.interface";
|
||||||
|
import ResponseData from "./responseData.inteface";
|
||||||
|
import adminCreateUser from "../../../../utils/users/adminCreateUser";
|
||||||
|
|
||||||
|
|
||||||
|
const RegisterMember: React.FC = () => {
|
||||||
|
|
||||||
|
const [name, setName] = useState<string>("");
|
||||||
|
const [lastname, setLastName] = useState<string>("");
|
||||||
|
const [email, setEmail] = useState<string>("");
|
||||||
|
const [phone, setPhone] = useState<string>("");
|
||||||
|
const [password, setPassword] = useState<string>("");
|
||||||
|
|
||||||
|
|
||||||
|
const handleCreate = async (): Promise<void> => {
|
||||||
|
|
||||||
|
if(name !== "" || lastname !== "" || email !== "" || phone !== "" ) {
|
||||||
|
const response: Response<ResponseData> = await adminCreateUser(email, name, lastname, phone);
|
||||||
|
if(response.status === 200) setPassword(response.data.password);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return <div className={`${styles.leftBlock} glassCard`}>
|
||||||
|
<div className={styles.registerMemberHeader}>
|
||||||
|
<h2>Enregister un bénévole</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className={styles.registerForm}>
|
||||||
|
<TextInput placeholder={"Prenom"} type={"text"} value={name} onChange={e => setName(e.target.value)} />
|
||||||
|
<TextInput placeholder={"Nom"} type={"text"} value={lastname} onChange={e => setLastName(e.target.value)} />
|
||||||
|
<TextInput placeholder={"Adresse Email"} type={"text"} value={email} onChange={e => setEmail(e.target.value)} />
|
||||||
|
<TextInput placeholder={"Numéro de téléphone"} type={"text"} value={phone} onChange={e => setPhone(e.target.value)} />
|
||||||
|
|
||||||
|
<p>{password !== "" && `Mot de passe: ${password}`}</p>
|
||||||
|
|
||||||
|
<Button variant={"default"} onClick={handleCreate}>Enregistrer</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
export default RegisterMember
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
export default interface ResponseData {
|
||||||
|
message: string;
|
||||||
|
password: string;
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
import fetchWrapper from "../fetchWrapper.js";
|
||||||
|
import getXSRFToken from "../getXSRF.js";
|
||||||
|
import Response from "../../interfaces/response.interface";
|
||||||
|
|
||||||
|
export default async function adminCreateUser(email: string, name: string, lastname: string, phone: string): Promise<Response> {
|
||||||
|
const csrfToken = await getXSRFToken();
|
||||||
|
|
||||||
|
return fetchWrapper(
|
||||||
|
"/api/users/create",
|
||||||
|
{ email, name, lastname, phone },
|
||||||
|
"POST",
|
||||||
|
{ "X-XSRF-TOKEN": csrfToken }
|
||||||
|
);
|
||||||
|
}
|
||||||
Reference in new issue
Block a user