import { createMemo, createResource, createSignal, For, Show } from 'solid-js'; import AdminShell from '~/components/AdminShell'; const API = '/api/gateway'; type ApplicationRow = { id: string; requirementId: string; professionalId: string; status: string; quote?: number; message?: string; createdAt?: string; }; type Requirement = { id: string; title?: string; location?: string; profession?: string; customerId?: string; }; type ApplicationsPayload = { applications: ApplicationRow[]; requirements: Requirement[]; }; async function fetchApplications(): Promise { const [appRes, reqRes] = await Promise.all([ fetch(`${API}/api/responses`), fetch(`${API}/api/requirements`), ]); const appData = appRes.ok ? await appRes.json() : {}; const reqData = reqRes.ok ? await reqRes.json() : {}; return { applications: appData?.responses || appData?.applications || [], requirements: reqData?.requirements || [], }; } export default function ApplicationsPage() { const [refreshToken, setRefreshToken] = createSignal(0); const [busyId, setBusyId] = createSignal(''); const [error, setError] = createSignal(''); const [payload] = createResource(refreshToken, fetchApplications); const applications = createMemo(() => payload()?.applications || []); const requirements = createMemo(() => payload()?.requirements || []); async function updateStatus(id: string, status: string) { setBusyId(id); setError(''); 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 status'); } setRefreshToken((value) => value + 1); } catch (nextError: any) { setError(nextError?.message || 'Failed to update status'); } finally { setBusyId(''); } } function requirementFor(id: string): Requirement | undefined { return requirements().find((item) => item.id === id); } function statusBadge(status: string) { if (status === 'ACCEPTED') return 'bg-green-100 text-green-800'; if (status === 'REJECTED' || status === 'WITHDRAWN') return 'bg-red-100 text-red-700'; return 'bg-yellow-100 text-yellow-800'; } return (
{/* ── Page header ── */}

Applications

Review submitted applications and update acceptance status.

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

Loading applications…

No applications found.

{(app) => { const req = createMemo(() => requirementFor(app.requirementId)); return (

{req()?.title || 'Unknown Requirement'}

ID: {app.id}

{app.status}

Message

{app.message || 'No message provided.'}

Quote

₹ {app.quote || 0}

Category

{req()?.profession || '—'}

Location

{req()?.location || '—'}

Applied On

{app.createdAt ? new Date(app.createdAt).toLocaleDateString() : '—'}

); }}
); }