blob: 77012db728da67fd77d918c23f73c70ab4b3c7b2 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
import React, { useEffect, useState } from 'react'
import { Link } from 'react-router-dom'
interface ContractSummary {
id: string
name: string
description?: string
contract_type: string
phase: string
status: string
file_count: number
task_count: number
repository_count: number
created_at: string
}
export function ContractList() {
const [contracts, setContracts] = useState<ContractSummary[]>([])
const [loading, setLoading] = useState(true)
const [error, setError] = useState<string | null>(null)
useEffect(() => {
async function fetchContracts() {
try {
setLoading(true)
const response = await fetch('/api/v1/contracts')
if (!response.ok) {
throw new Error(`Failed to fetch contracts: ${response.statusText}`)
}
const data = await response.json()
setContracts(data.contracts || [])
} catch (err) {
setError(err instanceof Error ? err.message : 'Unknown error')
} finally {
setLoading(false)
}
}
fetchContracts()
}, [])
if (loading) {
return (
<div className="contract-list-container">
<div className="loading">Loading contracts...</div>
</div>
)
}
if (error) {
return (
<div className="contract-list-container">
<div className="error">Error: {error}</div>
</div>
)
}
return (
<div className="contract-list-container">
<h1>Contracts</h1>
{contracts.length === 0 ? (
<p>No contracts found</p>
) : (
<ul className="contract-list">
{contracts.map((contract) => (
<li key={contract.id} className="contract-item">
<Link to={`/contracts/${contract.id}`}>
<h2>{contract.name}</h2>
{contract.description && <p>{contract.description}</p>}
<div className="contract-meta">
<span>Phase: {contract.phase}</span>
<span>Status: {contract.status}</span>
<span>Files: {contract.file_count}</span>
<span>Tasks: {contract.task_count}</span>
</div>
</Link>
</li>
))}
</ul>
)}
</div>
)
}
|