// routes/tenant/rent/pay/index.tsx import { define } from "../../../../utils.ts"; import { SessionCookie } from "../../../auth/callback.ts"; import { getLeasesByTenant } from "../../../../services/leaseService.ts"; import { getPaymentMethodsByUser, PaymentMethod, } from "../../../../services/paymentService.ts"; import { createPaymentTransaction } from "../../../../services/paymentService.ts"; import { getE2ENow, isE2EEnabled } from "../../../../services/e2eFixtures.ts"; import { page } from "fresh"; import { Lease } from "../../../../db/interfaces.ts"; // Flexible interface for rent payment page data interface RentPaymentPageData { currentLease?: Lease | null; paymentMethods?: PaymentMethod[]; error?: string; success?: boolean; paymentAmount?: number; dueDate?: string; lateFee?: number; // Allow additional properties for future extensibility [key: string]: string | number | boolean | object | null | undefined; } export const handler = define.handlers({ async GET(ctx) { const { user_id } = ctx.state.data; if (!user_id) { return new Response("", { status: 302, headers: { Location: "/auth/login" }, }); } try { const leases = await getLeasesByTenant(user_id); const paymentMethods = await getPaymentMethodsByUser(user_id); const currentLease = leases?.[0]; // Assuming tenant has one active lease return page({ currentLease, paymentMethods, error: "", success: false, paymentAmount: 0, dueDate: "", lateFee: 0, }); } catch (error) { console.error("Error loading rent payment page:", error); return page({ error: "Failed to load payment information", }); } }, async POST(ctx) { const { user_id } = ctx.state.data; if (!user_id) { return new Response("", { status: 302, headers: { Location: "/auth/login" }, }); } try { const formData = await ctx.req.formData(); const amount = parseFloat(formData.get("amount") as string); const payment_method_id = formData.get("payment_method_id") as string; const lease_id = formData.get("lease_id") as string; // TODO: Implement actual payment processing with Stripe or similar // For now, simulate successful payment if (isE2EEnabled()) { await createPaymentTransaction( lease_id, amount, getE2ENow(), "ach", "completed", ); } return new Response("", { status: 302, headers: { Location: "/tenant/rent/confirmation?success=true" }, }); } catch (error) { console.error("Error processing payment:", error); return page({ error: "Payment processing failed. Please try again.", }); } }, }); export default define.page( function RentPayment({ data }: { data: RentPaymentPageData }) { const { currentLease, paymentMethods, error } = data; if (!currentLease) { return (
Make your monthly rent payment securely online