diff --git a/src/components/Filter/Filter.jsx b/src/components/Filter/Filter.jsx
index d323cc9..eb0bf87 100644
--- a/src/components/Filter/Filter.jsx
+++ b/src/components/Filter/Filter.jsx
@@ -1,5 +1,5 @@
import styles from "./Filter.module.css";
-import Button from "../ui/button/button.jsx"
+import Button from "../ui/button/button.tsx"
function Filter({isFilterVisible, filters, setFilters}){
const setAlphabeticalOrder = (order) => {
diff --git a/src/components/Footer/Footer.jsx b/src/components/Footer/Footer.jsx
index 068f976..d5ded57 100644
--- a/src/components/Footer/Footer.jsx
+++ b/src/components/Footer/Footer.jsx
@@ -1,8 +1,8 @@
import styles from "./Footer.module.css"
import {Link} from "react-router";
import {useState} from "react";
-import Modal from "../ui/modal/modal.jsx";
-import Button from "../ui/button/button.jsx";
+import Modal from "../ui/modal/modal.tsx";
+import Button from "../ui/button/button.tsx";
import scrollToTop from "../../utils/scrollToTop.js";
export default function Footer(){
diff --git a/src/components/ToolBar/ToolBar.jsx b/src/components/ToolBar/ToolBar.jsx
index 2b90746..874fa70 100644
--- a/src/components/ToolBar/ToolBar.jsx
+++ b/src/components/ToolBar/ToolBar.jsx
@@ -3,7 +3,7 @@ import Filter from "../Filter/Filter.jsx";
import {useContext, useEffect, useState} from "react";
import SearchBar from "../SearchBar/SearchBar.jsx";
import CreateEventBtn from "../createEventBtn/CreateEventBtn.jsx";
-import Button from "../ui/button/button.jsx";
+import Button from "../ui/button/button.tsx";
import {AuthContext} from "../../contexts/auth/AuthContext.js";
function ToolBar({setFilters, filters, showCreate = true}) {
diff --git a/src/components/createEventBtn/CreateEventBtn.jsx b/src/components/createEventBtn/CreateEventBtn.jsx
index 18877cd..019b836 100644
--- a/src/components/createEventBtn/CreateEventBtn.jsx
+++ b/src/components/createEventBtn/CreateEventBtn.jsx
@@ -1,8 +1,8 @@
import styles from "./createEventBtn.module.css"
import { useState, useContext } from "react";
-import Modal from "../ui/modal/modal.jsx";
-import Button from "../ui/button/button.jsx";
-import TextInput from "../ui/input/input.jsx";
+import Modal from "../ui/modal/modal.tsx";
+import Button from "../ui/button/button.tsx";
+import TextInput from "../ui/input/input.tsx";
import { EventContext } from "../../contexts/events/EventContext.js";
diff --git a/src/components/ui/button/button.jsx b/src/components/ui/button/button.jsx
deleted file mode 100644
index 0fc74ab..0000000
--- a/src/components/ui/button/button.jsx
+++ /dev/null
@@ -1,16 +0,0 @@
-import styles from "./button.module.css";
-
-const Button = ({ children, variant = "primary", onClick, className }) => {
- let btnStyle;
-
- if (variant === "primary") btnStyle = styles.primary;
- else if (variant === "danger") btnStyle = styles.danger;
- else if(variant === "transparent") btnStyle = styles.transparent;
- else btnStyle = styles.default;
-
- return
- {children}
-
;
-};
-
-export default Button;
diff --git a/src/components/ui/button/button.tsx b/src/components/ui/button/button.tsx
new file mode 100644
index 0000000..1866c39
--- /dev/null
+++ b/src/components/ui/button/button.tsx
@@ -0,0 +1,44 @@
+import { ReactNode, MouseEventHandler } from "react";
+import styles from "./button.module.css";
+
+type ButtonVariant = "primary" | "danger" | "transparent" | "default";
+
+interface ButtonProps {
+ children: ReactNode;
+ variant?: ButtonVariant;
+ onClick?: MouseEventHandler;
+ className?: string;
+}
+
+const Button = ({
+ children,
+ variant = "primary",
+ onClick,
+ className = "",
+ }: ButtonProps) => {
+ let btnStyle: string;
+
+ if (variant === "primary") { // @ts-ignore
+ btnStyle = styles.primary;
+ }
+ else if (variant === "danger") { // @ts-ignore
+ btnStyle = styles.danger;
+ }
+ else if (variant === "transparent") { // @ts-ignore
+ btnStyle = styles.transparent;
+ }
+ else { // @ts-ignore
+ btnStyle = styles.default;
+ }
+
+ return (
+
+ {children}
+
+ );
+};
+
+export default Button;
diff --git a/src/components/ui/input/input.jsx b/src/components/ui/input/input.jsx
deleted file mode 100644
index 7713b27..0000000
--- a/src/components/ui/input/input.jsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import styles from "./input.module.css";
-import { useState } from "react";
-
-const TextInput = ({ placeholder, onChange, value, borderStyle, password, className, ...props }) => {
-
- const [showPassword, setShowPassword] = useState(false);
-
- let inputBorderStyle = styles.square;
- if (borderStyle === "square") inputBorderStyle = styles.square;
- if(borderStyle === "rounded") inputBorderStyle = styles.rounded;
-
- const toggleShowPassword = () => {
- setShowPassword(!showPassword);
- };
-
- if(password) return (
-
-
-
-
- );
-
- return
-};
-
-export default TextInput;
diff --git a/src/components/ui/input/input.tsx b/src/components/ui/input/input.tsx
new file mode 100644
index 0000000..0cc1e7f
--- /dev/null
+++ b/src/components/ui/input/input.tsx
@@ -0,0 +1,62 @@
+import styles from "./input.module.css";
+import { useState, ChangeEvent, InputHTMLAttributes } from "react";
+
+interface TextInputProps extends InputHTMLAttributes {
+ placeholder?: string;
+ value?: string;
+ onChange?: (e: ChangeEvent) => void;
+ borderStyle?: "square" | "rounded";
+ password?: boolean;
+ className?: string;
+}
+
+const TextInput = ({
+ placeholder,
+ onChange,
+ value,
+ borderStyle = "square",
+ password,
+ className = "",
+ ...props
+ }: TextInputProps) => {
+ const [showPassword, setShowPassword] = useState(false);
+
+ let inputBorderStyle = styles.square;
+ if (borderStyle === "rounded") inputBorderStyle = styles.rounded;
+
+ const toggleShowPassword = () => {
+ setShowPassword((prev) => !prev);
+ };
+
+ if (password)
+ return (
+
+
+
+
+ );
+
+ return (
+
+ );
+};
+
+export default TextInput;
diff --git a/src/components/ui/modal/modal.jsx b/src/components/ui/modal/modal.tsx
similarity index 67%
rename from src/components/ui/modal/modal.jsx
rename to src/components/ui/modal/modal.tsx
index 822398c..46db76f 100644
--- a/src/components/ui/modal/modal.jsx
+++ b/src/components/ui/modal/modal.tsx
@@ -1,16 +1,23 @@
+import { ReactNode, MouseEvent } from "react";
import { createPortal } from "react-dom";
import styles from "./modal.module.css";
-import Button from "../button/button.jsx";
+import Button from "../button/button";
-const Modal = ({ open, onClose, children, title }) => {
+interface ModalProps {
+ open: boolean;
+ onClose: () => void;
+ children: ReactNode;
+ title?: string;
+}
+const Modal = ({ open, onClose, children, title }: ModalProps) => {
if (!open) return null;
const handleOverlayClick = () => {
onClose();
};
- const handleModalClick = (e) => {
+ const handleModalClick = (e: MouseEvent) => {
e.stopPropagation();
};
diff --git a/src/components/ui/themeSwitcher/ThemeSwitcher.jsx b/src/components/ui/themeSwitcher/ThemeSwitcher.jsx
index ef3ffc6..25e0369 100644
--- a/src/components/ui/themeSwitcher/ThemeSwitcher.jsx
+++ b/src/components/ui/themeSwitcher/ThemeSwitcher.jsx
@@ -1,4 +1,4 @@
-import Button from "../button/button.jsx";
+import Button from "../button/button.tsx";
import { useState, useEffect } from "react";
import styles from "./ThemeSwitcher.module.css";
diff --git a/src/interfaces/response.interface.ts b/src/interfaces/response.interface.ts
new file mode 100644
index 0000000..5f7e27e
--- /dev/null
+++ b/src/interfaces/response.interface.ts
@@ -0,0 +1,4 @@
+export default interface Response {
+ status: number;
+ data: T;
+}
\ No newline at end of file
diff --git a/src/pages/Admin/AdminPage.jsx b/src/pages/Admin/AdminPage.jsx
index b8cf562..c300ff8 100644
--- a/src/pages/Admin/AdminPage.jsx
+++ b/src/pages/Admin/AdminPage.jsx
@@ -1,10 +1,10 @@
-import { useState, useContext } from "react";
+import { useContext } from "react";
import styles from "./AdminPage.module.css";
-import ParticipationChart from "./components/chart/ParticipationChart.jsx";
import IncompleteEvents from "./components/IncompleteEvent/IncompleteEvent.jsx";
import PendingMembers from "./components/pendingMembers/PendingMembers.jsx";
import { AuthContext } from "../../contexts/auth/AuthContext.js";
import { useNavigate } from "react-router";
+import RegisterMember from "./components/registerMember/registerMember.tsx";
function AdminPage() {
@@ -12,18 +12,11 @@ function AdminPage() {
const { user } = useContext(AuthContext);
const navigate = useNavigate();
- const [selected, setSelected] = useState("3");
- const [participationRate] = useState(89);
-
if(!user.isAdmin) navigate("/");
return (
-
+
diff --git a/src/pages/Admin/components/pendingMembers/PendingMembers.jsx b/src/pages/Admin/components/pendingMembers/PendingMembers.jsx
index 69dc4e4..19b1a1a 100644
--- a/src/pages/Admin/components/pendingMembers/PendingMembers.jsx
+++ b/src/pages/Admin/components/pendingMembers/PendingMembers.jsx
@@ -1,7 +1,7 @@
import React, {useState, useEffect} from "react";
-import Button from "../../../../components/ui/button/button.jsx";
+import Button from "../../../../components/ui/button/button.tsx";
import styles from "./PendingMembers.module.css";
-import Modal from "../../../../components/ui/modal/modal.jsx";
+import Modal from "../../../../components/ui/modal/modal.tsx";
import getUserToValidate from "../../../../utils/users/getUserToValidate.js";
import getUserById from "../../../../utils/users/getUserById.js";
import validateUser from "../../../../utils/users/validateUser.js";
diff --git a/src/pages/Admin/components/registerMember/registerMember.module.css b/src/pages/Admin/components/registerMember/registerMember.module.css
new file mode 100644
index 0000000..b15de9f
--- /dev/null
+++ b/src/pages/Admin/components/registerMember/registerMember.module.css
@@ -0,0 +1,52 @@
+.leftBlock {
+ width: 100%;
+ max-width: 720px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ min-height: calc(100vh - 260px);
+ box-sizing: border-box;
+ padding: 20px;
+ margin: 0 auto;
+}
+
+.registerMemberHeader {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+ margin-bottom: 20px;
+}
+
+.registerForm {
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+ align-items: stretch;
+}
+
+.registerForm input {
+ width: 100%;
+ box-sizing: border-box;
+}
+
+.registerForm button {
+ width: 100%;
+}
+
+.modalContent {
+ text-align: center;
+}
+
+@media (min-width: 768px) {
+ .leftBlock {
+ width: 70%;
+ }
+}
+
+@media (min-width: 1024px) {
+ .leftBlock {
+ width: 40%;
+ }
+}
diff --git a/src/pages/Admin/components/registerMember/registerMember.tsx b/src/pages/Admin/components/registerMember/registerMember.tsx
new file mode 100644
index 0000000..e233176
--- /dev/null
+++ b/src/pages/Admin/components/registerMember/registerMember.tsx
@@ -0,0 +1,74 @@
+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";
+import Modal from "../../../../components/ui/modal/modal";
+
+
+const RegisterMember: React.FC = () => {
+
+ const [name, setName] = useState
("");
+ const [lastname, setLastName] = useState("");
+ const [email, setEmail] = useState("");
+ const [phone, setPhone] = useState("");
+ const [password, setPassword] = useState("");
+
+ const [open, setOpen] = useState(false);
+ const [title, setTitle] = useState("");
+ const [message, setMessage] = useState("");
+
+
+ const handleCreate = async (): Promise => {
+
+ if(name !== "" && lastname !== "" && email !== "" && phone !== "" ) {
+ const response: Response = await adminCreateUser(email, name, lastname, phone);
+ if(response.status === 200) {
+ setPassword(response.data.password);
+ setTitle(`Utilisateur enregistré avec succès`);
+ setMessage(`L'utilisateur ${name} ${lastname} a été enregistré avec le mot de passe: ${response.data.password}`);
+ setOpen(true);
+ } else {
+ setTitle(`Erreur`);
+ setMessage(`Une erreur est survenue lors de l'enregistrement de ${name} ${lastname}`);
+ setOpen(true);
+ }
+ } else {
+ setTitle("Erreur");
+ setMessage("Un des champs n'a pas été rempli");
+ setOpen(true);
+ }
+ }
+
+ const showPassword = (): void => {
+ setTitle(`Mot de passe de ${name} ${lastname}`);
+ setMessage(password);
+ setOpen(true);
+ }
+
+ return
+
+
Enregister un bénévole
+
+
+
+ setName(e.target.value)} />
+ setLastName(e.target.value)} />
+ setEmail(e.target.value)} />
+ setPhone(e.target.value)} />
+
+ {password !== "" && }
+
+
+
+
+
setOpen(false)} title={title}>
+ {message}
+
+
+
+}
+
+export default RegisterMember
\ No newline at end of file
diff --git a/src/pages/Admin/components/registerMember/responseData.inteface.ts b/src/pages/Admin/components/registerMember/responseData.inteface.ts
new file mode 100644
index 0000000..528d1d3
--- /dev/null
+++ b/src/pages/Admin/components/registerMember/responseData.inteface.ts
@@ -0,0 +1,4 @@
+export default interface ResponseData {
+ message: string;
+ password: string;
+}
\ No newline at end of file
diff --git a/src/pages/Events/components/Event/Event.jsx b/src/pages/Events/components/Event/Event.jsx
index e011d56..41181d3 100644
--- a/src/pages/Events/components/Event/Event.jsx
+++ b/src/pages/Events/components/Event/Event.jsx
@@ -1,7 +1,7 @@
import styles from "./Event.module.css";
import { useState, useEffect } from "react";
import { useNavigate } from "react-router";
-import Button from "/src/components/ui/button/button.jsx"
+import Button from "/src/components/ui/button/button"
function Event({event}){
diff --git a/src/pages/Login/components/loginform/loginForm.jsx b/src/pages/Login/components/loginform/loginForm.jsx
index ee2ee6b..b4b3338 100644
--- a/src/pages/Login/components/loginform/loginForm.jsx
+++ b/src/pages/Login/components/loginform/loginForm.jsx
@@ -1,8 +1,8 @@
import { useState, useContext } from "react";
import styles from "./loginForm.module.css";
-import Button from "../../../../components/ui/button/button.jsx";
-import Input from "../../../../components/ui/input/input.jsx";
-import Modal from "../../../../components/ui/modal/modal.jsx";
+import Button from "../../../../components/ui/button/button.tsx";
+import Input from "../../../../components/ui/input/input.tsx";
+import Modal from "../../../../components/ui/modal/modal.tsx";
import { useNavigate } from "react-router";
import { AuthContext } from "../../../../contexts/auth/AuthContext.js";
diff --git a/src/pages/Profile/components/SettingsModal/SettingsModal.jsx b/src/pages/Profile/components/SettingsModal/SettingsModal.jsx
index 4283559..c5e0ff3 100644
--- a/src/pages/Profile/components/SettingsModal/SettingsModal.jsx
+++ b/src/pages/Profile/components/SettingsModal/SettingsModal.jsx
@@ -1,10 +1,10 @@
-import Modal from "../../../../components/ui/modal/modal.jsx";
-import Button from "../../../../components/ui/button/button.jsx";
+import Modal from "../../../../components/ui/modal/modal.tsx";
+import Button from "../../../../components/ui/button/button.tsx";
import styles from "./SettingsModal.module.css"
import { useContext, useState } from "react";
import ThemeSwitcher from "../../../../components/ui/themeSwitcher/ThemeSwitcher.jsx";
import { AuthContext } from "../../../../contexts/auth/AuthContext.js";
-import TextInput from "../../../../components/ui/input/input.jsx";
+import TextInput from "../../../../components/ui/input/input.tsx";
import updateUser from "../../../../utils/users/updateUser.js";
import deleteUser from "../../../../utils/users/deleteUser.js";
diff --git a/src/pages/Register/RegisterPage.jsx b/src/pages/Register/RegisterPage.jsx
index f0547c3..48c9751 100644
--- a/src/pages/Register/RegisterPage.jsx
+++ b/src/pages/Register/RegisterPage.jsx
@@ -1,12 +1,12 @@
import styles from "./RegisterPage.module.css";
import Background from "../../components/background/background.jsx";
-import Input from "../../components/ui/input/input.jsx";
-import Button from "../../components/ui/button/button.jsx";
+import Input from "../../components/ui/input/input.tsx";
+import Button from "../../components/ui/button/button.tsx";
import {useContext, useEffect, useState} from "react";
import register from "../../utils/register.js";
import { useNavigate } from "react-router";
import { AuthContext } from "../../contexts/auth/AuthContext.js";
-import Modal from "../../components/ui/modal/modal.jsx";
+import Modal from "../../components/ui/modal/modal.tsx";
function RegisterPage() {
diff --git a/src/pages/VolunteerProfile/components/manageMember/ManageMember.jsx b/src/pages/VolunteerProfile/components/manageMember/ManageMember.jsx
index 6266501..46f8ac2 100644
--- a/src/pages/VolunteerProfile/components/manageMember/ManageMember.jsx
+++ b/src/pages/VolunteerProfile/components/manageMember/ManageMember.jsx
@@ -1,5 +1,5 @@
-import Button from "../../../../components/ui/button/button.jsx";
-import Modal from "../../../../components/ui/modal/modal.jsx";
+import Button from "../../../../components/ui/button/button.tsx";
+import Modal from "../../../../components/ui/modal/modal.tsx";
import {useContext, useState} from "react";
import styles from "./manageMember.module.css"
import DeactivateMemberBtn from "./deactivateMember/deactivateMemberBtn.jsx";
diff --git a/src/pages/VolunteerProfile/components/manageMember/deactivateMember/deactivateMemberBtn.jsx b/src/pages/VolunteerProfile/components/manageMember/deactivateMember/deactivateMemberBtn.jsx
index ccb8390..2f586f6 100644
--- a/src/pages/VolunteerProfile/components/manageMember/deactivateMember/deactivateMemberBtn.jsx
+++ b/src/pages/VolunteerProfile/components/manageMember/deactivateMember/deactivateMemberBtn.jsx
@@ -1,5 +1,5 @@
-import Button from "../../../../../components/ui/button/button.jsx";
-import Modal from "../../../../../components/ui/modal/modal.jsx";
+import Button from "../../../../../components/ui/button/button.tsx";
+import Modal from "../../../../../components/ui/modal/modal.tsx";
import { useState } from "react";
import deactivateUser from "../../../../../utils/users/deactivateUser.js"
import { useNavigate } from "react-router";
diff --git a/src/pages/VolunteerProfile/components/manageMember/modifyrole/ModifyRole.jsx b/src/pages/VolunteerProfile/components/manageMember/modifyrole/ModifyRole.jsx
index bc4d495..9f847f4 100644
--- a/src/pages/VolunteerProfile/components/manageMember/modifyrole/ModifyRole.jsx
+++ b/src/pages/VolunteerProfile/components/manageMember/modifyrole/ModifyRole.jsx
@@ -1,9 +1,9 @@
import styles from "../manageMember.module.css";
-import Button from "../../../../../components/ui/button/button.jsx";
+import Button from "../../../../../components/ui/button/button.tsx";
import modifyRole from "../../../../../utils/users/modifyRole.js";
import { useState, useEffect } from "react";
import getRoles from "../../../../../utils/getRoles.js";
-import Modal from "../../../../../components/ui/modal/modal.jsx";
+import Modal from "../../../../../components/ui/modal/modal.tsx";
export default function ModifyRole({ user }) {
diff --git a/src/pages/Volunteers/VolunteerCard.jsx b/src/pages/Volunteers/VolunteerCard.jsx
index 144d708..f69f6df 100644
--- a/src/pages/Volunteers/VolunteerCard.jsx
+++ b/src/pages/Volunteers/VolunteerCard.jsx
@@ -2,7 +2,7 @@ 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.jsx";
+import Button from "../../components/ui/button/button.tsx";
export default function VolunteerCard({ user }) {
diff --git a/src/pages/eventDetail/components/EventTask/EventTask.jsx b/src/pages/eventDetail/components/EventTask/EventTask.jsx
index bbde7b6..ff10dbb 100644
--- a/src/pages/eventDetail/components/EventTask/EventTask.jsx
+++ b/src/pages/eventDetail/components/EventTask/EventTask.jsx
@@ -1,11 +1,11 @@
import styles from "./eventTask.module.css";
import { formatDateLetter } from "../../../../utils/date/formatDateLetter.js";
-import Button from "../../../../components/ui/button/button.jsx";
+import Button from "../../../../components/ui/button/button.tsx";
import assign from "../../../../utils/tasks/assign.js";
import unAssign from "../../../../utils/tasks/unAssign.js";
import { useContext, useEffect, useState } from "react";
import isAssigned from "../../../../utils/tasks/isAssigned.js";
-import Modal from "../../../../components/ui/modal/modal.jsx";
+import Modal from "../../../../components/ui/modal/modal.tsx";
import { AuthContext } from "../../../../contexts/auth/AuthContext.js";
import DeleteTaskBtn from "../deleteTaskBtn/deleteTaskBtn.jsx";
diff --git a/src/pages/eventDetail/components/createTaskBtn/createTaskBtn.jsx b/src/pages/eventDetail/components/createTaskBtn/createTaskBtn.jsx
index 8862ada..6ad9d4b 100644
--- a/src/pages/eventDetail/components/createTaskBtn/createTaskBtn.jsx
+++ b/src/pages/eventDetail/components/createTaskBtn/createTaskBtn.jsx
@@ -1,8 +1,8 @@
import styles from "../../eventDetail.module.css";
-import Button from "../../../../components/ui/button/button.jsx";
+import Button from "../../../../components/ui/button/button.tsx";
import {useContext, useState} from "react";
-import TextInput from "../../../../components/ui/input/input.jsx";
-import Modal from "../../../../components/ui/modal/modal.jsx";
+import TextInput from "../../../../components/ui/input/input.tsx";
+import Modal from "../../../../components/ui/modal/modal.tsx";
import createTaskApi from "../../../../utils/tasks/createTask.js";
import {EventDetailContext} from "../../../../contexts/eventDetail/eventDetail.js";
diff --git a/src/pages/eventDetail/components/deleteEventBtn/deleteEventBtn.jsx b/src/pages/eventDetail/components/deleteEventBtn/deleteEventBtn.jsx
index 813a995..c3b4383 100644
--- a/src/pages/eventDetail/components/deleteEventBtn/deleteEventBtn.jsx
+++ b/src/pages/eventDetail/components/deleteEventBtn/deleteEventBtn.jsx
@@ -1,6 +1,6 @@
import styles from "../../eventDetail.module.css";
-import Button from "../../../../components/ui/button/button.jsx";
-import Modal from "../../../../components/ui/modal/modal.jsx";
+import Button from "../../../../components/ui/button/button.tsx";
+import Modal from "../../../../components/ui/modal/modal.tsx";
import { useContext, useState } from "react";
import { EventDetailContext } from "../../../../contexts/eventDetail/eventDetail.js";
import { EventContext } from "../../../../contexts/events/EventContext.js";
diff --git a/src/pages/eventDetail/components/deleteTaskBtn/deleteTaskBtn.jsx b/src/pages/eventDetail/components/deleteTaskBtn/deleteTaskBtn.jsx
index fdad16f..90a749b 100644
--- a/src/pages/eventDetail/components/deleteTaskBtn/deleteTaskBtn.jsx
+++ b/src/pages/eventDetail/components/deleteTaskBtn/deleteTaskBtn.jsx
@@ -1,9 +1,9 @@
import { useContext } from "react";
import { AuthContext } from "../../../../contexts/auth/AuthContext.js";
import { EventDetailContext } from "../../../../contexts/eventDetail/eventDetail.js";
-import Button from "../../../../components/ui/button/button.jsx";
+import Button from "../../../../components/ui/button/button.tsx";
import { useState } from "react";
-import Modal from "../../../../components/ui/modal/modal.jsx";
+import Modal from "../../../../components/ui/modal/modal.tsx";
import styles from "../../eventDetail.module.css";
export default function DeleteTaskBtn({ taskId, eventId, taskName }) {
diff --git a/src/pages/waitValidationPage/ValidationErrorPage.jsx b/src/pages/waitValidationPage/ValidationErrorPage.jsx
index aeff346..3086d77 100644
--- a/src/pages/waitValidationPage/ValidationErrorPage.jsx
+++ b/src/pages/waitValidationPage/ValidationErrorPage.jsx
@@ -1,6 +1,6 @@
import styles from "./validationErrorPage.module.css"
import Background from "../../components/background/background.jsx";
-import Button from "../../components/ui/button/button.jsx";
+import Button from "../../components/ui/button/button.tsx";
import { useContext } from "react";
import { AuthContext } from "../../contexts/auth/AuthContext.js";
import { Navigate, useNavigate, Link } from "react-router";
diff --git a/src/stories/Button.stories.jsx b/src/stories/Button.stories.jsx
index 3f86188..3179067 100644
--- a/src/stories/Button.stories.jsx
+++ b/src/stories/Button.stories.jsx
@@ -1,6 +1,6 @@
import { fn } from 'storybook/test';
-import Button from '../components/ui/button/button.jsx';
+import Button from '../components/ui/button/button.tsx';
export default {
diff --git a/src/stories/Input.stories.jsx b/src/stories/Input.stories.jsx
index 1d3cc0c..86cd833 100644
--- a/src/stories/Input.stories.jsx
+++ b/src/stories/Input.stories.jsx
@@ -1,5 +1,5 @@
import { useState } from "react";
-import TextInput from "../components/ui/input/input.jsx";
+import TextInput from "../components/ui/input/input.tsx";
export default {
diff --git a/src/stories/Modal.stories.jsx b/src/stories/Modal.stories.jsx
index 1ece2ae..0983105 100644
--- a/src/stories/Modal.stories.jsx
+++ b/src/stories/Modal.stories.jsx
@@ -1,5 +1,5 @@
-import Modal from "../components/ui/modal/modal.jsx";
-import Button from "../components/ui/button/button.jsx";
+import Modal from "../components/ui/modal/modal.tsx";
+import Button from "../components/ui/button/button.tsx";
import { useState } from "react";
export default {
diff --git a/src/utils/users/adminCreateUser.ts b/src/utils/users/adminCreateUser.ts
new file mode 100644
index 0000000..01860d3
--- /dev/null
+++ b/src/utils/users/adminCreateUser.ts
@@ -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 {
+ const csrfToken = await getXSRFToken();
+
+ return fetchWrapper(
+ "/api/users/create",
+ { email, name, lastname, phone },
+ "POST",
+ { "X-XSRF-TOKEN": csrfToken }
+ );
+}