order-management 0.0.110 → 0.0.111
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -2419,6 +2419,247 @@ const useDebounce$2 = (value, delay) => {
|
|
|
2419
2419
|
return debouncedValue;
|
|
2420
2420
|
};
|
|
2421
2421
|
const getStatusBadgeClass$6 = (status) => {
|
|
2422
|
+
const statusLower = status.toLowerCase();
|
|
2423
|
+
if (statusLower === "requested") {
|
|
2424
|
+
return "bg-ui-tag-orange-bg text-ui-tag-orange-text";
|
|
2425
|
+
}
|
|
2426
|
+
if (statusLower === "received") {
|
|
2427
|
+
return "bg-ui-tag-blue-bg text-ui-tag-blue-text";
|
|
2428
|
+
}
|
|
2429
|
+
if (statusLower === "requires_action") {
|
|
2430
|
+
return "bg-ui-tag-red-bg text-ui-tag-red-text";
|
|
2431
|
+
}
|
|
2432
|
+
if (statusLower === "completed") {
|
|
2433
|
+
return "bg-ui-tag-green-bg text-ui-tag-green-text";
|
|
2434
|
+
}
|
|
2435
|
+
if (statusLower === "canceled") {
|
|
2436
|
+
return "bg-ui-tag-grey-bg text-ui-tag-grey-text";
|
|
2437
|
+
}
|
|
2438
|
+
return "bg-ui-tag-purple-bg text-ui-tag-purple-text";
|
|
2439
|
+
};
|
|
2440
|
+
const ReturnsPage = () => {
|
|
2441
|
+
const navigate = useNavigate();
|
|
2442
|
+
const [items, setItems] = useState([]);
|
|
2443
|
+
const [statusFilter, setStatusFilter] = useState("all");
|
|
2444
|
+
const [createdByFilter, setCreatedByFilter] = useState("all");
|
|
2445
|
+
const [searchQuery, setSearchQuery] = useState("");
|
|
2446
|
+
const debouncedSearchQuery = useDebounce$2(searchQuery, 300);
|
|
2447
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
2448
|
+
const [isFetchingMore, setIsFetchingMore] = useState(false);
|
|
2449
|
+
const [error, setError] = useState(null);
|
|
2450
|
+
const [offset, setOffset] = useState(0);
|
|
2451
|
+
const [count, setCount] = useState(0);
|
|
2452
|
+
const limit = 50;
|
|
2453
|
+
const loadReturns = useCallback(
|
|
2454
|
+
async (nextOffset, replace = false) => {
|
|
2455
|
+
try {
|
|
2456
|
+
if (replace) {
|
|
2457
|
+
setIsLoading(true);
|
|
2458
|
+
} else {
|
|
2459
|
+
setIsFetchingMore(true);
|
|
2460
|
+
}
|
|
2461
|
+
setError(null);
|
|
2462
|
+
const params = new URLSearchParams();
|
|
2463
|
+
params.set("limit", String(limit));
|
|
2464
|
+
params.set("offset", String(nextOffset));
|
|
2465
|
+
if (statusFilter !== "all") {
|
|
2466
|
+
params.set("status", statusFilter);
|
|
2467
|
+
}
|
|
2468
|
+
if (debouncedSearchQuery.trim()) {
|
|
2469
|
+
params.set("q", debouncedSearchQuery.trim());
|
|
2470
|
+
}
|
|
2471
|
+
if (createdByFilter !== "all") {
|
|
2472
|
+
params.set("created_by", createdByFilter);
|
|
2473
|
+
}
|
|
2474
|
+
params.set("order", "created_at");
|
|
2475
|
+
const response = await fetch(
|
|
2476
|
+
`/admin/return?${params.toString()}`,
|
|
2477
|
+
{ credentials: "include" }
|
|
2478
|
+
);
|
|
2479
|
+
if (!response.ok) {
|
|
2480
|
+
const message = await response.text();
|
|
2481
|
+
throw new Error(message || "Unable to load return orders");
|
|
2482
|
+
}
|
|
2483
|
+
const payload = await response.json();
|
|
2484
|
+
setCount(payload.count ?? 0);
|
|
2485
|
+
setOffset(nextOffset + (payload.returns?.length ?? 0));
|
|
2486
|
+
setItems(
|
|
2487
|
+
(prev) => replace ? payload.returns ?? [] : [...prev, ...payload.returns ?? []]
|
|
2488
|
+
);
|
|
2489
|
+
} catch (loadError) {
|
|
2490
|
+
const message = loadError instanceof Error ? loadError.message : "Unable to load return orders";
|
|
2491
|
+
setError(message);
|
|
2492
|
+
} finally {
|
|
2493
|
+
setIsLoading(false);
|
|
2494
|
+
setIsFetchingMore(false);
|
|
2495
|
+
}
|
|
2496
|
+
},
|
|
2497
|
+
[statusFilter, createdByFilter, debouncedSearchQuery]
|
|
2498
|
+
);
|
|
2499
|
+
useEffect(() => {
|
|
2500
|
+
void loadReturns(0, true);
|
|
2501
|
+
}, [statusFilter, createdByFilter, debouncedSearchQuery, loadReturns]);
|
|
2502
|
+
const hasMore = useMemo(() => offset < count, [offset, count]);
|
|
2503
|
+
const availableStatuses = useMemo(() => {
|
|
2504
|
+
const statuses = /* @__PURE__ */ new Set();
|
|
2505
|
+
items.forEach((item) => statuses.add(item.status));
|
|
2506
|
+
return Array.from(statuses).sort();
|
|
2507
|
+
}, [items]);
|
|
2508
|
+
return /* @__PURE__ */ jsx("div", { className: "w-full p-6", children: /* @__PURE__ */ jsxs(Container, { className: "mx-auto flex w-full max-w-7xl flex-col gap-6 p-6", children: [
|
|
2509
|
+
/* @__PURE__ */ jsxs("header", { className: "flex flex-col gap-3 md:flex-row md:items-center md:justify-between", children: [
|
|
2510
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
2511
|
+
/* @__PURE__ */ jsx(Heading, { level: "h1", children: "Return Orders" }),
|
|
2512
|
+
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-subtle", children: "View and manage all customer return orders" })
|
|
2513
|
+
] }),
|
|
2514
|
+
/* @__PURE__ */ jsx(Button, { variant: "primary", onClick: () => loadReturns(0, true), children: "Refresh" })
|
|
2515
|
+
] }),
|
|
2516
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3 md:flex-row md:items-center md:justify-between", children: [
|
|
2517
|
+
/* @__PURE__ */ jsx(
|
|
2518
|
+
Input,
|
|
2519
|
+
{
|
|
2520
|
+
placeholder: "Search by return ID, order ID, or customer email",
|
|
2521
|
+
value: searchQuery,
|
|
2522
|
+
onChange: (event) => setSearchQuery(event.target.value),
|
|
2523
|
+
className: "md:max-w-sm"
|
|
2524
|
+
}
|
|
2525
|
+
),
|
|
2526
|
+
/* @__PURE__ */ jsxs("div", { className: "flex gap-3", children: [
|
|
2527
|
+
/* @__PURE__ */ jsxs(
|
|
2528
|
+
"select",
|
|
2529
|
+
{
|
|
2530
|
+
value: createdByFilter,
|
|
2531
|
+
onChange: (event) => setCreatedByFilter(event.target.value),
|
|
2532
|
+
className: "h-9 rounded-md border border-ui-border-base bg-transparent px-3 text-sm text-ui-fg-base outline-none transition focus:ring-2 focus:ring-ui-fg-interactive md:max-w-xs",
|
|
2533
|
+
children: [
|
|
2534
|
+
/* @__PURE__ */ jsx("option", { value: "all", children: "All (Created by)" }),
|
|
2535
|
+
/* @__PURE__ */ jsx("option", { value: "customer", children: "Customer" }),
|
|
2536
|
+
/* @__PURE__ */ jsx("option", { value: "admin", children: "Admin" })
|
|
2537
|
+
]
|
|
2538
|
+
}
|
|
2539
|
+
),
|
|
2540
|
+
/* @__PURE__ */ jsxs(
|
|
2541
|
+
"select",
|
|
2542
|
+
{
|
|
2543
|
+
value: statusFilter,
|
|
2544
|
+
onChange: (event) => setStatusFilter(event.target.value),
|
|
2545
|
+
className: "h-9 rounded-md border border-ui-border-base bg-transparent px-3 text-sm text-ui-fg-base outline-none transition focus:ring-2 focus:ring-ui-fg-interactive md:max-w-xs",
|
|
2546
|
+
children: [
|
|
2547
|
+
/* @__PURE__ */ jsx("option", { value: "all", children: "All Statuses" }),
|
|
2548
|
+
availableStatuses.map((status) => /* @__PURE__ */ jsx("option", { value: status, children: status.replace(/_/g, " ").toUpperCase() }, status))
|
|
2549
|
+
]
|
|
2550
|
+
}
|
|
2551
|
+
)
|
|
2552
|
+
] })
|
|
2553
|
+
] }),
|
|
2554
|
+
error ? /* @__PURE__ */ jsxs("div", { className: "rounded-lg border border-ui-border-strong p-6 text-center", children: [
|
|
2555
|
+
/* @__PURE__ */ jsx(Text, { weight: "plus", className: "text-ui-fg-error", children: error }),
|
|
2556
|
+
/* @__PURE__ */ jsx("div", { className: "mt-4 flex justify-center", children: /* @__PURE__ */ jsx(
|
|
2557
|
+
Button,
|
|
2558
|
+
{
|
|
2559
|
+
variant: "secondary",
|
|
2560
|
+
onClick: () => loadReturns(0, true),
|
|
2561
|
+
children: "Try again"
|
|
2562
|
+
}
|
|
2563
|
+
) })
|
|
2564
|
+
] }) : null,
|
|
2565
|
+
isLoading ? /* @__PURE__ */ jsx("div", { className: "flex justify-center py-16", children: /* @__PURE__ */ jsx(Text, { children: "Loading return orders..." }) }) : items.length === 0 ? /* @__PURE__ */ jsxs("div", { className: "rounded-lg border border-dashed border-ui-border-strong p-10 text-center", children: [
|
|
2566
|
+
/* @__PURE__ */ jsx(Heading, { level: "h3", className: "text-xl", children: "No return orders yet" }),
|
|
2567
|
+
/* @__PURE__ */ jsx(Text, { size: "small", className: "mt-2 text-ui-fg-subtle", children: "Return orders created by customers will appear here." })
|
|
2568
|
+
] }) : /* @__PURE__ */ jsx("div", { className: "overflow-hidden rounded-xl border border-ui-border-base", children: /* @__PURE__ */ jsxs("table", { className: "min-w-full divide-y divide-ui-border-base", children: [
|
|
2569
|
+
/* @__PURE__ */ jsx("thead", { className: "bg-ui-bg-subtle", children: /* @__PURE__ */ jsxs("tr", { children: [
|
|
2570
|
+
/* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Return ID" }),
|
|
2571
|
+
/* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Order ID" }),
|
|
2572
|
+
/* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Customer" }),
|
|
2573
|
+
/* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Status" }),
|
|
2574
|
+
/* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Refund Amount" }),
|
|
2575
|
+
/* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Created" }),
|
|
2576
|
+
/* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Actions" })
|
|
2577
|
+
] }) }),
|
|
2578
|
+
/* @__PURE__ */ jsx("tbody", { className: "divide-y divide-ui-border-subtle", children: items.map((returnOrder) => /* @__PURE__ */ jsxs(
|
|
2579
|
+
"tr",
|
|
2580
|
+
{
|
|
2581
|
+
className: "hover:bg-ui-bg-subtle/60 cursor-pointer",
|
|
2582
|
+
onClick: () => navigate(`/returns/${returnOrder.id}`),
|
|
2583
|
+
children: [
|
|
2584
|
+
/* @__PURE__ */ jsx("td", { className: "px-4 py-4 font-medium text-ui-fg-base", children: /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-0.5", children: /* @__PURE__ */ jsx("span", { children: returnOrder.id }) }) }),
|
|
2585
|
+
/* @__PURE__ */ jsx("td", { className: "px-4 py-4 text-ui-fg-subtle", children: returnOrder.order_id }),
|
|
2586
|
+
/* @__PURE__ */ jsx("td", { className: "px-4 py-4 text-ui-fg-subtle", children: returnOrder.customer_email || returnOrder.order_email || "—" }),
|
|
2587
|
+
/* @__PURE__ */ jsx("td", { className: "px-4 py-4", children: /* @__PURE__ */ jsx(
|
|
2588
|
+
Badge,
|
|
2589
|
+
{
|
|
2590
|
+
size: "2xsmall",
|
|
2591
|
+
className: `uppercase ${getStatusBadgeClass$6(returnOrder.status)}`,
|
|
2592
|
+
children: returnOrder.status.replace(/_/g, " ")
|
|
2593
|
+
}
|
|
2594
|
+
) }),
|
|
2595
|
+
/* @__PURE__ */ jsx("td", { className: "px-4 py-4 text-ui-fg-subtle", children: (() => {
|
|
2596
|
+
const calc = returnOrder.refund;
|
|
2597
|
+
if (calc?.is_processed && calc.final_refund_amount != null) {
|
|
2598
|
+
return formatRefundCurrency(
|
|
2599
|
+
calc.final_refund_amount,
|
|
2600
|
+
calc.currency_code || returnOrder.currency_code
|
|
2601
|
+
);
|
|
2602
|
+
}
|
|
2603
|
+
if (calc) {
|
|
2604
|
+
return "Pending";
|
|
2605
|
+
}
|
|
2606
|
+
if (returnOrder.refund_amount == null) {
|
|
2607
|
+
return "—";
|
|
2608
|
+
}
|
|
2609
|
+
return formatRefundCurrency(
|
|
2610
|
+
Number(returnOrder.refund_amount),
|
|
2611
|
+
returnOrder.currency_code
|
|
2612
|
+
);
|
|
2613
|
+
})() }),
|
|
2614
|
+
/* @__PURE__ */ jsx("td", { className: "px-4 py-4 text-ui-fg-subtle", children: new Date(returnOrder.created_at).toLocaleDateString("en-US", {
|
|
2615
|
+
year: "numeric",
|
|
2616
|
+
month: "short",
|
|
2617
|
+
day: "numeric",
|
|
2618
|
+
hour: "numeric",
|
|
2619
|
+
minute: "2-digit",
|
|
2620
|
+
hour12: true
|
|
2621
|
+
}) }),
|
|
2622
|
+
/* @__PURE__ */ jsx("td", { className: "px-4 py-4", children: /* @__PURE__ */ jsx(
|
|
2623
|
+
Button,
|
|
2624
|
+
{
|
|
2625
|
+
variant: "transparent",
|
|
2626
|
+
size: "small",
|
|
2627
|
+
onClick: (e) => {
|
|
2628
|
+
e.stopPropagation();
|
|
2629
|
+
navigate(`/app/orders/${returnOrder.order_id}`);
|
|
2630
|
+
},
|
|
2631
|
+
children: "Go to order"
|
|
2632
|
+
}
|
|
2633
|
+
) })
|
|
2634
|
+
]
|
|
2635
|
+
},
|
|
2636
|
+
returnOrder.id
|
|
2637
|
+
)) })
|
|
2638
|
+
] }) }),
|
|
2639
|
+
hasMore ? /* @__PURE__ */ jsx("div", { className: "flex justify-center", children: /* @__PURE__ */ jsx(
|
|
2640
|
+
Button,
|
|
2641
|
+
{
|
|
2642
|
+
variant: "secondary",
|
|
2643
|
+
isLoading: isFetchingMore,
|
|
2644
|
+
onClick: () => loadReturns(offset, false),
|
|
2645
|
+
children: "Load more"
|
|
2646
|
+
}
|
|
2647
|
+
) }) : null
|
|
2648
|
+
] }) });
|
|
2649
|
+
};
|
|
2650
|
+
const config$7 = defineRouteConfig({
|
|
2651
|
+
label: "Return Orders",
|
|
2652
|
+
icon: ArrowPath
|
|
2653
|
+
});
|
|
2654
|
+
const useDebounce$1 = (value, delay) => {
|
|
2655
|
+
const [debouncedValue, setDebouncedValue] = useState(value);
|
|
2656
|
+
useEffect(() => {
|
|
2657
|
+
const handler = setTimeout(() => setDebouncedValue(value), delay);
|
|
2658
|
+
return () => clearTimeout(handler);
|
|
2659
|
+
}, [value, delay]);
|
|
2660
|
+
return debouncedValue;
|
|
2661
|
+
};
|
|
2662
|
+
const getStatusBadgeClass$5 = (status) => {
|
|
2422
2663
|
const s2 = status.toLowerCase();
|
|
2423
2664
|
if (s2 === "captured" || s2 === "completed") return "bg-ui-tag-green-bg text-ui-tag-green-text";
|
|
2424
2665
|
if (s2 === "authorized") return "bg-ui-tag-blue-bg text-ui-tag-blue-text";
|
|
@@ -2430,12 +2671,12 @@ const RefundsPage = () => {
|
|
|
2430
2671
|
const navigate = useNavigate();
|
|
2431
2672
|
const [items, setItems] = useState([]);
|
|
2432
2673
|
const [orderIdSearch, setOrderIdSearch] = useState("");
|
|
2433
|
-
const debouncedOrderId = useDebounce$
|
|
2674
|
+
const debouncedOrderId = useDebounce$1(orderIdSearch, 300);
|
|
2434
2675
|
const [paymentStatusFilter, setPaymentStatusFilter] = useState("all");
|
|
2435
2676
|
const [providerSearch, setProviderSearch] = useState("");
|
|
2436
|
-
const debouncedProvider = useDebounce$
|
|
2677
|
+
const debouncedProvider = useDebounce$1(providerSearch, 300);
|
|
2437
2678
|
const [currencySearch, setCurrencySearch] = useState("");
|
|
2438
|
-
const debouncedCurrency = useDebounce$
|
|
2679
|
+
const debouncedCurrency = useDebounce$1(currencySearch, 300);
|
|
2439
2680
|
const [dateFrom, setDateFrom] = useState("");
|
|
2440
2681
|
const [dateTo, setDateTo] = useState("");
|
|
2441
2682
|
const [amountMin, setAmountMin] = useState("");
|
|
@@ -2647,288 +2888,47 @@ const RefundsPage = () => {
|
|
|
2647
2888
|
Badge,
|
|
2648
2889
|
{
|
|
2649
2890
|
size: "2xsmall",
|
|
2650
|
-
className: `uppercase ${getStatusBadgeClass$
|
|
2891
|
+
className: `uppercase ${getStatusBadgeClass$5(displayStatus(r))}`,
|
|
2651
2892
|
children: displayStatus(r) !== "—" ? displayStatus(r).replace(/_/g, " ") : "—"
|
|
2652
2893
|
}
|
|
2653
|
-
) }),
|
|
2654
|
-
/* @__PURE__ */ jsx("td", { className: "min-w-0 truncate px-3 py-3 text-ui-fg-subtle", title: r.note ?? void 0, children: r.note ?? "—" }),
|
|
2655
|
-
/* @__PURE__ */ jsx("td", { className: "min-w-0 truncate px-3 py-3 text-ui-fg-subtle text-xs", children: new Date(r.created_at).toLocaleDateString("en-US", {
|
|
2656
|
-
month: "short",
|
|
2657
|
-
day: "numeric",
|
|
2658
|
-
hour: "numeric",
|
|
2659
|
-
minute: "2-digit",
|
|
2660
|
-
hour12: true
|
|
2661
|
-
}) }),
|
|
2662
|
-
/* @__PURE__ */ jsx("td", { className: "min-w-0 px-3 py-3", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-1", children: [
|
|
2663
|
-
/* @__PURE__ */ jsx(
|
|
2664
|
-
Button,
|
|
2665
|
-
{
|
|
2666
|
-
variant: "transparent",
|
|
2667
|
-
size: "small",
|
|
2668
|
-
onClick: (e) => {
|
|
2669
|
-
e.stopPropagation();
|
|
2670
|
-
navigate(`/refunds/${r.refund_id}`);
|
|
2671
|
-
},
|
|
2672
|
-
children: "Details"
|
|
2673
|
-
}
|
|
2674
|
-
),
|
|
2675
|
-
r.order_id ? /* @__PURE__ */ jsx(
|
|
2676
|
-
Button,
|
|
2677
|
-
{
|
|
2678
|
-
variant: "transparent",
|
|
2679
|
-
size: "small",
|
|
2680
|
-
onClick: (e) => {
|
|
2681
|
-
e.stopPropagation();
|
|
2682
|
-
navigate(`/orders/${r.order_id}`);
|
|
2683
|
-
},
|
|
2684
|
-
children: "Order"
|
|
2685
|
-
}
|
|
2686
|
-
) : null
|
|
2687
|
-
] }) })
|
|
2688
|
-
]
|
|
2689
|
-
},
|
|
2690
|
-
r.refund_id
|
|
2691
|
-
)) })
|
|
2692
|
-
] }) }),
|
|
2693
|
-
hasMore ? /* @__PURE__ */ jsx("div", { className: "flex justify-center", children: /* @__PURE__ */ jsx(
|
|
2694
|
-
Button,
|
|
2695
|
-
{
|
|
2696
|
-
variant: "secondary",
|
|
2697
|
-
isLoading: isFetchingMore,
|
|
2698
|
-
onClick: () => loadRefunds(offset, false),
|
|
2699
|
-
children: "Load more"
|
|
2700
|
-
}
|
|
2701
|
-
) }) : null
|
|
2702
|
-
] }) });
|
|
2703
|
-
};
|
|
2704
|
-
const config$7 = defineRouteConfig({
|
|
2705
|
-
label: "Refunds",
|
|
2706
|
-
icon: Receipt
|
|
2707
|
-
});
|
|
2708
|
-
const useDebounce$1 = (value, delay) => {
|
|
2709
|
-
const [debouncedValue, setDebouncedValue] = useState(value);
|
|
2710
|
-
useEffect(() => {
|
|
2711
|
-
const handler = setTimeout(() => setDebouncedValue(value), delay);
|
|
2712
|
-
return () => clearTimeout(handler);
|
|
2713
|
-
}, [value, delay]);
|
|
2714
|
-
return debouncedValue;
|
|
2715
|
-
};
|
|
2716
|
-
const getStatusBadgeClass$5 = (status) => {
|
|
2717
|
-
const statusLower = status.toLowerCase();
|
|
2718
|
-
if (statusLower === "requested") {
|
|
2719
|
-
return "bg-ui-tag-orange-bg text-ui-tag-orange-text";
|
|
2720
|
-
}
|
|
2721
|
-
if (statusLower === "received") {
|
|
2722
|
-
return "bg-ui-tag-blue-bg text-ui-tag-blue-text";
|
|
2723
|
-
}
|
|
2724
|
-
if (statusLower === "requires_action") {
|
|
2725
|
-
return "bg-ui-tag-red-bg text-ui-tag-red-text";
|
|
2726
|
-
}
|
|
2727
|
-
if (statusLower === "completed") {
|
|
2728
|
-
return "bg-ui-tag-green-bg text-ui-tag-green-text";
|
|
2729
|
-
}
|
|
2730
|
-
if (statusLower === "canceled") {
|
|
2731
|
-
return "bg-ui-tag-grey-bg text-ui-tag-grey-text";
|
|
2732
|
-
}
|
|
2733
|
-
return "bg-ui-tag-purple-bg text-ui-tag-purple-text";
|
|
2734
|
-
};
|
|
2735
|
-
const ReturnsPage = () => {
|
|
2736
|
-
const navigate = useNavigate();
|
|
2737
|
-
const [items, setItems] = useState([]);
|
|
2738
|
-
const [statusFilter, setStatusFilter] = useState("all");
|
|
2739
|
-
const [createdByFilter, setCreatedByFilter] = useState("all");
|
|
2740
|
-
const [searchQuery, setSearchQuery] = useState("");
|
|
2741
|
-
const debouncedSearchQuery = useDebounce$1(searchQuery, 300);
|
|
2742
|
-
const [isLoading, setIsLoading] = useState(true);
|
|
2743
|
-
const [isFetchingMore, setIsFetchingMore] = useState(false);
|
|
2744
|
-
const [error, setError] = useState(null);
|
|
2745
|
-
const [offset, setOffset] = useState(0);
|
|
2746
|
-
const [count, setCount] = useState(0);
|
|
2747
|
-
const limit = 50;
|
|
2748
|
-
const loadReturns = useCallback(
|
|
2749
|
-
async (nextOffset, replace = false) => {
|
|
2750
|
-
try {
|
|
2751
|
-
if (replace) {
|
|
2752
|
-
setIsLoading(true);
|
|
2753
|
-
} else {
|
|
2754
|
-
setIsFetchingMore(true);
|
|
2755
|
-
}
|
|
2756
|
-
setError(null);
|
|
2757
|
-
const params = new URLSearchParams();
|
|
2758
|
-
params.set("limit", String(limit));
|
|
2759
|
-
params.set("offset", String(nextOffset));
|
|
2760
|
-
if (statusFilter !== "all") {
|
|
2761
|
-
params.set("status", statusFilter);
|
|
2762
|
-
}
|
|
2763
|
-
if (debouncedSearchQuery.trim()) {
|
|
2764
|
-
params.set("q", debouncedSearchQuery.trim());
|
|
2765
|
-
}
|
|
2766
|
-
if (createdByFilter !== "all") {
|
|
2767
|
-
params.set("created_by", createdByFilter);
|
|
2768
|
-
}
|
|
2769
|
-
params.set("order", "created_at");
|
|
2770
|
-
const response = await fetch(
|
|
2771
|
-
`/admin/return?${params.toString()}`,
|
|
2772
|
-
{ credentials: "include" }
|
|
2773
|
-
);
|
|
2774
|
-
if (!response.ok) {
|
|
2775
|
-
const message = await response.text();
|
|
2776
|
-
throw new Error(message || "Unable to load return orders");
|
|
2777
|
-
}
|
|
2778
|
-
const payload = await response.json();
|
|
2779
|
-
setCount(payload.count ?? 0);
|
|
2780
|
-
setOffset(nextOffset + (payload.returns?.length ?? 0));
|
|
2781
|
-
setItems(
|
|
2782
|
-
(prev) => replace ? payload.returns ?? [] : [...prev, ...payload.returns ?? []]
|
|
2783
|
-
);
|
|
2784
|
-
} catch (loadError) {
|
|
2785
|
-
const message = loadError instanceof Error ? loadError.message : "Unable to load return orders";
|
|
2786
|
-
setError(message);
|
|
2787
|
-
} finally {
|
|
2788
|
-
setIsLoading(false);
|
|
2789
|
-
setIsFetchingMore(false);
|
|
2790
|
-
}
|
|
2791
|
-
},
|
|
2792
|
-
[statusFilter, createdByFilter, debouncedSearchQuery]
|
|
2793
|
-
);
|
|
2794
|
-
useEffect(() => {
|
|
2795
|
-
void loadReturns(0, true);
|
|
2796
|
-
}, [statusFilter, createdByFilter, debouncedSearchQuery, loadReturns]);
|
|
2797
|
-
const hasMore = useMemo(() => offset < count, [offset, count]);
|
|
2798
|
-
const availableStatuses = useMemo(() => {
|
|
2799
|
-
const statuses = /* @__PURE__ */ new Set();
|
|
2800
|
-
items.forEach((item) => statuses.add(item.status));
|
|
2801
|
-
return Array.from(statuses).sort();
|
|
2802
|
-
}, [items]);
|
|
2803
|
-
return /* @__PURE__ */ jsx("div", { className: "w-full p-6", children: /* @__PURE__ */ jsxs(Container, { className: "mx-auto flex w-full max-w-7xl flex-col gap-6 p-6", children: [
|
|
2804
|
-
/* @__PURE__ */ jsxs("header", { className: "flex flex-col gap-3 md:flex-row md:items-center md:justify-between", children: [
|
|
2805
|
-
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
2806
|
-
/* @__PURE__ */ jsx(Heading, { level: "h1", children: "Return Orders" }),
|
|
2807
|
-
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-subtle", children: "View and manage all customer return orders" })
|
|
2808
|
-
] }),
|
|
2809
|
-
/* @__PURE__ */ jsx(Button, { variant: "primary", onClick: () => loadReturns(0, true), children: "Refresh" })
|
|
2810
|
-
] }),
|
|
2811
|
-
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3 md:flex-row md:items-center md:justify-between", children: [
|
|
2812
|
-
/* @__PURE__ */ jsx(
|
|
2813
|
-
Input,
|
|
2814
|
-
{
|
|
2815
|
-
placeholder: "Search by return ID, order ID, or customer email",
|
|
2816
|
-
value: searchQuery,
|
|
2817
|
-
onChange: (event) => setSearchQuery(event.target.value),
|
|
2818
|
-
className: "md:max-w-sm"
|
|
2819
|
-
}
|
|
2820
|
-
),
|
|
2821
|
-
/* @__PURE__ */ jsxs("div", { className: "flex gap-3", children: [
|
|
2822
|
-
/* @__PURE__ */ jsxs(
|
|
2823
|
-
"select",
|
|
2824
|
-
{
|
|
2825
|
-
value: createdByFilter,
|
|
2826
|
-
onChange: (event) => setCreatedByFilter(event.target.value),
|
|
2827
|
-
className: "h-9 rounded-md border border-ui-border-base bg-transparent px-3 text-sm text-ui-fg-base outline-none transition focus:ring-2 focus:ring-ui-fg-interactive md:max-w-xs",
|
|
2828
|
-
children: [
|
|
2829
|
-
/* @__PURE__ */ jsx("option", { value: "all", children: "All (Created by)" }),
|
|
2830
|
-
/* @__PURE__ */ jsx("option", { value: "customer", children: "Customer" }),
|
|
2831
|
-
/* @__PURE__ */ jsx("option", { value: "admin", children: "Admin" })
|
|
2832
|
-
]
|
|
2833
|
-
}
|
|
2834
|
-
),
|
|
2835
|
-
/* @__PURE__ */ jsxs(
|
|
2836
|
-
"select",
|
|
2837
|
-
{
|
|
2838
|
-
value: statusFilter,
|
|
2839
|
-
onChange: (event) => setStatusFilter(event.target.value),
|
|
2840
|
-
className: "h-9 rounded-md border border-ui-border-base bg-transparent px-3 text-sm text-ui-fg-base outline-none transition focus:ring-2 focus:ring-ui-fg-interactive md:max-w-xs",
|
|
2841
|
-
children: [
|
|
2842
|
-
/* @__PURE__ */ jsx("option", { value: "all", children: "All Statuses" }),
|
|
2843
|
-
availableStatuses.map((status) => /* @__PURE__ */ jsx("option", { value: status, children: status.replace(/_/g, " ").toUpperCase() }, status))
|
|
2844
|
-
]
|
|
2845
|
-
}
|
|
2846
|
-
)
|
|
2847
|
-
] })
|
|
2848
|
-
] }),
|
|
2849
|
-
error ? /* @__PURE__ */ jsxs("div", { className: "rounded-lg border border-ui-border-strong p-6 text-center", children: [
|
|
2850
|
-
/* @__PURE__ */ jsx(Text, { weight: "plus", className: "text-ui-fg-error", children: error }),
|
|
2851
|
-
/* @__PURE__ */ jsx("div", { className: "mt-4 flex justify-center", children: /* @__PURE__ */ jsx(
|
|
2852
|
-
Button,
|
|
2853
|
-
{
|
|
2854
|
-
variant: "secondary",
|
|
2855
|
-
onClick: () => loadReturns(0, true),
|
|
2856
|
-
children: "Try again"
|
|
2857
|
-
}
|
|
2858
|
-
) })
|
|
2859
|
-
] }) : null,
|
|
2860
|
-
isLoading ? /* @__PURE__ */ jsx("div", { className: "flex justify-center py-16", children: /* @__PURE__ */ jsx(Text, { children: "Loading return orders..." }) }) : items.length === 0 ? /* @__PURE__ */ jsxs("div", { className: "rounded-lg border border-dashed border-ui-border-strong p-10 text-center", children: [
|
|
2861
|
-
/* @__PURE__ */ jsx(Heading, { level: "h3", className: "text-xl", children: "No return orders yet" }),
|
|
2862
|
-
/* @__PURE__ */ jsx(Text, { size: "small", className: "mt-2 text-ui-fg-subtle", children: "Return orders created by customers will appear here." })
|
|
2863
|
-
] }) : /* @__PURE__ */ jsx("div", { className: "overflow-hidden rounded-xl border border-ui-border-base", children: /* @__PURE__ */ jsxs("table", { className: "min-w-full divide-y divide-ui-border-base", children: [
|
|
2864
|
-
/* @__PURE__ */ jsx("thead", { className: "bg-ui-bg-subtle", children: /* @__PURE__ */ jsxs("tr", { children: [
|
|
2865
|
-
/* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Return ID" }),
|
|
2866
|
-
/* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Order ID" }),
|
|
2867
|
-
/* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Customer" }),
|
|
2868
|
-
/* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Status" }),
|
|
2869
|
-
/* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Refund Amount" }),
|
|
2870
|
-
/* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Created" }),
|
|
2871
|
-
/* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Actions" })
|
|
2872
|
-
] }) }),
|
|
2873
|
-
/* @__PURE__ */ jsx("tbody", { className: "divide-y divide-ui-border-subtle", children: items.map((returnOrder) => /* @__PURE__ */ jsxs(
|
|
2874
|
-
"tr",
|
|
2875
|
-
{
|
|
2876
|
-
className: "hover:bg-ui-bg-subtle/60 cursor-pointer",
|
|
2877
|
-
onClick: () => navigate(`/returns/${returnOrder.id}`),
|
|
2878
|
-
children: [
|
|
2879
|
-
/* @__PURE__ */ jsx("td", { className: "px-4 py-4 font-medium text-ui-fg-base", children: /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-0.5", children: /* @__PURE__ */ jsx("span", { children: returnOrder.id }) }) }),
|
|
2880
|
-
/* @__PURE__ */ jsx("td", { className: "px-4 py-4 text-ui-fg-subtle", children: returnOrder.order_id }),
|
|
2881
|
-
/* @__PURE__ */ jsx("td", { className: "px-4 py-4 text-ui-fg-subtle", children: returnOrder.customer_email || returnOrder.order_email || "—" }),
|
|
2882
|
-
/* @__PURE__ */ jsx("td", { className: "px-4 py-4", children: /* @__PURE__ */ jsx(
|
|
2883
|
-
Badge,
|
|
2884
|
-
{
|
|
2885
|
-
size: "2xsmall",
|
|
2886
|
-
className: `uppercase ${getStatusBadgeClass$5(returnOrder.status)}`,
|
|
2887
|
-
children: returnOrder.status.replace(/_/g, " ")
|
|
2888
|
-
}
|
|
2889
|
-
) }),
|
|
2890
|
-
/* @__PURE__ */ jsx("td", { className: "px-4 py-4 text-ui-fg-subtle", children: (() => {
|
|
2891
|
-
const calc = returnOrder.refund;
|
|
2892
|
-
if (calc?.is_processed && calc.final_refund_amount != null) {
|
|
2893
|
-
return formatRefundCurrency(
|
|
2894
|
-
calc.final_refund_amount,
|
|
2895
|
-
calc.currency_code || returnOrder.currency_code
|
|
2896
|
-
);
|
|
2897
|
-
}
|
|
2898
|
-
if (calc) {
|
|
2899
|
-
return "Pending";
|
|
2900
|
-
}
|
|
2901
|
-
if (returnOrder.refund_amount == null) {
|
|
2902
|
-
return "—";
|
|
2903
|
-
}
|
|
2904
|
-
return formatRefundCurrency(
|
|
2905
|
-
Number(returnOrder.refund_amount),
|
|
2906
|
-
returnOrder.currency_code
|
|
2907
|
-
);
|
|
2908
|
-
})() }),
|
|
2909
|
-
/* @__PURE__ */ jsx("td", { className: "px-4 py-4 text-ui-fg-subtle", children: new Date(returnOrder.created_at).toLocaleDateString("en-US", {
|
|
2910
|
-
year: "numeric",
|
|
2894
|
+
) }),
|
|
2895
|
+
/* @__PURE__ */ jsx("td", { className: "min-w-0 truncate px-3 py-3 text-ui-fg-subtle", title: r.note ?? void 0, children: r.note ?? "—" }),
|
|
2896
|
+
/* @__PURE__ */ jsx("td", { className: "min-w-0 truncate px-3 py-3 text-ui-fg-subtle text-xs", children: new Date(r.created_at).toLocaleDateString("en-US", {
|
|
2911
2897
|
month: "short",
|
|
2912
2898
|
day: "numeric",
|
|
2913
2899
|
hour: "numeric",
|
|
2914
2900
|
minute: "2-digit",
|
|
2915
2901
|
hour12: true
|
|
2916
2902
|
}) }),
|
|
2917
|
-
/* @__PURE__ */ jsx("td", { className: "px-
|
|
2918
|
-
|
|
2919
|
-
|
|
2920
|
-
|
|
2921
|
-
|
|
2922
|
-
|
|
2923
|
-
e
|
|
2924
|
-
|
|
2925
|
-
|
|
2926
|
-
|
|
2927
|
-
|
|
2928
|
-
|
|
2903
|
+
/* @__PURE__ */ jsx("td", { className: "min-w-0 px-3 py-3", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-1", children: [
|
|
2904
|
+
/* @__PURE__ */ jsx(
|
|
2905
|
+
Button,
|
|
2906
|
+
{
|
|
2907
|
+
variant: "transparent",
|
|
2908
|
+
size: "small",
|
|
2909
|
+
onClick: (e) => {
|
|
2910
|
+
e.stopPropagation();
|
|
2911
|
+
navigate(`/refunds/${r.refund_id}`);
|
|
2912
|
+
},
|
|
2913
|
+
children: "Details"
|
|
2914
|
+
}
|
|
2915
|
+
),
|
|
2916
|
+
r.order_id ? /* @__PURE__ */ jsx(
|
|
2917
|
+
Button,
|
|
2918
|
+
{
|
|
2919
|
+
variant: "transparent",
|
|
2920
|
+
size: "small",
|
|
2921
|
+
onClick: (e) => {
|
|
2922
|
+
e.stopPropagation();
|
|
2923
|
+
navigate(`/orders/${r.order_id}`);
|
|
2924
|
+
},
|
|
2925
|
+
children: "Order"
|
|
2926
|
+
}
|
|
2927
|
+
) : null
|
|
2928
|
+
] }) })
|
|
2929
2929
|
]
|
|
2930
2930
|
},
|
|
2931
|
-
|
|
2931
|
+
r.refund_id
|
|
2932
2932
|
)) })
|
|
2933
2933
|
] }) }),
|
|
2934
2934
|
hasMore ? /* @__PURE__ */ jsx("div", { className: "flex justify-center", children: /* @__PURE__ */ jsx(
|
|
@@ -2936,15 +2936,15 @@ const ReturnsPage = () => {
|
|
|
2936
2936
|
{
|
|
2937
2937
|
variant: "secondary",
|
|
2938
2938
|
isLoading: isFetchingMore,
|
|
2939
|
-
onClick: () =>
|
|
2939
|
+
onClick: () => loadRefunds(offset, false),
|
|
2940
2940
|
children: "Load more"
|
|
2941
2941
|
}
|
|
2942
2942
|
) }) : null
|
|
2943
2943
|
] }) });
|
|
2944
2944
|
};
|
|
2945
2945
|
const config$6 = defineRouteConfig({
|
|
2946
|
-
label: "
|
|
2947
|
-
icon:
|
|
2946
|
+
label: "Refunds",
|
|
2947
|
+
icon: Receipt
|
|
2948
2948
|
});
|
|
2949
2949
|
const useDebounce = (value, delay) => {
|
|
2950
2950
|
const [debouncedValue, setDebouncedValue] = useState(value);
|
|
@@ -4018,215 +4018,24 @@ const PaymentDetailPage = () => {
|
|
|
4018
4018
|
year: "numeric",
|
|
4019
4019
|
month: "short",
|
|
4020
4020
|
day: "numeric",
|
|
4021
|
-
hour: "numeric",
|
|
4022
|
-
minute: "2-digit",
|
|
4023
|
-
hour12: true
|
|
4024
|
-
}) })
|
|
4025
|
-
] })
|
|
4026
|
-
] }) }),
|
|
4027
|
-
Object.keys(detail.data ?? {}).length > 0 ? /* @__PURE__ */ jsxs("div", { className: "rounded-xl border border-ui-border-base p-6", children: [
|
|
4028
|
-
/* @__PURE__ */ jsx(Heading, { level: "h2", className: "text-lg mb-4", children: "Provider data" }),
|
|
4029
|
-
/* @__PURE__ */ jsx("pre", { className: "text-xs bg-ui-bg-subtle p-4 rounded-lg overflow-auto max-h-96", children: JSON.stringify(detail.data, null, 2) })
|
|
4030
|
-
] }) : /* @__PURE__ */ jsx("div", { className: "rounded-xl border border-ui-border-base p-6", children: /* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "No provider data for this session." }) })
|
|
4031
|
-
] }) : null
|
|
4032
|
-
] }) });
|
|
4033
|
-
};
|
|
4034
|
-
const config$3 = defineRouteConfig({
|
|
4035
|
-
label: "Payment details",
|
|
4036
|
-
icon: CreditCard
|
|
4037
|
-
});
|
|
4038
|
-
const getStatusBadgeClass$2 = (status) => {
|
|
4039
|
-
const s2 = status.toLowerCase();
|
|
4040
|
-
if (s2 === "captured" || s2 === "completed") return "bg-ui-tag-green-bg text-ui-tag-green-text";
|
|
4041
|
-
if (s2 === "authorized") return "bg-ui-tag-blue-bg text-ui-tag-blue-text";
|
|
4042
|
-
if (s2 === "error" || s2 === "canceled" || s2 === "cancelled") return "bg-ui-tag-red-bg text-ui-tag-red-text";
|
|
4043
|
-
if (s2 === "pending" || s2 === "requires_more") return "bg-ui-tag-orange-bg text-ui-tag-orange-text";
|
|
4044
|
-
return "bg-ui-tag-purple-bg text-ui-tag-purple-text";
|
|
4045
|
-
};
|
|
4046
|
-
const formatAmount = (value) => {
|
|
4047
|
-
return String(value);
|
|
4048
|
-
};
|
|
4049
|
-
const RefundDetailPage = () => {
|
|
4050
|
-
const navigate = useNavigate();
|
|
4051
|
-
const params = useParams();
|
|
4052
|
-
const id = params?.id?.trim();
|
|
4053
|
-
const [detail, setDetail] = useState(null);
|
|
4054
|
-
const [loading, setLoading] = useState(!!id);
|
|
4055
|
-
const [error, setError] = useState(null);
|
|
4056
|
-
const [gatewayExpanded, setGatewayExpanded] = useState(false);
|
|
4057
|
-
useEffect(() => {
|
|
4058
|
-
if (!id) {
|
|
4059
|
-
setLoading(false);
|
|
4060
|
-
return;
|
|
4061
|
-
}
|
|
4062
|
-
let cancelled = false;
|
|
4063
|
-
setLoading(true);
|
|
4064
|
-
setError(null);
|
|
4065
|
-
fetch(`/admin/refunds/${id}`, { credentials: "include" }).then((res) => {
|
|
4066
|
-
if (!res.ok) throw new Error(res.statusText || "Failed to load");
|
|
4067
|
-
return res.json();
|
|
4068
|
-
}).then((data) => {
|
|
4069
|
-
if (!cancelled) setDetail(data);
|
|
4070
|
-
}).catch((e) => {
|
|
4071
|
-
if (!cancelled) setError(e instanceof Error ? e.message : "Failed to load");
|
|
4072
|
-
}).finally(() => {
|
|
4073
|
-
if (!cancelled) setLoading(false);
|
|
4074
|
-
});
|
|
4075
|
-
return () => {
|
|
4076
|
-
cancelled = true;
|
|
4077
|
-
};
|
|
4078
|
-
}, [id]);
|
|
4079
|
-
const paymentStatus = detail?.payment?.status ?? "—";
|
|
4080
|
-
const hasGatewayData = detail?.payment?.payment_data && typeof detail.payment.payment_data === "object" && Object.keys(detail.payment.payment_data).length > 0;
|
|
4081
|
-
return /* @__PURE__ */ jsx("div", { className: "w-full p-6", children: /* @__PURE__ */ jsxs(Container, { className: "mx-auto flex w-full max-w-4xl flex-col gap-6 p-6", children: [
|
|
4082
|
-
/* @__PURE__ */ jsx("header", { className: "flex flex-col gap-3 md:flex-row md:items-center md:justify-between", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
4083
|
-
/* @__PURE__ */ jsx(Button, { variant: "transparent", size: "small", onClick: () => navigate("/refunds"), children: "← Refunds" }),
|
|
4084
|
-
/* @__PURE__ */ jsx(Heading, { level: "h1", children: "Refund details" }),
|
|
4085
|
-
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-subtle font-mono", children: id ?? "—" })
|
|
4086
|
-
] }) }),
|
|
4087
|
-
error ? /* @__PURE__ */ jsxs("div", { className: "rounded-lg border border-ui-border-strong p-6 text-center", children: [
|
|
4088
|
-
/* @__PURE__ */ jsx(Text, { weight: "plus", className: "text-ui-fg-error", children: error }),
|
|
4089
|
-
/* @__PURE__ */ jsx(Button, { variant: "secondary", className: "mt-4", onClick: () => navigate("/refunds"), children: "Back to list" })
|
|
4090
|
-
] }) : loading ? /* @__PURE__ */ jsx("div", { className: "flex justify-center py-16", children: /* @__PURE__ */ jsx(Text, { children: "Loading…" }) }) : detail ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-6", children: [
|
|
4091
|
-
/* @__PURE__ */ jsxs("div", { className: "rounded-xl border border-ui-border-base p-6", children: [
|
|
4092
|
-
/* @__PURE__ */ jsx(Heading, { level: "h2", className: "text-lg mb-4", children: "Refund summary" }),
|
|
4093
|
-
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [
|
|
4094
|
-
/* @__PURE__ */ jsxs("div", { children: [
|
|
4095
|
-
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Refund ID" }),
|
|
4096
|
-
/* @__PURE__ */ jsx(Text, { className: "mt-1 block font-mono text-sm", children: detail.refund.id })
|
|
4097
|
-
] }),
|
|
4098
|
-
/* @__PURE__ */ jsxs("div", { children: [
|
|
4099
|
-
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Amount" }),
|
|
4100
|
-
/* @__PURE__ */ jsx(Text, { className: "mt-1 block", children: formatAmount(detail.refund.amount) })
|
|
4101
|
-
] }),
|
|
4102
|
-
/* @__PURE__ */ jsxs("div", { children: [
|
|
4103
|
-
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Note" }),
|
|
4104
|
-
/* @__PURE__ */ jsx(Text, { className: "mt-1 block", children: detail.refund.note ?? "—" })
|
|
4105
|
-
] }),
|
|
4106
|
-
/* @__PURE__ */ jsxs("div", { children: [
|
|
4107
|
-
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Created at" }),
|
|
4108
|
-
/* @__PURE__ */ jsx(Text, { className: "mt-1 block", children: new Date(detail.refund.created_at).toLocaleDateString("en-US", {
|
|
4109
|
-
year: "numeric",
|
|
4110
|
-
month: "short",
|
|
4111
|
-
day: "numeric",
|
|
4112
|
-
hour: "numeric",
|
|
4113
|
-
minute: "2-digit",
|
|
4114
|
-
hour12: true
|
|
4115
|
-
}) })
|
|
4116
|
-
] }),
|
|
4117
|
-
detail.refund.created_by ? /* @__PURE__ */ jsxs("div", { children: [
|
|
4118
|
-
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Created by" }),
|
|
4119
|
-
/* @__PURE__ */ jsx(Text, { className: "mt-1 block font-mono text-sm", children: detail.refund.created_by })
|
|
4120
|
-
] }) : null
|
|
4121
|
-
] })
|
|
4122
|
-
] }),
|
|
4123
|
-
/* @__PURE__ */ jsxs("div", { className: "rounded-xl border border-ui-border-base p-6", children: [
|
|
4124
|
-
/* @__PURE__ */ jsx(Heading, { level: "h2", className: "text-lg mb-4", children: "Payment summary" }),
|
|
4125
|
-
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [
|
|
4126
|
-
/* @__PURE__ */ jsxs("div", { children: [
|
|
4127
|
-
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Payment amount" }),
|
|
4128
|
-
/* @__PURE__ */ jsx(Text, { className: "mt-1 block", children: formatAmount(detail.payment.payment_amount) })
|
|
4129
|
-
] }),
|
|
4130
|
-
/* @__PURE__ */ jsxs("div", { children: [
|
|
4131
|
-
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Captured amount" }),
|
|
4132
|
-
/* @__PURE__ */ jsx(Text, { className: "mt-1 block", children: formatAmount(detail.payment.captured_amount) })
|
|
4133
|
-
] }),
|
|
4134
|
-
/* @__PURE__ */ jsxs("div", { children: [
|
|
4135
|
-
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Refunded amount" }),
|
|
4136
|
-
/* @__PURE__ */ jsx(Text, { className: "mt-1 block", children: formatAmount(detail.payment.refunded_amount) })
|
|
4137
|
-
] }),
|
|
4138
|
-
/* @__PURE__ */ jsxs("div", { children: [
|
|
4139
|
-
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Provider" }),
|
|
4140
|
-
/* @__PURE__ */ jsx(Text, { className: "mt-1 block", children: detail.payment.provider_id || "—" })
|
|
4141
|
-
] }),
|
|
4142
|
-
/* @__PURE__ */ jsxs("div", { children: [
|
|
4143
|
-
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Status" }),
|
|
4144
|
-
/* @__PURE__ */ jsx("div", { className: "mt-1", children: /* @__PURE__ */ jsx(
|
|
4145
|
-
Badge,
|
|
4146
|
-
{
|
|
4147
|
-
size: "2xsmall",
|
|
4148
|
-
className: `uppercase ${getStatusBadgeClass$2(paymentStatus)}`,
|
|
4149
|
-
children: paymentStatus !== "—" ? paymentStatus.replace(/_/g, " ") : "—"
|
|
4150
|
-
}
|
|
4151
|
-
) })
|
|
4152
|
-
] }),
|
|
4153
|
-
detail.computed ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
4154
|
-
/* @__PURE__ */ jsxs("div", { children: [
|
|
4155
|
-
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Full refund" }),
|
|
4156
|
-
/* @__PURE__ */ jsx(Text, { className: "mt-1 block", children: detail.computed.is_full_refund ? "Yes" : "No" })
|
|
4157
|
-
] }),
|
|
4158
|
-
/* @__PURE__ */ jsxs("div", { children: [
|
|
4159
|
-
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Remaining refundable" }),
|
|
4160
|
-
/* @__PURE__ */ jsx(Text, { className: "mt-1 block", children: formatAmount(detail.computed.remaining_refundable_amount) })
|
|
4161
|
-
] }),
|
|
4162
|
-
/* @__PURE__ */ jsxs("div", { children: [
|
|
4163
|
-
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Refund %" }),
|
|
4164
|
-
/* @__PURE__ */ jsxs(Text, { className: "mt-1 block", children: [
|
|
4165
|
-
detail.computed.refund_percentage.toFixed(1),
|
|
4166
|
-
"%"
|
|
4167
|
-
] })
|
|
4168
|
-
] })
|
|
4169
|
-
] }) : null
|
|
4170
|
-
] })
|
|
4171
|
-
] }),
|
|
4172
|
-
/* @__PURE__ */ jsxs("div", { className: "rounded-xl border border-ui-border-base p-6", children: [
|
|
4173
|
-
/* @__PURE__ */ jsx(Heading, { level: "h2", className: "text-lg mb-4", children: "Order summary" }),
|
|
4174
|
-
detail.order ? /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [
|
|
4175
|
-
/* @__PURE__ */ jsxs("div", { children: [
|
|
4176
|
-
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Order" }),
|
|
4177
|
-
/* @__PURE__ */ jsx("div", { className: "mt-1", children: /* @__PURE__ */ jsx(
|
|
4178
|
-
Button,
|
|
4179
|
-
{
|
|
4180
|
-
variant: "transparent",
|
|
4181
|
-
size: "small",
|
|
4182
|
-
onClick: () => navigate(`/orders/${detail.order.order_id}`),
|
|
4183
|
-
children: detail.order.order_number ?? detail.order.order_id
|
|
4184
|
-
}
|
|
4185
|
-
) })
|
|
4186
|
-
] }),
|
|
4187
|
-
detail.order.total != null ? /* @__PURE__ */ jsxs("div", { children: [
|
|
4188
|
-
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Total" }),
|
|
4189
|
-
/* @__PURE__ */ jsx(Text, { className: "mt-1 block", children: formatAmount(detail.order.total) })
|
|
4190
|
-
] }) : null,
|
|
4191
|
-
detail.order.customer_id ? /* @__PURE__ */ jsxs("div", { children: [
|
|
4192
|
-
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Customer ID" }),
|
|
4193
|
-
/* @__PURE__ */ jsx(Text, { className: "mt-1 block font-mono text-sm", children: detail.order.customer_id })
|
|
4194
|
-
] }) : null,
|
|
4195
|
-
detail.order.region ? /* @__PURE__ */ jsxs("div", { children: [
|
|
4196
|
-
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Region" }),
|
|
4197
|
-
/* @__PURE__ */ jsx(Text, { className: "mt-1 block", children: detail.order.region })
|
|
4198
|
-
] }) : null,
|
|
4199
|
-
detail.order.fulfillment_status ? /* @__PURE__ */ jsxs("div", { children: [
|
|
4200
|
-
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Fulfillment status" }),
|
|
4201
|
-
/* @__PURE__ */ jsx(Text, { className: "mt-1 block", children: detail.order.fulfillment_status })
|
|
4202
|
-
] }) : null
|
|
4203
|
-
] }) : /* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "No order linked to this refund." })
|
|
4204
|
-
] }),
|
|
4205
|
-
/* @__PURE__ */ jsxs("div", { className: "rounded-xl border border-ui-border-base p-6", children: [
|
|
4206
|
-
/* @__PURE__ */ jsxs(
|
|
4207
|
-
"button",
|
|
4208
|
-
{
|
|
4209
|
-
type: "button",
|
|
4210
|
-
className: "flex w-full items-center justify-between text-left",
|
|
4211
|
-
onClick: () => setGatewayExpanded((prev) => !prev),
|
|
4212
|
-
"aria-expanded": gatewayExpanded,
|
|
4213
|
-
"aria-label": gatewayExpanded ? "Collapse gateway data" : "Expand gateway data",
|
|
4214
|
-
children: [
|
|
4215
|
-
/* @__PURE__ */ jsx(Heading, { level: "h2", className: "text-lg", children: "Gateway data" }),
|
|
4216
|
-
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: gatewayExpanded ? "Collapse" : "Expand" })
|
|
4217
|
-
]
|
|
4218
|
-
}
|
|
4219
|
-
),
|
|
4220
|
-
gatewayExpanded && /* @__PURE__ */ jsx("div", { className: "mt-4", children: hasGatewayData ? /* @__PURE__ */ jsx("pre", { className: "text-xs bg-ui-bg-subtle p-4 rounded-lg overflow-auto max-h-96", children: JSON.stringify(detail.payment.payment_data, null, 2) }) : /* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "No gateway payload for this payment." }) })
|
|
4221
|
-
] })
|
|
4021
|
+
hour: "numeric",
|
|
4022
|
+
minute: "2-digit",
|
|
4023
|
+
hour12: true
|
|
4024
|
+
}) })
|
|
4025
|
+
] })
|
|
4026
|
+
] }) }),
|
|
4027
|
+
Object.keys(detail.data ?? {}).length > 0 ? /* @__PURE__ */ jsxs("div", { className: "rounded-xl border border-ui-border-base p-6", children: [
|
|
4028
|
+
/* @__PURE__ */ jsx(Heading, { level: "h2", className: "text-lg mb-4", children: "Provider data" }),
|
|
4029
|
+
/* @__PURE__ */ jsx("pre", { className: "text-xs bg-ui-bg-subtle p-4 rounded-lg overflow-auto max-h-96", children: JSON.stringify(detail.data, null, 2) })
|
|
4030
|
+
] }) : /* @__PURE__ */ jsx("div", { className: "rounded-xl border border-ui-border-base p-6", children: /* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "No provider data for this session." }) })
|
|
4222
4031
|
] }) : null
|
|
4223
4032
|
] }) });
|
|
4224
4033
|
};
|
|
4225
|
-
const config$
|
|
4226
|
-
label: "
|
|
4227
|
-
icon:
|
|
4034
|
+
const config$3 = defineRouteConfig({
|
|
4035
|
+
label: "Payment details",
|
|
4036
|
+
icon: CreditCard
|
|
4228
4037
|
});
|
|
4229
|
-
const getStatusBadgeClass$
|
|
4038
|
+
const getStatusBadgeClass$2 = (status) => {
|
|
4230
4039
|
const statusLower = status.toLowerCase();
|
|
4231
4040
|
if (statusLower === "requested") {
|
|
4232
4041
|
return "bg-ui-tag-orange-bg text-ui-tag-orange-text";
|
|
@@ -4359,7 +4168,7 @@ const ReturnDetailPage = () => {
|
|
|
4359
4168
|
Badge,
|
|
4360
4169
|
{
|
|
4361
4170
|
size: "small",
|
|
4362
|
-
className: `uppercase ${getStatusBadgeClass$
|
|
4171
|
+
className: `uppercase ${getStatusBadgeClass$2(returnOrder.status)}`,
|
|
4363
4172
|
children: returnOrder.status.replace(/_/g, " ")
|
|
4364
4173
|
}
|
|
4365
4174
|
)
|
|
@@ -4442,7 +4251,7 @@ const ReturnDetailPage = () => {
|
|
|
4442
4251
|
Badge,
|
|
4443
4252
|
{
|
|
4444
4253
|
size: "2xsmall",
|
|
4445
|
-
className: `uppercase ${getStatusBadgeClass$
|
|
4254
|
+
className: `uppercase ${getStatusBadgeClass$2(entry.status)}`,
|
|
4446
4255
|
children: entry.status.replace(/_/g, " ")
|
|
4447
4256
|
}
|
|
4448
4257
|
) }),
|
|
@@ -4504,10 +4313,201 @@ const ReturnDetailPage = () => {
|
|
|
4504
4313
|
updateSuccess && /* @__PURE__ */ jsx("div", { className: "rounded-lg border border-ui-border-success bg-ui-bg-success-subtle p-4", children: /* @__PURE__ */ jsx(Text, { className: "text-ui-fg-success", children: "Action completed successfully" }) })
|
|
4505
4314
|
] }) });
|
|
4506
4315
|
};
|
|
4507
|
-
const config$
|
|
4316
|
+
const config$2 = defineRouteConfig({
|
|
4508
4317
|
label: "Return Order Details",
|
|
4509
4318
|
icon: CheckCircle
|
|
4510
4319
|
});
|
|
4320
|
+
const getStatusBadgeClass$1 = (status) => {
|
|
4321
|
+
const s2 = status.toLowerCase();
|
|
4322
|
+
if (s2 === "captured" || s2 === "completed") return "bg-ui-tag-green-bg text-ui-tag-green-text";
|
|
4323
|
+
if (s2 === "authorized") return "bg-ui-tag-blue-bg text-ui-tag-blue-text";
|
|
4324
|
+
if (s2 === "error" || s2 === "canceled" || s2 === "cancelled") return "bg-ui-tag-red-bg text-ui-tag-red-text";
|
|
4325
|
+
if (s2 === "pending" || s2 === "requires_more") return "bg-ui-tag-orange-bg text-ui-tag-orange-text";
|
|
4326
|
+
return "bg-ui-tag-purple-bg text-ui-tag-purple-text";
|
|
4327
|
+
};
|
|
4328
|
+
const formatAmount = (value) => {
|
|
4329
|
+
return String(value);
|
|
4330
|
+
};
|
|
4331
|
+
const RefundDetailPage = () => {
|
|
4332
|
+
const navigate = useNavigate();
|
|
4333
|
+
const params = useParams();
|
|
4334
|
+
const id = params?.id?.trim();
|
|
4335
|
+
const [detail, setDetail] = useState(null);
|
|
4336
|
+
const [loading, setLoading] = useState(!!id);
|
|
4337
|
+
const [error, setError] = useState(null);
|
|
4338
|
+
const [gatewayExpanded, setGatewayExpanded] = useState(false);
|
|
4339
|
+
useEffect(() => {
|
|
4340
|
+
if (!id) {
|
|
4341
|
+
setLoading(false);
|
|
4342
|
+
return;
|
|
4343
|
+
}
|
|
4344
|
+
let cancelled = false;
|
|
4345
|
+
setLoading(true);
|
|
4346
|
+
setError(null);
|
|
4347
|
+
fetch(`/admin/refunds/${id}`, { credentials: "include" }).then((res) => {
|
|
4348
|
+
if (!res.ok) throw new Error(res.statusText || "Failed to load");
|
|
4349
|
+
return res.json();
|
|
4350
|
+
}).then((data) => {
|
|
4351
|
+
if (!cancelled) setDetail(data);
|
|
4352
|
+
}).catch((e) => {
|
|
4353
|
+
if (!cancelled) setError(e instanceof Error ? e.message : "Failed to load");
|
|
4354
|
+
}).finally(() => {
|
|
4355
|
+
if (!cancelled) setLoading(false);
|
|
4356
|
+
});
|
|
4357
|
+
return () => {
|
|
4358
|
+
cancelled = true;
|
|
4359
|
+
};
|
|
4360
|
+
}, [id]);
|
|
4361
|
+
const paymentStatus = detail?.payment?.status ?? "—";
|
|
4362
|
+
const hasGatewayData = detail?.payment?.payment_data && typeof detail.payment.payment_data === "object" && Object.keys(detail.payment.payment_data).length > 0;
|
|
4363
|
+
return /* @__PURE__ */ jsx("div", { className: "w-full p-6", children: /* @__PURE__ */ jsxs(Container, { className: "mx-auto flex w-full max-w-4xl flex-col gap-6 p-6", children: [
|
|
4364
|
+
/* @__PURE__ */ jsx("header", { className: "flex flex-col gap-3 md:flex-row md:items-center md:justify-between", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
4365
|
+
/* @__PURE__ */ jsx(Button, { variant: "transparent", size: "small", onClick: () => navigate("/refunds"), children: "← Refunds" }),
|
|
4366
|
+
/* @__PURE__ */ jsx(Heading, { level: "h1", children: "Refund details" }),
|
|
4367
|
+
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-subtle font-mono", children: id ?? "—" })
|
|
4368
|
+
] }) }),
|
|
4369
|
+
error ? /* @__PURE__ */ jsxs("div", { className: "rounded-lg border border-ui-border-strong p-6 text-center", children: [
|
|
4370
|
+
/* @__PURE__ */ jsx(Text, { weight: "plus", className: "text-ui-fg-error", children: error }),
|
|
4371
|
+
/* @__PURE__ */ jsx(Button, { variant: "secondary", className: "mt-4", onClick: () => navigate("/refunds"), children: "Back to list" })
|
|
4372
|
+
] }) : loading ? /* @__PURE__ */ jsx("div", { className: "flex justify-center py-16", children: /* @__PURE__ */ jsx(Text, { children: "Loading…" }) }) : detail ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-6", children: [
|
|
4373
|
+
/* @__PURE__ */ jsxs("div", { className: "rounded-xl border border-ui-border-base p-6", children: [
|
|
4374
|
+
/* @__PURE__ */ jsx(Heading, { level: "h2", className: "text-lg mb-4", children: "Refund summary" }),
|
|
4375
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [
|
|
4376
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
4377
|
+
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Refund ID" }),
|
|
4378
|
+
/* @__PURE__ */ jsx(Text, { className: "mt-1 block font-mono text-sm", children: detail.refund.id })
|
|
4379
|
+
] }),
|
|
4380
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
4381
|
+
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Amount" }),
|
|
4382
|
+
/* @__PURE__ */ jsx(Text, { className: "mt-1 block", children: formatAmount(detail.refund.amount) })
|
|
4383
|
+
] }),
|
|
4384
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
4385
|
+
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Note" }),
|
|
4386
|
+
/* @__PURE__ */ jsx(Text, { className: "mt-1 block", children: detail.refund.note ?? "—" })
|
|
4387
|
+
] }),
|
|
4388
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
4389
|
+
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Created at" }),
|
|
4390
|
+
/* @__PURE__ */ jsx(Text, { className: "mt-1 block", children: new Date(detail.refund.created_at).toLocaleDateString("en-US", {
|
|
4391
|
+
year: "numeric",
|
|
4392
|
+
month: "short",
|
|
4393
|
+
day: "numeric",
|
|
4394
|
+
hour: "numeric",
|
|
4395
|
+
minute: "2-digit",
|
|
4396
|
+
hour12: true
|
|
4397
|
+
}) })
|
|
4398
|
+
] }),
|
|
4399
|
+
detail.refund.created_by ? /* @__PURE__ */ jsxs("div", { children: [
|
|
4400
|
+
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Created by" }),
|
|
4401
|
+
/* @__PURE__ */ jsx(Text, { className: "mt-1 block font-mono text-sm", children: detail.refund.created_by })
|
|
4402
|
+
] }) : null
|
|
4403
|
+
] })
|
|
4404
|
+
] }),
|
|
4405
|
+
/* @__PURE__ */ jsxs("div", { className: "rounded-xl border border-ui-border-base p-6", children: [
|
|
4406
|
+
/* @__PURE__ */ jsx(Heading, { level: "h2", className: "text-lg mb-4", children: "Payment summary" }),
|
|
4407
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [
|
|
4408
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
4409
|
+
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Payment amount" }),
|
|
4410
|
+
/* @__PURE__ */ jsx(Text, { className: "mt-1 block", children: formatAmount(detail.payment.payment_amount) })
|
|
4411
|
+
] }),
|
|
4412
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
4413
|
+
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Captured amount" }),
|
|
4414
|
+
/* @__PURE__ */ jsx(Text, { className: "mt-1 block", children: formatAmount(detail.payment.captured_amount) })
|
|
4415
|
+
] }),
|
|
4416
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
4417
|
+
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Refunded amount" }),
|
|
4418
|
+
/* @__PURE__ */ jsx(Text, { className: "mt-1 block", children: formatAmount(detail.payment.refunded_amount) })
|
|
4419
|
+
] }),
|
|
4420
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
4421
|
+
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Provider" }),
|
|
4422
|
+
/* @__PURE__ */ jsx(Text, { className: "mt-1 block", children: detail.payment.provider_id || "—" })
|
|
4423
|
+
] }),
|
|
4424
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
4425
|
+
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Status" }),
|
|
4426
|
+
/* @__PURE__ */ jsx("div", { className: "mt-1", children: /* @__PURE__ */ jsx(
|
|
4427
|
+
Badge,
|
|
4428
|
+
{
|
|
4429
|
+
size: "2xsmall",
|
|
4430
|
+
className: `uppercase ${getStatusBadgeClass$1(paymentStatus)}`,
|
|
4431
|
+
children: paymentStatus !== "—" ? paymentStatus.replace(/_/g, " ") : "—"
|
|
4432
|
+
}
|
|
4433
|
+
) })
|
|
4434
|
+
] }),
|
|
4435
|
+
detail.computed ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
4436
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
4437
|
+
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Full refund" }),
|
|
4438
|
+
/* @__PURE__ */ jsx(Text, { className: "mt-1 block", children: detail.computed.is_full_refund ? "Yes" : "No" })
|
|
4439
|
+
] }),
|
|
4440
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
4441
|
+
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Remaining refundable" }),
|
|
4442
|
+
/* @__PURE__ */ jsx(Text, { className: "mt-1 block", children: formatAmount(detail.computed.remaining_refundable_amount) })
|
|
4443
|
+
] }),
|
|
4444
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
4445
|
+
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Refund %" }),
|
|
4446
|
+
/* @__PURE__ */ jsxs(Text, { className: "mt-1 block", children: [
|
|
4447
|
+
detail.computed.refund_percentage.toFixed(1),
|
|
4448
|
+
"%"
|
|
4449
|
+
] })
|
|
4450
|
+
] })
|
|
4451
|
+
] }) : null
|
|
4452
|
+
] })
|
|
4453
|
+
] }),
|
|
4454
|
+
/* @__PURE__ */ jsxs("div", { className: "rounded-xl border border-ui-border-base p-6", children: [
|
|
4455
|
+
/* @__PURE__ */ jsx(Heading, { level: "h2", className: "text-lg mb-4", children: "Order summary" }),
|
|
4456
|
+
detail.order ? /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [
|
|
4457
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
4458
|
+
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Order" }),
|
|
4459
|
+
/* @__PURE__ */ jsx("div", { className: "mt-1", children: /* @__PURE__ */ jsx(
|
|
4460
|
+
Button,
|
|
4461
|
+
{
|
|
4462
|
+
variant: "transparent",
|
|
4463
|
+
size: "small",
|
|
4464
|
+
onClick: () => navigate(`/orders/${detail.order.order_id}`),
|
|
4465
|
+
children: detail.order.order_number ?? detail.order.order_id
|
|
4466
|
+
}
|
|
4467
|
+
) })
|
|
4468
|
+
] }),
|
|
4469
|
+
detail.order.total != null ? /* @__PURE__ */ jsxs("div", { children: [
|
|
4470
|
+
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Total" }),
|
|
4471
|
+
/* @__PURE__ */ jsx(Text, { className: "mt-1 block", children: formatAmount(detail.order.total) })
|
|
4472
|
+
] }) : null,
|
|
4473
|
+
detail.order.customer_id ? /* @__PURE__ */ jsxs("div", { children: [
|
|
4474
|
+
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Customer ID" }),
|
|
4475
|
+
/* @__PURE__ */ jsx(Text, { className: "mt-1 block font-mono text-sm", children: detail.order.customer_id })
|
|
4476
|
+
] }) : null,
|
|
4477
|
+
detail.order.region ? /* @__PURE__ */ jsxs("div", { children: [
|
|
4478
|
+
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Region" }),
|
|
4479
|
+
/* @__PURE__ */ jsx(Text, { className: "mt-1 block", children: detail.order.region })
|
|
4480
|
+
] }) : null,
|
|
4481
|
+
detail.order.fulfillment_status ? /* @__PURE__ */ jsxs("div", { children: [
|
|
4482
|
+
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Fulfillment status" }),
|
|
4483
|
+
/* @__PURE__ */ jsx(Text, { className: "mt-1 block", children: detail.order.fulfillment_status })
|
|
4484
|
+
] }) : null
|
|
4485
|
+
] }) : /* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "No order linked to this refund." })
|
|
4486
|
+
] }),
|
|
4487
|
+
/* @__PURE__ */ jsxs("div", { className: "rounded-xl border border-ui-border-base p-6", children: [
|
|
4488
|
+
/* @__PURE__ */ jsxs(
|
|
4489
|
+
"button",
|
|
4490
|
+
{
|
|
4491
|
+
type: "button",
|
|
4492
|
+
className: "flex w-full items-center justify-between text-left",
|
|
4493
|
+
onClick: () => setGatewayExpanded((prev) => !prev),
|
|
4494
|
+
"aria-expanded": gatewayExpanded,
|
|
4495
|
+
"aria-label": gatewayExpanded ? "Collapse gateway data" : "Expand gateway data",
|
|
4496
|
+
children: [
|
|
4497
|
+
/* @__PURE__ */ jsx(Heading, { level: "h2", className: "text-lg", children: "Gateway data" }),
|
|
4498
|
+
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: gatewayExpanded ? "Collapse" : "Expand" })
|
|
4499
|
+
]
|
|
4500
|
+
}
|
|
4501
|
+
),
|
|
4502
|
+
gatewayExpanded && /* @__PURE__ */ jsx("div", { className: "mt-4", children: hasGatewayData ? /* @__PURE__ */ jsx("pre", { className: "text-xs bg-ui-bg-subtle p-4 rounded-lg overflow-auto max-h-96", children: JSON.stringify(detail.payment.payment_data, null, 2) }) : /* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "No gateway payload for this payment." }) })
|
|
4503
|
+
] })
|
|
4504
|
+
] }) : null
|
|
4505
|
+
] }) });
|
|
4506
|
+
};
|
|
4507
|
+
const config$1 = defineRouteConfig({
|
|
4508
|
+
label: "Refund details",
|
|
4509
|
+
icon: Receipt
|
|
4510
|
+
});
|
|
4511
4511
|
const getStatusBadgeClass = (status) => {
|
|
4512
4512
|
const statusLower = status.toLowerCase();
|
|
4513
4513
|
if (statusLower === "requested") {
|
|
@@ -4812,13 +4812,13 @@ const routeModule = {
|
|
|
4812
4812
|
handle: { label: config$8.label, translationNs: config$8.translationNs }
|
|
4813
4813
|
},
|
|
4814
4814
|
{
|
|
4815
|
-
Component:
|
|
4816
|
-
path: "/
|
|
4815
|
+
Component: ReturnsPage,
|
|
4816
|
+
path: "/returns",
|
|
4817
4817
|
handle: { label: config$7.label, translationNs: config$7.translationNs }
|
|
4818
4818
|
},
|
|
4819
4819
|
{
|
|
4820
|
-
Component:
|
|
4821
|
-
path: "/
|
|
4820
|
+
Component: RefundsPage,
|
|
4821
|
+
path: "/refunds",
|
|
4822
4822
|
handle: { label: config$6.label, translationNs: config$6.translationNs }
|
|
4823
4823
|
},
|
|
4824
4824
|
{
|
|
@@ -4837,13 +4837,13 @@ const routeModule = {
|
|
|
4837
4837
|
handle: { label: config$3.label, translationNs: config$3.translationNs }
|
|
4838
4838
|
},
|
|
4839
4839
|
{
|
|
4840
|
-
Component:
|
|
4841
|
-
path: "/
|
|
4840
|
+
Component: ReturnDetailPage,
|
|
4841
|
+
path: "/returns/:id",
|
|
4842
4842
|
handle: { label: config$2.label, translationNs: config$2.translationNs }
|
|
4843
4843
|
},
|
|
4844
4844
|
{
|
|
4845
|
-
Component:
|
|
4846
|
-
path: "/
|
|
4845
|
+
Component: RefundDetailPage,
|
|
4846
|
+
path: "/refunds/:id",
|
|
4847
4847
|
handle: { label: config$1.label, translationNs: config$1.translationNs }
|
|
4848
4848
|
},
|
|
4849
4849
|
{
|
|
@@ -4863,6 +4863,14 @@ const menuItemModule = {
|
|
|
4863
4863
|
rank: void 0,
|
|
4864
4864
|
translationNs: void 0
|
|
4865
4865
|
},
|
|
4866
|
+
{
|
|
4867
|
+
label: config$6.label,
|
|
4868
|
+
icon: config$6.icon,
|
|
4869
|
+
path: "/refunds",
|
|
4870
|
+
nested: void 0,
|
|
4871
|
+
rank: void 0,
|
|
4872
|
+
translationNs: void 0
|
|
4873
|
+
},
|
|
4866
4874
|
{
|
|
4867
4875
|
label: config$8.label,
|
|
4868
4876
|
icon: config$8.icon,
|
|
@@ -4874,23 +4882,23 @@ const menuItemModule = {
|
|
|
4874
4882
|
{
|
|
4875
4883
|
label: config$7.label,
|
|
4876
4884
|
icon: config$7.icon,
|
|
4877
|
-
path: "/
|
|
4885
|
+
path: "/returns",
|
|
4878
4886
|
nested: void 0,
|
|
4879
4887
|
rank: void 0,
|
|
4880
4888
|
translationNs: void 0
|
|
4881
4889
|
},
|
|
4882
4890
|
{
|
|
4883
|
-
label: config$
|
|
4884
|
-
icon: config$
|
|
4885
|
-
path: "/
|
|
4891
|
+
label: config$5.label,
|
|
4892
|
+
icon: config$5.icon,
|
|
4893
|
+
path: "/swaps",
|
|
4886
4894
|
nested: void 0,
|
|
4887
4895
|
rank: void 0,
|
|
4888
4896
|
translationNs: void 0
|
|
4889
4897
|
},
|
|
4890
4898
|
{
|
|
4891
|
-
label: config$
|
|
4892
|
-
icon: config$
|
|
4893
|
-
path: "/
|
|
4899
|
+
label: config$1.label,
|
|
4900
|
+
icon: config$1.icon,
|
|
4901
|
+
path: "/refunds/:id",
|
|
4894
4902
|
nested: void 0,
|
|
4895
4903
|
rank: void 0,
|
|
4896
4904
|
translationNs: void 0
|
|
@@ -4906,14 +4914,6 @@ const menuItemModule = {
|
|
|
4906
4914
|
{
|
|
4907
4915
|
label: config$2.label,
|
|
4908
4916
|
icon: config$2.icon,
|
|
4909
|
-
path: "/refunds/:id",
|
|
4910
|
-
nested: void 0,
|
|
4911
|
-
rank: void 0,
|
|
4912
|
-
translationNs: void 0
|
|
4913
|
-
},
|
|
4914
|
-
{
|
|
4915
|
-
label: config$1.label,
|
|
4916
|
-
icon: config$1.icon,
|
|
4917
4917
|
path: "/returns/:id",
|
|
4918
4918
|
nested: void 0,
|
|
4919
4919
|
rank: void 0,
|