@lodashventure/medusa-booking-for-pickup 1.4.18 → 1.4.20
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.
- package/.medusa/server/src/admin/index.js +54 -30
- package/.medusa/server/src/admin/index.mjs +75 -51
- package/.medusa/server/src/api/admin/customers/[id]/pickup-history/route.js +56 -43
- package/.medusa/server/src/api/store/customers/me/pickup-history/route.js +94 -0
- package/.medusa/server/src/links/shipping-option-pickup-availability.js +4 -5
- package/package.json +2 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
const jsxRuntime = require("react/jsx-runtime");
|
|
3
|
-
const react = require("react");
|
|
4
|
-
const lucideReact = require("lucide-react");
|
|
5
3
|
const adminSdk = require("@medusajs/admin-sdk");
|
|
6
4
|
const ui = require("@medusajs/ui");
|
|
5
|
+
const react = require("react");
|
|
6
|
+
const lucideReact = require("lucide-react");
|
|
7
7
|
const icons = require("@medusajs/icons");
|
|
8
8
|
const reactRouterDom = require("react-router-dom");
|
|
9
9
|
const Medusa = require("@medusajs/js-sdk");
|
|
@@ -69,38 +69,38 @@ const CustomerPickupHistoryWidget = ({ data }) => {
|
|
|
69
69
|
canceled: "ยกเลิก",
|
|
70
70
|
processing: "กำลังดำเนินการ"
|
|
71
71
|
};
|
|
72
|
-
return /* @__PURE__ */ jsxRuntime.jsx(Badge, { color: statusColors[status] || "grey", size: "small", children: statusLabels[status] || status });
|
|
72
|
+
return /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { color: statusColors[status] || "grey", size: "small", children: statusLabels[status] || status });
|
|
73
73
|
};
|
|
74
74
|
if (loading) {
|
|
75
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(Container, { className: "divide-y p-0", children: [
|
|
75
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(ui.Container, { className: "divide-y p-0", children: [
|
|
76
76
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-between px-6 py-4", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-x-2", children: [
|
|
77
77
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Calendar, { className: "text-ui-fg-subtle" }),
|
|
78
|
-
/* @__PURE__ */ jsxRuntime.jsx(Heading, { level: "h2", children: "ประวัติการจองรับสินค้า" })
|
|
78
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", children: "ประวัติการจองรับสินค้า" })
|
|
79
79
|
] }) }),
|
|
80
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-6 py-4", children: /* @__PURE__ */ jsxRuntime.jsx(Text, { className: "text-ui-fg-subtle", children: "กำลังโหลด..." }) })
|
|
80
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-6 py-4", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-ui-fg-subtle", children: "กำลังโหลด..." }) })
|
|
81
81
|
] });
|
|
82
82
|
}
|
|
83
83
|
if (error) {
|
|
84
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(Container, { className: "divide-y p-0", children: [
|
|
84
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(ui.Container, { className: "divide-y p-0", children: [
|
|
85
85
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-between px-6 py-4", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-x-2", children: [
|
|
86
86
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Calendar, { className: "text-ui-fg-subtle" }),
|
|
87
|
-
/* @__PURE__ */ jsxRuntime.jsx(Heading, { level: "h2", children: "ประวัติการจองรับสินค้า" })
|
|
87
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", children: "ประวัติการจองรับสินค้า" })
|
|
88
88
|
] }) }),
|
|
89
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-6 py-4", children: /* @__PURE__ */ jsxRuntime.jsx(Text, { className: "text-red-500", children: error }) })
|
|
89
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-6 py-4", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-red-500", children: error }) })
|
|
90
90
|
] });
|
|
91
91
|
}
|
|
92
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(Container, { className: "divide-y p-0", children: [
|
|
92
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(ui.Container, { className: "divide-y p-0", children: [
|
|
93
93
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between px-6 py-4", children: [
|
|
94
94
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-x-2", children: [
|
|
95
95
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Calendar, { className: "text-ui-fg-subtle" }),
|
|
96
|
-
/* @__PURE__ */ jsxRuntime.jsx(Heading, { level: "h2", children: "ประวัติการจองรับสินค้า" }),
|
|
97
|
-
pickupHistory.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(Badge, { size: "small", children: pickupHistory.length })
|
|
96
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", children: "ประวัติการจองรับสินค้า" }),
|
|
97
|
+
pickupHistory.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { size: "small", children: pickupHistory.length })
|
|
98
98
|
] }),
|
|
99
|
-
/* @__PURE__ */ jsxRuntime.jsx(Button, { size: "small", variant: "transparent", onClick: fetchPickupHistory, children: "รีเฟรช" })
|
|
99
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "transparent", onClick: fetchPickupHistory, children: "รีเฟรช" })
|
|
100
100
|
] }),
|
|
101
101
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-6 py-4", children: pickupHistory.length === 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center justify-center py-8 text-center", children: [
|
|
102
102
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Package, { className: "text-ui-fg-muted mb-4", size: 48 }),
|
|
103
|
-
/* @__PURE__ */ jsxRuntime.jsx(Text, { className: "text-ui-fg-subtle", children: "ยังไม่มีประวัติการจองรับสินค้า" })
|
|
103
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-ui-fg-subtle", children: "ยังไม่มีประวัติการจองรับสินค้า" })
|
|
104
104
|
] }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-4", children: pickupHistory.map((pickup) => {
|
|
105
105
|
var _a;
|
|
106
106
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -112,22 +112,22 @@ const CustomerPickupHistoryWidget = ({ data }) => {
|
|
|
112
112
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
113
113
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ShoppingBag, { className: "text-ui-fg-subtle", size: 20 }),
|
|
114
114
|
/* @__PURE__ */ jsxRuntime.jsx("div", { children: pickup.order ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
115
|
-
/* @__PURE__ */ jsxRuntime.jsxs(Text, { weight: "plus", size: "small", children: [
|
|
115
|
+
/* @__PURE__ */ jsxRuntime.jsxs(ui.Text, { weight: "plus", size: "small", children: [
|
|
116
116
|
"คำสั่งซื้อ #",
|
|
117
117
|
pickup.order.display_id
|
|
118
118
|
] }),
|
|
119
|
-
/* @__PURE__ */ jsxRuntime.jsxs(Text, { size: "xsmall", className: "text-ui-fg-subtle", children: [
|
|
119
|
+
/* @__PURE__ */ jsxRuntime.jsxs(ui.Text, { size: "xsmall", className: "text-ui-fg-subtle", children: [
|
|
120
120
|
((_a = pickup.order.items) == null ? void 0 : _a.length) || 0,
|
|
121
121
|
" รายการ"
|
|
122
122
|
] })
|
|
123
|
-
] }) : /* @__PURE__ */ jsxRuntime.jsxs(Text, { weight: "plus", size: "small", children: [
|
|
123
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsxs(ui.Text, { weight: "plus", size: "small", children: [
|
|
124
124
|
"คำสั่งซื้อ ",
|
|
125
125
|
pickup.order_id
|
|
126
126
|
] }) })
|
|
127
127
|
] }),
|
|
128
128
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-end gap-1", children: [
|
|
129
129
|
pickup.order && getStatusBadge(pickup.order.status),
|
|
130
|
-
pickup.order && /* @__PURE__ */ jsxRuntime.jsx(Text, { weight: "plus", size: "small", children: formatCurrency(
|
|
130
|
+
pickup.order && /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { weight: "plus", size: "small", children: formatCurrency(
|
|
131
131
|
pickup.order.total,
|
|
132
132
|
pickup.order.currency_code
|
|
133
133
|
) })
|
|
@@ -149,7 +149,7 @@ const CustomerPickupHistoryWidget = ({ data }) => {
|
|
|
149
149
|
] })
|
|
150
150
|
] })
|
|
151
151
|
] }),
|
|
152
|
-
pickup.order && pickup.order.shipping_methods && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-2 pt-2 border-t", children: /* @__PURE__ */ jsxRuntime.jsx(Text, { size: "xsmall", className: "text-ui-fg-subtle", children: pickup.order.shipping_methods.map((sm) => sm.name).join(", ") }) })
|
|
152
|
+
pickup.order && pickup.order.shipping_methods && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-2 pt-2 border-t", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "xsmall", className: "text-ui-fg-subtle", children: pickup.order.shipping_methods.map((sm) => sm.name).join(", ") }) })
|
|
153
153
|
]
|
|
154
154
|
},
|
|
155
155
|
pickup.id
|
|
@@ -157,7 +157,7 @@ const CustomerPickupHistoryWidget = ({ data }) => {
|
|
|
157
157
|
}) }) })
|
|
158
158
|
] });
|
|
159
159
|
};
|
|
160
|
-
defineWidgetConfig({
|
|
160
|
+
adminSdk.defineWidgetConfig({
|
|
161
161
|
zone: "customer.details.after"
|
|
162
162
|
});
|
|
163
163
|
const OrderPickupBookingWidget = ({ data }) => {
|
|
@@ -460,7 +460,7 @@ const usePickupAvailable = (id) => {
|
|
|
460
460
|
setError(null);
|
|
461
461
|
try {
|
|
462
462
|
const option = await sdk.admin.shippingOption.retrieve(id, {
|
|
463
|
-
fields: "*.*,pickup_availabilities.*"
|
|
463
|
+
fields: "*.*,pickupAvailability.*,pickup_availabilities.*"
|
|
464
464
|
});
|
|
465
465
|
if (option.shipping_option.service_zone.fulfillment_set.type !== "pickup") {
|
|
466
466
|
throw new Error("shipping option is not pickup");
|
|
@@ -629,22 +629,46 @@ const DEFAULT_SCHEDULE = {
|
|
|
629
629
|
function ShippingOptionDetails() {
|
|
630
630
|
const { id } = reactRouterDom.useParams();
|
|
631
631
|
const navigate = reactRouterDom.useNavigate();
|
|
632
|
-
const sdk2 = adminSdk.useSdk();
|
|
633
632
|
const [schedule, setSchedule] = react.useState(
|
|
634
633
|
structuredClone(DEFAULT_SCHEDULE)
|
|
635
634
|
);
|
|
636
635
|
const { data, refetch, error } = usePickupAvailable(id);
|
|
637
636
|
react.useEffect(() => {
|
|
638
|
-
if (!data)
|
|
637
|
+
if (!(data == null ? void 0 : data.shipping_option)) {
|
|
638
|
+
return;
|
|
639
|
+
}
|
|
639
640
|
const _schedule = structuredClone(DEFAULT_SCHEDULE);
|
|
640
|
-
|
|
641
|
-
|
|
641
|
+
const normalizeInput = (input) => {
|
|
642
|
+
if (!input) {
|
|
643
|
+
return [];
|
|
644
|
+
}
|
|
645
|
+
if (Array.isArray(input)) {
|
|
646
|
+
return input;
|
|
647
|
+
}
|
|
648
|
+
if (typeof input === "object") {
|
|
649
|
+
return Object.values(input);
|
|
650
|
+
}
|
|
651
|
+
return [];
|
|
652
|
+
};
|
|
653
|
+
const normalized = [
|
|
654
|
+
...normalizeInput(data.shipping_option.pickup_availabilities),
|
|
655
|
+
...normalizeInput(data.shipping_option.pickupAvailability)
|
|
656
|
+
];
|
|
657
|
+
normalized.forEach((availability) => {
|
|
658
|
+
if (!(availability == null ? void 0 : availability.day_of_week)) {
|
|
659
|
+
return;
|
|
660
|
+
}
|
|
661
|
+
const dayKey = availability.day_of_week.toLowerCase();
|
|
662
|
+
if (!_schedule[dayKey]) {
|
|
663
|
+
return;
|
|
664
|
+
}
|
|
665
|
+
const timeSlots = _schedule[dayKey].timeSlots;
|
|
642
666
|
timeSlots.push({
|
|
643
667
|
start: dateToString(availability.timeStart),
|
|
644
668
|
end: dateToString(availability.timeEnd)
|
|
645
669
|
});
|
|
646
|
-
_schedule[
|
|
647
|
-
enabled: availability.enable,
|
|
670
|
+
_schedule[dayKey] = {
|
|
671
|
+
enabled: Boolean(availability.enable),
|
|
648
672
|
timeSlots
|
|
649
673
|
};
|
|
650
674
|
});
|
|
@@ -679,12 +703,12 @@ function ShippingOptionDetails() {
|
|
|
679
703
|
return;
|
|
680
704
|
}
|
|
681
705
|
try {
|
|
682
|
-
await
|
|
706
|
+
await sdk.client.fetch(`/admin/pickup-date/${id}`, {
|
|
683
707
|
method: "POST",
|
|
684
708
|
headers: {
|
|
685
709
|
"Content-Type": "application/json"
|
|
686
710
|
},
|
|
687
|
-
body:
|
|
711
|
+
body: {
|
|
688
712
|
schedules: Object.entries(schedule).filter(([_, daySchedule]) => daySchedule.enabled).map(([day, { enabled, timeSlots }]) => ({
|
|
689
713
|
day_of_week: day,
|
|
690
714
|
enable: enabled,
|
|
@@ -693,7 +717,7 @@ function ShippingOptionDetails() {
|
|
|
693
717
|
end: slot.end
|
|
694
718
|
}))
|
|
695
719
|
}))
|
|
696
|
-
}
|
|
720
|
+
}
|
|
697
721
|
});
|
|
698
722
|
refetch();
|
|
699
723
|
ui.toast.success("Availability updated", {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { defineWidgetConfig, defineRouteConfig } from "@medusajs/admin-sdk";
|
|
3
|
+
import { Container, Heading, Text, Badge, Button, toast, createDataTableColumnHelper, useDataTable, DataTable, Select, clx, Switch, IconButton } from "@medusajs/ui";
|
|
2
4
|
import { useState, useEffect, useMemo, useCallback } from "react";
|
|
3
5
|
import { Calendar, Package, ShoppingBag, Clock, MapPin, RefreshCw, ArrowLeft, Trash2 } from "lucide-react";
|
|
4
|
-
import { defineWidgetConfig as defineWidgetConfig$1, defineRouteConfig, useSdk } from "@medusajs/admin-sdk";
|
|
5
|
-
import { Container as Container$1, Heading as Heading$1, Text as Text$1, Badge as Badge$1, Button as Button$1, toast, createDataTableColumnHelper, useDataTable, DataTable, Select, clx, Switch, IconButton } from "@medusajs/ui";
|
|
6
6
|
import { StackPerspective, Plus } from "@medusajs/icons";
|
|
7
7
|
import { useNavigate, useParams, Navigate } from "react-router-dom";
|
|
8
8
|
import Medusa from "@medusajs/js-sdk";
|
|
@@ -232,46 +232,46 @@ const OrderPickupBookingWidget = ({ data }) => {
|
|
|
232
232
|
return { label: "รอรับสินค้า", color: "blue" };
|
|
233
233
|
};
|
|
234
234
|
if (loading) {
|
|
235
|
-
return /* @__PURE__ */ jsxs(Container
|
|
235
|
+
return /* @__PURE__ */ jsxs(Container, { className: "divide-y p-0", children: [
|
|
236
236
|
/* @__PURE__ */ jsx("div", { className: "flex items-center justify-between px-6 py-4", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-x-2", children: [
|
|
237
237
|
/* @__PURE__ */ jsx(Calendar, { className: "text-ui-fg-subtle" }),
|
|
238
|
-
/* @__PURE__ */ jsx(Heading
|
|
238
|
+
/* @__PURE__ */ jsx(Heading, { level: "h2", children: "การจองรับสินค้า" })
|
|
239
239
|
] }) }),
|
|
240
|
-
/* @__PURE__ */ jsx("div", { className: "px-6 py-4", children: /* @__PURE__ */ jsx(Text
|
|
240
|
+
/* @__PURE__ */ jsx("div", { className: "px-6 py-4", children: /* @__PURE__ */ jsx(Text, { className: "text-ui-fg-subtle", children: "กำลังโหลด..." }) })
|
|
241
241
|
] });
|
|
242
242
|
}
|
|
243
243
|
if (error) {
|
|
244
|
-
return /* @__PURE__ */ jsxs(Container
|
|
244
|
+
return /* @__PURE__ */ jsxs(Container, { className: "divide-y p-0", children: [
|
|
245
245
|
/* @__PURE__ */ jsx("div", { className: "flex items-center justify-between px-6 py-4", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-x-2", children: [
|
|
246
246
|
/* @__PURE__ */ jsx(Calendar, { className: "text-ui-fg-subtle" }),
|
|
247
|
-
/* @__PURE__ */ jsx(Heading
|
|
247
|
+
/* @__PURE__ */ jsx(Heading, { level: "h2", children: "การจองรับสินค้า" })
|
|
248
248
|
] }) }),
|
|
249
|
-
/* @__PURE__ */ jsx("div", { className: "px-6 py-4", children: /* @__PURE__ */ jsx(Text
|
|
249
|
+
/* @__PURE__ */ jsx("div", { className: "px-6 py-4", children: /* @__PURE__ */ jsx(Text, { className: "text-red-500", children: error }) })
|
|
250
250
|
] });
|
|
251
251
|
}
|
|
252
252
|
if (!pickupBooking) {
|
|
253
|
-
return /* @__PURE__ */ jsxs(Container
|
|
253
|
+
return /* @__PURE__ */ jsxs(Container, { className: "divide-y p-0", children: [
|
|
254
254
|
/* @__PURE__ */ jsx("div", { className: "flex items-center justify-between px-6 py-4", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-x-2", children: [
|
|
255
255
|
/* @__PURE__ */ jsx(Calendar, { className: "text-ui-fg-subtle" }),
|
|
256
|
-
/* @__PURE__ */ jsx(Heading
|
|
256
|
+
/* @__PURE__ */ jsx(Heading, { level: "h2", children: "การจองรับสินค้า" })
|
|
257
257
|
] }) }),
|
|
258
258
|
/* @__PURE__ */ jsx("div", { className: "px-6 py-4", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center py-8 text-center", children: [
|
|
259
259
|
/* @__PURE__ */ jsx(MapPin, { className: "text-ui-fg-muted mb-4", size: 48 }),
|
|
260
|
-
/* @__PURE__ */ jsx(Text
|
|
261
|
-
/* @__PURE__ */ jsx(Text
|
|
260
|
+
/* @__PURE__ */ jsx(Text, { className: "text-ui-fg-subtle", children: "คำสั่งซื้อนี้ไม่ได้จองรับสินค้าที่สาขา" }),
|
|
261
|
+
/* @__PURE__ */ jsx(Text, { size: "xsmall", className: "text-ui-fg-muted mt-2", children: "คำสั่งซื้อนี้อาจเป็นการจัดส่งแบบปกติ" })
|
|
262
262
|
] }) })
|
|
263
263
|
] });
|
|
264
264
|
}
|
|
265
265
|
const status = getPickupStatus();
|
|
266
|
-
return /* @__PURE__ */ jsxs(Container
|
|
266
|
+
return /* @__PURE__ */ jsxs(Container, { className: "divide-y p-0", children: [
|
|
267
267
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-6 py-4", children: [
|
|
268
268
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-x-2", children: [
|
|
269
269
|
/* @__PURE__ */ jsx(Calendar, { className: "text-ui-fg-subtle" }),
|
|
270
|
-
/* @__PURE__ */ jsx(Heading
|
|
271
|
-
/* @__PURE__ */ jsx(Badge
|
|
270
|
+
/* @__PURE__ */ jsx(Heading, { level: "h2", children: "การจองรับสินค้าที่สาขา" }),
|
|
271
|
+
/* @__PURE__ */ jsx(Badge, { color: status.color, size: "small", children: status.label })
|
|
272
272
|
] }),
|
|
273
273
|
/* @__PURE__ */ jsx(
|
|
274
|
-
Button
|
|
274
|
+
Button,
|
|
275
275
|
{
|
|
276
276
|
size: "small",
|
|
277
277
|
variant: "transparent",
|
|
@@ -288,25 +288,25 @@ const OrderPickupBookingWidget = ({ data }) => {
|
|
|
288
288
|
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
289
289
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-ui-fg-subtle", children: [
|
|
290
290
|
/* @__PURE__ */ jsx(Calendar, { size: 16 }),
|
|
291
|
-
/* @__PURE__ */ jsx(Text
|
|
291
|
+
/* @__PURE__ */ jsx(Text, { size: "xsmall", weight: "plus", children: "วันที่รับสินค้า" })
|
|
292
292
|
] }),
|
|
293
|
-
/* @__PURE__ */ jsx(Text
|
|
293
|
+
/* @__PURE__ */ jsx(Text, { weight: "plus", children: formatDate(pickupBooking.pickup_datetime) })
|
|
294
294
|
] }),
|
|
295
295
|
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
296
296
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-ui-fg-subtle", children: [
|
|
297
297
|
/* @__PURE__ */ jsx(Clock, { size: 16 }),
|
|
298
|
-
/* @__PURE__ */ jsx(Text
|
|
298
|
+
/* @__PURE__ */ jsx(Text, { size: "xsmall", weight: "plus", children: "เวลารับสินค้า" })
|
|
299
299
|
] }),
|
|
300
|
-
/* @__PURE__ */ jsx(Text
|
|
300
|
+
/* @__PURE__ */ jsx(Text, { weight: "plus", children: formatTime(pickupBooking.pickup_datetime) })
|
|
301
301
|
] })
|
|
302
302
|
] }),
|
|
303
303
|
pickupBooking.shipping_option && /* @__PURE__ */ jsx("div", { className: "rounded-lg border p-4 bg-ui-bg-subtle", children: /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-2 mb-2", children: [
|
|
304
304
|
/* @__PURE__ */ jsx(MapPin, { className: "text-ui-fg-muted mt-1", size: 16 }),
|
|
305
305
|
/* @__PURE__ */ jsxs("div", { className: "flex-1", children: [
|
|
306
|
-
/* @__PURE__ */ jsx(Text
|
|
306
|
+
/* @__PURE__ */ jsx(Text, { weight: "plus", size: "small", className: "mb-1", children: pickupBooking.shipping_option.name }),
|
|
307
307
|
((_b = (_a = pickupBooking.shipping_option.service_zone) == null ? void 0 : _a.fulfillment_set) == null ? void 0 : _b.location) && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
308
|
-
/* @__PURE__ */ jsx(Text
|
|
309
|
-
pickupBooking.shipping_option.service_zone.fulfillment_set.location.address && /* @__PURE__ */ jsxs(Text
|
|
308
|
+
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-subtle", children: pickupBooking.shipping_option.service_zone.fulfillment_set.location.name }),
|
|
309
|
+
pickupBooking.shipping_option.service_zone.fulfillment_set.location.address && /* @__PURE__ */ jsxs(Text, { size: "xsmall", className: "text-ui-fg-muted mt-1", children: [
|
|
310
310
|
pickupBooking.shipping_option.service_zone.fulfillment_set.location.address.address_1,
|
|
311
311
|
pickupBooking.shipping_option.service_zone.fulfillment_set.location.address.address_2 && `, ${pickupBooking.shipping_option.service_zone.fulfillment_set.location.address.address_2}`,
|
|
312
312
|
/* @__PURE__ */ jsx("br", {}),
|
|
@@ -321,22 +321,22 @@ const OrderPickupBookingWidget = ({ data }) => {
|
|
|
321
321
|
] }) }),
|
|
322
322
|
/* @__PURE__ */ jsx("div", { className: "pt-4 border-t", children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
|
|
323
323
|
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
324
|
-
/* @__PURE__ */ jsx(Text
|
|
325
|
-
/* @__PURE__ */ jsx(Text
|
|
324
|
+
/* @__PURE__ */ jsx(Text, { size: "xsmall", className: "text-ui-fg-subtle", children: "จองเมื่อ" }),
|
|
325
|
+
/* @__PURE__ */ jsx(Text, { size: "small", children: formatDateTime(pickupBooking.created_at) })
|
|
326
326
|
] }),
|
|
327
327
|
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
328
|
-
/* @__PURE__ */ jsx(Text
|
|
329
|
-
/* @__PURE__ */ jsx(Text
|
|
328
|
+
/* @__PURE__ */ jsx(Text, { size: "xsmall", className: "text-ui-fg-subtle", children: "อัปเดตล่าสุด" }),
|
|
329
|
+
/* @__PURE__ */ jsx(Text, { size: "small", children: formatDateTime(pickupBooking.updated_at) })
|
|
330
330
|
] })
|
|
331
331
|
] }) }),
|
|
332
|
-
/* @__PURE__ */ jsx("div", { className: "pt-4 border-t", children: /* @__PURE__ */ jsxs(Text
|
|
332
|
+
/* @__PURE__ */ jsx("div", { className: "pt-4 border-t", children: /* @__PURE__ */ jsxs(Text, { size: "xsmall", className: "text-ui-fg-muted", children: [
|
|
333
333
|
"Booking ID: ",
|
|
334
334
|
pickupBooking.id
|
|
335
335
|
] }) })
|
|
336
336
|
] }) })
|
|
337
337
|
] });
|
|
338
338
|
};
|
|
339
|
-
defineWidgetConfig
|
|
339
|
+
defineWidgetConfig({
|
|
340
340
|
zone: "order.details.after"
|
|
341
341
|
});
|
|
342
342
|
const sdk = new Medusa({
|
|
@@ -431,8 +431,8 @@ const ShippingOptionList = () => {
|
|
|
431
431
|
navigate(`/pickup-shipping/${row.id}`);
|
|
432
432
|
}
|
|
433
433
|
});
|
|
434
|
-
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(Container
|
|
435
|
-
/* @__PURE__ */ jsx(DataTable.Toolbar, { className: "flex flex-col items-start justify-between gap-2 md:flex-row md:items-center", children: /* @__PURE__ */ jsx(Heading
|
|
434
|
+
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(Container, { className: "flex flex-col p-0 overflow-hidden", children: /* @__PURE__ */ jsxs(DataTable, { instance: table, children: [
|
|
435
|
+
/* @__PURE__ */ jsx(DataTable.Toolbar, { className: "flex flex-col items-start justify-between gap-2 md:flex-row md:items-center", children: /* @__PURE__ */ jsx(Heading, { children: "Pickup Shipping Options" }) }),
|
|
436
436
|
/* @__PURE__ */ jsx(DataTable.Table, {})
|
|
437
437
|
] }) }) });
|
|
438
438
|
};
|
|
@@ -457,7 +457,7 @@ const usePickupAvailable = (id) => {
|
|
|
457
457
|
setError(null);
|
|
458
458
|
try {
|
|
459
459
|
const option = await sdk.admin.shippingOption.retrieve(id, {
|
|
460
|
-
fields: "*.*,pickup_availabilities.*"
|
|
460
|
+
fields: "*.*,pickupAvailability.*,pickup_availabilities.*"
|
|
461
461
|
});
|
|
462
462
|
if (option.shipping_option.service_zone.fulfillment_set.type !== "pickup") {
|
|
463
463
|
throw new Error("shipping option is not pickup");
|
|
@@ -567,10 +567,10 @@ function TimeTable({
|
|
|
567
567
|
});
|
|
568
568
|
};
|
|
569
569
|
if (timeSlots.length === 0) return null;
|
|
570
|
-
return /* @__PURE__ */ jsxs(Container
|
|
571
|
-
/* @__PURE__ */ jsx(Heading
|
|
570
|
+
return /* @__PURE__ */ jsxs(Container, { className: "p-4 overflow-x-auto", children: [
|
|
571
|
+
/* @__PURE__ */ jsx(Heading, { className: "text-xl font-bold mb-4", children: "Pickup Hours Schedule" }),
|
|
572
572
|
/* @__PURE__ */ jsxs("div", { className: "min-w-full flex", children: [
|
|
573
|
-
/* @__PURE__ */ jsx("div", { className: "ml-2 mt-7 flex flex-col items-end", children: timeSlots.map((timeSlot) => /* @__PURE__ */ jsx(Text
|
|
573
|
+
/* @__PURE__ */ jsx("div", { className: "ml-2 mt-7 flex flex-col items-end", children: timeSlots.map((timeSlot) => /* @__PURE__ */ jsx(Text, { className: "h-8", children: timeSlot }, timeSlot)) }),
|
|
574
574
|
/* @__PURE__ */ jsxs("table", { className: "ml-2 w-full border-collapse", children: [
|
|
575
575
|
/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsx("tr", { children: days.map((day) => /* @__PURE__ */ jsx(
|
|
576
576
|
"th",
|
|
@@ -626,22 +626,46 @@ const DEFAULT_SCHEDULE = {
|
|
|
626
626
|
function ShippingOptionDetails() {
|
|
627
627
|
const { id } = useParams();
|
|
628
628
|
const navigate = useNavigate();
|
|
629
|
-
const sdk2 = useSdk();
|
|
630
629
|
const [schedule, setSchedule] = useState(
|
|
631
630
|
structuredClone(DEFAULT_SCHEDULE)
|
|
632
631
|
);
|
|
633
632
|
const { data, refetch, error } = usePickupAvailable(id);
|
|
634
633
|
useEffect(() => {
|
|
635
|
-
if (!data)
|
|
634
|
+
if (!(data == null ? void 0 : data.shipping_option)) {
|
|
635
|
+
return;
|
|
636
|
+
}
|
|
636
637
|
const _schedule = structuredClone(DEFAULT_SCHEDULE);
|
|
637
|
-
|
|
638
|
-
|
|
638
|
+
const normalizeInput = (input) => {
|
|
639
|
+
if (!input) {
|
|
640
|
+
return [];
|
|
641
|
+
}
|
|
642
|
+
if (Array.isArray(input)) {
|
|
643
|
+
return input;
|
|
644
|
+
}
|
|
645
|
+
if (typeof input === "object") {
|
|
646
|
+
return Object.values(input);
|
|
647
|
+
}
|
|
648
|
+
return [];
|
|
649
|
+
};
|
|
650
|
+
const normalized = [
|
|
651
|
+
...normalizeInput(data.shipping_option.pickup_availabilities),
|
|
652
|
+
...normalizeInput(data.shipping_option.pickupAvailability)
|
|
653
|
+
];
|
|
654
|
+
normalized.forEach((availability) => {
|
|
655
|
+
if (!(availability == null ? void 0 : availability.day_of_week)) {
|
|
656
|
+
return;
|
|
657
|
+
}
|
|
658
|
+
const dayKey = availability.day_of_week.toLowerCase();
|
|
659
|
+
if (!_schedule[dayKey]) {
|
|
660
|
+
return;
|
|
661
|
+
}
|
|
662
|
+
const timeSlots = _schedule[dayKey].timeSlots;
|
|
639
663
|
timeSlots.push({
|
|
640
664
|
start: dateToString(availability.timeStart),
|
|
641
665
|
end: dateToString(availability.timeEnd)
|
|
642
666
|
});
|
|
643
|
-
_schedule[
|
|
644
|
-
enabled: availability.enable,
|
|
667
|
+
_schedule[dayKey] = {
|
|
668
|
+
enabled: Boolean(availability.enable),
|
|
645
669
|
timeSlots
|
|
646
670
|
};
|
|
647
671
|
});
|
|
@@ -676,12 +700,12 @@ function ShippingOptionDetails() {
|
|
|
676
700
|
return;
|
|
677
701
|
}
|
|
678
702
|
try {
|
|
679
|
-
await
|
|
703
|
+
await sdk.client.fetch(`/admin/pickup-date/${id}`, {
|
|
680
704
|
method: "POST",
|
|
681
705
|
headers: {
|
|
682
706
|
"Content-Type": "application/json"
|
|
683
707
|
},
|
|
684
|
-
body:
|
|
708
|
+
body: {
|
|
685
709
|
schedules: Object.entries(schedule).filter(([_, daySchedule]) => daySchedule.enabled).map(([day, { enabled, timeSlots }]) => ({
|
|
686
710
|
day_of_week: day,
|
|
687
711
|
enable: enabled,
|
|
@@ -690,7 +714,7 @@ function ShippingOptionDetails() {
|
|
|
690
714
|
end: slot.end
|
|
691
715
|
}))
|
|
692
716
|
}))
|
|
693
|
-
}
|
|
717
|
+
}
|
|
694
718
|
});
|
|
695
719
|
refetch();
|
|
696
720
|
toast.success("Availability updated", {
|
|
@@ -760,22 +784,22 @@ function ShippingOptionDetails() {
|
|
|
760
784
|
return /* @__PURE__ */ jsx(Navigate, { to: "/pickup-shipping" });
|
|
761
785
|
}
|
|
762
786
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
763
|
-
/* @__PURE__ */ jsxs(Container
|
|
787
|
+
/* @__PURE__ */ jsxs(Container, { className: "p-4 ", children: [
|
|
764
788
|
/* @__PURE__ */ jsxs(
|
|
765
|
-
Button
|
|
789
|
+
Button,
|
|
766
790
|
{
|
|
767
791
|
onClick: () => navigate("/pickup-shipping"),
|
|
768
792
|
variant: "transparent",
|
|
769
793
|
className: "p-0 mb-4",
|
|
770
794
|
children: [
|
|
771
795
|
/* @__PURE__ */ jsx(ArrowLeft, { size: 20 }),
|
|
772
|
-
/* @__PURE__ */ jsx(Text
|
|
796
|
+
/* @__PURE__ */ jsx(Text, { className: "ml-2", children: "Back" })
|
|
773
797
|
]
|
|
774
798
|
}
|
|
775
799
|
),
|
|
776
800
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4 mb-4", children: [
|
|
777
|
-
/* @__PURE__ */ jsx(Heading
|
|
778
|
-
/* @__PURE__ */ jsx(Button
|
|
801
|
+
/* @__PURE__ */ jsx(Heading, { className: "text-xl font-bold", children: "Pickup Hours" }),
|
|
802
|
+
/* @__PURE__ */ jsx(Button, { onClick: handleUpdateSchedules, children: "Save" })
|
|
779
803
|
] }),
|
|
780
804
|
/* @__PURE__ */ jsx("div", { className: "space-y-4", children: Object.entries(schedule).map(([day, { enabled, timeSlots }]) => /* @__PURE__ */ jsxs("div", { className: "flex flex-col", children: [
|
|
781
805
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4 mb-2 h-8", children: [
|
|
@@ -787,7 +811,7 @@ function ShippingOptionDetails() {
|
|
|
787
811
|
},
|
|
788
812
|
`switch-${day}`
|
|
789
813
|
),
|
|
790
|
-
/* @__PURE__ */ jsx(Text
|
|
814
|
+
/* @__PURE__ */ jsx(Text, { className: "capitalize", children: day }),
|
|
791
815
|
enabled && /* @__PURE__ */ jsx(
|
|
792
816
|
IconButton,
|
|
793
817
|
{
|
|
@@ -812,7 +836,7 @@ function ShippingOptionDetails() {
|
|
|
812
836
|
maxTime: slot.end
|
|
813
837
|
}
|
|
814
838
|
),
|
|
815
|
-
/* @__PURE__ */ jsx(Text
|
|
839
|
+
/* @__PURE__ */ jsx(Text, { className: "text-gray-400", children: "-" }),
|
|
816
840
|
/* @__PURE__ */ jsx(
|
|
817
841
|
TimeSelect,
|
|
818
842
|
{
|
|
@@ -6,8 +6,45 @@ const GET = async (req, res) => {
|
|
|
6
6
|
const { id: customer_id } = req.params;
|
|
7
7
|
const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
8
8
|
try {
|
|
9
|
-
//
|
|
10
|
-
const
|
|
9
|
+
// Fetch customer orders first because pickup_date doesn't expose the customer relationship.
|
|
10
|
+
const ordersResult = (await query.graph({
|
|
11
|
+
entity: "order",
|
|
12
|
+
fields: [
|
|
13
|
+
"id",
|
|
14
|
+
"display_id",
|
|
15
|
+
"status",
|
|
16
|
+
"created_at",
|
|
17
|
+
"total",
|
|
18
|
+
"currency_code",
|
|
19
|
+
"items.id",
|
|
20
|
+
"shipping_methods.name",
|
|
21
|
+
],
|
|
22
|
+
filters: {
|
|
23
|
+
customer_id,
|
|
24
|
+
},
|
|
25
|
+
pagination: {
|
|
26
|
+
order: {
|
|
27
|
+
created_at: "DESC",
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
}));
|
|
31
|
+
const orders = ordersResult.data || [];
|
|
32
|
+
if (!orders.length) {
|
|
33
|
+
return res.status(200).json({
|
|
34
|
+
pickup_history: [],
|
|
35
|
+
count: 0,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
const orderIds = Array.from(new Set(orders
|
|
39
|
+
.map((order) => order.id)
|
|
40
|
+
.filter((id) => typeof id === "string" && id.length > 0)));
|
|
41
|
+
if (!orderIds.length) {
|
|
42
|
+
return res.status(200).json({
|
|
43
|
+
pickup_history: [],
|
|
44
|
+
count: 0,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
const pickupResult = (await query.graph({
|
|
11
48
|
entity: "pickup_date",
|
|
12
49
|
fields: [
|
|
13
50
|
"id",
|
|
@@ -17,53 +54,29 @@ const GET = async (req, res) => {
|
|
|
17
54
|
"updated_at",
|
|
18
55
|
],
|
|
19
56
|
filters: {
|
|
20
|
-
|
|
21
|
-
customer_id: customer_id,
|
|
22
|
-
},
|
|
57
|
+
order_id: orderIds,
|
|
23
58
|
},
|
|
24
59
|
pagination: {
|
|
25
60
|
order: {
|
|
26
|
-
|
|
61
|
+
pickup_datetime: "DESC",
|
|
27
62
|
},
|
|
28
63
|
},
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
const orders = await query.graph({
|
|
37
|
-
entity: "order",
|
|
38
|
-
fields: [
|
|
39
|
-
"id",
|
|
40
|
-
"display_id",
|
|
41
|
-
"status",
|
|
42
|
-
"created_at",
|
|
43
|
-
"total",
|
|
44
|
-
"currency_code",
|
|
45
|
-
"items.*",
|
|
46
|
-
"shipping_methods.*",
|
|
47
|
-
],
|
|
48
|
-
filters: {
|
|
49
|
-
id: orderIds,
|
|
50
|
-
},
|
|
51
|
-
});
|
|
52
|
-
// Map orders to pickup dates
|
|
53
|
-
const orderMap = new Map(orders.data.map((order) => [order.id, order]));
|
|
54
|
-
const enrichedPickups = pickupDates.map((pickup) => ({
|
|
55
|
-
...pickup,
|
|
56
|
-
order: orderMap.get(pickup.order_id) || null,
|
|
57
|
-
}));
|
|
58
|
-
return res.status(200).json({
|
|
59
|
-
pickup_history: enrichedPickups,
|
|
60
|
-
count: enrichedPickups.length,
|
|
61
|
-
});
|
|
62
|
-
}
|
|
64
|
+
}));
|
|
65
|
+
const pickupDates = pickupResult.data || [];
|
|
66
|
+
if (!pickupDates.length) {
|
|
67
|
+
return res.status(200).json({
|
|
68
|
+
pickup_history: [],
|
|
69
|
+
count: 0,
|
|
70
|
+
});
|
|
63
71
|
}
|
|
72
|
+
const orderMap = new Map(orders.map((order) => [order.id, order]));
|
|
73
|
+
const enrichedPickups = pickupDates.map((pickup) => ({
|
|
74
|
+
...pickup,
|
|
75
|
+
order: pickup.order_id ? orderMap.get(pickup.order_id) ?? null : null,
|
|
76
|
+
}));
|
|
64
77
|
return res.status(200).json({
|
|
65
|
-
pickup_history:
|
|
66
|
-
count:
|
|
78
|
+
pickup_history: enrichedPickups,
|
|
79
|
+
count: enrichedPickups.length,
|
|
67
80
|
});
|
|
68
81
|
}
|
|
69
82
|
catch (error) {
|
|
@@ -74,4 +87,4 @@ const GET = async (req, res) => {
|
|
|
74
87
|
}
|
|
75
88
|
};
|
|
76
89
|
exports.GET = GET;
|
|
77
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2N1c3RvbWVycy9baWRdL3BpY2t1cC1oaXN0b3J5L3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUFzRTtBQXlCL0QsTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUFFLEdBQWtCLEVBQUUsR0FBbUIsRUFBRSxFQUFFO0lBQ25FLE1BQU0sRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztJQUN2QyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVqRSxJQUFJLENBQUM7UUFDSCw0RkFBNEY7UUFDNUYsTUFBTSxZQUFZLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDdEMsTUFBTSxFQUFFLE9BQU87WUFDZixNQUFNLEVBQUU7Z0JBQ04sSUFBSTtnQkFDSixZQUFZO2dCQUNaLFFBQVE7Z0JBQ1IsWUFBWTtnQkFDWixPQUFPO2dCQUNQLGVBQWU7Z0JBQ2YsVUFBVTtnQkFDVix1QkFBdUI7YUFDeEI7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsV0FBVzthQUNaO1lBQ0QsVUFBVSxFQUFFO2dCQUNWLEtBQUssRUFBRTtvQkFDTCxVQUFVLEVBQUUsTUFBTTtpQkFDbkI7YUFDRjtTQUNGLENBQUMsQ0FBNEIsQ0FBQztRQUUvQixNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUV2QyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25CLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQzFCLGNBQWMsRUFBRSxFQUFFO2dCQUNsQixLQUFLLEVBQUUsQ0FBQzthQUNULENB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
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
/**
|
|
6
|
+
* GET /store/customers/me/pickup-history
|
|
7
|
+
* Returns pickup history for the authenticated customer
|
|
8
|
+
*/
|
|
9
|
+
const GET = async (req, res) => {
|
|
10
|
+
const customer_id = req.auth_context.actor_id;
|
|
11
|
+
const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
12
|
+
try {
|
|
13
|
+
// Fetch customer orders first because pickup_date doesn't expose the customer relationship.
|
|
14
|
+
const ordersResult = (await query.graph({
|
|
15
|
+
entity: "order",
|
|
16
|
+
fields: [
|
|
17
|
+
"id",
|
|
18
|
+
"display_id",
|
|
19
|
+
"status",
|
|
20
|
+
"created_at",
|
|
21
|
+
"total",
|
|
22
|
+
"currency_code",
|
|
23
|
+
"items.id",
|
|
24
|
+
"shipping_methods.name",
|
|
25
|
+
],
|
|
26
|
+
filters: {
|
|
27
|
+
customer_id,
|
|
28
|
+
},
|
|
29
|
+
pagination: {
|
|
30
|
+
order: {
|
|
31
|
+
created_at: "DESC",
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
}));
|
|
35
|
+
const orders = ordersResult.data || [];
|
|
36
|
+
if (!orders.length) {
|
|
37
|
+
return res.status(200).json({
|
|
38
|
+
pickup_history: [],
|
|
39
|
+
count: 0,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
const orderIds = Array.from(new Set(orders
|
|
43
|
+
.map((order) => order.id)
|
|
44
|
+
.filter((id) => typeof id === "string" && id.length > 0)));
|
|
45
|
+
if (!orderIds.length) {
|
|
46
|
+
return res.status(200).json({
|
|
47
|
+
pickup_history: [],
|
|
48
|
+
count: 0,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
const pickupResult = (await query.graph({
|
|
52
|
+
entity: "pickup_date",
|
|
53
|
+
fields: [
|
|
54
|
+
"id",
|
|
55
|
+
"pickup_datetime",
|
|
56
|
+
"order_id",
|
|
57
|
+
"created_at",
|
|
58
|
+
"updated_at",
|
|
59
|
+
],
|
|
60
|
+
filters: {
|
|
61
|
+
order_id: orderIds,
|
|
62
|
+
},
|
|
63
|
+
pagination: {
|
|
64
|
+
order: {
|
|
65
|
+
pickup_datetime: "DESC",
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
}));
|
|
69
|
+
const pickupDates = pickupResult.data || [];
|
|
70
|
+
if (!pickupDates.length) {
|
|
71
|
+
return res.status(200).json({
|
|
72
|
+
pickup_history: [],
|
|
73
|
+
count: 0,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
const orderMap = new Map(orders.map((order) => [order.id, order]));
|
|
77
|
+
const enrichedPickups = pickupDates.map((pickup) => ({
|
|
78
|
+
...pickup,
|
|
79
|
+
order: pickup.order_id ? orderMap.get(pickup.order_id) ?? null : null,
|
|
80
|
+
}));
|
|
81
|
+
return res.status(200).json({
|
|
82
|
+
pickup_history: enrichedPickups,
|
|
83
|
+
count: enrichedPickups.length,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
console.error("Error fetching pickup history:", error);
|
|
88
|
+
return res.status(500).json({
|
|
89
|
+
error: error.message || "Failed to fetch pickup history",
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
exports.GET = GET;
|
|
94
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2N1c3RvbWVycy9tZS9waWNrdXAtaGlzdG9yeS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSxxREFBc0U7QUF5QnRFOzs7R0FHRztBQUNJLE1BQU0sR0FBRyxHQUFHLEtBQUssRUFDdEIsR0FBK0IsRUFDL0IsR0FBbUIsRUFDbkIsRUFBRTtJQUNGLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO0lBQzlDLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWpFLElBQUksQ0FBQztRQUNILDRGQUE0RjtRQUM1RixNQUFNLFlBQVksR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztZQUN0QyxNQUFNLEVBQUUsT0FBTztZQUNmLE1BQU0sRUFBRTtnQkFDTixJQUFJO2dCQUNKLFlBQVk7Z0JBQ1osUUFBUTtnQkFDUixZQUFZO2dCQUNaLE9BQU87Z0JBQ1AsZUFBZTtnQkFDZixVQUFVO2dCQUNWLHVCQUF1QjthQUN4QjtZQUNELE9BQU8sRUFBRTtnQkFDUCxXQUFXO2FBQ1o7WUFDRCxVQUFVLEVBQUU7Z0JBQ1YsS0FBSyxFQUFFO29CQUNMLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjthQUNGO1NBQ0YsQ0FBQyxDQUE0QixDQUFDO1FBRS9CLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1FBRXZDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkIsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDMUIsY0FBYyxFQUFFLEVBQUU7Z0JBQ2xCLEtBQUssRUFBRSxDQUFDO2FBQ1Qs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
|
|
@@ -7,10 +7,9 @@ const utils_1 = require("@medusajs/framework/utils");
|
|
|
7
7
|
const fulfillment_1 = __importDefault(require("@medusajs/medusa/fulfillment"));
|
|
8
8
|
const pickup_datetime_1 = __importDefault(require("../modules/pickup-datetime"));
|
|
9
9
|
exports.default = (0, utils_1.defineLink)({
|
|
10
|
-
linkable:
|
|
11
|
-
|
|
10
|
+
linkable: pickup_datetime_1.default.linkable.pickupAvailability,
|
|
11
|
+
foreignKey: "shipping_option_id",
|
|
12
12
|
}, {
|
|
13
|
-
linkable:
|
|
14
|
-
isList: true,
|
|
13
|
+
linkable: fulfillment_1.default.linkable.shippingOption,
|
|
15
14
|
});
|
|
16
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hpcHBpbmctb3B0aW9uLXBpY2t1cC1hdmFpbGFiaWxpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGlua3Mvc2hpcHBpbmctb3B0aW9uLXBpY2t1cC1hdmFpbGFiaWxpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxREFBdUQ7QUFDdkQsK0VBQTZEO0FBQzdELGlGQUE4RDtBQUU5RCxrQkFBZSxJQUFBLGtCQUFVLEVBQ3ZCO0lBQ0UsUUFBUSxFQUFFLHlCQUFvQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0I7SUFDMUQsVUFBVSxFQUFFLG9CQUFvQjtDQUNqQyxFQUNEO0lBQ0UsUUFBUSxFQUFFLHFCQUFpQixDQUFDLFFBQVEsQ0FBQyxjQUFjO0NBQ3BELENBQ0YsQ0FBQyJ9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lodashventure/medusa-booking-for-pickup",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.20",
|
|
4
4
|
"description": "A starter for Medusa plugins.",
|
|
5
5
|
"author": "Medusa (https://medusajs.com)",
|
|
6
6
|
"license": "MIT",
|
|
@@ -44,6 +44,7 @@
|
|
|
44
44
|
"prop-types": "^15.8.1",
|
|
45
45
|
"react": "^18.2.0",
|
|
46
46
|
"react-dom": "^18.2.0",
|
|
47
|
+
"react-router-dom": "^6.22.0",
|
|
47
48
|
"ts-node": "^10.9.2",
|
|
48
49
|
"typescript": "^5.6.2",
|
|
49
50
|
"vite": "^5.2.11",
|