medusa-storefront-data 1.0.0 → 2.0.0
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/dist/cookies.d.ts +2 -2
- package/dist/cookies.d.ts.map +1 -1
- package/dist/edge.d.ts +3 -0
- package/dist/edge.d.ts.map +1 -0
- package/dist/edge.js +1 -0
- package/dist/middleware.d.ts +3 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/middleware.js +1 -0
- package/dist/server/cart.d.ts +9 -5
- package/dist/server/cart.d.ts.map +1 -1
- package/dist/server/cart.js +164 -194
- package/dist/server/categories.d.ts +3 -2
- package/dist/server/categories.d.ts.map +1 -1
- package/dist/server/categories.js +14 -51
- package/dist/server/collections.d.ts.map +1 -1
- package/dist/server/collections.js +16 -61
- package/dist/server/contact.d.ts +34 -0
- package/dist/server/contact.d.ts.map +1 -0
- package/dist/server/contact.js +57 -0
- package/dist/server/customer.d.ts +7 -7
- package/dist/server/customer.d.ts.map +1 -1
- package/dist/server/customer.js +95 -145
- package/dist/server/dynamic-config.d.ts.map +1 -1
- package/dist/server/dynamic-config.js +5 -2
- package/dist/server/fulfillment.d.ts +4 -3
- package/dist/server/fulfillment.d.ts.map +1 -1
- package/dist/server/fulfillment.js +16 -41
- package/dist/server/guest.d.ts +35 -63
- package/dist/server/guest.d.ts.map +1 -1
- package/dist/server/guest.js +81 -202
- package/dist/server/home.d.ts +15 -0
- package/dist/server/home.d.ts.map +1 -0
- package/dist/server/home.js +45 -0
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +2 -0
- package/dist/server/locale-actions.d.ts +1 -1
- package/dist/server/locale-actions.d.ts.map +1 -1
- package/dist/server/locale-actions.js +8 -13
- package/dist/server/locales.d.ts +2 -4
- package/dist/server/locales.d.ts.map +1 -1
- package/dist/server/locales.js +5 -13
- package/dist/server/orders.d.ts +5 -11
- package/dist/server/orders.d.ts.map +1 -1
- package/dist/server/orders.js +126 -267
- package/dist/server/payment-details.d.ts +4 -4
- package/dist/server/payment-details.d.ts.map +1 -1
- package/dist/server/payment-details.js +17 -42
- package/dist/server/payment.d.ts +2 -1
- package/dist/server/payment.d.ts.map +1 -1
- package/dist/server/payment.js +9 -21
- package/dist/server/pincode.d.ts +7 -0
- package/dist/server/pincode.d.ts.map +1 -0
- package/dist/server/pincode.js +30 -0
- package/dist/server/products.d.ts +15 -19
- package/dist/server/products.d.ts.map +1 -1
- package/dist/server/products.js +47 -178
- package/dist/server/regions.d.ts +1 -1
- package/dist/server/regions.d.ts.map +1 -1
- package/dist/server/regions.js +6 -3
- package/dist/server/returns.d.ts +4 -4
- package/dist/server/returns.d.ts.map +1 -1
- package/dist/server/returns.js +50 -154
- package/dist/server/swaps.d.ts +3 -3
- package/dist/server/swaps.d.ts.map +1 -1
- package/dist/server/swaps.js +22 -56
- package/dist/server/variants.d.ts.map +1 -1
- package/dist/server/variants.js +11 -22
- package/dist/server/wishlist.d.ts +11 -0
- package/dist/server/wishlist.d.ts.map +1 -0
- package/dist/server/wishlist.js +49 -0
- package/dist/util/get-locale-header.d.ts +1 -1
- package/dist/util/revalidate-cart.d.ts +2 -0
- package/dist/util/revalidate-cart.d.ts.map +1 -0
- package/dist/util/revalidate-cart.js +8 -0
- package/dist/util/sort-products.d.ts +3 -0
- package/dist/util/sort-products.d.ts.map +1 -0
- package/dist/util/sort-products.js +1 -0
- package/dist/util/store-client.d.ts +13 -0
- package/dist/util/store-client.d.ts.map +1 -0
- package/dist/util/store-client.js +77 -0
- package/package.json +95 -37
- package/src/edge.ts +2 -0
- package/src/middleware.ts +2 -2
- package/src/server/cart.ts +214 -267
- package/src/server/categories.ts +19 -72
- package/src/server/collections.ts +25 -82
- package/src/server/contact.ts +92 -0
- package/src/server/customer.ts +140 -189
- package/src/server/dynamic-config.ts +6 -2
- package/src/server/fulfillment.ts +27 -53
- package/src/server/guest.ts +159 -276
- package/src/server/home.ts +68 -0
- package/src/server/index.ts +1 -0
- package/src/server/locale-actions.ts +8 -15
- package/src/server/locales.ts +6 -18
- package/src/server/orders.ts +167 -337
- package/src/server/payment-details.ts +24 -52
- package/src/server/payment.ts +8 -28
- package/src/server/pincode.ts +49 -0
- package/src/server/products.ts +72 -235
- package/src/server/regions.ts +10 -6
- package/src/server/returns.ts +75 -189
- package/src/server/swaps.ts +90 -121
- package/src/server/variants.ts +9 -28
- package/src/util/revalidate-cart.ts +10 -0
- package/src/util/sort-products.ts +2 -47
- package/src/util/store-client.ts +93 -0
- package/src/services/middleware.ts +0 -54
package/src/server/returns.ts
CHANGED
|
@@ -1,29 +1,22 @@
|
|
|
1
1
|
"use server"
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
medusaReturnCreate,
|
|
5
|
+
medusaReturnCreateGuest,
|
|
6
|
+
medusaReturnList,
|
|
7
|
+
medusaReturnListGuest,
|
|
8
|
+
medusaReturnReasonList,
|
|
9
|
+
medusaReturnShippingOptionsResolve,
|
|
10
|
+
medusaReturnUpdatePayment,
|
|
11
|
+
} from "medusa-services/returns"
|
|
4
12
|
import { HttpTypes } from "@medusajs/types"
|
|
5
13
|
import { cookies } from "next/headers"
|
|
6
|
-
import { getAuthHeaders, getCacheOptions } from "../cookies"
|
|
7
14
|
import { revalidateTag } from "next/cache"
|
|
15
|
+
import { getStoreClientOptions, getStoreClientOptionsWithToken } from "../util/store-client"
|
|
8
16
|
|
|
9
17
|
export const listReturnReasons = async () => {
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
const next = {
|
|
15
|
-
...(await getCacheOptions("return_reasons")),
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
return sdk.client
|
|
19
|
-
.fetch<HttpTypes.StoreReturnReasonListResponse>(`/store/return-reasons`, {
|
|
20
|
-
method: "GET",
|
|
21
|
-
headers,
|
|
22
|
-
next,
|
|
23
|
-
cache: "force-cache", // Reasons change rarely
|
|
24
|
-
})
|
|
25
|
-
.then(({ return_reasons }) => return_reasons)
|
|
26
|
-
.catch(() => [])
|
|
18
|
+
const options = await getStoreClientOptions()
|
|
19
|
+
return medusaReturnReasonList(options)
|
|
27
20
|
}
|
|
28
21
|
|
|
29
22
|
export const listReturnShippingOptions = async (
|
|
@@ -31,72 +24,12 @@ export const listReturnShippingOptions = async (
|
|
|
31
24
|
regionId?: string,
|
|
32
25
|
productIds?: string[]
|
|
33
26
|
): Promise<HttpTypes.StoreShippingOption[]> => {
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// Strategy 1: Try with cart_id (preferred as it has context)
|
|
43
|
-
if (cartId) {
|
|
44
|
-
try {
|
|
45
|
-
const { shipping_options } = await sdk.client.fetch<HttpTypes.StoreShippingOptionListResponse>(
|
|
46
|
-
`/store/shipping-options`,
|
|
47
|
-
{
|
|
48
|
-
method: "GET",
|
|
49
|
-
query: {
|
|
50
|
-
cart_id: cartId,
|
|
51
|
-
is_return: true,
|
|
52
|
-
},
|
|
53
|
-
headers,
|
|
54
|
-
next,
|
|
55
|
-
cache: "no-store",
|
|
56
|
-
}
|
|
57
|
-
)
|
|
58
|
-
|
|
59
|
-
if (shipping_options.length > 0) {
|
|
60
|
-
return shipping_options as unknown as HttpTypes.StoreShippingOption[]
|
|
61
|
-
}
|
|
62
|
-
} catch (e) {
|
|
63
|
-
// Fallback strategy
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// Strategy 2: Fallback - Create ephemeral cart if region_id is available
|
|
68
|
-
// This is required because /store/shipping-options STRICTLY requires a cart_id for return options
|
|
69
|
-
if (regionId) {
|
|
70
|
-
try {
|
|
71
|
-
// Create a temporary cart for this region to get valid shipping options
|
|
72
|
-
const { cart } = await sdk.store.cart.create(
|
|
73
|
-
{ region_id: regionId },
|
|
74
|
-
{},
|
|
75
|
-
headers
|
|
76
|
-
)
|
|
77
|
-
|
|
78
|
-
if (cart?.id) {
|
|
79
|
-
const { shipping_options } = await sdk.client.fetch<HttpTypes.StoreShippingOptionListResponse>(
|
|
80
|
-
`/store/shipping-options`,
|
|
81
|
-
{
|
|
82
|
-
method: "GET",
|
|
83
|
-
query: {
|
|
84
|
-
cart_id: cart.id,
|
|
85
|
-
is_return: true,
|
|
86
|
-
},
|
|
87
|
-
headers,
|
|
88
|
-
next,
|
|
89
|
-
cache: "no-store",
|
|
90
|
-
}
|
|
91
|
-
)
|
|
92
|
-
return shipping_options as unknown as HttpTypes.StoreShippingOption[]
|
|
93
|
-
}
|
|
94
|
-
} catch (e) {
|
|
95
|
-
// Silence error
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
return []
|
|
27
|
+
const options = await getStoreClientOptions()
|
|
28
|
+
const shippingOptions = await medusaReturnShippingOptionsResolve(options, {
|
|
29
|
+
cartId,
|
|
30
|
+
regionId,
|
|
31
|
+
})
|
|
32
|
+
return shippingOptions as unknown as HttpTypes.StoreShippingOption[]
|
|
100
33
|
}
|
|
101
34
|
|
|
102
35
|
export const createReturnRequest = async (
|
|
@@ -120,10 +53,10 @@ export const createReturnRequest = async (
|
|
|
120
53
|
if (!orderId) return { success: false, error: "Order ID is required", return: null }
|
|
121
54
|
if (!itemsJson) return { success: false, error: "Items are required", return: null }
|
|
122
55
|
|
|
123
|
-
let items:
|
|
56
|
+
let items: Array<{ id: string; quantity: number; return_reason_id?: string; location_id?: string }> = []
|
|
124
57
|
try {
|
|
125
58
|
items = JSON.parse(itemsJson)
|
|
126
|
-
} catch
|
|
59
|
+
} catch {
|
|
127
60
|
return { success: false, error: "Invalid items data", return: null }
|
|
128
61
|
}
|
|
129
62
|
|
|
@@ -131,91 +64,67 @@ export const createReturnRequest = async (
|
|
|
131
64
|
return { success: false, error: "At least one item must be selected", return: null }
|
|
132
65
|
}
|
|
133
66
|
|
|
134
|
-
const
|
|
135
|
-
...(await getAuthHeaders()),
|
|
136
|
-
}
|
|
67
|
+
const options = await getStoreClientOptions()
|
|
137
68
|
|
|
138
69
|
try {
|
|
139
|
-
|
|
140
|
-
const payload: any = {
|
|
70
|
+
const payload = {
|
|
141
71
|
order_id: orderId,
|
|
142
72
|
items: items.map((item) => ({
|
|
143
73
|
id: item.id,
|
|
144
74
|
quantity: item.quantity,
|
|
145
75
|
reason_id: item.return_reason_id || undefined,
|
|
146
|
-
note:
|
|
76
|
+
note: note && note.trim().length > 0 ? note : undefined,
|
|
147
77
|
})),
|
|
148
|
-
...(returnShippingOptionId
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
78
|
+
...(returnShippingOptionId
|
|
79
|
+
? {
|
|
80
|
+
return_shipping: {
|
|
81
|
+
option_id: returnShippingOptionId,
|
|
82
|
+
location_id: locationId || items[0]?.location_id || "default_location",
|
|
83
|
+
},
|
|
84
|
+
}
|
|
85
|
+
: {}),
|
|
86
|
+
note: note && note.trim().length > 0 ? note : "Return request",
|
|
156
87
|
}
|
|
157
88
|
|
|
158
|
-
// Double check location_id is NOT nested incorrectly if already set above
|
|
159
|
-
// The plugin expects return_shipping.location_id
|
|
160
|
-
|
|
161
|
-
// Check for any available guest tokens
|
|
162
89
|
const cookieStore = await cookies()
|
|
163
|
-
const guestToken =
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
90
|
+
const guestToken =
|
|
91
|
+
cookieStore.get("_medusa_guest_jwt")?.value ||
|
|
92
|
+
cookieStore.get("_medusa_guest_token")?.value ||
|
|
93
|
+
cookieStore.get("guest_id")?.value
|
|
167
94
|
const token = cookieStore.get("_medusa_jwt")?.value
|
|
168
95
|
|
|
169
96
|
let returnData: HttpTypes.StoreReturn
|
|
170
97
|
|
|
171
|
-
// If we have a guest token, try the guest specific endpoint
|
|
172
98
|
if (guestToken && !token) {
|
|
173
99
|
try {
|
|
174
|
-
const
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
)
|
|
186
|
-
returnData = response.return || response
|
|
187
|
-
} catch (e) {
|
|
188
|
-
// Fallback to standard if guest endpoint fails
|
|
189
|
-
const response = await sdk.client.fetch<{ return: HttpTypes.StoreReturn }>(
|
|
190
|
-
`/store/returns`,
|
|
191
|
-
{
|
|
192
|
-
method: "POST",
|
|
193
|
-
body: payload,
|
|
194
|
-
headers,
|
|
195
|
-
cache: "no-store",
|
|
196
|
-
}
|
|
197
|
-
)
|
|
198
|
-
returnData = response.return
|
|
100
|
+
const guestOptions = await getStoreClientOptionsWithToken(guestToken)
|
|
101
|
+
returnData = (await medusaReturnCreateGuest(
|
|
102
|
+
orderId,
|
|
103
|
+
payload,
|
|
104
|
+
guestOptions
|
|
105
|
+
)) as unknown as HttpTypes.StoreReturn
|
|
106
|
+
} catch {
|
|
107
|
+
returnData = (await medusaReturnCreate(
|
|
108
|
+
payload,
|
|
109
|
+
options
|
|
110
|
+
)) as unknown as HttpTypes.StoreReturn
|
|
199
111
|
}
|
|
200
112
|
} else {
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
method: "POST",
|
|
206
|
-
body: payload,
|
|
207
|
-
headers,
|
|
208
|
-
cache: "no-store",
|
|
209
|
-
}
|
|
210
|
-
)
|
|
211
|
-
returnData = response.return
|
|
113
|
+
returnData = (await medusaReturnCreate(
|
|
114
|
+
payload,
|
|
115
|
+
options
|
|
116
|
+
)) as unknown as HttpTypes.StoreReturn
|
|
212
117
|
}
|
|
213
118
|
|
|
214
119
|
revalidateTag("orders")
|
|
215
120
|
|
|
216
121
|
return { success: true, error: null, return: returnData }
|
|
217
|
-
} catch (error
|
|
218
|
-
return {
|
|
122
|
+
} catch (error) {
|
|
123
|
+
return {
|
|
124
|
+
success: false,
|
|
125
|
+
error: error instanceof Error ? error.message : "Failed to create return request",
|
|
126
|
+
return: null,
|
|
127
|
+
}
|
|
219
128
|
}
|
|
220
129
|
}
|
|
221
130
|
|
|
@@ -223,24 +132,17 @@ export const createReturnRequest = async (
|
|
|
223
132
|
* Link a payment method to a return (for Refund Destination)
|
|
224
133
|
*/
|
|
225
134
|
export const updateReturnPayment = async (returnId: string, paymentId: string) => {
|
|
226
|
-
const
|
|
227
|
-
...(await getAuthHeaders()),
|
|
228
|
-
}
|
|
135
|
+
const options = await getStoreClientOptions()
|
|
229
136
|
|
|
230
137
|
try {
|
|
231
|
-
const
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
method: "PUT",
|
|
235
|
-
body: { payment_id: paymentId },
|
|
236
|
-
headers,
|
|
237
|
-
cache: "no-store",
|
|
238
|
-
}
|
|
239
|
-
)
|
|
240
|
-
return { success: true, data: response }
|
|
241
|
-
} catch (error: any) {
|
|
138
|
+
const data = await medusaReturnUpdatePayment(returnId, paymentId, options)
|
|
139
|
+
return { success: true, data }
|
|
140
|
+
} catch (error) {
|
|
242
141
|
console.error("Update return payment fail:", error)
|
|
243
|
-
return {
|
|
142
|
+
return {
|
|
143
|
+
success: false,
|
|
144
|
+
error: error instanceof Error ? error.message : String(error),
|
|
145
|
+
}
|
|
244
146
|
}
|
|
245
147
|
}
|
|
246
148
|
|
|
@@ -248,43 +150,27 @@ export const updateReturnPayment = async (returnId: string, paymentId: string) =
|
|
|
248
150
|
* List returns for an order or customer
|
|
249
151
|
*/
|
|
250
152
|
export const listReturns = async (orderId?: string) => {
|
|
251
|
-
const
|
|
252
|
-
...(await getAuthHeaders()),
|
|
253
|
-
}
|
|
153
|
+
const options = await getStoreClientOptions()
|
|
254
154
|
|
|
255
|
-
|
|
256
|
-
const authHeaders = headers as any
|
|
257
|
-
if (authHeaders.authorization || authHeaders.Authorization) {
|
|
155
|
+
if (options.authorization) {
|
|
258
156
|
try {
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
query: orderId ? { order_id: orderId } : {},
|
|
262
|
-
headers,
|
|
263
|
-
cache: "no-store",
|
|
264
|
-
})
|
|
265
|
-
return response
|
|
266
|
-
} catch (e) {
|
|
157
|
+
return await medusaReturnList(options, orderId ? { order_id: orderId } : undefined)
|
|
158
|
+
} catch {
|
|
267
159
|
return { returns: [], count: 0 }
|
|
268
160
|
}
|
|
269
161
|
}
|
|
270
162
|
|
|
271
|
-
// Guest flow
|
|
272
163
|
if (orderId) {
|
|
273
164
|
const cookieStore = await cookies()
|
|
274
|
-
const guestToken =
|
|
165
|
+
const guestToken =
|
|
166
|
+
cookieStore.get("_medusa_guest_jwt")?.value ||
|
|
167
|
+
cookieStore.get("_medusa_guest_token")?.value
|
|
275
168
|
|
|
276
169
|
if (guestToken) {
|
|
277
170
|
try {
|
|
278
|
-
const
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
...headers,
|
|
282
|
-
"Authorization": `Bearer ${guestToken}`
|
|
283
|
-
},
|
|
284
|
-
cache: "no-store",
|
|
285
|
-
})
|
|
286
|
-
return response
|
|
287
|
-
} catch (e) {
|
|
171
|
+
const guestOptions = await getStoreClientOptionsWithToken(guestToken)
|
|
172
|
+
return await medusaReturnListGuest(orderId, guestOptions)
|
|
173
|
+
} catch {
|
|
288
174
|
return { returns: [], count: 0 }
|
|
289
175
|
}
|
|
290
176
|
}
|
package/src/server/swaps.ts
CHANGED
|
@@ -1,150 +1,119 @@
|
|
|
1
|
-
|
|
2
1
|
"use server"
|
|
3
2
|
|
|
4
|
-
import {
|
|
5
|
-
|
|
3
|
+
import {
|
|
4
|
+
medusaSwapCreate,
|
|
5
|
+
medusaSwapCreateGuest,
|
|
6
|
+
medusaSwapList,
|
|
7
|
+
medusaSwapListGuest,
|
|
8
|
+
} from "medusa-services/swaps"
|
|
6
9
|
import { cookies } from "next/headers"
|
|
7
|
-
import { getAuthHeaders } from "../cookies"
|
|
8
10
|
import { revalidateTag } from "next/cache"
|
|
11
|
+
import { getStoreClientOptions, getStoreClientOptionsWithToken } from "../util/store-client"
|
|
9
12
|
|
|
10
13
|
/**
|
|
11
14
|
* Create an exchange (swap) request.
|
|
12
15
|
* Supports both authenticated customers and guest users.
|
|
13
16
|
*/
|
|
14
17
|
export const createSwapRequest = async (
|
|
15
|
-
|
|
16
|
-
|
|
18
|
+
prevState: unknown,
|
|
19
|
+
formData: FormData
|
|
17
20
|
): Promise<{
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
+
success: boolean
|
|
22
|
+
error: string | null
|
|
23
|
+
swap: Record<string, unknown> | null
|
|
21
24
|
}> => {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
25
|
+
const orderId = formData.get("order_id") as string
|
|
26
|
+
const returnItemsJson = formData.get("return_items") as string
|
|
27
|
+
const newItemsJson = formData.get("new_items") as string
|
|
28
|
+
const reason = formData.get("reason") as string
|
|
29
|
+
const note = formData.get("note") as string
|
|
30
|
+
|
|
31
|
+
if (!orderId) return { success: false, error: "Order ID is required", swap: null }
|
|
32
|
+
if (!returnItemsJson) return { success: false, error: "Items to return are required", swap: null }
|
|
33
|
+
if (!newItemsJson) return { success: false, error: "New items are required", swap: null }
|
|
34
|
+
|
|
35
|
+
let returnItems: Array<Record<string, unknown>> = []
|
|
36
|
+
let newItems: Array<Record<string, unknown>> = []
|
|
37
|
+
try {
|
|
38
|
+
returnItems = JSON.parse(returnItemsJson)
|
|
39
|
+
newItems = JSON.parse(newItemsJson)
|
|
40
|
+
} catch {
|
|
41
|
+
return { success: false, error: "Invalid items data format", swap: null }
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
if (returnItems.length === 0) {
|
|
45
|
+
return { success: false, error: "At least one item must be selected for return", swap: null }
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const options = await getStoreClientOptions()
|
|
49
|
+
|
|
50
|
+
try {
|
|
51
|
+
const payload = {
|
|
52
|
+
order_id: orderId,
|
|
53
|
+
return_items: returnItems,
|
|
54
|
+
new_items: newItems,
|
|
55
|
+
reason: reason || "Size exchange",
|
|
56
|
+
note: note || "Exchange requested from storefront",
|
|
39
57
|
}
|
|
40
58
|
|
|
41
|
-
|
|
42
|
-
|
|
59
|
+
const cookieStore = await cookies()
|
|
60
|
+
const guestToken =
|
|
61
|
+
cookieStore.get("_medusa_guest_jwt")?.value ||
|
|
62
|
+
cookieStore.get("_medusa_guest_token")?.value
|
|
63
|
+
const token = cookieStore.get("_medusa_jwt")?.value
|
|
64
|
+
|
|
65
|
+
let swapData: Record<string, unknown>
|
|
66
|
+
|
|
67
|
+
if (guestToken && !token) {
|
|
68
|
+
const guestOptions = await getStoreClientOptionsWithToken(guestToken)
|
|
69
|
+
swapData = await medusaSwapCreateGuest(
|
|
70
|
+
orderId,
|
|
71
|
+
{
|
|
72
|
+
return_items: payload.return_items,
|
|
73
|
+
new_items: payload.new_items,
|
|
74
|
+
reason: payload.reason,
|
|
75
|
+
note: payload.note,
|
|
76
|
+
},
|
|
77
|
+
guestOptions
|
|
78
|
+
)
|
|
79
|
+
} else {
|
|
80
|
+
swapData = await medusaSwapCreate(payload, options)
|
|
43
81
|
}
|
|
44
82
|
|
|
45
|
-
|
|
46
|
-
...(await getAuthHeaders()),
|
|
47
|
-
}
|
|
83
|
+
revalidateTag("orders")
|
|
48
84
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
reason: reason || "Size exchange",
|
|
55
|
-
note: note || "Exchange requested from storefront",
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
const cookieStore = await cookies()
|
|
59
|
-
const guestToken = cookieStore.get("_medusa_guest_jwt")?.value || cookieStore.get("_medusa_guest_token")?.value
|
|
60
|
-
const token = cookieStore.get("_medusa_jwt")?.value
|
|
61
|
-
|
|
62
|
-
let swapData: any
|
|
63
|
-
|
|
64
|
-
// Check if we should use the guest endpoint
|
|
65
|
-
if (guestToken && !token) {
|
|
66
|
-
|
|
67
|
-
const response = await sdk.client.fetch<any>(
|
|
68
|
-
`/store/guest-orders/${orderId}/swaps`,
|
|
69
|
-
{
|
|
70
|
-
method: "POST",
|
|
71
|
-
body: {
|
|
72
|
-
return_items: payload.return_items,
|
|
73
|
-
new_items: payload.new_items,
|
|
74
|
-
reason: payload.reason,
|
|
75
|
-
note: payload.note,
|
|
76
|
-
},
|
|
77
|
-
headers: {
|
|
78
|
-
...headers,
|
|
79
|
-
"Authorization": `Bearer ${guestToken}`
|
|
80
|
-
},
|
|
81
|
-
cache: "no-store",
|
|
82
|
-
}
|
|
83
|
-
)
|
|
84
|
-
swapData = response.swap || response
|
|
85
|
-
} else {
|
|
86
|
-
|
|
87
|
-
const response = await sdk.client.fetch<any>(
|
|
88
|
-
`/store/swaps`,
|
|
89
|
-
{
|
|
90
|
-
method: "POST",
|
|
91
|
-
body: payload,
|
|
92
|
-
headers,
|
|
93
|
-
cache: "no-store",
|
|
94
|
-
}
|
|
95
|
-
)
|
|
96
|
-
swapData = response.swap || response
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
revalidateTag("orders")
|
|
100
|
-
|
|
101
|
-
return { success: true, error: null, swap: swapData }
|
|
102
|
-
} catch (error: any) {
|
|
103
|
-
// Extract error message from response if possible
|
|
104
|
-
let errorMsg = "Failed to create exchange request"
|
|
105
|
-
if (error.response?.data?.message) {
|
|
106
|
-
errorMsg = error.response.data.message
|
|
107
|
-
} else if (error.message) {
|
|
108
|
-
errorMsg = error.message
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
return { success: false, error: errorMsg, swap: null }
|
|
85
|
+
return { success: true, error: null, swap: swapData }
|
|
86
|
+
} catch (error) {
|
|
87
|
+
let errorMsg = "Failed to create exchange request"
|
|
88
|
+
if (error instanceof Error && error.message) {
|
|
89
|
+
errorMsg = error.message
|
|
112
90
|
}
|
|
91
|
+
|
|
92
|
+
return { success: false, error: errorMsg, swap: null }
|
|
93
|
+
}
|
|
113
94
|
}
|
|
114
95
|
|
|
115
96
|
/**
|
|
116
97
|
* List swaps for an order or customer
|
|
117
98
|
*/
|
|
118
99
|
export const listSwaps = async (orderId?: string) => {
|
|
119
|
-
|
|
120
|
-
...(await getAuthHeaders()),
|
|
121
|
-
}
|
|
100
|
+
const options = await getStoreClientOptions()
|
|
122
101
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
102
|
+
if (options.authorization) {
|
|
103
|
+
return medusaSwapList(options, orderId ? { order_id: orderId } : undefined)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (orderId) {
|
|
107
|
+
const cookieStore = await cookies()
|
|
108
|
+
const guestToken =
|
|
109
|
+
cookieStore.get("_medusa_guest_jwt")?.value ||
|
|
110
|
+
cookieStore.get("_medusa_guest_token")?.value
|
|
132
111
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
const guestToken = cookieStore.get("_medusa_guest_jwt")?.value || cookieStore.get("_medusa_guest_token")?.value
|
|
137
|
-
if (guestToken) {
|
|
138
|
-
return sdk.client.fetch<any>(`/store/guest-orders/${orderId}/swaps`, {
|
|
139
|
-
method: "GET",
|
|
140
|
-
headers: {
|
|
141
|
-
...headers,
|
|
142
|
-
"Authorization": `Bearer ${guestToken}`
|
|
143
|
-
},
|
|
144
|
-
cache: "no-store",
|
|
145
|
-
})
|
|
146
|
-
}
|
|
112
|
+
if (guestToken) {
|
|
113
|
+
const guestOptions = await getStoreClientOptionsWithToken(guestToken)
|
|
114
|
+
return medusaSwapListGuest(orderId, guestOptions)
|
|
147
115
|
}
|
|
116
|
+
}
|
|
148
117
|
|
|
149
|
-
|
|
118
|
+
return { swaps: [], count: 0 }
|
|
150
119
|
}
|
package/src/server/variants.ts
CHANGED
|
@@ -1,38 +1,19 @@
|
|
|
1
1
|
"use server"
|
|
2
2
|
|
|
3
|
-
import { sdk } from "../config"
|
|
4
3
|
import { HttpTypes } from "@medusajs/types"
|
|
5
|
-
|
|
6
|
-
import {
|
|
4
|
+
import { medusaVariantRetrieve } from "medusa-services/variants"
|
|
5
|
+
import { getStoreClientOptions } from "../util/store-client"
|
|
7
6
|
|
|
8
7
|
export const retrieveVariant = async (
|
|
9
8
|
variant_id: string
|
|
10
9
|
): Promise<HttpTypes.StoreProductVariant | null> => {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
try {
|
|
11
|
+
const options = await getStoreClientOptions()
|
|
12
|
+
if (!options.authorization) return null
|
|
14
13
|
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
const { variant } = await medusaVariantRetrieve(variant_id, options, { fields: "*images" })
|
|
15
|
+
return variant as unknown as HttpTypes.StoreProductVariant
|
|
16
|
+
} catch {
|
|
17
|
+
return null
|
|
17
18
|
}
|
|
18
|
-
|
|
19
|
-
const next = {
|
|
20
|
-
...(await getCacheOptions("variants")),
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
return await sdk.client
|
|
24
|
-
.fetch<{ variant: HttpTypes.StoreProductVariant }>(
|
|
25
|
-
`/store/product-variants/${variant_id}`,
|
|
26
|
-
{
|
|
27
|
-
method: "GET",
|
|
28
|
-
query: {
|
|
29
|
-
fields: "*images",
|
|
30
|
-
},
|
|
31
|
-
headers,
|
|
32
|
-
next,
|
|
33
|
-
cache: "force-cache",
|
|
34
|
-
}
|
|
35
|
-
)
|
|
36
|
-
.then(({ variant }) => variant)
|
|
37
|
-
.catch(() => null)
|
|
38
19
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { revalidateTag } from "next/cache"
|
|
2
|
+
import { getCacheTag } from "../cookies"
|
|
3
|
+
|
|
4
|
+
export async function revalidateCartTags(): Promise<void> {
|
|
5
|
+
const cartCacheTag = await getCacheTag("carts")
|
|
6
|
+
revalidateTag(cartCacheTag)
|
|
7
|
+
|
|
8
|
+
const fulfillmentCacheTag = await getCacheTag("fulfillment")
|
|
9
|
+
revalidateTag(fulfillmentCacheTag)
|
|
10
|
+
}
|