Compare commits

..

2 Commits

Author SHA1 Message Date
Daniel Volz d2bf5e61c0 chore: release v1.7.1 (#93) 2026-02-03 05:58:54 +01:00
Daniel Volz 31a89356fe fix: prevent crash when takenBy is not an array (#92)
- Add Array.isArray() checks before calling .map() on dose.takenBy
- Fixes TypeError: dose.takenBy.map is not a function
- Affects AppContext missedPastDoseIds calculation
- Affects SchedulePage dose ID generation (3 locations)

This hotfix prevents the app from crashing when dose.takenBy
is null, undefined, or any non-array value.
2026-02-03 05:57:11 +01:00
4 changed files with 16 additions and 12 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "medassist-ng-backend", "name": "medassist-ng-backend",
"version": "1.7.0", "version": "1.7.1",
"private": true, "private": true,
"type": "module", "type": "module",
"scripts": { "scripts": {
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "medassist-ng-frontend", "name": "medassist-ng-frontend",
"private": true, "private": true,
"version": "1.7.0", "version": "1.7.1",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
+2 -1
View File
@@ -480,7 +480,8 @@ export function AppProvider({ children }: { children: React.ReactNode }) {
return []; return [];
} }
return (dose.takenBy || []).length > 0 ? dose.takenBy.map((p: string) => `${dose.id}-${p}`) : [dose.id]; const takenByArray = Array.isArray(dose.takenBy) ? dose.takenBy : [];
return takenByArray.length > 0 ? takenByArray.map((p: string) => `${dose.id}-${p}`) : [dose.id];
}); });
}) })
); );
+12 -9
View File
@@ -126,9 +126,10 @@ export function SchedulePage() {
{showPastDays && {showPastDays &&
pastDays.map((day) => { pastDays.map((day) => {
const allDoseIds = day.meds.flatMap((item) => const allDoseIds = day.meds.flatMap((item) =>
item.doses.flatMap((d) => item.doses.flatMap((d) => {
(d.takenBy || []).length > 0 ? d.takenBy.map((p) => `${d.id}-${p}`) : [d.id] const takenByArray = Array.isArray(d.takenBy) ? d.takenBy : [];
) return takenByArray.length > 0 ? takenByArray.map((p) => `${d.id}-${p}`) : [d.id];
})
); );
const allDayTaken = allDoseIds.length > 0 && allDoseIds.every((id) => takenDoses.has(id)); const allDayTaken = allDoseIds.length > 0 && allDoseIds.every((id) => takenDoses.has(id));
const takenCount = allDoseIds.filter((id) => takenDoses.has(id)).length; const takenCount = allDoseIds.filter((id) => takenDoses.has(id)).length;
@@ -171,9 +172,10 @@ export function SchedulePage() {
const med = meds.find((m) => m.name === item.medName); const med = meds.find((m) => m.name === item.medName);
const medCov = coverageByMed[item.medName]; const medCov = coverageByMed[item.medName];
const isEmpty = medCov ? medCov.medsLeft <= 0 : false; const isEmpty = medCov ? medCov.medsLeft <= 0 : false;
const itemDoseIds = item.doses.flatMap((d) => const itemDoseIds = item.doses.flatMap((d) => {
(d.takenBy || []).length > 0 ? d.takenBy.map((p) => `${d.id}-${p}`) : [d.id] const takenByArray = Array.isArray(d.takenBy) ? d.takenBy : [];
); return takenByArray.length > 0 ? takenByArray.map((p) => `${d.id}-${p}`) : [d.id];
});
const allTaken = itemDoseIds.every((id) => takenDoses.has(id)); const allTaken = itemDoseIds.every((id) => takenDoses.has(id));
return ( return (
<div key={`${day.dateStr}-${item.medName}`} className={`time-row ${allTaken ? "taken" : ""}`}> <div key={`${day.dateStr}-${item.medName}`} className={`time-row ${allTaken ? "taken" : ""}`}>
@@ -275,9 +277,10 @@ export function SchedulePage() {
: medCoverage : medCoverage
? getStockStatus(medCoverage.daysLeft, medCoverage.medsLeft, settings) ? getStockStatus(medCoverage.daysLeft, medCoverage.medsLeft, settings)
: null; : null;
const itemDoseIds = item.doses.flatMap((d) => const itemDoseIds = item.doses.flatMap((d) => {
(d.takenBy || []).length > 0 ? d.takenBy.map((p) => `${d.id}-${p}`) : [d.id] const takenByArray = Array.isArray(d.takenBy) ? d.takenBy : [];
); return takenByArray.length > 0 ? takenByArray.map((p) => `${d.id}-${p}`) : [d.id];
});
const allTaken = itemDoseIds.every((id) => takenDoses.has(id)); const allTaken = itemDoseIds.every((id) => takenDoses.has(id));
return ( return (
<div key={`${day.dateStr}-${item.medName}`} className={`time-row ${allTaken ? "taken" : ""}`}> <div key={`${day.dateStr}-${item.medName}`} className={`time-row ${allTaken ? "taken" : ""}`}>