49 lines
2.8 KiB
TypeScript
49 lines
2.8 KiB
TypeScript
import QRCode from "qrcode";
|
|
import Link from "next/link";
|
|
import { and, eq } from "drizzle-orm";
|
|
import { notFound, redirect } from "next/navigation";
|
|
import { connection } from "next/server";
|
|
import { getDb } from "@/db";
|
|
import { commissionCheckouts, commissionTickets } from "@/db/schema";
|
|
import { CommissionPaymentForm } from "@/components/commission/payment-form";
|
|
import { CommissionRequestSummary } from "@/components/commission/request-summary";
|
|
import { SiteHeader } from "@/components/public/site-header";
|
|
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
|
|
import { getCustomerSession } from "@/lib/auth/server";
|
|
import { promptPayConfig } from "@/lib/commission/payment";
|
|
import { generatePromptPayPayload } from "@/lib/commission/promptpay";
|
|
import { getCommissionLabels } from "@/lib/commission/catalog";
|
|
import { checkoutExpiresAt, checkoutNow } from "@/lib/commission/checkout-expiration";
|
|
|
|
export const instant = false;
|
|
|
|
export default async function CommissionPayPage({ params }: PageProps<"/commission/pay/[id]">) {
|
|
await connection();
|
|
const { id } = await params;
|
|
const session = await getCustomerSession();
|
|
if (!session) redirect(`/login?next=${encodeURIComponent(`/commission/pay/${id}`)}`);
|
|
const [checkout] = await getDb().select().from(commissionCheckouts)
|
|
.where(and(eq(commissionCheckouts.id, id), eq(commissionCheckouts.userId, session.user.id))).limit(1);
|
|
if (!checkout) notFound();
|
|
const [ticket] = await getDb().select({ id: commissionTickets.id }).from(commissionTickets)
|
|
.where(eq(commissionTickets.checkoutId, id)).limit(1);
|
|
if (ticket) redirect(`/commission/tickets/${ticket.id}`);
|
|
const expiresAt = checkoutExpiresAt(checkout.createdAt);
|
|
const serverNow = checkoutNow();
|
|
let qr: string | null = null;
|
|
if (serverNow < expiresAt) {
|
|
const { identifier } = promptPayConfig();
|
|
const payload = generatePromptPayPayload({ identifier, amount: checkout.amountBaht });
|
|
qr = await QRCode.toDataURL(payload, { margin: 2, width: 300 });
|
|
}
|
|
const catalog = await getCommissionLabels(checkout.request);
|
|
return <div className="min-h-svh"><SiteHeader /><main className="mx-auto flex max-w-3xl flex-col gap-6 p-4 py-10 sm:p-8">
|
|
<Link href="/commission" className="text-sm underline">กลับไป Commission</Link>
|
|
<h1 className="font-heading text-3xl font-semibold">ชำระเงิน</h1>
|
|
<Card><CardHeader><CardTitle>รายการคำขอ - ฿{checkout.amountBaht}</CardTitle></CardHeader>
|
|
<CardContent>{catalog && <CommissionRequestSummary request={checkout.request} catalog={catalog} amountBaht={checkout.amountBaht} />}</CardContent></Card>
|
|
<CommissionPaymentForm checkoutId={id} amountBaht={checkout.amountBaht} qr={qr}
|
|
expiresAt={expiresAt} serverNow={serverNow} />
|
|
</main></div>;
|
|
}
|