121 lines
4.0 KiB
JavaScript
121 lines
4.0 KiB
JavaScript
import { useEffect } from "react";
|
||
import { useDispatch, useSelector } from "react-redux";
|
||
import { notification } from "antd";
|
||
import {
|
||
useAddPatientMutation,
|
||
useDeletePatientMutation,
|
||
useGetPatientsQuery,
|
||
useUpdatePatientMutation
|
||
} from "../redux/services/patientsApi";
|
||
import {
|
||
openModal,
|
||
closeModal,
|
||
selectPatient,
|
||
setSearchText,
|
||
setSortOrder,
|
||
setViewMode,
|
||
setCurrentPage,
|
||
setPageSize
|
||
} from "../redux/slices/patientsSlice";
|
||
import { getCachedInfo } from "../utils/cachedInfoUtils";
|
||
|
||
const usePatients = () => {
|
||
const dispatch = useDispatch();
|
||
const {
|
||
searchText,
|
||
sortOrder,
|
||
viewMode,
|
||
selectedPatient,
|
||
isModalVisible
|
||
} = useSelector(state => state.patientsUI);
|
||
|
||
const { data: patients = [], isLoading, isError } = useGetPatientsQuery(undefined, {
|
||
pollingInterval: 20000,
|
||
});
|
||
const [addPatient] = useAddPatientMutation();
|
||
const [updatePatient] = useUpdatePatientMutation();
|
||
const [deletePatient] = useDeletePatientMutation();
|
||
|
||
useEffect(() => {
|
||
document.title = "Пациенты";
|
||
const cachedViewMode = getCachedInfo("viewModePatients");
|
||
if (cachedViewMode) dispatch(setViewMode(cachedViewMode));
|
||
}, [dispatch]);
|
||
|
||
const handleAddPatient = () => {
|
||
dispatch(selectPatient(null));
|
||
dispatch(openModal());
|
||
};
|
||
|
||
const handleEditPatient = (patient) => {
|
||
dispatch(selectPatient(patient));
|
||
dispatch(openModal());
|
||
};
|
||
|
||
const handleDeletePatient = async (patientId) => {
|
||
try {
|
||
await deletePatient(patientId).unwrap();
|
||
notification.success({
|
||
message: "Пациент удалён",
|
||
description: "Пациент успешно удалён из базы.",
|
||
placement: "topRight",
|
||
});
|
||
} catch (error) {
|
||
notification.error({
|
||
message: "Ошибка удаления",
|
||
description: error.data?.message || "Не удалось удалить пациента",
|
||
placement: "topRight",
|
||
});
|
||
}
|
||
};
|
||
|
||
const handleModalPatientSubmit = async (patientData) => {
|
||
try {
|
||
if (selectedPatient) {
|
||
await updatePatient({ id: selectedPatient.id, ...patientData }).unwrap();
|
||
notification.success({
|
||
message: "Пациент обновлён",
|
||
description: `Данные пациента ${patientData.first_name} ${patientData.last_name} успешно обновлены.`,
|
||
placement: "topRight",
|
||
});
|
||
} else {
|
||
await addPatient(patientData).unwrap();
|
||
notification.success({
|
||
message: "Пациент добавлен",
|
||
description: `Пациент ${patientData.first_name} ${patientData.last_name} успешно добавлен.`,
|
||
placement: "topRight",
|
||
});
|
||
}
|
||
dispatch(closeModal());
|
||
} catch (error) {
|
||
notification.error({
|
||
message: "Ошибка",
|
||
description: error.data?.message || "Произошла ошибка при сохранении",
|
||
placement: "topRight",
|
||
});
|
||
}
|
||
};
|
||
|
||
return {
|
||
patients,
|
||
isLoading,
|
||
isError,
|
||
searchText,
|
||
sortOrder,
|
||
viewMode,
|
||
isModalVisible,
|
||
selectedPatient,
|
||
handleAddPatient,
|
||
handleEditPatient,
|
||
handleDeletePatient,
|
||
handleModalPatientSubmit,
|
||
setSearchText: (text) => dispatch(setSearchText(text)),
|
||
setSortOrder: (order) => dispatch(setSortOrder(order)),
|
||
setViewMode: (mode) => dispatch(setViewMode(mode)),
|
||
setCurrentPage: (page) => dispatch(setCurrentPage(page)),
|
||
setPageSize: (size) => dispatch(setPageSize(size)),
|
||
};
|
||
};
|
||
|
||
export default usePatients;
|