Merge pull request 'Add error handling for API failures to prevent blank screen' (#8) from fix/dog-form-litter-ui into master
Reviewed-on: #8
This commit was merged in pull request #8.
This commit is contained in:
@@ -20,7 +20,8 @@ function DogForm({ dog, onClose, onSave }) {
|
|||||||
const [litters, setLitters] = useState([])
|
const [litters, setLitters] = useState([])
|
||||||
const [loading, setLoading] = useState(false)
|
const [loading, setLoading] = useState(false)
|
||||||
const [error, setError] = useState('')
|
const [error, setError] = useState('')
|
||||||
const [useManuaParents, setUseManualParents] = useState(false)
|
const [useManualParents, setUseManualParents] = useState(true)
|
||||||
|
const [littersAvailable, setLittersAvailable] = useState(false)
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
fetchDogs()
|
fetchDogs()
|
||||||
@@ -46,18 +47,29 @@ function DogForm({ dog, onClose, onSave }) {
|
|||||||
const fetchDogs = async () => {
|
const fetchDogs = async () => {
|
||||||
try {
|
try {
|
||||||
const res = await axios.get('/api/dogs')
|
const res = await axios.get('/api/dogs')
|
||||||
setDogs(res.data)
|
setDogs(res.data || [])
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error fetching dogs:', error)
|
console.error('Error fetching dogs:', error)
|
||||||
|
setDogs([])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const fetchLitters = async () => {
|
const fetchLitters = async () => {
|
||||||
try {
|
try {
|
||||||
const res = await axios.get('/api/litters')
|
const res = await axios.get('/api/litters')
|
||||||
setLitters(res.data)
|
const litterData = res.data || []
|
||||||
|
setLitters(litterData)
|
||||||
|
setLittersAvailable(litterData.length > 0)
|
||||||
|
// Only default to manual if no litters exist
|
||||||
|
if (litterData.length === 0) {
|
||||||
|
setUseManualParents(true)
|
||||||
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error fetching litters:', error)
|
console.error('Error fetching litters:', error)
|
||||||
|
// If endpoint fails, gracefully fallback to manual mode
|
||||||
|
setLitters([])
|
||||||
|
setLittersAvailable(false)
|
||||||
|
setUseManualParents(true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -211,28 +223,32 @@ function DogForm({ dog, onClose, onSave }) {
|
|||||||
<div style={{ marginTop: '1.5rem', padding: '1rem', background: 'rgba(99, 102, 241, 0.05)', borderRadius: '8px', border: '1px solid rgba(99, 102, 241, 0.2)' }}>
|
<div style={{ marginTop: '1.5rem', padding: '1rem', background: 'rgba(99, 102, 241, 0.05)', borderRadius: '8px', border: '1px solid rgba(99, 102, 241, 0.2)' }}>
|
||||||
<label className="label" style={{ marginBottom: '0.75rem', display: 'block', fontWeight: '600' }}>Parent Information</label>
|
<label className="label" style={{ marginBottom: '0.75rem', display: 'block', fontWeight: '600' }}>Parent Information</label>
|
||||||
|
|
||||||
<div style={{ display: 'flex', gap: '1.5rem', marginBottom: '1rem', flexWrap: 'wrap' }}>
|
{littersAvailable && (
|
||||||
<label style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', cursor: 'pointer', fontSize: '0.95rem' }}>
|
<div style={{ display: 'flex', gap: '1.5rem', marginBottom: '1rem', flexWrap: 'wrap' }}>
|
||||||
<input
|
<label style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', cursor: 'pointer', fontSize: '0.95rem' }}>
|
||||||
type="radio"
|
<input
|
||||||
checked={!useManualParents}
|
type="radio"
|
||||||
onChange={() => setUseManualParents(false)}
|
name="parentMode"
|
||||||
style={{ width: '16px', height: '16px' }}
|
checked={!useManualParents}
|
||||||
/>
|
onChange={() => setUseManualParents(false)}
|
||||||
<span>Link to Litter</span>
|
style={{ width: '16px', height: '16px' }}
|
||||||
</label>
|
/>
|
||||||
<label style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', cursor: 'pointer', fontSize: '0.95rem' }}>
|
<span>Link to Litter</span>
|
||||||
<input
|
</label>
|
||||||
type="radio"
|
<label style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', cursor: 'pointer', fontSize: '0.95rem' }}>
|
||||||
checked={useManualParents}
|
<input
|
||||||
onChange={() => setUseManualParents(true)}
|
type="radio"
|
||||||
style={{ width: '16px', height: '16px' }}
|
name="parentMode"
|
||||||
/>
|
checked={useManualParents}
|
||||||
<span>Manual Parent Selection</span>
|
onChange={() => setUseManualParents(true)}
|
||||||
</label>
|
style={{ width: '16px', height: '16px' }}
|
||||||
</div>
|
/>
|
||||||
|
<span>Manual Parent Selection</span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
{!useManualParents ? (
|
{!useManualParents && littersAvailable ? (
|
||||||
<div className="form-group" style={{ marginTop: '0.5rem' }}>
|
<div className="form-group" style={{ marginTop: '0.5rem' }}>
|
||||||
<label className="label">Select Litter</label>
|
<label className="label">Select Litter</label>
|
||||||
<select
|
<select
|
||||||
|
|||||||
Reference in New Issue
Block a user