order-management 0.0.29 → 0.0.30
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.
|
@@ -866,7 +866,8 @@ const SwapDetailPage = () => {
|
|
|
866
866
|
}
|
|
867
867
|
const payload = await response.json();
|
|
868
868
|
setSwap(payload.swap);
|
|
869
|
-
|
|
869
|
+
const redirectUrl = payload.redirect_url.startsWith("http") ? payload.redirect_url : `${window.location.origin}${payload.redirect_url}`;
|
|
870
|
+
window.location.href = redirectUrl;
|
|
870
871
|
} catch (approveErr) {
|
|
871
872
|
const message = approveErr instanceof Error ? approveErr.message : "Unable to prepare swap for exchange";
|
|
872
873
|
setUpdateError(message);
|
|
@@ -1172,12 +1173,6 @@ const routeModule = {
|
|
|
1172
1173
|
};
|
|
1173
1174
|
const menuItemModule = {
|
|
1174
1175
|
menuItems: [
|
|
1175
|
-
{
|
|
1176
|
-
label: config$3.label,
|
|
1177
|
-
icon: config$3.icon,
|
|
1178
|
-
path: "/returns",
|
|
1179
|
-
nested: void 0
|
|
1180
|
-
},
|
|
1181
1176
|
{
|
|
1182
1177
|
label: config$2.label,
|
|
1183
1178
|
icon: config$2.icon,
|
|
@@ -1185,9 +1180,9 @@ const menuItemModule = {
|
|
|
1185
1180
|
nested: void 0
|
|
1186
1181
|
},
|
|
1187
1182
|
{
|
|
1188
|
-
label: config$
|
|
1189
|
-
icon: config$
|
|
1190
|
-
path: "/returns
|
|
1183
|
+
label: config$3.label,
|
|
1184
|
+
icon: config$3.icon,
|
|
1185
|
+
path: "/returns",
|
|
1191
1186
|
nested: void 0
|
|
1192
1187
|
},
|
|
1193
1188
|
{
|
|
@@ -1195,6 +1190,12 @@ const menuItemModule = {
|
|
|
1195
1190
|
icon: config.icon,
|
|
1196
1191
|
path: "/swaps/:id",
|
|
1197
1192
|
nested: void 0
|
|
1193
|
+
},
|
|
1194
|
+
{
|
|
1195
|
+
label: config$1.label,
|
|
1196
|
+
icon: config$1.icon,
|
|
1197
|
+
path: "/returns/:id",
|
|
1198
|
+
nested: void 0
|
|
1198
1199
|
}
|
|
1199
1200
|
]
|
|
1200
1201
|
};
|
|
@@ -865,7 +865,8 @@ const SwapDetailPage = () => {
|
|
|
865
865
|
}
|
|
866
866
|
const payload = await response.json();
|
|
867
867
|
setSwap(payload.swap);
|
|
868
|
-
|
|
868
|
+
const redirectUrl = payload.redirect_url.startsWith("http") ? payload.redirect_url : `${window.location.origin}${payload.redirect_url}`;
|
|
869
|
+
window.location.href = redirectUrl;
|
|
869
870
|
} catch (approveErr) {
|
|
870
871
|
const message = approveErr instanceof Error ? approveErr.message : "Unable to prepare swap for exchange";
|
|
871
872
|
setUpdateError(message);
|
|
@@ -1171,12 +1172,6 @@ const routeModule = {
|
|
|
1171
1172
|
};
|
|
1172
1173
|
const menuItemModule = {
|
|
1173
1174
|
menuItems: [
|
|
1174
|
-
{
|
|
1175
|
-
label: config$3.label,
|
|
1176
|
-
icon: config$3.icon,
|
|
1177
|
-
path: "/returns",
|
|
1178
|
-
nested: void 0
|
|
1179
|
-
},
|
|
1180
1175
|
{
|
|
1181
1176
|
label: config$2.label,
|
|
1182
1177
|
icon: config$2.icon,
|
|
@@ -1184,9 +1179,9 @@ const menuItemModule = {
|
|
|
1184
1179
|
nested: void 0
|
|
1185
1180
|
},
|
|
1186
1181
|
{
|
|
1187
|
-
label: config$
|
|
1188
|
-
icon: config$
|
|
1189
|
-
path: "/returns
|
|
1182
|
+
label: config$3.label,
|
|
1183
|
+
icon: config$3.icon,
|
|
1184
|
+
path: "/returns",
|
|
1190
1185
|
nested: void 0
|
|
1191
1186
|
},
|
|
1192
1187
|
{
|
|
@@ -1194,6 +1189,12 @@ const menuItemModule = {
|
|
|
1194
1189
|
icon: config.icon,
|
|
1195
1190
|
path: "/swaps/:id",
|
|
1196
1191
|
nested: void 0
|
|
1192
|
+
},
|
|
1193
|
+
{
|
|
1194
|
+
label: config$1.label,
|
|
1195
|
+
icon: config$1.icon,
|
|
1196
|
+
path: "/returns/:id",
|
|
1197
|
+
nested: void 0
|
|
1197
1198
|
}
|
|
1198
1199
|
]
|
|
1199
1200
|
};
|
|
@@ -58,11 +58,188 @@ const POST = async (req, res) => {
|
|
|
58
58
|
});
|
|
59
59
|
// Retrieve updated swap
|
|
60
60
|
const updatedSwap = await swapService.retrieveSwap(id);
|
|
61
|
-
|
|
61
|
+
// Log the full swap object to see its structure
|
|
62
|
+
console.log("[Prepare Exchange] Full swap object keys:", Object.keys(updatedSwap));
|
|
63
|
+
console.log("[Prepare Exchange] Full swap object:", JSON.stringify(updatedSwap, null, 2));
|
|
64
|
+
const fullSwapData = updatedSwap;
|
|
65
|
+
// Helper function to parse swap items from JSONB format
|
|
66
|
+
// Handles arrays, JSON strings, Record objects, and null/undefined
|
|
67
|
+
const parseReturnItems = (items) => {
|
|
68
|
+
if (!items)
|
|
69
|
+
return [];
|
|
70
|
+
// If already an array, parse it
|
|
71
|
+
if (Array.isArray(items)) {
|
|
72
|
+
const parsed = [];
|
|
73
|
+
for (const item of items) {
|
|
74
|
+
// Handle both object format and direct values
|
|
75
|
+
if (typeof item === "object" && item !== null) {
|
|
76
|
+
const parsedItem = {
|
|
77
|
+
id: String(item.id || item.item_id || ""),
|
|
78
|
+
quantity: Number(item.quantity || 0),
|
|
79
|
+
reason: item.reason ? String(item.reason) : undefined,
|
|
80
|
+
};
|
|
81
|
+
if (parsedItem.id) {
|
|
82
|
+
parsed.push(parsedItem);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return parsed;
|
|
87
|
+
}
|
|
88
|
+
// If it's a string, try to parse as JSON
|
|
89
|
+
if (typeof items === "string") {
|
|
90
|
+
try {
|
|
91
|
+
const parsed = JSON.parse(items);
|
|
92
|
+
return parseReturnItems(parsed);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return [];
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// If it's an object (Record), try to extract array values
|
|
99
|
+
if (typeof items === "object" && items !== null) {
|
|
100
|
+
// Check if it's an object with array-like structure
|
|
101
|
+
const record = items;
|
|
102
|
+
// If it has numeric keys or is array-like, convert to array
|
|
103
|
+
const values = Object.values(record);
|
|
104
|
+
if (values.length > 0 && Array.isArray(values[0])) {
|
|
105
|
+
return parseReturnItems(values[0]);
|
|
106
|
+
}
|
|
107
|
+
// If values are objects, treat as array
|
|
108
|
+
if (values.length > 0 && typeof values[0] === "object") {
|
|
109
|
+
return parseReturnItems(values);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return [];
|
|
113
|
+
};
|
|
114
|
+
// Helper function to parse new items from JSONB format
|
|
115
|
+
// Handles arrays, JSON strings, Record objects, and null/undefined
|
|
116
|
+
const parseNewItems = (items) => {
|
|
117
|
+
if (!items)
|
|
118
|
+
return [];
|
|
119
|
+
// If already an array, parse it
|
|
120
|
+
if (Array.isArray(items)) {
|
|
121
|
+
const parsed = [];
|
|
122
|
+
for (const item of items) {
|
|
123
|
+
// Handle both object format and direct values
|
|
124
|
+
if (typeof item === "object" && item !== null) {
|
|
125
|
+
const parsedItem = {
|
|
126
|
+
variant_id: String(item.variant_id || ""),
|
|
127
|
+
quantity: Number(item.quantity || 0),
|
|
128
|
+
};
|
|
129
|
+
if (parsedItem.variant_id) {
|
|
130
|
+
parsed.push(parsedItem);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return parsed;
|
|
135
|
+
}
|
|
136
|
+
// If it's a string, try to parse as JSON
|
|
137
|
+
if (typeof items === "string") {
|
|
138
|
+
try {
|
|
139
|
+
const parsed = JSON.parse(items);
|
|
140
|
+
return parseNewItems(parsed);
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return [];
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// If it's an object (Record), try to extract array values
|
|
147
|
+
if (typeof items === "object" && items !== null) {
|
|
148
|
+
// Check if it's an object with array-like structure
|
|
149
|
+
const record = items;
|
|
150
|
+
// If it has numeric keys or is array-like, convert to array
|
|
151
|
+
const values = Object.values(record);
|
|
152
|
+
if (values.length > 0 && Array.isArray(values[0])) {
|
|
153
|
+
return parseNewItems(values[0]);
|
|
154
|
+
}
|
|
155
|
+
// If values are objects, treat as array
|
|
156
|
+
if (values.length > 0 && typeof values[0] === "object") {
|
|
157
|
+
return parseNewItems(values);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return [];
|
|
161
|
+
};
|
|
162
|
+
// Debug: Log raw data before parsing
|
|
163
|
+
console.log("[Prepare Exchange] Raw swap data:", {
|
|
164
|
+
return_items_raw: fullSwapData.return_items,
|
|
165
|
+
new_items_raw: fullSwapData.new_items,
|
|
166
|
+
return_items_type: typeof fullSwapData.return_items,
|
|
167
|
+
new_items_type: typeof fullSwapData.new_items,
|
|
168
|
+
return_items_is_array: Array.isArray(fullSwapData.return_items),
|
|
169
|
+
new_items_is_array: Array.isArray(fullSwapData.new_items),
|
|
170
|
+
return_items_is_null: fullSwapData.return_items === null,
|
|
171
|
+
new_items_is_null: fullSwapData.new_items === null,
|
|
172
|
+
});
|
|
173
|
+
// Parse swap items from JSONB format
|
|
174
|
+
const returnItems = parseReturnItems(fullSwapData.return_items);
|
|
175
|
+
const newItems = parseNewItems(fullSwapData.new_items);
|
|
176
|
+
// Debug: Log parsed results
|
|
177
|
+
console.log("[Prepare Exchange] Parsed items:", {
|
|
178
|
+
returnItemsCount: returnItems.length,
|
|
179
|
+
newItemsCount: newItems.length,
|
|
180
|
+
returnItems,
|
|
181
|
+
newItems,
|
|
182
|
+
});
|
|
183
|
+
// Build redirect URL with query parameters for autofilling exchange products
|
|
184
|
+
let redirectUrl = `/app/orders/${swapData.order_id}/exchanges`;
|
|
185
|
+
const queryParams = new URLSearchParams();
|
|
186
|
+
try {
|
|
187
|
+
// Encode return_items (inbound) as base64 JSON
|
|
188
|
+
if (returnItems.length > 0) {
|
|
189
|
+
const inboundJson = JSON.stringify(returnItems);
|
|
190
|
+
const inboundEncoded = Buffer.from(inboundJson).toString("base64");
|
|
191
|
+
queryParams.set("inbound", inboundEncoded);
|
|
192
|
+
console.log("[Prepare Exchange] Added inbound param, length:", inboundEncoded.length);
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
console.log("[Prepare Exchange] No return items to encode (count:", returnItems.length, ")");
|
|
196
|
+
}
|
|
197
|
+
// Encode new_items (outbound) as base64 JSON
|
|
198
|
+
if (newItems.length > 0) {
|
|
199
|
+
const outboundJson = JSON.stringify(newItems);
|
|
200
|
+
const outboundEncoded = Buffer.from(outboundJson).toString("base64");
|
|
201
|
+
queryParams.set("outbound", outboundEncoded);
|
|
202
|
+
console.log("[Prepare Exchange] Added outbound param, length:", outboundEncoded.length);
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
console.log("[Prepare Exchange] No new items to encode (count:", newItems.length, ")");
|
|
206
|
+
}
|
|
207
|
+
// Append query parameters if any were added
|
|
208
|
+
const queryString = queryParams.toString();
|
|
209
|
+
if (queryString) {
|
|
210
|
+
redirectUrl = `${redirectUrl}?${queryString}`;
|
|
211
|
+
console.log("[Prepare Exchange] Final redirect URL with params:", redirectUrl);
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
console.log("[Prepare Exchange] No query params added - redirect URL:", redirectUrl);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
catch (encodingError) {
|
|
218
|
+
// If encoding fails, log error but continue with redirect without query params
|
|
219
|
+
// This ensures the redirect still works even if autofill data can't be encoded
|
|
220
|
+
console.warn(`Failed to encode swap items for autofill: ${encodingError instanceof Error ? encodingError.message : String(encodingError)}`);
|
|
221
|
+
}
|
|
222
|
+
// Log the response being sent
|
|
223
|
+
console.log("[Prepare Exchange] Response being sent:", {
|
|
224
|
+
redirect_url: redirectUrl,
|
|
225
|
+
has_query_params: redirectUrl.includes("?"),
|
|
226
|
+
query_string: redirectUrl.split("?")[1] || "none",
|
|
227
|
+
});
|
|
228
|
+
const response = {
|
|
62
229
|
swap: updatedSwap,
|
|
63
230
|
order_id: swapData.order_id,
|
|
64
|
-
redirect_url:
|
|
65
|
-
|
|
231
|
+
redirect_url: redirectUrl,
|
|
232
|
+
// Debug info (can be removed later)
|
|
233
|
+
debug: {
|
|
234
|
+
has_return_items: !!fullSwapData.return_items,
|
|
235
|
+
has_new_items: !!fullSwapData.new_items,
|
|
236
|
+
return_items_count: returnItems.length,
|
|
237
|
+
new_items_count: newItems.length,
|
|
238
|
+
redirect_url_has_params: redirectUrl.includes("?"),
|
|
239
|
+
},
|
|
240
|
+
};
|
|
241
|
+
console.log("[Prepare Exchange] Full response:", JSON.stringify(response, null, 2));
|
|
242
|
+
res.json(response);
|
|
66
243
|
}
|
|
67
244
|
catch (error) {
|
|
68
245
|
if (error instanceof utils_1.MedusaError) {
|
|
@@ -85,4 +262,4 @@ const POST = async (req, res) => {
|
|
|
85
262
|
}
|
|
86
263
|
};
|
|
87
264
|
exports.POST = POST;
|
|
88
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3N3YXBzL1tpZF0vcHJlcGFyZS1leGNoYW5nZS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxREFBdUQ7QUFDdkQsc0RBQXlEO0FBR2xELE1BQU0sSUFBSSxHQUFHLEtBQUssRUFDdkIsR0FBa0IsRUFDbEIsR0FBbUIsRUFDSixFQUFFO0lBQ2pCLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFBO0lBRXpCLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNSLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLENBQUMsQ0FBQTtRQUN4RCxPQUFNO0lBQ1IsQ0FBQztJQUVELG1DQUFtQztJQUNuQyxNQUFNLFdBQVcsR0FBSSxHQUVuQixDQUFDLFlBQVksQ0FBQTtJQUVmLE1BQU0sT0FBTyxHQUFHLFdBQVcsRUFBRSxRQUFRLElBQUksV0FBVyxFQUFFLE9BQU8sSUFBSSxPQUFPLENBQUE7SUFFeEUsSUFBSSxDQUFDO1FBQ0gsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQWMsa0JBQVcsQ0FBQyxDQUFBO1FBRS9ELHNDQUFzQztRQUN0QyxNQUFNLElBQUksR0FBRyxNQUFNLFdBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDL0MsTUFBTSxRQUFRLEdBQUcsSUFJaEIsQ0FBQTtRQUVELDhEQUE4RDtRQUM5RCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3ZCLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUNuQixPQUFPLEVBQUUsK0NBQStDO2FBQ3pELENBQUMsQ0FBQTtZQUNGLE9B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
|
|
265
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3N3YXBzL1tpZF0vcHJlcGFyZS1leGNoYW5nZS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxREFBdUQ7QUFDdkQsc0RBQXlEO0FBR2xELE1BQU0sSUFBSSxHQUFHLEtBQUssRUFDdkIsR0FBa0IsRUFDbEIsR0FBbUIsRUFDSixFQUFFO0lBQ2pCLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFBO0lBRXpCLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNSLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLENBQUMsQ0FBQTtRQUN4RCxPQUFNO0lBQ1IsQ0FBQztJQUVELG1DQUFtQztJQUNuQyxNQUFNLFdBQVcsR0FBSSxHQUVuQixDQUFDLFlBQVksQ0FBQTtJQUVmLE1BQU0sT0FBTyxHQUFHLFdBQVcsRUFBRSxRQUFRLElBQUksV0FBVyxFQUFFLE9BQU8sSUFBSSxPQUFPLENBQUE7SUFFeEUsSUFBSSxDQUFDO1FBQ0gsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQWMsa0JBQVcsQ0FBQyxDQUFBO1FBRS9ELHNDQUFzQztRQUN0QyxNQUFNLElBQUksR0FBRyxNQUFNLFdBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDL0MsTUFBTSxRQUFRLEdBQUcsSUFJaEIsQ0FBQTtRQUVELDhEQUE4RDtRQUM5RCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3ZCLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUNuQixPQUFPLEVBQUUsK0NBQStDO2FBQ3pELENBQUMsQ0FBQTtZQUNGLE9B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
|