diff --git a/frontend/src/app/api/medical.ts b/frontend/src/app/api/medical.ts index 640a1de..fb1d2e2 100644 --- a/frontend/src/app/api/medical.ts +++ b/frontend/src/app/api/medical.ts @@ -158,14 +158,19 @@ export async function analyzeMedicalOcr( return parseEnvelope(res); } -export async function uploadMedicalRecord(body: MedicalUploadBody): Promise { +export async function uploadMedicalRecord(body: MedicalUploadBody): Promise { const petId = Number(getPetId()); const res = await safeFetch(`${API_BASE}/api/upload/medical`, { method: 'POST', headers: { 'Content-Type': 'application/json', ...authHeaders() }, body: JSON.stringify({ ...body, petId }), }); - return parseEnvelope(res); + if (!res.ok) return parseEnvelope(res); + try { + return await parseEnvelope(res); + } catch { + return null; + } } export async function getLatestMedicalSummary(): Promise { @@ -174,3 +179,4 @@ export async function getLatestMedicalSummary(): Promise { }); return parseEnvelope(res); } + diff --git a/frontend/src/app/components/HealthLogScreen.tsx b/frontend/src/app/components/HealthLogScreen.tsx index b6a741f..757b7af 100644 --- a/frontend/src/app/components/HealthLogScreen.tsx +++ b/frontend/src/app/components/HealthLogScreen.tsx @@ -71,7 +71,7 @@ const symptomChips = [ { id: 'itch', label: '가렀움', emoji: '🐾' }, { id: 'appetite', label: 'μ‹μš•λΆ€μ§„', emoji: '🍽️' }, { id: 'lethargy', label: 'κΈ°λ ₯μ €ν•˜', emoji: '😴' }, - { id: 'limp', label: 'θ·›θ‘Œ', emoji: '🦡' }, + { id: 'limp', label: 'νŒŒν–‰', emoji: '🦡' }, { id: 'eye', label: '눈 λΆ„λΉ„λ¬Ό', emoji: 'πŸ‘οΈ' }, { id: 'ear', label: 'κ·€ 긁음', emoji: 'πŸ‘‚' }, ]; @@ -601,3 +601,4 @@ export default function HealthLogScreen() { ); } + diff --git a/frontend/src/app/components/MedicalRecordsScreen.tsx b/frontend/src/app/components/MedicalRecordsScreen.tsx index 9c9df0c..e2c54a5 100644 --- a/frontend/src/app/components/MedicalRecordsScreen.tsx +++ b/frontend/src/app/components/MedicalRecordsScreen.tsx @@ -238,6 +238,7 @@ export default function MedicalRecordsScreen() {

처방 내역이 μ—†μ–΄μš”

)} + )} diff --git a/frontend/src/app/components/MedicalUploadScreen.tsx b/frontend/src/app/components/MedicalUploadScreen.tsx index 0633ddf..bd9fa9d 100644 --- a/frontend/src/app/components/MedicalUploadScreen.tsx +++ b/frontend/src/app/components/MedicalUploadScreen.tsx @@ -45,6 +45,7 @@ export default function MedicalUploadScreen() { const [analyzeStep, setAnalyzeStep] = useState(0); const [ocrData, setOcrData] = useState({ hospital: '', date: '', items: '', diagnosis: '', amount: '' }); const [showTypePicker, setShowTypePicker] = useState(false); + const [ocrImageUrls, setOcrImageUrls] = useState([]); const [ocrError, setOcrError] = useState(null); const [saving, setSaving] = useState(false); const [saveError, setSaveError] = useState(null); @@ -80,13 +81,6 @@ export default function MedicalUploadScreen() { }); }; - const readAsDataUrl = (file: File): Promise => new Promise((resolve, reject) => { - const reader = new FileReader(); - reader.onload = () => resolve(String(reader.result ?? '')); - reader.onerror = () => reject(new Error('Failed to read file')); - reader.readAsDataURL(file); - }); - const handleAnalyze = async () => { setScreenState('analyzing'); setAnalyzeStep(0); @@ -103,7 +97,8 @@ export default function MedicalUploadScreen() { clearInterval(interval); - const { extracted } = result; + const { extracted, imageUrls } = result; + setOcrImageUrls(imageUrls ?? []); setOcrData({ hospital: extracted.clinicName ?? '', date: extracted.visitDate || selectedDate, @@ -113,6 +108,7 @@ export default function MedicalUploadScreen() { }); } catch (e) { clearInterval(interval); + setOcrImageUrls([]); setOcrData({ hospital: '', date: selectedDate, items: '', diagnosis: '', amount: '' }); setOcrError(e instanceof Error ? e.message : 'OCR 뢄석에 μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€. 직접 μž…λ ₯ν•΄μ£Όμ„Έμš”.'); } @@ -125,11 +121,6 @@ export default function MedicalUploadScreen() { setSaving(true); setSaveError(null); try { - const base64List = await Promise.all(receiptFiles.map(readAsDataUrl)); - const imageBase64 = base64List.map(b => { - const idx = b.indexOf(','); - return idx >= 0 ? b.substring(idx + 1) : b; - }); await uploadMedicalRecord({ type: TYPE_MAP[medType], clinicName: ocrData.hospital, @@ -137,7 +128,7 @@ export default function MedicalUploadScreen() { content: ocrData.items, diagnosis: ocrData.diagnosis, totalCost: ocrData.amount, - image: imageBase64, + image: ocrImageUrls, }); navigate('/medical-records', { replace: true }); } catch (e) { @@ -417,3 +408,4 @@ export default function MedicalUploadScreen() { ); } +