Spaces:
Sleeping
Sleeping
'use client' | |
import { useState } from 'react' | |
import { | |
Container, | |
Paper, | |
Typography, | |
TextField, | |
Button, | |
Box, | |
Alert, | |
CircularProgress, | |
Chip, | |
Divider, | |
Stack | |
} from '@mui/material' | |
import MedicalInformationIcon from '@mui/icons-material/MedicalInformation' | |
import HealthAndSafetyIcon from '@mui/icons-material/HealthAndSafety' | |
import LocalHospitalIcon from '@mui/icons-material/LocalHospital' | |
const contohGejala = [ | |
'Sakit Kepala', | |
'Demam', | |
'Batuk', | |
'Kelelahan', | |
'Mual', | |
'Pilek', | |
'Nyeri Otot' | |
] | |
const contohRiwayat = [ | |
'Hipertensi', | |
'Diabetes', | |
'Asma', | |
'Alergi', | |
'Jantung', | |
'Maag' | |
] | |
export default function Home() { | |
const [gejala, setGejala] = useState('') | |
const [riwayatMedis, setRiwayatMedis] = useState('') | |
const [rekomendasi, setRekomendasi] = useState('') | |
const [loading, setLoading] = useState(false) | |
const handleSubmit = async (e: React.FormEvent) => { | |
e.preventDefault() | |
setLoading(true) | |
try { | |
const response = await fetch('/api/recommend', { | |
method: 'POST', | |
headers: { | |
'Content-Type': 'application/json', | |
}, | |
body: JSON.stringify({ | |
symptoms: gejala, | |
medicalHistory: riwayatMedis | |
}), | |
}) | |
const data = await response.json() | |
setRekomendasi(data.recommendation) | |
} catch (error) { | |
console.error('Gagal mendapatkan rekomendasi:', error) | |
} finally { | |
setLoading(false) | |
} | |
} | |
const tambahGejala = (gejala: string) => { | |
setGejala(prev => prev ? `${prev}, ${gejala}` : gejala) | |
} | |
const tambahRiwayat = (riwayat: string) => { | |
setRiwayatMedis(prev => prev ? `${prev}, ${riwayat}` : riwayat) | |
} | |
return ( | |
<Container maxWidth="md" sx={{ py: 4 }}> | |
<Paper elevation={3} sx={{ p: 4, borderRadius: 2 }}> | |
<Box display="flex" alignItems="center" gap={2} mb={4}> | |
<LocalHospitalIcon color="primary" sx={{ fontSize: 40 }} /> | |
<Typography variant="h4" component="h1" fontWeight="bold"> | |
Sistem Rekomendasi Obat | |
</Typography> | |
</Box> | |
<Alert severity="info" sx={{ mb: 4 }}> | |
Ini adalah alat berbasis AI untuk membantu tenaga kesehatan. Semua rekomendasi harus ditinjau oleh praktisi medis yang berkualifikasi. | |
</Alert> | |
<form onSubmit={handleSubmit}> | |
<Stack spacing={4}> | |
<Box> | |
<Typography variant="h6" display="flex" alignItems="center" gap={1} mb={2}> | |
<MedicalInformationIcon /> | |
Gejala Pasien | |
</Typography> | |
<TextField | |
fullWidth | |
multiline | |
rows={4} | |
value={gejala} | |
onChange={(e) => setGejala(e.target.value)} | |
placeholder="Masukkan gejala pasien..." | |
required | |
/> | |
<Box mt={2}> | |
<Typography variant="subtitle2" mb={1}>Contoh gejala:</Typography> | |
<Stack direction="row" spacing={1} flexWrap="wrap" gap={1}> | |
{contohGejala.map((gejala) => ( | |
<Chip | |
key={gejala} | |
label={gejala} | |
onClick={() => tambahGejala(gejala)} | |
clickable | |
/> | |
))} | |
</Stack> | |
</Box> | |
</Box> | |
<Box> | |
<Typography variant="h6" display="flex" alignItems="center" gap={1} mb={2}> | |
<HealthAndSafetyIcon /> | |
Riwayat Medis | |
</Typography> | |
<TextField | |
fullWidth | |
multiline | |
rows={4} | |
value={riwayatMedis} | |
onChange={(e) => setRiwayatMedis(e.target.value)} | |
placeholder="Masukkan riwayat medis pasien..." | |
required | |
/> | |
<Box mt={2}> | |
<Typography variant="subtitle2" mb={1}>Contoh kondisi:</Typography> | |
<Stack direction="row" spacing={1} flexWrap="wrap" gap={1}> | |
{contohRiwayat.map((riwayat) => ( | |
<Chip | |
key={riwayat} | |
label={riwayat} | |
onClick={() => tambahRiwayat(riwayat)} | |
clickable | |
/> | |
))} | |
</Stack> | |
</Box> | |
</Box> | |
<Button | |
type="submit" | |
variant="contained" | |
size="large" | |
disabled={loading} | |
startIcon={loading ? <CircularProgress size={20} /> : null} | |
> | |
{loading ? 'Menghasilkan Rekomendasi...' : 'Dapatkan Rekomendasi'} | |
</Button> | |
</Stack> | |
</form> | |
{rekomendasi && ( | |
<Box mt={4}> | |
<Divider sx={{ my: 4 }} /> | |
<Typography variant="h6" gutterBottom> | |
Rekomendasi Pengobatan | |
</Typography> | |
<Paper variant="outlined" sx={{ p: 3, bgcolor: 'background.default' }}> | |
<Typography whiteSpace="pre-wrap"> | |
{rekomendasi} | |
</Typography> | |
</Paper> | |
</Box> | |
)} | |
</Paper> | |
</Container> | |
) | |
} | |