diff --git a/client/api/applications.ts b/client/api/applications.ts new file mode 100644 index 00000000..e82bca08 --- /dev/null +++ b/client/api/applications.ts @@ -0,0 +1,107 @@ +export interface Application { + id: string; + creator_id: string; + opportunity_id: string; + status: "submitted" | "reviewing" | "accepted" | "rejected" | "withdrawn"; + cover_letter: string; + response_message?: string; + applied_at: string; + updated_at: string; + aethex_opportunities?: { + id: string; + title: string; + arm_affiliation: string; + job_type: string; + posted_by_id: string; + aethex_creators: { + username: string; + avatar_url: string; + }; + }; +} + +export interface ApplicationsResponse { + data: Application[]; + pagination: { + page: number; + limit: number; + total: number; + pages: number; + }; +} + +export interface ApplicationWithCreator { + id: string; + creator_id: string; + status: string; + cover_letter: string; + applied_at: string; + aethex_creators: { + username: string; + avatar_url: string; + bio: string; + skills: string[]; + }; +} + +const API_BASE = process.env.VITE_API_BASE || ""; + +export async function getMyApplications(filters?: { + status?: string; + page?: number; + limit?: number; +}): Promise { + const params = new URLSearchParams(); + if (filters?.status) params.append("status", filters.status); + if (filters?.page) params.append("page", String(filters.page)); + if (filters?.limit) params.append("limit", String(filters.limit)); + + const response = await fetch(`${API_BASE}/api/applications/me?${params}`); + if (!response.ok) throw new Error("Failed to fetch applications"); + return response.json(); +} + +export async function getApplicationsForOpportunity(opportunityId: string) { + const response = await fetch( + `${API_BASE}/api/opportunities/${opportunityId}/applications` + ); + if (!response.ok) throw new Error("Failed to fetch applications"); + const data = await response.json(); + return data.data as ApplicationWithCreator[]; +} + +export async function submitApplication(data: { + opportunity_id: string; + cover_letter: string; +}): Promise { + const response = await fetch(`${API_BASE}/api/applications`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(data), + }); + if (!response.ok) throw new Error("Failed to submit application"); + return response.json(); +} + +export async function updateApplicationStatus( + applicationId: string, + data: { + status: "reviewing" | "accepted" | "rejected"; + response_message?: string; + } +): Promise { + const response = await fetch(`${API_BASE}/api/applications/${applicationId}/status`, { + method: "PUT", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(data), + }); + if (!response.ok) throw new Error("Failed to update application"); + return response.json(); +} + +export async function withdrawApplication(applicationId: string): Promise { + const response = await fetch(`${API_BASE}/api/applications/${applicationId}`, { + method: "DELETE", + }); + if (!response.ok) throw new Error("Failed to withdraw application"); +}