import { createMemo, createResource, createSignal, For, Show } from 'solid-js'; const API = '/api/gateway'; type Requirement = { id: string; customerId?: string; title?: string; status?: string; }; type ResponseRow = { id: string; requirementId: string; professionalId: string; professionalName?: string; quote?: number; message?: string; status: string; createdAt?: string; }; type ResponsesPayload = { responses: ResponseRow[]; requirements: Requirement[]; }; async function fetchResponses(): Promise { const [resRes, reqRes] = await Promise.all([ fetch(`${API}/api/responses`), fetch(`${API}/api/requirements`), ]); const resData = resRes.ok ? await resRes.json() : {}; const reqData = reqRes.ok ? await reqRes.json() : {}; return { responses: resData?.responses || [], requirements: reqData?.requirements || [], }; } export default function ResponsesPage() { const [refreshToken, setRefreshToken] = createSignal(0); const [error, setError] = createSignal(''); const [busyId, setBusyId] = createSignal(''); const [payload] = createResource(refreshToken, fetchResponses); const responses = createMemo(() => payload()?.responses || []); const requirements = createMemo(() => payload()?.requirements || []); function requirementTitle(id: string): string { return requirements().find((item) => item.id === id)?.title || id; } function statusBadge(status: string) { if (status === 'ACCEPTED') return 'bg-green-100 text-green-800'; if (status === 'REJECTED') return 'bg-red-100 text-red-700'; if (status === 'SHORTLISTED') return 'bg-blue-100 text-blue-700'; return 'bg-yellow-100 text-yellow-800'; } async function transition(id: string, status: string) { setError(''); setBusyId(id); try { const res = await fetch(`${API}/api/responses/${id}/status`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ status }), }); if (!res.ok) { const message = await res.text(); throw new Error(message || 'Failed to update response'); } setRefreshToken((value) => value + 1); } catch (nextError: any) { setError(nextError?.message || 'Failed to update response'); } finally { setBusyId(''); } } return (
{/* ── Page header ── */}

Responses

Track professional responses and move them through shortlist, accept, or reject states.

{/* ── Content ── */}
{error()}

Loading responses…

No responses yet.

{(row) => (

{requirementTitle(row.requirementId)}

{row.status}

{row.message || 'No message'}

Professional: {row.professionalName || row.professionalId} Quote: {row.quote || 0} {new Date(row.createdAt!).toLocaleDateString()}
)}
); }