import PropTypes from 'prop-types'; import React, { useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { Grid, Button, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Paper, Dialog, DialogActions, DialogContent, DialogTitle, MenuItem, Select, FormControl, InputLabel, TextField, Typography, CircularProgress, Snackbar, Alert } from '@mui/material'; import { Formik } from 'formik'; import * as Yup from 'yup'; import axios from 'axios'; import MainCard from 'components/MainCard'; import AnimateButton from 'components/@extended/AnimateButton'; export default function ManageUsers() { const [users, setUsers] = useState([]); const [editUser, setEditUser] = useState(null); // To hold the user being edited const [openEdit, setOpenEdit] = useState(false); // To control the Edit dialog const [openCreate, setOpenCreate] = useState(false); // To control the Create User dialog const [loading, setLoading] = useState(true); // Loading state const [snackbar, setSnackbar] = useState({ open: false, message: '', severity: 'success' }); // Snackbar for feedback const navigate = useNavigate(); const serverUrl = import.meta.env.VITE_APP_SERVER_URL; // Fetch all users on component mount const fetchUsers = async () => { setLoading(true); try { const response = await axios.get(`${serverUrl}/api/v1/admin/getAllUsers`, { withCredentials: true }); setUsers(response.data.users); // Assuming API returns an array of users setLoading(false); } catch (error) { console.error('Error fetching users:', error); setLoading(false); } }; useEffect(() => { document.title = "Predictator | Users"; fetchUsers(); }, [serverUrl]); // Handle Delete action const handleDelete = async (userId) => { if (window.confirm('Are you sure you want to delete this user?')) { try { await axios.delete(`${serverUrl}/api/v1/admin/deleteUser/${userId}`, { withCredentials: true }); fetchUsers(); // Re-fetch users after delete setSnackbar({ open: true, message: 'User deleted successfully', severity: 'success' }); } catch (error) { console.error('Error deleting user:', error); setSnackbar({ open: true, message: 'Error deleting user', severity: 'error' }); } } }; // Handle Edit action (open popup) const handleEdit = (user) => { setEditUser(user); // Set the user to be edited setOpenEdit(true); // Open the dialog }; // Handle the Edit form submit // Handle the Edit form submit const handleEditSubmit = async () => { try { await axios.put(`${serverUrl}/api/v1/admin/updateUser/${editUser.id}`, { id: editUser.id, // Ensure the ID is included name: editUser.name, email: editUser.email, status: editUser.status, userType: editUser.user_type, }, { withCredentials: true }); setOpenEdit(false); // Close the dialog after saving setSnackbar({ open: true, message: 'User updated successfully', severity: 'success' }); fetchUsers(); // Re-fetch users after update } catch (error) { console.error('Error updating user:', error); setSnackbar({ open: true, message: 'Error updating user', severity: 'error' }); } }; // Handlers for individual input changes const handleNameChange = (e) => { setEditUser((prevData) => ({ ...prevData, name: e.target.value, })); }; const handleEmailChange = (e) => { setEditUser((prevData) => ({ ...prevData, email: e.target.value, })); }; const handleUserTypeChange = (e) => { setEditUser((prevData) => ({ ...prevData, user_type: e.target.value, // Correct usage of user_type })); }; const handleStatusChange = (e) => { setEditUser((prevData) => ({ ...prevData, status: e.target.value, })); }; // Validation Schema for the Create User form const validationSchema = Yup.object().shape({ name: Yup.string().required('Name is required'), email: Yup.string().email('Must be a valid email').required('Email is required'), password: Yup.string().required('Password is required'), user_type: Yup.string().required('User Type is required') // Using user_type in the validation schema }); // Handle Create User form submit const handleCreateUserSubmit = async (values, { setErrors, resetForm }) => { try { const response = await axios.post(`${serverUrl}/api/v1/admin/createUser`, { name: values.name, email: values.email, password: values.password, user_type: values.user_type // Correct usage of user_type }, { withCredentials: true }); if (response.data.status === 1) { setOpenCreate(false); // Close the dialog after creating resetForm(); // Reset the form after success setSnackbar({ open: true, message: 'User created successfully', severity: 'success' }); fetchUsers(); // Re-fetch users after creation } else { setErrors({ submit: response.data.message }); } } catch (error) { console.error('Error creating user:', error); setErrors({ submit: 'An error occurred. Please try again.' }); setSnackbar({ open: true, message: 'Error creating user', severity: 'error' }); } }; return ( setOpenCreate(true)}> Create User } > {loading ? ( ) : ( ID Name Email User Type Status Action {users.map((user) => ( {user.id} {user.name} {user.email} {user.user_type ? user.user_type : 'N/A'} {user.status === 1 ? 'Active' : 'Inactive'} ))}
)}
{/* Snackbar for feedback */} setSnackbar({ open: false, message: '', severity: 'success' })} > setSnackbar({ open: false, message: '', severity: 'success' })}> {snackbar.message} {/* Edit Dialog */} setOpenEdit(false)}> Edit User {/* Name Field */} {/* Email Field */} {/* User Type Select Field */} User Type {/* Status Select Field */} Status {/* Create User Dialog */} setOpenCreate(false)}> Create User {({ errors, handleBlur, handleChange, handleSubmit, touched, values }) => (
User Type {touched.user_type && errors.user_type && ( {errors.user_type} )} {errors.submit && ( {errors.submit} )}
)}
); } ManageUsers.propTypes = { isDemo: PropTypes.bool };