import { Archive, Bell, Eye, Pencil, Trash2 } from "lucide-react"; import { useTranslation } from "react-i18next"; import type { Medication } from "../../types"; import { getMedDisplayName, getMedTotal, getStockDisplayCapacity, isAmountBasedPackageType } from "../../types"; import { formatDate, formatDateTime } from "../../utils/formatters"; import { getIntakeFrequencyText, getMedicationIntakes } from "../../utils/intake-schedule"; import { MedicationAvatar } from "../MedicationAvatar"; type MedicationListSectionProps = { orderedMeds: Medication[]; obsoleteMeds: Medication[]; editingId: number | null; showObsolete: boolean; coverageByMed: Record; onNewEntry: () => void; onOpenReport: () => void; onEdit: (med: Medication) => void; onView: (med: Medication) => void; onMarkObsolete: (med: Medication) => void; onDelete: (med: Medication) => void; onReactivate: (medId: number) => void; onToggleObsolete: () => void; onImagePreview: (med: Medication) => void; getMedicationPackageTypeLabel: (med: Medication) => string; getMedicationStockSuffix: (med: Medication) => string; getMedicationUsageUnitLabel: (med: Medication, usage: number) => string; }; export function MedicationListSection({ orderedMeds, obsoleteMeds, editingId, showObsolete, coverageByMed, onNewEntry, onOpenReport, onEdit, onView, onMarkObsolete, onDelete, onReactivate, onToggleObsolete, onImagePreview, getMedicationPackageTypeLabel, getMedicationStockSuffix, getMedicationUsageUnitLabel, }: MedicationListSectionProps) { const { t } = useTranslation(); const renderImageAvatar = (med: Medication) => ( med.imageUrl && onImagePreview(med)} onKeyDown={(e) => { if ((e.key === "Enter" || e.key === " ") && med.imageUrl) { onImagePreview(med); } }} > ); return (

{t("medications.list.title")}

{orderedMeds.map((med) => { const displayName = getMedDisplayName(med); const stockDisplayCapacity = getStockDisplayCapacity(med); const currentStock = coverageByMed[displayName] ? Math.round(coverageByMed[displayName].medsLeft) : getMedTotal(med); return (
{renderImageAvatar(med)}
{displayName}
{med.name && med.genericName &&
{med.genericName}
}
{editingId !== med.id && ( )}
{t("medications.details.type")}: {getMedicationPackageTypeLabel(med)} {!isAmountBasedPackageType(med.packageType) ? ( <> {t("medications.details.packs")}: {med.packCount} {t("medications.details.blisters")}: {med.blistersPerPack} {t("medications.details.pillsPerBlister")}: {med.pillsPerBlister} {t("medications.details.loose")}: {med.looseTablets} ) : ( {t("medications.details.totalCapacity")}:{" "} {med.totalPills ?? med.looseTablets} )}
{med.prescriptionEnabled && (
{t("prescription.remainingRefills")}: {med.prescriptionRemainingRefills ?? 0}
)}
{t("medications.details.stock")}: {currentStock} / {stockDisplayCapacity} {getMedicationStockSuffix(med)} {currentStock > stockDisplayCapacity ? ( {" "} ⚠️ ) : null}
{getMedicationIntakes(med).map((intake) => (
{intake.usage} {getMedicationUsageUnitLabel(med, intake.usage)} · {getIntakeFrequencyText(intake, t)} · {t("form.blisters.from")} {formatDateTime(intake.start)} {intake.takenBy && · {intake.takenBy}} {intake.intakeRemindersEnabled && ( {" "} )}
))}
); })}
{obsoleteMeds.length > 0 && (
{showObsolete && (
{obsoleteMeds.map((med) => (
{renderImageAvatar(med)}
{getMedDisplayName(med)}
{med.name && med.genericName &&
{med.genericName}
}
{med.medicationStartDate && ( {t("medications.list.started")}: {formatDate(med.medicationStartDate)} )} {t("medications.list.obsoleteSince")}: {formatDate(med.obsoleteAt)}
))}
)}
)}
); }