diff --git a/apps/edr-passenger-web/portal/src/app/booking/payment/dmoney/failure/page.tsx b/apps/edr-passenger-web/portal/src/app/booking/payment/dmoney/failure/page.tsx new file mode 100644 index 000000000..bb66105f3 --- /dev/null +++ b/apps/edr-passenger-web/portal/src/app/booking/payment/dmoney/failure/page.tsx @@ -0,0 +1,60 @@ +'use client'; + +import { useSearchParams, useRouter } from 'next/navigation'; +import { usePaymentStore } from '@/lib/payment-store'; +import { consumeManageBookingPaymentReturn } from '@/utils/manage-booking-return'; +import { useEffect, useState, Suspense } from 'react'; +import { XCircle, Loader2, ChevronLeft } from 'lucide-react'; + +function DmoneyFailureContent() { + const router = useRouter(); + const searchParams = useSearchParams(); + const { updateStatus } = usePaymentStore(); + // A Manage Booking payment (paying for an already-existing booking) has no in-progress + // booking-store session to go "back to review" from — send it back to that booking's + // detail view instead, where the user can pick a different payment method. + const [backTarget, setBackTarget] = useState('/booking/review'); + + // D-Money callback query params (mirrors Telebirr) + const merchantOrderId = searchParams.get('merchantOrderId') || ''; + const trxRef = searchParams.get('trxRef') || searchParams.get('outTradeNo') || ''; + const resultCode = searchParams.get('resultCode') || searchParams.get('code') || ''; + const resultMsg = searchParams.get('resultMsg') || searchParams.get('message') || 'Payment was not completed.'; + + useEffect(() => { + const manageBookingRef = consumeManageBookingPaymentReturn(); + if (manageBookingRef) { + setBackTarget(`/booking/detail?ref=${encodeURIComponent(manageBookingRef)}`); + } + updateStatus('FAILED'); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( +
+
+ +

Payment Failed

+

{resultMsg}

+ {resultCode &&

Code: {resultCode}

} + {merchantOrderId &&

Order ID: {merchantOrderId}

} + {trxRef &&

Ref: {trxRef}

} +
+ +
+
+
+ ); +} + +export default function DmoneyFailurePage() { + return ( + }> + + + ); +}