import React, { useEffect, useState } from 'react'; import { useParams, useNavigate, Link } from 'react-router-dom'; import { animalsApi, dailyStatusesApi } from '../api/client'; import { format } from 'date-fns'; import Button from '../components/ui/Button'; import Modal from '../components/ui/Modal'; import ConfirmDialog from '../components/ui/ConfirmDialog'; import DailyStatusForm from '../components/DailyStatusForm'; import Alert from '../components/ui/Alert'; import AuditLogSection from '../components/AuditLogSection'; export default function AnimalDetail() { const { id } = useParams(); const navigate = useNavigate(); const [animal, setAnimal] = useState(null); const [statuses, setStatuses] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [successMsg, setSuccessMsg] = useState(null); const [showAddStatus, setShowAddStatus] = useState(false); const [editStatus, setEditStatus] = useState(null); const [deleteStatus, setDeleteStatus] = useState(null); const [deleteLoading, setDeleteLoading] = useState(false); async function load() { setLoading(true); setError(null); try { const [animalData, statusData] = await Promise.all([ animalsApi.get(id), dailyStatusesApi.list(id), ]); setAnimal(animalData); setStatuses(statusData); } catch (err) { setError(err.message); } finally { setLoading(false); } } useEffect(() => { load(); }, [id]); function flash(msg) { setSuccessMsg(msg); setTimeout(() => setSuccessMsg(null), 3000); } function handleStatusSaved() { setShowAddStatus(false); setEditStatus(null); load(); flash(editStatus ? 'Daily status updated.' : 'Daily status logged.'); } async function handleDeleteStatus() { setDeleteLoading(true); try { await dailyStatusesApi.delete(deleteStatus.id); setDeleteStatus(null); load(); flash('Daily status removed.'); } catch (err) { setError(err.message); setDeleteStatus(null); } finally { setDeleteLoading(false); } } if (loading) return
Loading…
; if (error) return (
); return (
{/* Breadcrumb */}

{animal.animal_name}

ID: {animal.animal_id_string} {' · '} {statuses.length} daily status {statuses.length !== 1 ? 'entries' : 'entry'}

{successMsg && } {error && setError(null)} />} {statuses.length === 0 ? (

No daily statuses logged yet.

) : (
{statuses.map((s) => (
{format(new Date(s.date), 'MMMM d, yyyy')}
{[ ['Experiment Description', s.experiment_description], ['Vitals', s.vitals], ['Treatment', s.treatment], ['Notes', s.notes], ] .filter(([, v]) => v) .map(([label, value]) => (
{label}
{value}
))}
{!s.experiment_description && !s.vitals && !s.treatment && !s.notes && (

No details recorded for this date.

)}
))}
)} setShowAddStatus(false)} title="Log Daily Status" size="lg"> setShowAddStatus(false)} /> setEditStatus(null)} title="Edit Daily Status" size="lg"> setEditStatus(null)} /> setDeleteStatus(null)} onConfirm={handleDeleteStatus} loading={deleteLoading} title="Delete Daily Status" message={`Delete the status entry for ${deleteStatus ? format(new Date(deleteStatus.date), 'MMMM d, yyyy') : ''}?`} />
); }