diff --git a/maternal-web/app/track/feeding/page.tsx b/maternal-web/app/track/feeding/page.tsx index 3728f2d..32731c2 100644 --- a/maternal-web/app/track/feeding/page.tsx +++ b/maternal-web/app/track/feeding/page.tsx @@ -53,6 +53,7 @@ import { FormSkeleton, ActivityListSkeleton } from '@/components/common/LoadingS import { motion } from 'framer-motion'; import { useLocalizedDate } from '@/hooks/useLocalizedDate'; import { useTranslation } from '@/hooks/useTranslation'; +import { UnitInput } from '@/components/forms/UnitInput'; interface FeedingData { feedingType: 'breast' | 'bottle' | 'solid'; @@ -80,7 +81,7 @@ function FeedingTrackPage() { const [timerSeconds, setTimerSeconds] = useState(0); // Bottle feeding state - const [amount, setAmount] = useState(''); + const [amount, setAmount] = useState(0); // Stored in ml (metric) const [bottleType, setBottleType] = useState<'formula' | 'breastmilk' | 'other'>('formula'); // Solid food state @@ -218,7 +219,7 @@ function FeedingTrackPage() { data.side = side; data.duration = duration || Math.floor(timerSeconds / 60); } else if (feedingType === 'bottle') { - data.amount = parseFloat(amount); + data.amount = amount; // Already in ml (metric) data.bottleType = bottleType; } else if (feedingType === 'solid') { data.foodDescription = foodDescription; @@ -252,7 +253,7 @@ function FeedingTrackPage() { setDuration(0); setTimerSeconds(0); setIsTimerRunning(false); - setAmount(''); + setAmount(0); setBottleType('formula'); setFoodDescription(''); setAmountDescription(''); @@ -377,7 +378,7 @@ function FeedingTrackPage() { // Auto-fill form with voice data if (data.type === 'bottle' && data.amount) { setFeedingType('bottle'); - setAmount(data.amount.toString()); + setAmount(typeof data.amount === 'number' ? data.amount : parseFloat(data.amount)); } else if (data.type?.includes('breast')) { setFeedingType('breast'); if (data.side) setSide(data.side); @@ -506,12 +507,12 @@ function FeedingTrackPage() { {/* Bottle Form */} {feedingType === 'bottle' && ( - setAmount(e.target.value)} + onChange={(metricValue) => setAmount(metricValue)} sx={{ mb: 3 }} /> diff --git a/maternal-web/app/track/medicine/page.tsx b/maternal-web/app/track/medicine/page.tsx index d883b2a..16953c3 100644 --- a/maternal-web/app/track/medicine/page.tsx +++ b/maternal-web/app/track/medicine/page.tsx @@ -45,6 +45,7 @@ import { FormSkeleton, ActivityListSkeleton } from '@/components/common/LoadingS import { motion } from 'framer-motion'; import { useLocalizedDate } from '@/hooks/useLocalizedDate'; import { useTranslation } from '@/hooks/useTranslation'; +import { UnitInput } from '@/components/forms/UnitInput'; interface MedicineData { medicineName: string; @@ -64,7 +65,8 @@ function MedicineTrackPage() { // Medicine state const [medicineName, setMedicineName] = useState(''); - const [dosage, setDosage] = useState(''); + const [dosage, setDosage] = useState(0); // For ml/liquid - stored in ml + const [dosageText, setDosageText] = useState(''); // For non-liquid units const [unit, setUnit] = useState('ml'); const [route, setRoute] = useState<'oral' | 'topical' | 'injection' | 'other'>('oral'); const [reason, setReason] = useState(''); @@ -146,7 +148,8 @@ function MedicineTrackPage() { return; } - if (!dosage) { + const dosageValue = unit === 'ml' ? dosage : dosageText; + if (!dosageValue || (unit === 'ml' && dosage === 0) || (unit !== 'ml' && !dosageText)) { setError('Please enter dosage'); return; } @@ -157,7 +160,7 @@ function MedicineTrackPage() { const data: MedicineData = { medicineName, - dosage, + dosage: unit === 'ml' ? dosage.toString() : dosageText, unit, route, reason: reason || undefined, @@ -187,7 +190,8 @@ function MedicineTrackPage() { const resetForm = () => { setMedicineName(''); - setDosage(''); + setDosage(0); + setDosageText(''); setUnit('ml'); setRoute('oral'); setReason(''); @@ -297,8 +301,14 @@ function MedicineTrackPage() { const data = result.structuredData; // Auto-fill form with voice data if (data.medicineName) setMedicineName(data.medicineName); - if (data.dosage) setDosage(data.dosage.toString()); if (data.unit) setUnit(data.unit); + if (data.dosage) { + if (data.unit === 'ml') { + setDosage(typeof data.dosage === 'number' ? data.dosage : parseFloat(data.dosage)); + } else { + setDosageText(data.dosage.toString()); + } + } if (data.route) setRoute(data.route); if (data.reason) setReason(data.reason); } @@ -358,20 +368,40 @@ function MedicineTrackPage() { /> - setDosage(e.target.value)} - placeholder="e.g., 5, 2.5" - required - /> + {unit === 'ml' ? ( + setDosage(metricValue)} + required + /> + ) : ( + setDosageText(e.target.value)} + placeholder="e.g., 5, 2.5" + required + /> + )} Unit