// routes/tenant/maintenance/new/index.tsx import { define } from "../../../../utils.ts"; import { getLeasesByTenant } from "../../../../services/leaseService.ts"; import { createMaintenanceRequest } from "../../../../services/maintenanceRequestService.ts"; import { page } from "fresh"; import { MAINTENANCE_CATEGORIES, PRIORITY_LEVELS } from "./constants.ts"; import { FormField } from "./components/FormField.tsx"; import { SelectField } from "./components/SelectField.tsx"; import { TextAreaField } from "./components/TextAreaField.tsx"; import { AlertMessage } from "./components/AlertMessage.tsx"; import { PropertyInfo } from "./components/PropertyInfo.tsx"; import { EmergencyNotice } from "./components/EmergencyNotice.tsx"; import { FileUpload } from "./components/FileUpload.tsx"; import { MaintenanceFormData, NewMaintenancePageProps } from "./types.ts"; import { validateMaintenanceRequest } from "./utils/validation.ts"; export const handler = define.handlers({ async GET(ctx) { const { user_id } = ctx.state.data; try { const leases = await getLeasesByTenant(user_id); const currentLease = leases?.[0]; // Assuming tenant has one active lease return page({ currentLease, }); } catch (error) { console.error("Error loading maintenance request form:", error); return page({ error: "Failed to load form", }); } }, async POST(ctx) { const { user_id } = ctx.state.data; try { const formData = await ctx.req.formData(); const requestData: MaintenanceFormData = { tenant_id: user_id, property_id: formData.get("property_id") as string, title: formData.get("title") as string, description: formData.get("description") as string, priority: formData.get("priority") as string, category: formData.get("category") as string, status: "open", }; const validationErrors = validateMaintenanceRequest(requestData); if (validationErrors.length > 0) { return page({ error: validationErrors.map(( err: { field: string; message: string }, ) => `${err.field}: ${err.message}`).join(", "), }); } await createMaintenanceRequest( requestData.property_id, requestData.tenant_id, requestData.title, requestData.description, requestData.priority, ); return new Response("", { status: 302, headers: { Location: "/tenant/maintenance?success=true" }, }); } catch (error) { console.error("Error creating maintenance request:", error); return page({ error: "Failed to submit maintenance request. Please try again.", }); } }, }); export default define.page( function NewMaintenanceRequest( { data }: NewMaintenancePageProps, ) { const { currentLease, error } = data; if (!currentLease) { return (
Report an issue with your rental property