import React, { useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { experimentsApi } from '../api/client'; import Button from '../components/ui/Button'; import Modal from '../components/ui/Modal'; import ConfirmDialog from '../components/ui/ConfirmDialog'; import ExperimentForm from '../components/ExperimentForm'; import Alert from '../components/ui/Alert'; import { format } from 'date-fns'; import AuditLogSection from '../components/AuditLogSection'; export default function Dashboard() { const navigate = useNavigate(); const [experiments, setExperiments] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [showCreateModal, setShowCreateModal] = useState(false); const [editTarget, setEditTarget] = useState(null); const [deleteTarget, setDeleteTarget] = useState(null); const [deleteLoading, setDeleteLoading] = useState(false); const [successMsg, setSuccessMsg] = useState(null); async function loadExperiments() { setLoading(true); setError(null); try { const data = await experimentsApi.list(); setExperiments(data); } catch (err) { setError(err.message); } finally { setLoading(false); } } useEffect(() => { loadExperiments(); }, []); function flash(msg) { setSuccessMsg(msg); setTimeout(() => setSuccessMsg(null), 3000); } function handleCreated(exp) { setShowCreateModal(false); loadExperiments(); flash(`Experiment "${exp.title}" created.`); } function handleUpdated(exp) { setEditTarget(null); loadExperiments(); flash(`Experiment "${exp.title}" updated.`); } async function handleDelete() { setDeleteLoading(true); try { await experimentsApi.delete(deleteTarget.id); setDeleteTarget(null); loadExperiments(); flash('Experiment deleted.'); } catch (err) { setError(err.message); setDeleteTarget(null); } finally { setDeleteLoading(false); } } return (
Manage all animal experimental studies
No experiments yet
Create your first experiment to get started.