diff options
| author | Miqdad <ahmadmiqdad27@gmail.com> | 2025-08-31 12:18:14 +0700 |
|---|---|---|
| committer | Miqdad <ahmadmiqdad27@gmail.com> | 2025-08-31 12:18:14 +0700 |
| commit | 016b9f1e9b234f546a0354b818fd33712379a803 (patch) | |
| tree | 081256d48eb13bdcf706d96d3d62c87327a6a619 | |
| parent | 90c4cde3981450cf20172fb938cd18c0943a57c6 (diff) | |
<Miqdad> oke
| -rw-r--r-- | src/lib/transaction/components/Transaction.jsx | 64 | ||||
| -rw-r--r-- | src/lib/transaction/components/Transactions.jsx | 72 |
2 files changed, 79 insertions, 57 deletions
diff --git a/src/lib/transaction/components/Transaction.jsx b/src/lib/transaction/components/Transaction.jsx index 803b60bd..30ba74d2 100644 --- a/src/lib/transaction/components/Transaction.jsx +++ b/src/lib/transaction/components/Transaction.jsx @@ -209,37 +209,59 @@ const Transaction = ({ id }) => { transaction.refetch(); }; + // ===== Bayar Sekarang (pakai link dari backend; fallback generate via Next API) ===== const handlePayNow = async () => { try { setContLoading(true); - // Selalu minta link baru ke server - const res = await axios.post( - '/api/shop/midtrans-payment', // pakai relative path biar nggak salah host - null, + const base = (process.env.NEXT_PUBLIC_ODOO_API_HOST || '').replace( + /\/$/, + '' + ); + const token = auth?.token; + const partnerId = auth?.partnerId; + + // 1) Minta Odoo ensure (hanya generate jika kosong / expire / cancel) + const { data: resp } = await axios.get( + `${base}/api/v1/partner/${partnerId}/sale_order/${transaction.data.id}`, { - params: { - transactionId: transaction.data.id, - force: 1, - ts: Date.now(), - }, + params: { ensure_payment_link: 1, ts: Date.now() }, + headers: { Token: token }, } ); - const ensuredUrl = res?.data?.redirectUrl || ''; - if (!ensuredUrl) { - const fallback = - transaction?.data?.paymentSummary?.redirectUrl || - transaction?.data?.paymentLinkMidtrans || - ''; - if (fallback) { - window.open(fallback, '_blank', 'noopener,noreferrer'); - return; - } - throw new Error('redirectUrl kosong'); + const payload = resp?.data || resp; + + // 2) Ambil URL dari berbagai kemungkinan field (snake_case dan camelCase) + let url = + payload?.payment_summary?.redirect_url || + payload?.paymentSummary?.redirectUrl || + payload?.paymentLinkMidtrans || + payload?.payment_link_midtrans || + ''; + + if (url) { + window.location.href = url; + return; + } + + // 3) Fallback: refetch detail dari hook lalu cek lagi + await transaction.refetch(); + + url = + transaction?.data?.paymentSummary?.redirectUrl || + transaction?.data?.payment_summary?.redirect_url || + transaction?.data?.paymentLinkMidtrans || + transaction?.data?.payment_link_midtrans || + ''; + + if (url) { + window.location.href = url; + return; } - window.location.href = ensuredUrl; // pakai link BARU + // 4) Masih kosong → error + throw new Error('Link pembayaran belum tersedia.'); } catch (e) { toast.error( e?.response?.data?.description || diff --git a/src/lib/transaction/components/Transactions.jsx b/src/lib/transaction/components/Transactions.jsx index 064471d5..287451ef 100644 --- a/src/lib/transaction/components/Transactions.jsx +++ b/src/lib/transaction/components/Transactions.jsx @@ -1,3 +1,4 @@ +import axios from 'axios'; import { useRouter } from 'next/router'; import { useEffect, useState, useRef } from 'react'; import { toast } from 'react-hot-toast'; @@ -40,7 +41,6 @@ import { Calendar } from 'lucide-react'; import { DateRangePicker } from 'react-date-range'; import 'react-date-range/dist/styles.css'; import 'react-date-range/dist/theme/default.css'; -import axios from 'axios'; const Transactions = ({ context = '' }) => { const auth = useAuth(); @@ -57,8 +57,6 @@ const Transactions = ({ context = '' }) => { } = router.query; const { setRefreshCart } = useProductCartContext(); - const [cachedAllData, setCachedAllData] = useState(null); // Simpan data "All" - const [currentData, setCurrentData] = useState([]); const [inputQuery, setInputQuery] = useState(q); const [toOthers, setToOthers] = useState(null); const [toCancel, setToCancel] = useState(null); @@ -341,28 +339,17 @@ const Transactions = ({ context = '' }) => { } }; - const handleStatusChange = async (status) => { + const handleStatusChange = (status) => { setStatusNew(status); setPageNew(1); - - if (status === 'all' && cachedAllData) { - setCurrentData(cachedAllData); - return; - } - const data = await fetchSite(status, 1); - - if (status === 'all') { - setCachedAllData(data); - } - - setCurrentData(data); + // opsional: sinkronkan ke URL + router.push({ + pathname: router.pathname, + query: { ...router.query, status }, + }); }; useEffect(() => { - setCachedAllData([]); - }, []); - - useEffect(() => { // bersihkan cache lama jika perlu (saat first mount) // (sengaja kosong; tidak pakai cached data di versi ini) }, []); @@ -393,39 +380,51 @@ const Transactions = ({ context = '' }) => { return `${day} ${months[parseInt(month, 10) - 1]} ${year}`; }; + // ==== Lanjutkan Transaksi (tanpa endpoint baru) ==== const handleContinuePayment = async (saleOrder) => { try { setContLoadingId(saleOrder.id); - // 1) Selalu coba generate link baru via Next API dulu - const base = (process.env.NEXT_PUBLIC_SELF_HOST || '').replace(/\/$/, ''); + const base = (process.env.NEXT_PUBLIC_ODOO_API_HOST || '').replace( + /\/$/, + '' + ); + const token = auth?.token; + const partnerId = auth?.partnerId; + + // (1) Minta Odoo ensure (generate hanya jika kosong/expire/cancel) + let ensuredUrl = ''; try { - const { data } = await axios.post( - `${base}/api/shop/midtrans-payment`, - null, - { params: { transactionId: saleOrder.id } } + const { data: resp } = await axios.get( + `${base}/api/v1/partner/${partnerId}/sale_order/${saleOrder.id}`, + { + params: { ensure_payment_link: 1, ts: Date.now() }, + headers: { Token: token }, + } ); - if (data?.redirectUrl) { - window.open(data.redirectUrl, '_blank', 'noopener,noreferrer'); - toast.success('Membuka halaman pembayaran…'); - return; - } - } catch (err) { - // biarkan fail, lanjut fallback + const payload = resp?.data || resp; + ensuredUrl = + payload?.payment_summary?.redirect_url || + payload?.paymentLinkMidtrans || + ''; + } catch (_) { + /* biarkan lanjut ke fallback */ } - // 2) Fallback: pakai link yang sudah ada di list (mungkin masih valid) + // (2) Pakai link hasil ensure atau yang sudah ada di list const existingUrl = + ensuredUrl || saleOrder?.paymentSummary?.redirectUrl || saleOrder?.paymentLinkMidtrans || ''; + if (existingUrl) { window.open(existingUrl, '_blank', 'noopener,noreferrer'); - toast('Membuka link pembayaran yang sudah ada'); + toast.success('Membuka halaman pembayaran…'); return; } - // 3) Fallback terakhir: refetch list + // (3) Fallback terakhir: refetch list (agar link yang disimpan Odoo ikut terambil) await transactions.refetch(); const updated = transactions?.data?.saleOrders?.find((s) => s.id === saleOrder.id) || @@ -434,6 +433,7 @@ const Transactions = ({ context = '' }) => { updated?.paymentSummary?.redirectUrl || updated?.paymentLinkMidtrans || ''; + if (updatedUrl) { window.open(updatedUrl, '_blank', 'noopener,noreferrer'); toast.success('Membuka halaman pembayaran…'); |
