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 ( + }> + + + ); +} diff --git a/apps/edr-passenger-web/portal/src/app/booking/results/page.tsx b/apps/edr-passenger-web/portal/src/app/booking/results/page.tsx index 66f91dd60..574652cde 100644 --- a/apps/edr-passenger-web/portal/src/app/booking/results/page.tsx +++ b/apps/edr-passenger-web/portal/src/app/booking/results/page.tsx @@ -379,36 +379,50 @@ export default function ResultsPage() { const coachCurrency = "ETB"; const CoachIcon = getCoachIcon(coachType.coachTypeName); + const selectThisCoach = () => + handleSelectCoachType( + scheduleId, + coachType.coachTypeId, + coachType.coachTypeCode, + coachType.coachTypeName, + coachType.classes?.[0]?.name || + coachType.coachTypeName, + ); + return ( - + )} - + ); })} @@ -512,33 +555,6 @@ export default function ResultsPage() { )} - -
-
- - {!selectedCoachType && ( -

- - Select a coach type to continue -

- )} -
-