test_rsabhk_fe/src/pages/Dokter/RiwayatPasien.jsx
2025-04-28 00:02:47 +07:00

225 lines
7.8 KiB
JavaScript

import { Table } from "flowbite-react";
import { useLocation, useOutletContext, useParams } from "react-router-dom";
import Modals from "../../components/Modals";
import { useEffect, useState } from "react";
import { useDispatch, useSelector } from "react-redux";
import { getPeriksa } from "../../config/Redux/Action/periksaAction";
import {
getAllPasien,
getDaftarPoli,
getDaftarPoliByPasienId,
getDetailPriksa,
getPasienById,
} from "../../config/Redux/Action";
const RiwayatPasien = () => {
const pathName = useLocation().pathname;
const [openModal, setOpenModal] = useState(false);
const [role] = useOutletContext();
const dispatch = useDispatch();
const { periksa } = useSelector((state) => state.periksaReducer);
const { id } = useParams();
const { daftarPoli, daftarPoliByPasienId } = useSelector(
(state) => state.daftarPoliReducer
);
const { detailPriksa } = useSelector((state) => state.detailPeriksaReducer);
const { pasienAll, pasienById } = useSelector((state) => state.pasienReducer);
const [riwayat, setRiwayat] = useState([]);
const [pasien, setPasien] = useState([]);
const [idPasien, setIdPasien] = useState("");
const handleOpenModal = (id) => {
setOpenModal(true);
setIdPasien(id);
};
const formatPriceInRupiah = (price) => {
return new Intl.NumberFormat("id-ID", {
style: "currency",
currency: "IDR",
}).format(price);
};
useEffect(() => {
dispatch(getPeriksa());
dispatch(getDaftarPoli());
}, [dispatch]);
useEffect(() => {
dispatch(getAllPasien());
}, [dispatch]);
useEffect(() => {
if (idPasien) {
dispatch(getDaftarPoliByPasienId(idPasien));
}
}, [dispatch, idPasien]);
useEffect(() => {
const matchedPatients = periksa
.map((item) => {
return daftarPoli.find(
(item2) =>
item.id_daftar_poli === item2.id &&
item2.jadwal_periksa.id_dokter === id
);
})
.filter((matchedItem) => matchedItem !== undefined);
const matchedPatients2 = matchedPatients
.map((item) => {
return pasienAll.find((item2) => item2.id === item.id_pasien);
})
.filter((matchedItem) => matchedItem !== undefined);
const uniquePatients = [
...new Map(matchedPatients2.map((item) => [item.id, item])).values(),
];
setPasien(uniquePatients || []);
return () => {
setPasien([]);
};
}, [pasienAll, daftarPoli, id, periksa]);
useEffect(() => {
if (daftarPoliByPasienId.length > 0) {
const filteredRiwayat = periksa.filter((item2) =>
daftarPoliByPasienId.some(
(item) =>
item.id === item2.id_daftar_poli &&
item2?.daftar_poli?.jadwal_periksa?.id_dokter === id &&
item.id_pasien === idPasien
)
);
setRiwayat(filteredRiwayat);
}
}, [daftarPoliByPasienId, periksa, id, idPasien]);
useEffect(() => {
if (riwayat.length > 0) {
dispatch(getDetailPriksa());
}
}, [riwayat, dispatch]);
useEffect(() => {
if (idPasien) {
dispatch(getPasienById(idPasien));
}
}, [dispatch, idPasien]);
useEffect(() => {
if (role !== "dokter") {
window.location.href = "/";
}
}, [role]);
return (
<div className="container min-h-[90vh] m-5 my-[3rem]">
<div className="flex justify-between">
<h1 className="text-xl font-medium">Riwayat Pasien</h1>
<h1>{pathName}</h1>
</div>
<div className="card bg-white p-5 mt-[3rem]">
<div className="card-body">
<div className="flex justify-between">
<h1 className="text-xl font-medium">Daftar Riwayat Pasien</h1>
</div>
<div className="overflow-x-auto mt-4">
<Table striped>
<Table.Head>
<Table.HeadCell>No</Table.HeadCell>
<Table.HeadCell>Nama</Table.HeadCell>
<Table.HeadCell width="30%">Alamat</Table.HeadCell>
<Table.HeadCell>No. KTP</Table.HeadCell>
<Table.HeadCell>No. HP</Table.HeadCell>
<Table.HeadCell>No. RM</Table.HeadCell>
<Table.HeadCell>Aksi</Table.HeadCell>
</Table.Head>
<Table.Body className="divide-y">
{pasien.map((item, index) => {
return (
<Table.Row key={index}>
<Table.Cell>{index + 1}</Table.Cell>
<Table.Cell>{item.nama}</Table.Cell>
<Table.Cell>{item.alamat}</Table.Cell>
<Table.Cell>{item.no_ktp}</Table.Cell>
<Table.Cell>{item.no_hp}</Table.Cell>
<Table.Cell>{item.no_rm}</Table.Cell>
<Table.Cell>
<button
className="bg-[#ff8d9a] p-2 rounded text-white mx-2"
onClick={() => handleOpenModal(item.id)}
>
Detail Riwayat Periksa
</button>
</Table.Cell>
</Table.Row>
);
})}
</Table.Body>
</Table>
<Modals
openModal={openModal}
setOpenModal={setOpenModal}
size="xxl"
title={"Riwayat " + pasienById?.nama}
body={
<div className="overflow-x-auto">
<Table striped>
<Table.Head>
<Table.HeadCell>No</Table.HeadCell>
<Table.HeadCell>Tanggal Periksa</Table.HeadCell>
<Table.HeadCell>Nama Pasien</Table.HeadCell>
<Table.HeadCell>Nama Dokter</Table.HeadCell>
<Table.HeadCell>Keluhan</Table.HeadCell>
<Table.HeadCell>Catatan</Table.HeadCell>
<Table.HeadCell>Obat</Table.HeadCell>
<Table.HeadCell>Biaya Priksa</Table.HeadCell>
<Table.HeadCell>Total Biaya</Table.HeadCell>
</Table.Head>
<Table.Body className="divide-y">
{riwayat?.map((item, index) => (
<Table.Row key={index}>
<Table.Cell>{index + 1}</Table.Cell>
<Table.Cell>{item.tanggal}</Table.Cell>
<Table.Cell>
{item.daftar_poli?.pasien?.nama}
</Table.Cell>
<Table.Cell>
Dr. {item.daftar_poli?.jadwal_periksa?.dokter?.nama}
</Table.Cell>
<Table.Cell>{item?.daftar_poli?.keluhan}</Table.Cell>
<Table.Cell>{item?.catatan}</Table.Cell>
<Table.Cell>
{detailPriksa?.map((item2, index) => {
if (item2.id_periksa === item.id) {
return (
<div key={index}>
{item2?.obat?.nama_obat} -{" "}
{formatPriceInRupiah(item2?.obat?.harga)}
</div>
);
}
})}
</Table.Cell>
<Table.Cell>{formatPriceInRupiah(150000)}</Table.Cell>
<Table.Cell>
{formatPriceInRupiah(item.biaya_periksa)}
</Table.Cell>
</Table.Row>
))}
</Table.Body>
</Table>
</div>
}
/>
</div>
</div>
</div>
</div>
);
};
export default RiwayatPasien;