frontend_adaptive_learning/src/roles/admin/manage_section/hooks/useSections.jsx

217 lines
6.6 KiB
React
Raw Normal View History

2024-10-31 02:32:14 +00:00
import { useState, useEffect } from 'react';
import sectionService from '../services/serviceSections';
2024-11-19 16:02:04 +00:00
import { MEDIA_URL } from '../../../../utils/Constant';
2024-10-31 02:32:14 +00:00
const useSections = () => {
2024-11-19 16:02:04 +00:00
const thumbPath = `${MEDIA_URL}/uploads/section/`;
2024-10-31 02:32:14 +00:00
const [sections, setSections] = useState([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
const [selectedSection, setSelectedSection] = useState(null);
const [selectedImage, setSelectedImage] = useState(null);
const [formData, setFormData] = useState({
sectionName: '',
description: '',
thumbnail: ''
});
const [show, setShow] = useState(false);
const [showLoader, setShowLoader] = useState(false);
const [loaderState, setLoaderState] = useState({ loading: false, successMessage: '', title: '', description: '', confirmAction: false });
const handleFormChange = (e) => {
setFormData({ ...formData, [e.target.name]: e.target.value });
};
const handleImageChange = (e) => {
const file = e.target.files[0];
if (file && file.size <= 5 * 1024 * 1024) {
setSelectedImage(file);
} else {
setError('File size must be less than 5 MB');
}
};
const handleShow = (data) => {
setSelectedSection(data);
setFormData({
sectionName: data?.NAME_SECTION || '',
description: data?.DESCRIPTION_SECTION || '',
thumbnail: data?.THUMBNAIL || '',
});
setShow(true);
};
const handleClose = () => {setShow(false); resetForm(); setSelectedSection(null)};
const handleCloseLoader = () => setShowLoader(false);
const handleShowLoader = (title, description, loading = false, successMessage = '', confirmAction = false) => {
setLoaderState({ title, description, loading, successMessage, confirmAction });
setShowLoader(true);
};
const resetForm = () =>{
setSelectedImage(null);
setFormData({
sectionName: '',
description: '',
thumbnail: ''
});
}
const createSection = async () => {
const createData = new FormData();
createData.append('NAME_SECTION', formData.sectionName,);
createData.append('DESCRIPTION_SECTION', formData.description,);
if (selectedImage) {
createData.append('THUMBNAIL', selectedImage);
}
handleShowLoader('Created', '', true);
try {
const createdSection = await sectionService.createData(createData);
setSections((prevSections) => [...prevSections, createdSection.payload]);
resetForm();
setLoaderState(prev => ({
...prev,
loading: false,
successMessage: 'Your new entry has been successfully created and saved.'
}));
2024-11-04 19:23:26 +00:00
} catch (err) {
setError(err);
setLoaderState(prev => ({
...prev,
title: "ERROR",
loading: false,
successMessage: err.message
}));
2024-10-31 02:32:14 +00:00
}
};
const editSection = async () => {
const id = selectedSection.ID_SECTION
const updateData = new FormData();
updateData.append('NAME_SECTION', formData.sectionName,);
updateData.append('DESCRIPTION_SECTION', formData.description,);
if (selectedImage) {
updateData.append('THUMBNAIL', selectedImage);
}
handleClose();
handleShowLoader('Updated', '', true);
try {
const section = await sectionService.updateData(id, updateData);
setSections((prevSections) =>
prevSections.map((s) => (s.ID_SECTION === id ? section.payload : s))
);
} catch (err) {
setError(err);
}finally{
setLoaderState(prev => ({
...prev,
loading: false,
successMessage: 'Your data has been successfully updated.'
}));
}
};
const deleteSection = async (id) => {
handleShowLoader('Deleted', 'Are you sure you want to delete this Section?', false, '', true);
const confirmDelete = async () => {
handleCloseLoader();
handleShowLoader('Deleted', '', true)
try {
await sectionService.deleteData(id);
} catch (err) {
setError(err);
}finally{
setSections((prevSections) => prevSections.filter((s) => s.ID_SECTION !== id));
setLoaderState(prev => ({
...prev,
loading: false,
successMessage: 'Your data has been successfully deleted.'
}));
}
}
setLoaderState(prev => ({ ...prev, handleConfirm: confirmDelete }));
};
const [search, setSearch] = useState("");
const [sort, setSort] = useState("");
const [page, setCurrentPage] = useState(1);
const [limit, setLimit] = useState(7);
const [totalPages, setTotalPages] = useState(0);
const [totalData, setTotalData] = useState(null);
const fetchData = async () => {
setLoading(true);
try {
const data = await sectionService.fetchData(search, sort, page, limit);
setTotalPages(data.payload.totalPages);
setTotalData(data.payload.totalItems);
setSections(data.payload.sections);
} catch (err) {
setError(err);
} finally {
setLoading(false);
}
};
const handleSerachChange = () => {
fetchData();
setCurrentPage(1);
}
const handlePageChange = (pages) => {
setCurrentPage(pages);
}
const handleLimitsChange = (e) => {
setLimit(e.target.value);
setCurrentPage(1);
}
useEffect(() => {
fetchData();
}, []);
return {
sections,
loading,
error,
selectedSection,
selectedImage,
formData,
createSection,
editSection,
deleteSection,
setSelectedSection,
setFormData,
handleFormChange,
handleImageChange,
resetForm,
show,
setShow,
handleShow,
handleClose,
showLoader,
handleShowLoader,
handleCloseLoader,
loaderState,
setLoaderState,
thumbPath,
totalPages,
totalData,
setSearch,
page,
handlePageChange,
handleLimitsChange,
handleSerachChange
};
};
export default useSections;