// settlement-dashboard.tsx
import { useState } from 'react';
import { useSettlements, getStateInfo } from '@keystoneos/react';
import { StateBadge } from './state-badge';
import { StateFilter } from './state-filter';
import { Pagination } from './pagination';
const PAGE_SIZE = 20;
export function SettlementDashboard() {
const [stateFilter, setStateFilter] = useState<string | undefined>(undefined);
const [page, setPage] = useState(0);
const { settlements, total, isLoading, error } = useSettlements({
state: stateFilter,
limit: PAGE_SIZE,
offset: page * PAGE_SIZE,
});
const totalPages = Math.max(1, Math.ceil(total / PAGE_SIZE));
// Reset to first page when filter changes
const handleFilterChange = (state: string | undefined) => {
setStateFilter(state);
setPage(0);
};
if (error) {
return <div style={{ color: '#dc2626', padding: '16px' }}>Error: {error}</div>;
}
return (
<div style={{ padding: '24px' }}>
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '16px' }}>
<h1 style={{ fontSize: '24px', fontWeight: 700 }}>Settlements</h1>
<StateFilter value={stateFilter} onChange={handleFilterChange} />
</div>
{isLoading ? (
<div style={{ padding: '40px', textAlign: 'center', color: '#6b7280' }}>Loading settlements...</div>
) : settlements.length === 0 ? (
<div style={{ padding: '40px', textAlign: 'center', color: '#6b7280' }}>
No settlements found{stateFilter ? ` with state "${stateFilter}"` : ''}.
</div>
) : (
<>
<table style={{ width: '100%', borderCollapse: 'collapse' }}>
<thead>
<tr style={{ borderBottom: '2px solid #e5e7eb', textAlign: 'left' }}>
<th style={{ padding: '12px 8px' }}>Reference</th>
<th style={{ padding: '12px 8px' }}>State</th>
<th style={{ padding: '12px 8px' }}>Parties</th>
<th style={{ padding: '12px 8px', textAlign: 'right' }}>Asset</th>
<th style={{ padding: '12px 8px', textAlign: 'right' }}>Payment</th>
<th style={{ padding: '12px 8px' }}>Created</th>
</tr>
</thead>
<tbody>
{settlements.map(settlement => {
const assetLeg = settlement.legs.find(l => l.leg_type === 'asset_delivery');
const paymentLeg = settlement.legs.find(l => l.leg_type === 'payment');
return (
<tr
key={settlement.id}
onClick={() => window.location.href = `/settlements/${settlement.id}`}
style={{ borderBottom: '1px solid #f3f4f6', cursor: 'pointer' }}
onMouseEnter={e => (e.currentTarget.style.backgroundColor = '#f9fafb')}
onMouseLeave={e => (e.currentTarget.style.backgroundColor = 'transparent')}
>
<td style={{ padding: '12px 8px', fontFamily: 'monospace', fontSize: '13px' }}>
{settlement.external_reference ?? settlement.id.slice(0, 8)}
</td>
<td style={{ padding: '12px 8px' }}>
<StateBadge state={settlement.state} />
</td>
<td style={{ padding: '12px 8px', fontSize: '14px' }}>
{settlement.parties.map(p => p.name ?? p.external_reference).join(' / ')}
</td>
<td style={{ padding: '12px 8px', textAlign: 'right', fontFamily: 'monospace', fontSize: '13px' }}>
{assetLeg ? `${Number(assetLeg.quantity).toLocaleString()} ${assetLeg.instrument_id}` : '-'}
</td>
<td style={{ padding: '12px 8px', textAlign: 'right', fontFamily: 'monospace', fontSize: '13px' }}>
{paymentLeg ? `${Number(paymentLeg.quantity).toLocaleString()} ${paymentLeg.instrument_id}` : '-'}
</td>
<td style={{ padding: '12px 8px', fontSize: '14px', color: '#6b7280' }}>
{new Date(settlement.created_at).toLocaleDateString()}
</td>
</tr>
);
})}
</tbody>
</table>
<Pagination
page={page}
totalPages={totalPages}
total={total}
onPageChange={setPage}
/>
</>
)}
</div>
);
}