diff --git a/app/payments/page.js b/app/payments/page.js index 39cfefa..cdb1659 100644 --- a/app/payments/page.js +++ b/app/payments/page.js @@ -26,7 +26,7 @@ import { } from 'lucide-react'; import toast, { Toaster } from 'react-hot-toast'; import AuthService from '@/app/services/AuthService'; -import { payDeposit, getMyTransaction } from '@/app/utils/api'; +import { payDeposit, getMyTransaction, getPaymentTypes } from '@/app/utils/api'; const STATUS_MAP = ['pending', 'ownerConfirmed', 'depositPaid', 'depositConfirmed', 'completed', 'cancelled']; @@ -67,6 +67,8 @@ export default function PaymentsPage() { const [loading, setLoading] = useState(true); const [payingId, setPayingId] = useState(null); const [isGuest, setIsGuest] = useState(null); + const [paymentMethods, setPaymentMethods] = useState([]); + const [loadingPaymentMethods, setLoadingPaymentMethods] = useState(true); const [selectedPayment, setSelectedPayment] = useState('cash'); const loadReservations = useCallback(async () => { @@ -109,6 +111,24 @@ export default function PaymentsPage() { } }, [t]); + const loadPaymentMethods = useCallback(async () => { + setLoadingPaymentMethods(true); + try { + const data = await getPaymentTypes(); + const methods = Array.isArray(data) ? data : []; + setPaymentMethods(methods); + const firstActive = methods.find((method) => method?.isActive === true || method?.active === true); + if (firstActive) { + setSelectedPayment(firstActive.id ?? firstActive.name ?? selectedPayment); + } + } catch (err) { + console.error('[Payments] failed to load payment methods', err); + setPaymentMethods([]); + } finally { + setLoadingPaymentMethods(false); + } + }, [selectedPayment]); + useEffect(() => { if (AuthService.isGuest()) { setIsGuest(true); @@ -119,10 +139,25 @@ export default function PaymentsPage() { loadReservations(); }, [loadReservations]); - const handlePayDeposit = async (reservation) => { + useEffect(() => { + loadPaymentMethods(); + }, [loadPaymentMethods]); + + const resolvePaymentTypeId = (paymentKey) => { + const method = paymentMethods.find( + (m) => String(m.id) === String(paymentKey) || String(m.name) === String(paymentKey), + ); + return method?.id ?? paymentKey; + }; + + const handlePayDeposit = async (reservation, paymentKey) => { setPayingId(reservation.id); + const paymentTypeId = resolvePaymentTypeId(paymentKey); try { - await payDeposit({ reservationId: reservation.id }); + await payDeposit({ + reservationId: reservation.id, + paymentTypeId, + }); toast.success(t('payments.depositPaidSuccess')); loadReservations(); } catch (err) { @@ -196,6 +231,8 @@ export default function PaymentsPage() { key={r.id || i} reservation={r} payingId={payingId} + paymentMethods={paymentMethods} + loadingPaymentMethods={loadingPaymentMethods} selectedPayment={selectedPayment} onSelectPayment={setSelectedPayment} onPay={handlePayDeposit} @@ -262,10 +299,11 @@ export default function PaymentsPage() { } // eslint-disable-next-line react/prop-types - function PaymentCard({ reservation, payingId, selectedPayment, onSelectPayment, onPay }) { + function PaymentCard({ reservation, payingId, paymentMethods, loadingPaymentMethods, selectedPayment, onSelectPayment, onPay }) { const r = reservation; const amount = r.depositAmount || r.totalPrice || 0; const [showCashDialog, setShowCashDialog] = useState(false); + const methods = paymentMethods.length > 0 ? paymentMethods : getPaymentMethods(t); return ( <> @@ -332,49 +370,64 @@ export default function PaymentsPage() {
{t('payments.paymentMethodLabel')}