medusa-storefront-data 1.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/config.d.ts +3 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +31 -0
- package/dist/cookies.d.ts +23 -0
- package/dist/cookies.d.ts.map +1 -0
- package/dist/cookies.js +140 -0
- package/dist/server/cart.d.ts +92 -0
- package/dist/server/cart.d.ts.map +1 -0
- package/dist/server/cart.js +827 -0
- package/dist/server/categories.d.ts +3 -0
- package/dist/server/categories.d.ts.map +1 -0
- package/dist/server/categories.js +71 -0
- package/dist/server/collections.d.ts +8 -0
- package/dist/server/collections.d.ts.map +1 -0
- package/dist/server/collections.js +84 -0
- package/dist/server/customer-registration.d.ts +142 -0
- package/dist/server/customer-registration.d.ts.map +1 -0
- package/dist/server/customer-registration.js +295 -0
- package/dist/server/customer.d.ts +48 -0
- package/dist/server/customer.d.ts.map +1 -0
- package/dist/server/customer.js +462 -0
- package/dist/server/dynamic-config.d.ts +125 -0
- package/dist/server/dynamic-config.d.ts.map +1 -0
- package/dist/server/dynamic-config.js +263 -0
- package/dist/server/fulfillment.d.ts +4 -0
- package/dist/server/fulfillment.d.ts.map +1 -0
- package/dist/server/fulfillment.js +72 -0
- package/dist/server/guest.d.ts +109 -0
- package/dist/server/guest.d.ts.map +1 -0
- package/dist/server/guest.js +304 -0
- package/dist/server/index.d.ts +21 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +20 -0
- package/dist/server/locale-actions.d.ts +14 -0
- package/dist/server/locale-actions.d.ts.map +1 -0
- package/dist/server/locale-actions.js +63 -0
- package/dist/server/locales.d.ts +10 -0
- package/dist/server/locales.d.ts.map +1 -0
- package/dist/server/locales.js +20 -0
- package/dist/server/notifications.d.ts +2 -0
- package/dist/server/notifications.d.ts.map +1 -0
- package/dist/server/notifications.js +20 -0
- package/dist/server/onboarding.d.ts +2 -0
- package/dist/server/onboarding.d.ts.map +1 -0
- package/dist/server/onboarding.js +8 -0
- package/dist/server/orders.d.ts +69 -0
- package/dist/server/orders.d.ts.map +1 -0
- package/dist/server/orders.js +371 -0
- package/dist/server/payment-details.d.ts +5 -0
- package/dist/server/payment-details.d.ts.map +1 -0
- package/dist/server/payment-details.js +53 -0
- package/dist/server/payment.d.ts +2 -0
- package/dist/server/payment.d.ts.map +1 -0
- package/dist/server/payment.js +25 -0
- package/dist/server/products.d.ts +58 -0
- package/dist/server/products.d.ts.map +1 -0
- package/dist/server/products.js +285 -0
- package/dist/server/regions.d.ts +5 -0
- package/dist/server/regions.d.ts.map +1 -0
- package/dist/server/regions.js +54 -0
- package/dist/server/returns.d.ts +29 -0
- package/dist/server/returns.d.ts.map +1 -0
- package/dist/server/returns.js +236 -0
- package/dist/server/swaps.d.ts +14 -0
- package/dist/server/swaps.d.ts.map +1 -0
- package/dist/server/swaps.js +123 -0
- package/dist/server/variants.d.ts +3 -0
- package/dist/server/variants.d.ts.map +1 -0
- package/dist/server/variants.js +26 -0
- package/dist/util/get-locale-header.d.ts +4 -0
- package/dist/util/get-locale-header.d.ts.map +1 -0
- package/dist/util/get-locale-header.js +7 -0
- package/dist/util/medusa-error.d.ts +2 -0
- package/dist/util/medusa-error.d.ts.map +1 -0
- package/dist/util/medusa-error.js +18 -0
- package/package.json +152 -0
- package/src/config.ts +39 -0
- package/src/cookies.ts +171 -0
- package/src/middleware.ts +2 -0
- package/src/server/cart.ts +1054 -0
- package/src/server/categories.ts +94 -0
- package/src/server/collections.ts +113 -0
- package/src/server/customer-registration.ts +349 -0
- package/src/server/customer.ts +581 -0
- package/src/server/dynamic-config.ts +403 -0
- package/src/server/fulfillment.ts +97 -0
- package/src/server/guest.ts +333 -0
- package/src/server/index.ts +21 -0
- package/src/server/locale-actions.ts +74 -0
- package/src/server/locales.ts +28 -0
- package/src/server/notifications.ts +22 -0
- package/src/server/onboarding.ts +9 -0
- package/src/server/orders.ts +467 -0
- package/src/server/payment-details.ts +69 -0
- package/src/server/payment.ts +35 -0
- package/src/server/products.ts +378 -0
- package/src/server/regions.ts +66 -0
- package/src/server/returns.ts +294 -0
- package/src/server/swaps.ts +150 -0
- package/src/server/variants.ts +38 -0
- package/src/server/wishlist.ts +64 -0
- package/src/services/middleware.ts +54 -0
- package/src/util/get-locale-header.ts +8 -0
- package/src/util/medusa-error.ts +19 -0
- package/src/util/sort-products.ts +47 -0
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
"use server";
|
|
2
|
+
import { cookies, headers } from "next/headers";
|
|
3
|
+
import { getGuestAuthHeaders } from "../cookies";
|
|
4
|
+
import { sdk } from "../config";
|
|
5
|
+
const BACKEND_URL = process.env.NEXT_PUBLIC_MEDUSA_BACKEND_URL || "http://localhost:9000";
|
|
6
|
+
const PUBLISHABLE_KEY = process.env.NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY;
|
|
7
|
+
/**
|
|
8
|
+
* Compatibility wrapper for sendOTP
|
|
9
|
+
*/
|
|
10
|
+
export async function sendOTP(email, type = "email_verification") {
|
|
11
|
+
const res = await requestGuestOTP(email);
|
|
12
|
+
// The previous project expected a token or success.
|
|
13
|
+
// We return a dummy token if successful because the UI checks for it.
|
|
14
|
+
if (res.success) {
|
|
15
|
+
return { success: true, token: "otp_sent_successfully" };
|
|
16
|
+
}
|
|
17
|
+
return res;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Compatibility wrapper for verifyOTP
|
|
21
|
+
*/
|
|
22
|
+
export async function verifyOTP(email, token, otp) {
|
|
23
|
+
// The previous implementation used 3 args, but guest.ts uses 2.
|
|
24
|
+
// We ignore the mid 'token' as per user's working code.
|
|
25
|
+
return await verifyGuestOTP(email, otp);
|
|
26
|
+
}
|
|
27
|
+
import { retrieveOrder } from "./orders";
|
|
28
|
+
/**
|
|
29
|
+
* Compatibility wrapper for listGuestOrders
|
|
30
|
+
*/
|
|
31
|
+
export async function listGuestOrders(token) {
|
|
32
|
+
const res = await getGuestOrders(token);
|
|
33
|
+
if (!res.success) {
|
|
34
|
+
throw new Error(res.error || "Failed to fetch orders");
|
|
35
|
+
}
|
|
36
|
+
// Fetch full details for each order to ensure latest fulfillment_status is available
|
|
37
|
+
// because the custom list endpoint might not return all fields correctly.
|
|
38
|
+
const fullOrders = await Promise.all((res.orders || []).map(async (order) => {
|
|
39
|
+
try {
|
|
40
|
+
return await retrieveOrder(order.id);
|
|
41
|
+
}
|
|
42
|
+
catch (e) {
|
|
43
|
+
return order;
|
|
44
|
+
}
|
|
45
|
+
}));
|
|
46
|
+
return { orders: fullOrders, count: fullOrders.length };
|
|
47
|
+
}
|
|
48
|
+
export async function requestGuestOTP(email) {
|
|
49
|
+
const headers = {
|
|
50
|
+
"Content-Type": "application/json",
|
|
51
|
+
};
|
|
52
|
+
if (PUBLISHABLE_KEY)
|
|
53
|
+
headers["x-publishable-api-key"] = PUBLISHABLE_KEY;
|
|
54
|
+
try {
|
|
55
|
+
const res = await fetch(`${BACKEND_URL}/store/otp/request`, {
|
|
56
|
+
method: "POST",
|
|
57
|
+
headers,
|
|
58
|
+
body: JSON.stringify({ email }),
|
|
59
|
+
cache: "no-store",
|
|
60
|
+
});
|
|
61
|
+
if (!res.ok) {
|
|
62
|
+
const errorData = await res.json().catch(() => ({}));
|
|
63
|
+
throw new Error(errorData.message || "Failed to send OTP");
|
|
64
|
+
}
|
|
65
|
+
return { success: true };
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
return { success: false, error: error.message };
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
export async function verifyGuestOTP(email, otp) {
|
|
72
|
+
const headers = {
|
|
73
|
+
"Content-Type": "application/json",
|
|
74
|
+
};
|
|
75
|
+
if (PUBLISHABLE_KEY)
|
|
76
|
+
headers["x-publishable-api-key"] = PUBLISHABLE_KEY;
|
|
77
|
+
try {
|
|
78
|
+
const res = await fetch(`${BACKEND_URL}/store/otp/verify`, {
|
|
79
|
+
method: "POST",
|
|
80
|
+
headers,
|
|
81
|
+
body: JSON.stringify({ email, otp }),
|
|
82
|
+
cache: "no-store",
|
|
83
|
+
});
|
|
84
|
+
if (!res.ok) {
|
|
85
|
+
const errorData = await res.json().catch(() => ({}));
|
|
86
|
+
throw new Error(errorData.message || "Failed to verify OTP");
|
|
87
|
+
}
|
|
88
|
+
const data = await res.json();
|
|
89
|
+
if (data.token) {
|
|
90
|
+
const cookieStore = await cookies();
|
|
91
|
+
cookieStore.set("_medusa_guest_jwt", data.token, {
|
|
92
|
+
httpOnly: true,
|
|
93
|
+
secure: process.env.NODE_ENV === "production",
|
|
94
|
+
maxAge: 60 * 60 * 24, // 1 day
|
|
95
|
+
path: "/",
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
throw new Error("No token returned");
|
|
100
|
+
}
|
|
101
|
+
return { success: true, token: data.token };
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
return { success: false, error: error.message };
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
export async function logoutGuest() {
|
|
108
|
+
const cookieStore = await cookies();
|
|
109
|
+
cookieStore.set("_medusa_guest_jwt", "", {
|
|
110
|
+
maxAge: -1,
|
|
111
|
+
path: "/",
|
|
112
|
+
});
|
|
113
|
+
return { success: true };
|
|
114
|
+
}
|
|
115
|
+
export async function getGuestOrders(token) {
|
|
116
|
+
const cookieStore = await cookies();
|
|
117
|
+
const headersStore = await headers();
|
|
118
|
+
const authHeader = headersStore.get("authorization");
|
|
119
|
+
const headerToken = authHeader?.startsWith("Bearer ") ? authHeader.split(" ")[1] : undefined;
|
|
120
|
+
const authToken = token || headerToken || cookieStore.get("_medusa_guest_jwt")?.value;
|
|
121
|
+
if (!authToken)
|
|
122
|
+
return { success: false, error: "Unauthorized" };
|
|
123
|
+
const requestHeaders = {
|
|
124
|
+
"Authorization": `Bearer ${authToken}`
|
|
125
|
+
};
|
|
126
|
+
if (PUBLISHABLE_KEY)
|
|
127
|
+
requestHeaders["x-publishable-api-key"] = PUBLISHABLE_KEY;
|
|
128
|
+
try {
|
|
129
|
+
const response = await sdk.client.fetch(`/store/guest-orders`, {
|
|
130
|
+
method: "GET",
|
|
131
|
+
headers: requestHeaders,
|
|
132
|
+
query: {
|
|
133
|
+
fields: "id,display_id,status,fulfillment_status,payment_status,created_at,currency_code,total,subtotal,tax_total,shipping_total,discount_total,metadata,email,*items,*items.variant,*items.variant.product"
|
|
134
|
+
},
|
|
135
|
+
cache: "no-store",
|
|
136
|
+
});
|
|
137
|
+
return { success: true, orders: response.orders || [] };
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
return { success: false, error: error.message };
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
export async function getGuestOrder(id, token) {
|
|
144
|
+
const cookieStore = await cookies();
|
|
145
|
+
const headersStore = await headers();
|
|
146
|
+
const authHeader = headersStore.get("authorization");
|
|
147
|
+
const headerToken = authHeader?.startsWith("Bearer ") ? authHeader.split(" ")[1] : undefined;
|
|
148
|
+
const authToken = token || headerToken || cookieStore.get("_medusa_guest_jwt")?.value;
|
|
149
|
+
if (!authToken)
|
|
150
|
+
return { success: false, error: "Unauthorized" };
|
|
151
|
+
const requestHeaders = {
|
|
152
|
+
"Authorization": `Bearer ${authToken}`
|
|
153
|
+
};
|
|
154
|
+
if (PUBLISHABLE_KEY)
|
|
155
|
+
requestHeaders["x-publishable-api-key"] = PUBLISHABLE_KEY;
|
|
156
|
+
try {
|
|
157
|
+
const response = await sdk.client.fetch(`/store/orders/${id}`, {
|
|
158
|
+
method: "GET",
|
|
159
|
+
headers: requestHeaders,
|
|
160
|
+
query: {
|
|
161
|
+
fields: "*payment_collections.payments,*items,*items.metadata,*items.variant,*items.variant.images,*items.variant.product,*items.variant.product.thumbnail,*items.variant.product.images,*items.product,*items.product.thumbnail,*items.product.images,*fulfillments,*fulfillments.items,*fulfillments.location_id,*returns,*returns.items,*cart,*shipping_address,*billing_address,*region,*shipping_methods"
|
|
162
|
+
},
|
|
163
|
+
cache: "no-store"
|
|
164
|
+
});
|
|
165
|
+
if (response.order) {
|
|
166
|
+
return { success: true, order: response.order };
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
return { success: false, error: "Order not found" };
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
return { success: false, error: error.message };
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
export async function cancelGuestOrder(orderId, token) {
|
|
177
|
+
const authHeaders = await getGuestAuthHeaders();
|
|
178
|
+
const authToken = token || authHeaders.authorization?.split(" ")[1];
|
|
179
|
+
if (!authToken)
|
|
180
|
+
return { success: false, error: "Unauthorized" };
|
|
181
|
+
const requestHeaders = {
|
|
182
|
+
"Authorization": `Bearer ${authToken}`
|
|
183
|
+
};
|
|
184
|
+
if (PUBLISHABLE_KEY)
|
|
185
|
+
requestHeaders["x-publishable-api-key"] = PUBLISHABLE_KEY;
|
|
186
|
+
try {
|
|
187
|
+
const response = await fetch(`${BACKEND_URL}/store/guest-orders/${orderId}/cancel`, {
|
|
188
|
+
method: "POST",
|
|
189
|
+
headers: {
|
|
190
|
+
"Content-Type": "application/json",
|
|
191
|
+
...requestHeaders
|
|
192
|
+
},
|
|
193
|
+
cache: "no-store",
|
|
194
|
+
});
|
|
195
|
+
if (!response.ok) {
|
|
196
|
+
const errorData = await response.json().catch(() => ({}));
|
|
197
|
+
throw new Error(errorData.message || "Failed to cancel order");
|
|
198
|
+
}
|
|
199
|
+
return { success: true };
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
return { success: false, error: error.message };
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
export async function getGuestOrderInvoice(orderId, token) {
|
|
206
|
+
const authHeaders = await getGuestAuthHeaders();
|
|
207
|
+
const authToken = token || authHeaders.authorization?.split(" ")[1];
|
|
208
|
+
if (!authToken)
|
|
209
|
+
return { success: false, error: "Unauthorized" };
|
|
210
|
+
const requestHeaders = {
|
|
211
|
+
"Authorization": `Bearer ${authToken}`
|
|
212
|
+
};
|
|
213
|
+
if (PUBLISHABLE_KEY)
|
|
214
|
+
requestHeaders["x-publishable-api-key"] = PUBLISHABLE_KEY;
|
|
215
|
+
try {
|
|
216
|
+
const response = await fetch(`${BACKEND_URL}/store/guest/invoice/download/${orderId}`, {
|
|
217
|
+
method: "GET",
|
|
218
|
+
headers: requestHeaders,
|
|
219
|
+
cache: "no-store",
|
|
220
|
+
});
|
|
221
|
+
if (!response.ok) {
|
|
222
|
+
const errorData = await response.json().catch(() => ({}));
|
|
223
|
+
throw new Error(errorData.message || "Failed to get invoice");
|
|
224
|
+
}
|
|
225
|
+
const contentType = response.headers.get("content-type");
|
|
226
|
+
if (contentType && contentType.includes("application/pdf")) {
|
|
227
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
228
|
+
const base64 = Buffer.from(arrayBuffer).toString('base64');
|
|
229
|
+
return { success: true, type: 'pdf', data: base64 };
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
const data = await response.json();
|
|
233
|
+
return { success: true, type: 'json', data };
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
catch (error) {
|
|
237
|
+
return { success: false, error: error.message };
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
export async function guestReorder(orderId, token) {
|
|
241
|
+
const authHeaders = await getGuestAuthHeaders();
|
|
242
|
+
const authToken = token || authHeaders.authorization?.split(" ")[1];
|
|
243
|
+
if (!authToken)
|
|
244
|
+
return { success: false, error: "Unauthorized" };
|
|
245
|
+
const requestHeaders = {
|
|
246
|
+
"Authorization": `Bearer ${authToken}`
|
|
247
|
+
};
|
|
248
|
+
if (PUBLISHABLE_KEY)
|
|
249
|
+
requestHeaders["x-publishable-api-key"] = PUBLISHABLE_KEY;
|
|
250
|
+
try {
|
|
251
|
+
const response = await fetch(`${BACKEND_URL}/store/guest-orders/${orderId}/reorder`, {
|
|
252
|
+
method: "POST",
|
|
253
|
+
headers: {
|
|
254
|
+
"Content-Type": "application/json",
|
|
255
|
+
...requestHeaders
|
|
256
|
+
},
|
|
257
|
+
cache: "no-store",
|
|
258
|
+
});
|
|
259
|
+
if (!response.ok) {
|
|
260
|
+
const errorData = await response.json().catch(() => ({}));
|
|
261
|
+
throw new Error(errorData.message || "Failed to reorder");
|
|
262
|
+
}
|
|
263
|
+
const data = await response.json();
|
|
264
|
+
return { success: true, data };
|
|
265
|
+
}
|
|
266
|
+
catch (error) {
|
|
267
|
+
return { success: false, error: error.message };
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
export async function createGuestReturn(orderId, items, reason_id, note, token) {
|
|
271
|
+
const authHeaders = await getGuestAuthHeaders();
|
|
272
|
+
const authToken = token || authHeaders.authorization?.split(" ")[1];
|
|
273
|
+
if (!authToken)
|
|
274
|
+
return { success: false, error: "Unauthorized" };
|
|
275
|
+
const requestHeaders = {
|
|
276
|
+
"Authorization": `Bearer ${authToken}`
|
|
277
|
+
};
|
|
278
|
+
if (PUBLISHABLE_KEY)
|
|
279
|
+
requestHeaders["x-publishable-api-key"] = PUBLISHABLE_KEY;
|
|
280
|
+
try {
|
|
281
|
+
const response = await fetch(`${BACKEND_URL}/store/guest-orders/${orderId}/returns`, {
|
|
282
|
+
method: "POST",
|
|
283
|
+
headers: {
|
|
284
|
+
"Content-Type": "application/json",
|
|
285
|
+
...requestHeaders
|
|
286
|
+
},
|
|
287
|
+
body: JSON.stringify({
|
|
288
|
+
items,
|
|
289
|
+
reason_id,
|
|
290
|
+
note
|
|
291
|
+
}),
|
|
292
|
+
cache: "no-store",
|
|
293
|
+
});
|
|
294
|
+
if (!response.ok) {
|
|
295
|
+
const errorData = await response.json().catch(() => ({}));
|
|
296
|
+
throw new Error(errorData.message || "Failed to create return request");
|
|
297
|
+
}
|
|
298
|
+
const data = await response.json();
|
|
299
|
+
return { success: true, data };
|
|
300
|
+
}
|
|
301
|
+
catch (error) {
|
|
302
|
+
return { success: false, error: error.message };
|
|
303
|
+
}
|
|
304
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export * from "./cart";
|
|
2
|
+
export * from "./categories";
|
|
3
|
+
export * from "./collections";
|
|
4
|
+
export * from "./customer-registration";
|
|
5
|
+
export * from "./customer";
|
|
6
|
+
export * from "./dynamic-config";
|
|
7
|
+
export * from "./fulfillment";
|
|
8
|
+
export * from "./guest";
|
|
9
|
+
export * from "./locale-actions";
|
|
10
|
+
export * from "./locales";
|
|
11
|
+
export * from "./notifications";
|
|
12
|
+
export * from "./onboarding";
|
|
13
|
+
export * from "./orders";
|
|
14
|
+
export * from "./payment-details";
|
|
15
|
+
export * from "./payment";
|
|
16
|
+
export * from "./products";
|
|
17
|
+
export * from "./regions";
|
|
18
|
+
export * from "./returns";
|
|
19
|
+
export * from "./swaps";
|
|
20
|
+
export * from "./variants";
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAA;AACtB,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,yBAAyB,CAAA;AACvC,cAAc,YAAY,CAAA;AAC1B,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAC7B,cAAc,SAAS,CAAA;AACvB,cAAc,kBAAkB,CAAA;AAChC,cAAc,WAAW,CAAA;AACzB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,mBAAmB,CAAA;AACjC,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,SAAS,CAAA;AACvB,cAAc,YAAY,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export * from "./cart";
|
|
2
|
+
export * from "./categories";
|
|
3
|
+
export * from "./collections";
|
|
4
|
+
export * from "./customer-registration";
|
|
5
|
+
export * from "./customer";
|
|
6
|
+
export * from "./dynamic-config";
|
|
7
|
+
export * from "./fulfillment";
|
|
8
|
+
export * from "./guest";
|
|
9
|
+
export * from "./locale-actions";
|
|
10
|
+
export * from "./locales";
|
|
11
|
+
export * from "./notifications";
|
|
12
|
+
export * from "./onboarding";
|
|
13
|
+
export * from "./orders";
|
|
14
|
+
export * from "./payment-details";
|
|
15
|
+
export * from "./payment";
|
|
16
|
+
export * from "./products";
|
|
17
|
+
export * from "./regions";
|
|
18
|
+
export * from "./returns";
|
|
19
|
+
export * from "./swaps";
|
|
20
|
+
export * from "./variants";
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gets the current locale from cookies
|
|
3
|
+
*/
|
|
4
|
+
export declare const getLocale: () => Promise<string | null>;
|
|
5
|
+
/**
|
|
6
|
+
* Sets the locale cookie
|
|
7
|
+
*/
|
|
8
|
+
export declare const setLocaleCookie: (locale: string) => Promise<void>;
|
|
9
|
+
/**
|
|
10
|
+
* Updates the locale preference via SDK and stores in cookie.
|
|
11
|
+
* Also updates the cart with the new locale if one exists.
|
|
12
|
+
*/
|
|
13
|
+
export declare const updateLocale: (localeCode: string) => Promise<string>;
|
|
14
|
+
//# sourceMappingURL=locale-actions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locale-actions.d.ts","sourceRoot":"","sources":["../../src/server/locale-actions.ts"],"names":[],"mappings":"AASA;;GAEG;AACH,eAAO,MAAM,SAAS,QAAa,OAAO,CAAC,MAAM,GAAG,IAAI,CAOvD,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,GAAU,QAAQ,MAAM,kBAQnD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAU,YAAY,MAAM,KAAG,OAAO,CAAC,MAAM,CAmCrE,CAAA"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use server";
|
|
2
|
+
import { sdk } from "../config";
|
|
3
|
+
import { revalidateTag } from "next/cache";
|
|
4
|
+
import { cookies as nextCookies } from "next/headers";
|
|
5
|
+
import { getAuthHeaders, getCacheTag, getCartId } from "../cookies";
|
|
6
|
+
const LOCALE_COOKIE_NAME = "_medusa_locale";
|
|
7
|
+
/**
|
|
8
|
+
* Gets the current locale from cookies
|
|
9
|
+
*/
|
|
10
|
+
export const getLocale = async () => {
|
|
11
|
+
try {
|
|
12
|
+
const cookies = await nextCookies();
|
|
13
|
+
return cookies.get(LOCALE_COOKIE_NAME)?.value ?? null;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Sets the locale cookie
|
|
21
|
+
*/
|
|
22
|
+
export const setLocaleCookie = async (locale) => {
|
|
23
|
+
const cookies = await nextCookies();
|
|
24
|
+
cookies.set(LOCALE_COOKIE_NAME, locale, {
|
|
25
|
+
maxAge: 60 * 60 * 24 * 365, // 1 year
|
|
26
|
+
httpOnly: false, // Allow client-side access
|
|
27
|
+
sameSite: "strict",
|
|
28
|
+
secure: process.env.NODE_ENV === "production",
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Updates the locale preference via SDK and stores in cookie.
|
|
33
|
+
* Also updates the cart with the new locale if one exists.
|
|
34
|
+
*/
|
|
35
|
+
export const updateLocale = async (localeCode) => {
|
|
36
|
+
await setLocaleCookie(localeCode);
|
|
37
|
+
// Update cart with the new locale if a cart exists
|
|
38
|
+
const cartId = await getCartId();
|
|
39
|
+
if (cartId) {
|
|
40
|
+
const headers = {
|
|
41
|
+
...(await getAuthHeaders()),
|
|
42
|
+
};
|
|
43
|
+
await sdk.store.cart.update(cartId, { locale: localeCode }, {}, headers);
|
|
44
|
+
const cartCacheTag = await getCacheTag("carts");
|
|
45
|
+
if (cartCacheTag) {
|
|
46
|
+
revalidateTag(cartCacheTag);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Revalidate relevant caches to refresh content
|
|
50
|
+
const productsCacheTag = await getCacheTag("products");
|
|
51
|
+
if (productsCacheTag) {
|
|
52
|
+
revalidateTag(productsCacheTag);
|
|
53
|
+
}
|
|
54
|
+
const categoriesCacheTag = await getCacheTag("categories");
|
|
55
|
+
if (categoriesCacheTag) {
|
|
56
|
+
revalidateTag(categoriesCacheTag);
|
|
57
|
+
}
|
|
58
|
+
const collectionsCacheTag = await getCacheTag("collections");
|
|
59
|
+
if (collectionsCacheTag) {
|
|
60
|
+
revalidateTag(collectionsCacheTag);
|
|
61
|
+
}
|
|
62
|
+
return localeCode;
|
|
63
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type Locale = {
|
|
2
|
+
code: string;
|
|
3
|
+
name: string;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* Fetches available locales from the backend.
|
|
7
|
+
* Returns null if the endpoint returns 404 (locales not configured).
|
|
8
|
+
*/
|
|
9
|
+
export declare const listLocales: () => Promise<Locale[] | null>;
|
|
10
|
+
//# sourceMappingURL=locales.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../src/server/locales.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,MAAM,GAAG;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAa3D,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use server";
|
|
2
|
+
import { sdk } from "../config";
|
|
3
|
+
import { getCacheOptions } from "../cookies";
|
|
4
|
+
/**
|
|
5
|
+
* Fetches available locales from the backend.
|
|
6
|
+
* Returns null if the endpoint returns 404 (locales not configured).
|
|
7
|
+
*/
|
|
8
|
+
export const listLocales = async () => {
|
|
9
|
+
const next = {
|
|
10
|
+
...(await getCacheOptions("locales")),
|
|
11
|
+
};
|
|
12
|
+
return sdk.client
|
|
13
|
+
.fetch(`/store/locales`, {
|
|
14
|
+
method: "GET",
|
|
15
|
+
next,
|
|
16
|
+
cache: "force-cache",
|
|
17
|
+
})
|
|
18
|
+
.then(({ locales }) => locales)
|
|
19
|
+
.catch(() => null);
|
|
20
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/server/notifications.ts"],"names":[],"mappings":"AAKA,wBAAsB,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,GAAG,gBAgB9E"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use server";
|
|
2
|
+
import { sdk } from "../config";
|
|
3
|
+
import { getAuthHeaders } from "../cookies";
|
|
4
|
+
export async function registerNotificationToken(token, deviceInfo) {
|
|
5
|
+
const headers = (await getAuthHeaders());
|
|
6
|
+
try {
|
|
7
|
+
const result = await sdk.client.fetch(`/store/notification-tokens`, {
|
|
8
|
+
method: "POST",
|
|
9
|
+
body: {
|
|
10
|
+
token,
|
|
11
|
+
device_info: deviceInfo,
|
|
12
|
+
},
|
|
13
|
+
headers,
|
|
14
|
+
});
|
|
15
|
+
return result;
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../../src/server/onboarding.ts"],"names":[],"mappings":"AAIA,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,iBAIzD"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use server";
|
|
2
|
+
import { cookies as nextCookies } from "next/headers";
|
|
3
|
+
import { redirect } from "next/navigation";
|
|
4
|
+
export async function resetOnboardingState(orderId) {
|
|
5
|
+
const cookies = await nextCookies();
|
|
6
|
+
cookies.set("_medusa_onboarding", "false", { maxAge: -1 });
|
|
7
|
+
redirect(`http://localhost:7001/a/orders/${orderId}`);
|
|
8
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { HttpTypes } from "@medusajs/types";
|
|
2
|
+
export declare const retrieveOrder: (id: string) => Promise<any>;
|
|
3
|
+
export declare const listOrders: (limit?: number, offset?: number, filters?: Record<string, any>) => Promise<HttpTypes.StoreOrder[]>;
|
|
4
|
+
export declare const createTransferRequest: (state: {
|
|
5
|
+
success: boolean;
|
|
6
|
+
error: string | null;
|
|
7
|
+
order: HttpTypes.StoreOrder | null;
|
|
8
|
+
}, formData: FormData) => Promise<{
|
|
9
|
+
success: boolean;
|
|
10
|
+
error: string | null;
|
|
11
|
+
order: HttpTypes.StoreOrder | null;
|
|
12
|
+
}>;
|
|
13
|
+
export declare const acceptTransferRequest: (id: string, token: string) => Promise<{
|
|
14
|
+
success: boolean;
|
|
15
|
+
error: any;
|
|
16
|
+
order: HttpTypes.StoreOrder;
|
|
17
|
+
} | {
|
|
18
|
+
success: boolean;
|
|
19
|
+
error: any;
|
|
20
|
+
order: any;
|
|
21
|
+
}>;
|
|
22
|
+
export declare const declineTransferRequest: (id: string, token: string) => Promise<{
|
|
23
|
+
success: boolean;
|
|
24
|
+
error: any;
|
|
25
|
+
order: HttpTypes.StoreOrder;
|
|
26
|
+
} | {
|
|
27
|
+
success: boolean;
|
|
28
|
+
error: any;
|
|
29
|
+
order: any;
|
|
30
|
+
}>;
|
|
31
|
+
export declare const downloadInvoice: (orderId: string) => Promise<{
|
|
32
|
+
success: boolean;
|
|
33
|
+
data: string;
|
|
34
|
+
error?: undefined;
|
|
35
|
+
} | {
|
|
36
|
+
success: boolean;
|
|
37
|
+
error: any;
|
|
38
|
+
data?: undefined;
|
|
39
|
+
}>;
|
|
40
|
+
/**
|
|
41
|
+
* Cancel an order
|
|
42
|
+
*/
|
|
43
|
+
export declare const cancelOrder: (orderId: string, reasonId?: string) => Promise<{
|
|
44
|
+
success: boolean;
|
|
45
|
+
error?: undefined;
|
|
46
|
+
} | {
|
|
47
|
+
success: boolean;
|
|
48
|
+
error: any;
|
|
49
|
+
}>;
|
|
50
|
+
/**
|
|
51
|
+
* Reorder an order (supports both logged-in and guest users)
|
|
52
|
+
*/
|
|
53
|
+
export declare const reorderOrder: (orderId: string, skipVariantIds?: string[], forceReorder?: boolean) => Promise<{
|
|
54
|
+
success: boolean;
|
|
55
|
+
error: string;
|
|
56
|
+
inventory_issues: any;
|
|
57
|
+
data?: undefined;
|
|
58
|
+
} | {
|
|
59
|
+
success: boolean;
|
|
60
|
+
error: any;
|
|
61
|
+
inventory_issues?: undefined;
|
|
62
|
+
data?: undefined;
|
|
63
|
+
} | {
|
|
64
|
+
success: boolean;
|
|
65
|
+
data: any;
|
|
66
|
+
error?: undefined;
|
|
67
|
+
inventory_issues?: undefined;
|
|
68
|
+
}>;
|
|
69
|
+
//# sourceMappingURL=orders.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orders.d.ts","sourceRoot":"","sources":["../../src/server/orders.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAG3C,eAAO,MAAM,aAAa,GAAU,IAAI,MAAM,iBAwE7C,CAAA;AAED,eAAO,MAAM,UAAU,GACrB,QAAO,MAAW,EAClB,SAAQ,MAAU,EAClB,UAAU,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,oCA0B9B,CAAA;AAED,eAAO,MAAM,qBAAqB,GAChC,OAAO;IACL,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,KAAK,EAAE,SAAS,CAAC,UAAU,GAAG,IAAI,CAAA;CACnC,EACD,UAAU,QAAQ,KACjB,OAAO,CAAC;IACT,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,KAAK,EAAE,SAAS,CAAC,UAAU,GAAG,IAAI,CAAA;CACnC,CAoBA,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAU,IAAI,MAAM,EAAE,OAAO,MAAM;;;;;;;;EAOpE,CAAA;AAED,eAAO,MAAM,sBAAsB,GAAU,IAAI,MAAM,EAAE,OAAO,MAAM;;;;;;;;EAOrE,CAAA;AAED,eAAO,MAAM,eAAe,GAAU,SAAS,MAAM;;;;;;;;EAuDpD,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,WAAW,GAAU,SAAS,MAAM,EAAE,WAAW,MAAM;;;;;;EAqGnE,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,GAAU,SAAS,MAAM,EAAE,iBAAiB,MAAM,EAAE,EAAE,eAAc,OAAe;;;;;;;;;;;;;;;EAqI3G,CAAA"}
|