import React, { useEffect, useState } from 'react'; import './ContractBlock.css'; interface ContractBlockComponentProps { contractId: string; contractName: string; } interface ContractInfo { id: string; name: string; status: string; phase: string; contract_type: string; } const PHASE_COLORS: Record = { planning: '#3b82f6', execution: '#f59e0b', review: '#8b5cf6', completed: '#10b981', failed: '#ef4444', }; const STATUS_COLORS: Record = { active: '#10b981', running: '#10b981', idle: '#f59e0b', paused: '#f59e0b', completed: '#10b981', failed: '#ef4444', archived: '#6b7280', }; export function ContractBlockComponent({ contractId, contractName }: ContractBlockComponentProps) { const [contract, setContract] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { let cancelled = false; async function fetchContract() { try { const response = await fetch(`/api/v1/contracts/${contractId}`); if (!response.ok) throw new Error(`HTTP ${response.status}`); const data = await response.json(); if (!cancelled) { setContract(data.contract || data); setError(null); } } catch (err) { if (!cancelled) { setError(err instanceof Error ? err.message : 'Failed to load'); } } finally { if (!cancelled) setLoading(false); } } fetchContract(); return () => { cancelled = true; }; }, [contractId]); if (loading) { return (
Loading contract...
); } if (error) { return (
📦 {contractName}
Unable to load: {error}
); } const phase = contract?.phase?.toLowerCase() || 'unknown'; const status = contract?.status?.toLowerCase() || 'unknown'; const phaseColor = PHASE_COLORS[phase] || '#6b7280'; const statusColor = STATUS_COLORS[status] || '#6b7280'; return (
📦 {contract?.name || contractName} {phase}
{contract?.contract_type && (
{contract.contract_type}
)}
); }