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) {