|
|
import { useEffect, useState } from "react"; |
|
|
import { apiClient } from "../api/client"; |
|
|
|
|
|
interface CaseSelectorProps { |
|
|
selectedCase: string | null; |
|
|
onSelectCase: (caseId: string) => void; |
|
|
} |
|
|
|
|
|
export function CaseSelector({ |
|
|
selectedCase, |
|
|
onSelectCase, |
|
|
}: CaseSelectorProps) { |
|
|
const [cases, setCases] = useState<string[]>([]); |
|
|
const [isLoading, setIsLoading] = useState(true); |
|
|
const [error, setError] = useState<string | null>(null); |
|
|
|
|
|
useEffect(() => { |
|
|
const abortController = new AbortController(); |
|
|
|
|
|
const fetchCases = async () => { |
|
|
try { |
|
|
const data = await apiClient.getCases(abortController.signal); |
|
|
setCases(data.cases); |
|
|
} catch (err) { |
|
|
|
|
|
if (err instanceof Error && err.name === "AbortError") return; |
|
|
|
|
|
const message = err instanceof Error ? err.message : "Unknown error"; |
|
|
setError(`Failed to load cases: ${message}`); |
|
|
} finally { |
|
|
if (!abortController.signal.aborted) { |
|
|
setIsLoading(false); |
|
|
} |
|
|
} |
|
|
}; |
|
|
|
|
|
fetchCases(); |
|
|
|
|
|
return () => abortController.abort(); |
|
|
}, []); |
|
|
|
|
|
if (isLoading) { |
|
|
return ( |
|
|
<div className="bg-gray-800 rounded-lg p-4"> |
|
|
<p className="text-gray-400">Loading cases...</p> |
|
|
</div> |
|
|
); |
|
|
} |
|
|
|
|
|
if (error) { |
|
|
return ( |
|
|
<div className="bg-red-900/50 rounded-lg p-4"> |
|
|
<p className="text-red-300">{error}</p> |
|
|
</div> |
|
|
); |
|
|
} |
|
|
|
|
|
return ( |
|
|
<div className="bg-gray-800 rounded-lg p-4"> |
|
|
<label className="block text-sm font-medium mb-2">Select Case</label> |
|
|
<select |
|
|
value={selectedCase || ""} |
|
|
onChange={(e) => onSelectCase(e.target.value)} |
|
|
className="w-full bg-gray-700 border border-gray-600 rounded-lg px-3 py-2 |
|
|
text-white focus:ring-2 focus:ring-blue-500 focus:border-transparent" |
|
|
> |
|
|
<option value="">Choose a case...</option> |
|
|
{cases.map((caseId) => ( |
|
|
<option key={caseId} value={caseId}> |
|
|
{caseId} |
|
|
</option> |
|
|
))} |
|
|
</select> |
|
|
</div> |
|
|
); |
|
|
} |
|
|
|