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, // <- Add this import InputLabel, TextField, Typography, CircularProgress, Snackbar, Alert, } from '@mui/material'; // Add `FormControl` 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 ManageCategories() { const [categories, setCategories] = useState([]); const [editCategory, setEditCategory] = useState(null); // To hold the category being edited const [openEdit, setOpenEdit] = useState(false); // To control the Edit dialog const [openCreate, setOpenCreate] = useState(false); // To control the Create Category 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 categories on component mount const fetchCategories = async () => { setLoading(true); try { const response = await axios.get(`${serverUrl}/api/v1/admin/getAllCategories`, { withCredentials: true, }); setCategories(response.data.categories); // Assuming API returns an array of categories setLoading(false); } catch (error) { console.error('Error fetching categories:', error); setLoading(false); } }; useEffect(() => { fetchCategories(); }, [serverUrl]); // Handle Delete action const handleDelete = async (categoryId) => { if (window.confirm('Are you sure you want to delete this category?')) { try { await axios.delete(`${serverUrl}/api/v1/admin/deleteCategory/${categoryId}`, { withCredentials: true, }); fetchCategories(); // Re-fetch categories after delete setSnackbar({ open: true, message: 'Category deleted successfully', severity: 'success' }); } catch (error) { console.error('Error deleting category:', error); setSnackbar({ open: true, message: 'Error deleting category', severity: 'error' }); } } }; // Handle Edit action (open popup) const handleEdit = (category) => { setEditCategory(category); // Set the category to be edited setOpenEdit(true); // Open the dialog }; // Handle the Edit form submit const handleEditSubmit = async () => { try { await axios.put(`${serverUrl}/api/v1/admin/updateCategory/${editCategory.id}`, { id: editCategory.id, category: editCategory.category, status: editCategory.status, }, { withCredentials: true, }); setOpenEdit(false); // Close the dialog after saving setSnackbar({ open: true, message: 'Category updated successfully', severity: 'success' }); fetchCategories(); // Re-fetch categories after update } catch (error) { console.error('Error updating category:', error); setSnackbar({ open: true, message: 'Error updating category', severity: 'error' }); } }; // Handle individual input changes for editing const handleCategoryChange = (e) => { setEditCategory((prevData) => ({ ...prevData, category: e.target.value, })); }; const handleStatusChange = (e) => { setEditCategory((prevData) => ({ ...prevData, status: e.target.value, })); }; // Validation Schema for the Create Category form const validationSchema = Yup.object().shape({ category: Yup.string().required('Category is required'), }); // Handle Create Category form submit const handleCreateCategorySubmit = async (values, { setErrors, resetForm }) => { try { const response = await axios.post(`${serverUrl}/api/v1/admin/createCategory`, { category: values.category, status: values.status, }, { withCredentials: true, }); if (response.data.status === 1) { setOpenCreate(false); // Close the dialog after creating resetForm(); // Reset the form after success setSnackbar({ open: true, message: 'Category created successfully', severity: 'success' }); fetchCategories(); // Re-fetch categories after creation } else { setErrors({ submit: response.data.message }); } } catch (error) { console.error('Error creating category:', error); setErrors({ submit: 'An error occurred. Please try again.' }); setSnackbar({ open: true, message: 'Error creating category', severity: 'error' }); } }; return ( setOpenCreate(true)}> Create Category } > {loading ? ( ) : ( ID Category Status Action {categories.map((category) => ( {category.id} {category.category} {category.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 Category {/* Category Field */} {/* Status Select Field */} Status {/* Create Category Dialog */} setOpenCreate(false)}> Create Category {({ errors, handleBlur, handleChange, handleSubmit, touched, values }) => (
Status {errors.submit && ( {errors.submit} )}
)}
); } ManageCategories.propTypes = { isDemo: PropTypes.bool };