57 lines
4.7 KiB
TypeScript
57 lines
4.7 KiB
TypeScript
"use client";
|
|
|
|
import { useState, type FormEvent } from "react";
|
|
import { useRouter } from "next/navigation";
|
|
import { Alert, AlertDescription } from "@/components/ui/alert";
|
|
import { Button } from "@/components/ui/button";
|
|
import { Field, FieldGroup, FieldLabel } from "@/components/ui/field";
|
|
import { Input } from "@/components/ui/input";
|
|
|
|
function verificationError(code: string | undefined): string {
|
|
const reason = code?.startsWith("slip-rejected:") ? code.slice("slip-rejected:".length)
|
|
: code?.startsWith("slip2go-service:") ? code.slice("slip2go-service:".length) : code;
|
|
switch (reason) {
|
|
case "200000": return "พบสลิป แต่ Slip2Go ยังไม่ได้ยืนยันเงื่อนไขผู้รับและยอดเงิน กรุณาแจ้งผู้ดูแลระบบ (200000)";
|
|
case "200401": return "บัญชีผู้รับในสลิปไม่ตรงกับบัญชีที่ตั้งไว้ (200401)";
|
|
case "200402": return "ยอดเงินในสลิปไม่ตรงกับยอดคำขอ (200402)";
|
|
case "200403": return "วันที่โอนในสลิปไม่ตรงเงื่อนไข (200403)";
|
|
case "200404": return "Slip2Go ไม่พบข้อมูลสลิปในระบบธนาคาร (200404)";
|
|
case "200500": return "Slip2Go ระบุว่าสลิปไม่ถูกต้อง (200500)";
|
|
case "200501": return "สลิปนี้เคยถูกตรวจสอบแล้ว หากชำระเงินแล้ว กรุณาติดต่อผู้ดูแลก่อนโอนซ้ำ (200501)";
|
|
case "200502": return "ธนาคารไม่สามารถตรวจสอบสลิปได้ในขณะนี้ กรุณาลองอีกครั้ง (200502)";
|
|
case "400001":
|
|
case "400002": return `อ่าน QR ในรูปสลิปไม่ได้ กรุณาอัปโหลดรูปสลิปจากแอปธนาคาร (${reason})`;
|
|
case "400400": return "ตั้งค่าเงื่อนไขตรวจสอบสลิปไม่ถูกต้อง กรุณาแจ้งผู้ดูแลระบบ (400400)";
|
|
case "401001": return "Slip2Go ไม่ยอมรับ API Secret ที่ตั้งไว้ กรุณาแจ้งผู้ดูแลระบบ (401001)";
|
|
case "401005": return "โทเคน Slip2Go หมด กรุณาแจ้งผู้ดูแลระบบ (401005)";
|
|
case "slip-amount-or-date-mismatch": return "ยอดเงินหรือวันเวลาในสลิปไม่ตรงกับคำขอนี้ กรุณาใช้สลิปจากการชำระเงินครั้งนี้";
|
|
case "payment-already-used": return "สลิปนี้ถูกใช้กับคำขออื่นแล้ว";
|
|
default: return reason && /^\d{6}$/.test(reason)
|
|
? `ตรวจสอบสลิปไม่ผ่าน (รหัส ${reason}) กรุณาแจ้งผู้ดูแลระบบ`
|
|
: "ตรวจสอบสลิปไม่สำเร็จ กรุณาลองอีกครั้ง";
|
|
}
|
|
}
|
|
|
|
export function CommissionPaymentForm({ checkoutId }: { checkoutId: string }) {
|
|
const router = useRouter();
|
|
const [busy, setBusy] = useState(false);
|
|
const [error, setError] = useState("");
|
|
async function submit(event: FormEvent<HTMLFormElement>) {
|
|
event.preventDefault(); setBusy(true); setError("");
|
|
try {
|
|
const response = await fetch(`/api/commission/checkouts/${checkoutId}/verify`, {
|
|
method: "POST", body: new FormData(event.currentTarget),
|
|
});
|
|
const result = await response.json();
|
|
if (!response.ok) throw new Error(verificationError(result.error));
|
|
router.push(`/commission/tickets/${result.ticketId}`);
|
|
} catch (cause) { setError(cause instanceof Error ? cause.message : "เกิดข้อผิดพลาด"); }
|
|
finally { setBusy(false); }
|
|
}
|
|
return <form onSubmit={submit} className="flex flex-col gap-4"><FieldGroup>
|
|
<Field><FieldLabel htmlFor="slip">อัปโหลดสลิปที่ชำระเงินแล้ว</FieldLabel>
|
|
<Input id="slip" name="file" type="file" accept="image/png,image/jpeg,image/webp" required /></Field>
|
|
<Button type="submit" disabled={busy}>{busy ? "กำลังตรวจสอบ..." : "ตรวจสอบสลิปและเปิด Ticket"}</Button>
|
|
</FieldGroup>{error && <Alert variant="destructive"><AlertDescription>{error}</AlertDescription></Alert>}</form>;
|
|
}
|