// routes/tenant/applications/[id]/index.tsx import { define } from "../../../../utils.ts"; import { page } from "fresh"; import { getApplicationById } from "../../../../services/tenantApplicationService.ts"; import { TenantApplication } from "../../../../db/interfaces.ts"; import { AlertMessage } from "../../maintenance/new/components/AlertMessage.tsx"; interface ApplicationDetailPageData { application?: TenantApplication; parsedData?: Record; documentUrls?: { url: string; name: string; type: string }[]; error?: string; } export const handler = define.handlers({ async GET(ctx) { const { user_id } = ctx.state.data; const applicationId = ctx.params.id; if (!user_id) { return new Response("", { status: 302, headers: { Location: "/auth/login" }, }); } try { const application = await getApplicationById(applicationId); if (!application || application.applicant_id !== user_id) { return page({ error: "Application not found or unauthorized access.", }); } let parsedData: Record = {}; let documentUrls: { url: string; name: string; type: string }[] = []; if (application.application_data_encrypted) { // Assuming application_data_encrypted is a JSON string for now try { parsedData = JSON.parse(application.application_data_encrypted); } catch (e) { console.error("Failed to parse application data:", e); parsedData = { error: "Failed to parse application data." }; } } if (application.document_urls_json) { try { documentUrls = JSON.parse(application.document_urls_json as string); } catch (e) { console.error("Failed to parse document URLs:", e); } } return page({ application, parsedData, documentUrls, }); } catch (error) { console.error("Error loading application details:", error); return page({ error: "Failed to load application details.", }); } }, }); function ApplicationStatusPill({ status }: { status: string }) { let colorClass = "bg-gray-100 text-gray-800"; switch (status.toLowerCase()) { case "submitted": case "pending": colorClass = "bg-yellow-100 text-yellow-800"; break; case "approved": colorClass = "bg-green-100 text-green-800"; break; case "rejected": colorClass = "bg-red-100 text-red-800"; break; } return ( {status} ); } function DetailItem( { label, value }: { label: string; value: string | number | null | undefined; }, ) { return (
{label}
{value !== undefined ? value : "N/A"}
); } export default define.page(function ApplicationDetailPage({ data }) { const { application, parsedData, documentUrls, error } = data as ApplicationDetailPageData; if (error) { return ( ); } if (!application) { return (
); } const submittedDate = application.submitted_on ? new Date(application.submitted_on).toLocaleDateString() : "N/A"; const reviewedDate = application.reviewed_on ? new Date(application.reviewed_on).toLocaleDateString() : "N/A"; const status = application.application_status || "Unknown"; return (
{/* Header */}

Application Details

Application ID: {application.id.substring(0, 8)}...

{/* Main Content */}
{/* Application Data */}

Application Data

Details provided in the application form.

{/* Documents */}

Uploaded Documents

Supporting documents submitted with the application.

    {documentUrls && documentUrls.length > 0 ? ( documentUrls.map((doc) => (
  • {doc.name}
  • )) ) : (
  • No documents were uploaded.
  • )}
); });