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;
|