diff --git a/src/components/settings.tsx b/src/components/settings.tsx
index a989263..c37e6b7 100644
--- a/src/components/settings.tsx
+++ b/src/components/settings.tsx
@@ -193,7 +193,7 @@ const Settings = ({
onUpdatePkParams('damph', { halfLife: val })}
+ onChange={val => onUpdatePkParams('damph', { ...pkParams.damph, halfLife: val })}
increment={0.5}
min={0.1}
unit="h"
@@ -209,7 +209,7 @@ const Settings = ({
onUpdatePkParams('ldx', { halfLife: val })}
+ onChange={val => onUpdatePkParams('ldx', { ...pkParams.ldx, halfLife: val })}
increment={0.1}
min={0.1}
unit="h"
@@ -222,7 +222,7 @@ const Settings = ({
onUpdatePkParams('ldx', { absorptionRate: val })}
+ onChange={val => onUpdatePkParams('ldx', { ...pkParams.ldx, absorptionRate: val })}
increment={0.1}
min={0.1}
unit={t('faster')}
diff --git a/src/locales/de.ts b/src/locales/de.ts
index 87bb83f..f01499d 100644
--- a/src/locales/de.ts
+++ b/src/locales/de.ts
@@ -100,6 +100,11 @@ export const de = {
errorTimeRequired: "Bitte gib eine gültige Zeitangabe ein.",
warningDuplicateTime: "Mehrere Dosen zur gleichen Zeit.",
warningZeroDose: "Nulldosis hat keine Auswirkung auf die Simulation.",
+ halfLifeRequired: "Halbwertszeit ist erforderlich.",
+ conversionHalfLifeRequired: "Umwandlungs-Halbwertszeit ist erforderlich.",
+ absorptionRateRequired: "Absorptionsrate ist erforderlich.",
+ therapeuticRangeMinRequired: "Minimaler therapeutischer Bereich ist erforderlich.",
+ therapeuticRangeMaxRequired: "Maximaler therapeutischer Bereich ist erforderlich.",
// Day-based schedule
regularPlan: "Regulärer Plan",
diff --git a/src/locales/en.ts b/src/locales/en.ts
index 4642e10..235ac3e 100644
--- a/src/locales/en.ts
+++ b/src/locales/en.ts
@@ -99,6 +99,11 @@ export const en = {
errorTimeRequired: "Please enter a valid time.",
warningDuplicateTime: "Multiple doses at same time.",
warningZeroDose: "Zero dose has no effect on simulation.",
+ halfLifeRequired: "Half-life is required.",
+ conversionHalfLifeRequired: "Conversion half-life is required.",
+ absorptionRateRequired: "Absorption rate is required.",
+ therapeuticRangeMinRequired: "Minimum therapeutic range is required.",
+ therapeuticRangeMaxRequired: "Maximum therapeutic range is required.",
// Time picker
timePickerHour: "Hour",
diff --git a/src/utils/pharmacokinetics.ts b/src/utils/pharmacokinetics.ts
index 7ee87e0..688da18 100644
--- a/src/utils/pharmacokinetics.ts
+++ b/src/utils/pharmacokinetics.ts
@@ -25,9 +25,20 @@ export const calculateSingleDoseConcentration = (
const numDose = parseFloat(dose) || 0;
if (timeSinceDoseHours < 0 || numDose <= 0) return { ldx: 0, damph: 0 };
- const ka_ldx = Math.log(2) / (parseFloat(pkParams.ldx.absorptionRate) || 1);
- const k_conv = Math.log(2) / (parseFloat(pkParams.ldx.halfLife) || 1);
- const ke_damph = Math.log(2) / (parseFloat(pkParams.damph.halfLife) || 1);
+ const absorptionRate = parseFloat(pkParams.ldx.absorptionRate);
+ const conversionHalfLife = parseFloat(pkParams.ldx.halfLife);
+ const damphHalfLife = parseFloat(pkParams.damph.halfLife);
+
+ // Validate parameters to avoid division by zero or invalid calculations
+ if (isNaN(absorptionRate) || absorptionRate <= 0 ||
+ isNaN(conversionHalfLife) || conversionHalfLife <= 0 ||
+ isNaN(damphHalfLife) || damphHalfLife <= 0) {
+ return { ldx: 0, damph: 0 };
+ }
+
+ const ka_ldx = Math.log(2) / absorptionRate;
+ const k_conv = Math.log(2) / conversionHalfLife;
+ const ke_damph = Math.log(2) / damphHalfLife;
let ldxConcentration = 0;
if (Math.abs(ka_ldx - k_conv) > 0.0001) {