2025-04-28 00:02:47 +07:00

268 lines
9.3 KiB
JavaScript

import { Table } from "flowbite-react";
import { useEffect, useState } from "react";
import { FaEdit, FaStethoscope } from "react-icons/fa";
import { useDispatch, useSelector } from "react-redux";
import {
Link,
useLocation,
useOutletContext,
useParams,
} from "react-router-dom";
import {
getDaftarPoli,
getDetailPriksaByPeriksaId,
getObat,
getPeriksa,
getPeriksaByDafPol,
updatePeriksa,
} from "../../../config/Redux/Action";
import Modals from "../../../components/Modals";
import Input from "../../../components/Input";
import ReactSelect from "../../../components/ReactSelect";
const DaftarPeriksa = () => {
const pathName = useLocation().pathname;
const [role] = useOutletContext();
const { id } = useParams();
const { daftarPoli } = useSelector((state) => state.daftarPoliReducer);
const { periksa, periksaByDafPolId } = useSelector(
(state) => state.periksaReducer
);
const { detailPriksaByPriksaId } = useSelector(
(state) => state.detailPeriksaReducer
);
const { obat } = useSelector((state) => state.obatReducer);
const dispatch = useDispatch();
const [edit, setEdit] = useState(false);
const [idPeriksa, setIdPeriksa] = useState("");
const [obatValue, setObatValue] = useState([]);
const [editForm, setEditForm] = useState({
id_daftar_poli: periksaByDafPolId?.id_daftar_poli,
tgl_periksa: periksaByDafPolId?.tanggal,
catatan: periksaByDafPolId?.catatan,
biaya_periksa: obatValue.reduce((acc, curr) => acc + curr.harga, 150000),
});
const handleEdit = (id) => {
setEdit(true);
setIdPeriksa(id);
};
const handleUpdate = (e) => {
e.preventDefault();
const data = {
...editForm,
};
dispatch(updatePeriksa(periksaByDafPolId?.id, data, obatValue));
setEdit(false);
};
const formatPriceInRupiah = (price) => {
return new Intl.NumberFormat("id-ID", {
style: "currency",
currency: "IDR",
}).format(price);
};
useEffect(() => {
dispatch(getDaftarPoli());
}, [dispatch]);
useEffect(() => {
dispatch(getPeriksa());
}, [dispatch]);
useEffect(() => {
if (idPeriksa !== "") {
dispatch(getPeriksaByDafPol(idPeriksa));
dispatch(getObat());
}
}, [dispatch, idPeriksa]);
useEffect(() => {
if (periksaByDafPolId?.id) {
dispatch(getDetailPriksaByPeriksaId(periksaByDafPolId?.id));
}
}, [dispatch, periksaByDafPolId?.id]);
useEffect(() => {
if (periksaByDafPolId) {
setEditForm({
id_daftar_poli: periksaByDafPolId.id_daftar_poli,
tgl_periksa: periksaByDafPolId.tanggal,
catatan: periksaByDafPolId.catatan,
biaya_periksa: obatValue.reduce(
(acc, curr) => acc + curr.harga,
150000
),
});
}
}, [periksaByDafPolId, obatValue]);
useEffect(() => {
if (detailPriksaByPriksaId?.length > 0) {
setObatValue([]); // Reset array obat menjadi kosong sebelum membangun kembali
detailPriksaByPriksaId?.forEach((item) => {
setObatValue((obat) => [
...obat,
{
value: item.obat.id,
label: item.obat.nama_obat,
harga: item.obat.harga,
},
]);
});
} else {
setObatValue([]); // Jika detailPriksaByPriksaId kosong, reset obat menjadi array kosong
}
}, [detailPriksaByPriksaId]);
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">Periksa</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 Periksa</h1>
</div>
<div className="overflow-x-auto mt-4">
<Table striped>
<Table.Head>
<Table.HeadCell>No</Table.HeadCell>
<Table.HeadCell>Nama Pasien</Table.HeadCell>
<Table.HeadCell>Keluhan</Table.HeadCell>
<Table.HeadCell>Aksi</Table.HeadCell>
</Table.Head>
<Table.Body className="divide-y">
{daftarPoli.map((item, index) => {
if (item.jadwal_periksa.id_dokter === id) {
index = 0;
return (
<>
<Table.Row key={index}>
<Table.Cell>{index + 1}</Table.Cell>
<Table.Cell>{item.pasien.nama}</Table.Cell>
<Table.Cell>{item.keluhan}</Table.Cell>
<Table.Cell width={150}>
{periksa?.find(
(periksa) => periksa.id_daftar_poli === item.id
) ? (
<button
className="bg-[#5C8374] p-2 rounded text-white mx-2 flex items-center"
onClick={() => handleEdit(item.id)}
>
<FaEdit className="mr-2" /> Edit
</button>
) : (
<Link
to={
"/dokter/daftar-periksa/periksa/" +
item.id +
"/" +
id
}
className="bg-[#1B4242] p-2 rounded text-white mx-2 flex items-center w-fit"
>
<FaStethoscope className="mr-2" /> Periksa
</Link>
)}
</Table.Cell>
</Table.Row>
</>
);
}
})}
<Modals
openModal={edit}
setOpenModal={() => setEdit(!edit)}
title={"Edit Periksa"}
buttonClose={false}
body={
<form className="flex flex-col" onSubmit={handleUpdate}>
<Input
label="Nama Pasien"
disabled
value={periksaByDafPolId?.daftar_poli?.pasien?.nama}
onChange={(e) =>
setEditForm({ ...editForm, nama: e.target.value })
}
/>
<Input
label="Tanggal Periksa"
type="datetime-local"
value={editForm.tgl_periksa}
onChange={(e) =>
setEditForm({
...editForm,
tgl_periksa: e.target.value,
})
}
/>
<Input
label="Catatan"
value={editForm.catatan}
onChange={(e) =>
setEditForm({ ...editForm, catatan: e.target.value })
}
/>
<ReactSelect
title="Obat"
value={obatValue}
isMulti
onChange={(e) => {
// Membuat objek baru dengan value, label, dan harga
const updatedObatValue = e.map((item) => ({
value: item.value,
label: item.label,
harga:
obat.find(
(obatItem) => obatItem.id === item.value
)?.harga || 0, // Mendapatkan harga dari obat yang cocok dengan value
}));
setObatValue(updatedObatValue); // Menetapkan nilai yang telah diperbarui ke dalam state obatValue
}}
data={obat.map((item) => ({
value: item.id,
label: item.nama_obat,
}))}
/>
<div className="my-3">
<label className="text-black text-sm font-normal mb-5">
Biaya Periksa
</label>
<h2 className="text-black text-md font-normal mb-5">
{formatPriceInRupiah(editForm.biaya_periksa)}
</h2>
</div>
<div className="flex justify-end mt-4">
<button
className="bg-[#1B4242] p-2 px-3 text-sm rounded-md text-white mx-2"
type="submit"
>
Simpan
</button>
</div>
</form>
}
/>
</Table.Body>
</Table>
</div>
</div>
</div>
</div>
);
};
export default DaftarPeriksa;