summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiqdad <ahmadmiqdad27@gmail.com>2025-08-31 12:18:14 +0700
committerMiqdad <ahmadmiqdad27@gmail.com>2025-08-31 12:18:14 +0700
commit016b9f1e9b234f546a0354b818fd33712379a803 (patch)
tree081256d48eb13bdcf706d96d3d62c87327a6a619
parent90c4cde3981450cf20172fb938cd18c0943a57c6 (diff)
<Miqdad> oke
-rw-r--r--src/lib/transaction/components/Transaction.jsx64
-rw-r--r--src/lib/transaction/components/Transactions.jsx72
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…');