@crystaldesign/basket-handler 26.7.0-beta.9 → 26.7.0-rc.1

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.
@@ -20,6 +20,9 @@ import DivaUtils from '@crystaldesign/diva-utils';
20
20
 
21
21
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
22
22
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
23
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
24
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
25
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
23
26
  var BASKET_SAVE_ERROR = /*#__PURE__*/function (BASKET_SAVE_ERROR) {
24
27
  BASKET_SAVE_ERROR["ERROR_NO_BASKET_SAVED"] = "ERROR_NO_BASKET_SAVED";
25
28
  BASKET_SAVE_ERROR["ERROR_BASKET_AFTER_SAVE"] = "ERROR_BASKET_AFTER_SAVE";
@@ -46,87 +49,418 @@ var BasketHandler = /*#__PURE__*/function () {
46
49
  return this._api2Url;
47
50
  }
48
51
  }, {
49
- key: "saveBasket",
52
+ key: "getAuthHeader",
53
+ value: function getAuthHeader(jwt, apiKey) {
54
+ if (jwt) return {
55
+ Authorization: 'Bearer ' + jwt
56
+ };
57
+ if (apiKey) return {
58
+ 'X-API-KEY': apiKey
59
+ };
60
+ return undefined;
61
+ }
62
+ }, {
63
+ key: "getUploadTupleKey",
64
+ value: function getUploadTupleKey(upload) {
65
+ var _upload$setImagesId, _upload$variantId;
66
+ return "".concat(upload.slot, "|").concat(upload.setId, "|").concat((_upload$setImagesId = upload.setImagesId) !== null && _upload$setImagesId !== void 0 ? _upload$setImagesId : '', "|").concat((_upload$variantId = upload.variantId) !== null && _upload$variantId !== void 0 ? _upload$variantId : '');
67
+ }
68
+
69
+ /**
70
+ * Mirror the CDN URLs the backend wrote into the saved basket back onto the
71
+ * in-memory basket the UI still holds. Without this, after save the local
72
+ * Set2DImage / SetImages[].URL stay empty (they were sent empty) and the
73
+ * transient preview URLs get cleared, so 2D/AI images disappear from the
74
+ * checkout. Mirrors the backend resolveUploadTarget routing, incl. variants.
75
+ */
76
+ }, {
77
+ key: "syncUploadedUrlsToLocalBasket",
78
+ value: function syncUploadedUrlsToLocalBasket(localBasket, savedBasketJson, uploadRefs) {
79
+ var _savedBasketJson$Orde;
80
+ if (!(savedBasketJson !== null && savedBasketJson !== void 0 && (_savedBasketJson$Orde = savedBasketJson.OrderSets) !== null && _savedBasketJson$Orde !== void 0 && _savedBasketJson$Orde.length) || !uploadRefs.length) return;
81
+ var _iterator = _createForOfIteratorHelper(uploadRefs),
82
+ _step;
83
+ try {
84
+ var _loop = function _loop() {
85
+ var _localBasket$OrderSet, _savedBasketJson$Orde2, _localSet$SetImages, _savedSet$SetImages;
86
+ var uploadRef = _step.value;
87
+ var localSet = (_localBasket$OrderSet = localBasket.OrderSets) === null || _localBasket$OrderSet === void 0 ? void 0 : _localBasket$OrderSet.find(function (orderSet) {
88
+ return orderSet.SetID === uploadRef.setId;
89
+ });
90
+ var savedSet = (_savedBasketJson$Orde2 = savedBasketJson.OrderSets) === null || _savedBasketJson$Orde2 === void 0 ? void 0 : _savedBasketJson$Orde2.find(function (orderSet) {
91
+ return orderSet.SetID === uploadRef.setId;
92
+ });
93
+ if (!localSet || !savedSet) return 0; // continue
94
+ if (uploadRef.slot === 'planning2D') {
95
+ if (uploadRef.variantId !== undefined) {
96
+ var _localSet$ConfigVaria, _savedSet$ConfigVaria;
97
+ var localVariant = (_localSet$ConfigVaria = localSet.ConfigVariants) === null || _localSet$ConfigVaria === void 0 ? void 0 : _localSet$ConfigVaria.find(function (variant) {
98
+ return variant.VariantID === uploadRef.variantId;
99
+ });
100
+ var savedVariant = (_savedSet$ConfigVaria = savedSet.ConfigVariants) === null || _savedSet$ConfigVaria === void 0 ? void 0 : _savedSet$ConfigVaria.find(function (variant) {
101
+ return variant.VariantID === uploadRef.variantId;
102
+ });
103
+ if (localVariant && savedVariant !== null && savedVariant !== void 0 && savedVariant.Set2DImage) {
104
+ localVariant.Set2DImage = savedVariant.Set2DImage;
105
+ }
106
+ return 0; // continue
107
+ }
108
+ if (savedSet.Set2DImage) {
109
+ localSet.Set2DImage = savedSet.Set2DImage;
110
+ }
111
+ return 0; // continue
112
+ }
113
+ var localImage = (_localSet$SetImages = localSet.SetImages) === null || _localSet$SetImages === void 0 ? void 0 : _localSet$SetImages.find(function (setImage) {
114
+ return setImage.Id === uploadRef.setImagesId;
115
+ });
116
+ var savedImage = (_savedSet$SetImages = savedSet.SetImages) === null || _savedSet$SetImages === void 0 ? void 0 : _savedSet$SetImages.find(function (setImage) {
117
+ return setImage.Id === uploadRef.setImagesId;
118
+ });
119
+ if (localImage && savedImage !== null && savedImage !== void 0 && savedImage.URL) {
120
+ localImage.URL = savedImage.URL;
121
+ }
122
+ },
123
+ _ret;
124
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
125
+ _ret = _loop();
126
+ if (_ret === 0) continue;
127
+ }
128
+ } catch (err) {
129
+ _iterator.e(err);
130
+ } finally {
131
+ _iterator.f();
132
+ }
133
+ }
134
+ }, {
135
+ key: "validateAndFilterPendingUploads",
136
+ value: function validateAndFilterPendingUploads(basket) {
137
+ var _basket$OrderSets, _basket$OrderSets2;
138
+ var pendingUploads = basket.listPendingUploads();
139
+ var knownSetIds = new Set(((_basket$OrderSets = basket.OrderSets) !== null && _basket$OrderSets !== void 0 ? _basket$OrderSets : []).map(function (orderSet) {
140
+ return orderSet.SetID;
141
+ }));
142
+ var validSetImagesIdsBySet = new Map();
143
+ var validVariantIdsBySet = new Map();
144
+ var _iterator2 = _createForOfIteratorHelper((_basket$OrderSets2 = basket.OrderSets) !== null && _basket$OrderSets2 !== void 0 ? _basket$OrderSets2 : []),
145
+ _step2;
146
+ try {
147
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
148
+ var _orderSet$SetImages, _orderSet$ConfigVaria;
149
+ var orderSet = _step2.value;
150
+ validSetImagesIdsBySet.set(orderSet.SetID, new Set(((_orderSet$SetImages = orderSet.SetImages) !== null && _orderSet$SetImages !== void 0 ? _orderSet$SetImages : []).map(function (setImage) {
151
+ return setImage === null || setImage === void 0 ? void 0 : setImage.Id;
152
+ }).filter(function (id) {
153
+ return !!id;
154
+ })));
155
+ validVariantIdsBySet.set(orderSet.SetID, new Set(((_orderSet$ConfigVaria = orderSet.ConfigVariants) !== null && _orderSet$ConfigVaria !== void 0 ? _orderSet$ConfigVaria : []).map(function (variant) {
156
+ return variant === null || variant === void 0 ? void 0 : variant.VariantID;
157
+ }).filter(function (id) {
158
+ return id !== undefined && id !== null;
159
+ })));
160
+ }
161
+
162
+ // planning2D is unique per (setId, variantId): the main configuration and
163
+ // each ConfigVariant of a set may carry its own 2D image.
164
+ } catch (err) {
165
+ _iterator2.e(err);
166
+ } finally {
167
+ _iterator2.f();
168
+ }
169
+ var planning2DTargets = new Set();
170
+ var seenTuples = new Set();
171
+ var filteredUploads = [];
172
+ var _iterator3 = _createForOfIteratorHelper(pendingUploads),
173
+ _step3;
174
+ try {
175
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
176
+ var pendingUpload = _step3.value;
177
+ if (pendingUpload.slot === 'planning2D') {
178
+ var _validVariantIdsBySet, _pendingUpload$varian;
179
+ if (!knownSetIds.has(pendingUpload.setId)) {
180
+ throw new Error('planning2D pending upload setId does not exist in basket OrderSets');
181
+ }
182
+ if (pendingUpload.variantId !== undefined && !((_validVariantIdsBySet = validVariantIdsBySet.get(pendingUpload.setId)) !== null && _validVariantIdsBySet !== void 0 && _validVariantIdsBySet.has(pendingUpload.variantId))) {
183
+ throw new Error('planning2D pending upload variantId does not exist in matching OrderSet.ConfigVariants');
184
+ }
185
+ var planning2DTargetKey = "".concat(pendingUpload.setId, "|").concat((_pendingUpload$varian = pendingUpload.variantId) !== null && _pendingUpload$varian !== void 0 ? _pendingUpload$varian : '');
186
+ if (planning2DTargets.has(planning2DTargetKey)) {
187
+ throw new Error('Only one planning2D pending upload is allowed per setId/variantId');
188
+ }
189
+ planning2DTargets.add(planning2DTargetKey);
190
+ }
191
+ if (pendingUpload.slot === 'aiImage') {
192
+ if (!pendingUpload.setImagesId) {
193
+ var _this$LOG;
194
+ (_this$LOG = this.LOG) === null || _this$LOG === void 0 || _this$LOG.warn('Skipping aiImage pending upload without setImagesId');
195
+ continue;
196
+ }
197
+ var setImagesIds = validSetImagesIdsBySet.get(pendingUpload.setId);
198
+ if (!(setImagesIds !== null && setImagesIds !== void 0 && setImagesIds.has(pendingUpload.setImagesId))) {
199
+ throw new Error('aiImage pending upload setImagesId does not exist in matching OrderSet.SetImages');
200
+ }
201
+ }
202
+ var tupleKey = this.getUploadTupleKey(pendingUpload);
203
+ if (seenTuples.has(tupleKey)) {
204
+ throw new Error('Duplicate pending upload tuple detected');
205
+ }
206
+ seenTuples.add(tupleKey);
207
+ filteredUploads.push(pendingUpload);
208
+ }
209
+ } catch (err) {
210
+ _iterator3.e(err);
211
+ } finally {
212
+ _iterator3.f();
213
+ }
214
+ return filteredUploads;
215
+ }
216
+ }, {
217
+ key: "initUploads",
50
218
  value: function () {
51
- var _saveBasket = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(_ref) {
52
- var jwt, basket, awaitPDF, utmCampaign, saveToApi2, sessionGuid, apiKey, _this$LOG, fullUrl, response, _DivaUtils$Configurat, _api2Result, authHeader, resultBasket, api2Result, _e$response, _e$response2, _this$LOG4, _this$LOG2, _this$LOG3;
219
+ var _initUploads = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(_ref) {
220
+ var _DivaUtils$Configurat, _initResponse$data$ti, _initResponse$data;
221
+ var jwt, apiKey, basket, pendingUploads, authHeader, initUrl, initItems, initResponse;
53
222
  return _regeneratorRuntime.wrap(function _callee$(_context) {
54
223
  while (1) switch (_context.prev = _context.next) {
55
224
  case 0:
56
- jwt = _ref.jwt, basket = _ref.basket, awaitPDF = _ref.awaitPDF, utmCampaign = _ref.utmCampaign, saveToApi2 = _ref.saveToApi2, sessionGuid = _ref.sessionGuid, apiKey = _ref.apiKey;
225
+ jwt = _ref.jwt, apiKey = _ref.apiKey, basket = _ref.basket, pendingUploads = _ref.pendingUploads;
226
+ authHeader = this.getAuthHeader(jwt, apiKey);
227
+ initUrl = this.basketService + '/v1/baskets/save/uploads/init';
228
+ initItems = pendingUploads.map(function (pendingUpload) {
229
+ return {
230
+ slot: pendingUpload.slot,
231
+ setId: pendingUpload.setId,
232
+ setImagesId: pendingUpload.setImagesId,
233
+ variantId: pendingUpload.variantId,
234
+ fileName: pendingUpload.fileName,
235
+ mimeType: pendingUpload.mimeType,
236
+ size: pendingUpload.size
237
+ };
238
+ });
239
+ _context.next = 6;
240
+ return axios.post(initUrl, JSON.stringify({
241
+ organizationId: basket.OrganizationId,
242
+ uploads: initItems
243
+ }), {
244
+ headers: _objectSpread(_objectSpread({}, authHeader), {}, {
245
+ 'Content-Type': 'application/json',
246
+ 'X-Session-Id': DivaUtils.SessionId,
247
+ 'X-Configurator-Id': (_DivaUtils$Configurat = DivaUtils.ConfigurationId) !== null && _DivaUtils$Configurat !== void 0 ? _DivaUtils$Configurat : ''
248
+ })
249
+ });
250
+ case 6:
251
+ initResponse = _context.sent;
252
+ return _context.abrupt("return", (_initResponse$data$ti = (_initResponse$data = initResponse.data) === null || _initResponse$data === void 0 ? void 0 : _initResponse$data.tickets) !== null && _initResponse$data$ti !== void 0 ? _initResponse$data$ti : []);
253
+ case 8:
254
+ case "end":
255
+ return _context.stop();
256
+ }
257
+ }, _callee, this);
258
+ }));
259
+ function initUploads(_x) {
260
+ return _initUploads.apply(this, arguments);
261
+ }
262
+ return initUploads;
263
+ }()
264
+ }, {
265
+ key: "uploadPendingFiles",
266
+ value: function () {
267
+ var _uploadPendingFiles = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(pendingUploads, tickets) {
268
+ var uploadTicketsByTuple, _iterator4, _step4, ticket, uploadRefs, _iterator5, _step5, _ticket$simpleUpload, _ticket$simpleUpload2, _ticket$simpleUpload$, pendingUpload, _ticket, uploadResponse;
269
+ return _regeneratorRuntime.wrap(function _callee2$(_context2) {
270
+ while (1) switch (_context2.prev = _context2.next) {
271
+ case 0:
272
+ uploadTicketsByTuple = new Map();
273
+ _iterator4 = _createForOfIteratorHelper(tickets);
274
+ try {
275
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
276
+ ticket = _step4.value;
277
+ uploadTicketsByTuple.set(this.getUploadTupleKey(ticket), ticket);
278
+ }
279
+ } catch (err) {
280
+ _iterator4.e(err);
281
+ } finally {
282
+ _iterator4.f();
283
+ }
284
+ uploadRefs = [];
285
+ _iterator5 = _createForOfIteratorHelper(pendingUploads);
286
+ _context2.prev = 5;
287
+ _iterator5.s();
288
+ case 7:
289
+ if ((_step5 = _iterator5.n()).done) {
290
+ _context2.next = 20;
291
+ break;
292
+ }
293
+ pendingUpload = _step5.value;
294
+ _ticket = uploadTicketsByTuple.get(this.getUploadTupleKey(pendingUpload));
295
+ if (!(!(_ticket !== null && _ticket !== void 0 && _ticket.uploadId) || !((_ticket$simpleUpload = _ticket.simpleUpload) !== null && _ticket$simpleUpload !== void 0 && _ticket$simpleUpload.url) || !((_ticket$simpleUpload2 = _ticket.simpleUpload) !== null && _ticket$simpleUpload2 !== void 0 && _ticket$simpleUpload2.method))) {
296
+ _context2.next = 12;
297
+ break;
298
+ }
299
+ throw new Error('Missing upload ticket for pending basket upload');
300
+ case 12:
301
+ _context2.next = 14;
302
+ return fetch(_ticket.simpleUpload.url, {
303
+ method: _ticket.simpleUpload.method,
304
+ headers: (_ticket$simpleUpload$ = _ticket.simpleUpload.headers) !== null && _ticket$simpleUpload$ !== void 0 ? _ticket$simpleUpload$ : {},
305
+ body: pendingUpload.blob
306
+ });
307
+ case 14:
308
+ uploadResponse = _context2.sent;
309
+ if (uploadResponse.ok) {
310
+ _context2.next = 17;
311
+ break;
312
+ }
313
+ throw new Error('Direct storage upload failed');
314
+ case 17:
315
+ uploadRefs.push({
316
+ slot: pendingUpload.slot,
317
+ setId: pendingUpload.setId,
318
+ setImagesId: pendingUpload.setImagesId,
319
+ variantId: pendingUpload.variantId,
320
+ fileName: pendingUpload.fileName,
321
+ uploadId: _ticket.uploadId
322
+ });
323
+ case 18:
324
+ _context2.next = 7;
325
+ break;
326
+ case 20:
327
+ _context2.next = 25;
328
+ break;
329
+ case 22:
330
+ _context2.prev = 22;
331
+ _context2.t0 = _context2["catch"](5);
332
+ _iterator5.e(_context2.t0);
333
+ case 25:
334
+ _context2.prev = 25;
335
+ _iterator5.f();
336
+ return _context2.finish(25);
337
+ case 28:
338
+ return _context2.abrupt("return", uploadRefs);
339
+ case 29:
340
+ case "end":
341
+ return _context2.stop();
342
+ }
343
+ }, _callee2, this, [[5, 22, 25, 28]]);
344
+ }));
345
+ function uploadPendingFiles(_x2, _x3) {
346
+ return _uploadPendingFiles.apply(this, arguments);
347
+ }
348
+ return uploadPendingFiles;
349
+ }()
350
+ }, {
351
+ key: "saveBasket",
352
+ value: function () {
353
+ var _saveBasket = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(_ref2) {
354
+ var jwt, basket, awaitPDF, utmCampaign, saveToApi2, sessionGuid, apiKey, _this$LOG2, fullUrl, response, _DivaUtils$Configurat2, authHeader, pendingUploads, uploadRefs, uploadTickets, saveRequestBody, resultBasket, api2Result, _e$response, _e$response2, _this$LOG5, _this$LOG3, _this$LOG4;
355
+ return _regeneratorRuntime.wrap(function _callee3$(_context3) {
356
+ while (1) switch (_context3.prev = _context3.next) {
357
+ case 0:
358
+ jwt = _ref2.jwt, basket = _ref2.basket, awaitPDF = _ref2.awaitPDF, utmCampaign = _ref2.utmCampaign, saveToApi2 = _ref2.saveToApi2, sessionGuid = _ref2.sessionGuid, apiKey = _ref2.apiKey;
57
359
  if (basket.DivaNr) {
58
- _context.next = 4;
360
+ _context3.next = 4;
59
361
  break;
60
362
  }
61
- (_this$LOG = this.LOG) === null || _this$LOG === void 0 || _this$LOG.error('Saving Basket Failed. Error: DivaNr is empty', 'SELLER_0003');
62
- return _context.abrupt("return", BASKET_SAVE_ERROR.ERROR_NO_BASKET_SAVED);
363
+ (_this$LOG2 = this.LOG) === null || _this$LOG2 === void 0 || _this$LOG2.error('Saving Basket Failed. Error: DivaNr is empty', 'SELLER_0003');
364
+ return _context3.abrupt("return", BASKET_SAVE_ERROR.ERROR_NO_BASKET_SAVED);
63
365
  case 4:
64
- fullUrl = new URL(this.basketService + '/baskets');
366
+ fullUrl = new URL(this.basketService + '/v1/baskets/save');
65
367
  if (awaitPDF != undefined) fullUrl.searchParams.append('awaitPDF', awaitPDF.toString());
66
368
  if (utmCampaign) fullUrl.searchParams.append('utmCampaign', utmCampaign);
67
- _context.prev = 7;
68
- if (jwt) authHeader = {
69
- Authorization: 'Bearer ' + jwt
70
- };else if (apiKey) authHeader = {
71
- 'X-API-KEY': apiKey
369
+ _context3.prev = 7;
370
+ authHeader = this.getAuthHeader(jwt, apiKey);
371
+ pendingUploads = this.validateAndFilterPendingUploads(basket);
372
+ uploadRefs = [];
373
+ if (!(pendingUploads.length > 0)) {
374
+ _context3.next = 18;
375
+ break;
376
+ }
377
+ _context3.next = 14;
378
+ return this.initUploads({
379
+ jwt: jwt,
380
+ apiKey: apiKey,
381
+ basket: basket,
382
+ pendingUploads: pendingUploads
383
+ });
384
+ case 14:
385
+ uploadTickets = _context3.sent;
386
+ _context3.next = 17;
387
+ return this.uploadPendingFiles(pendingUploads, uploadTickets);
388
+ case 17:
389
+ uploadRefs = _context3.sent;
390
+ case 18:
391
+ saveRequestBody = {
392
+ basket: basket.getAsJson()
72
393
  };
73
- _context.next = 11;
74
- return axios.post(fullUrl.toString(), JSON.stringify(basket.getAsJson()), {
394
+ if (uploadRefs.length > 0) {
395
+ saveRequestBody.uploads = uploadRefs;
396
+ }
397
+ _context3.next = 22;
398
+ return axios.post(fullUrl.toString(), JSON.stringify(saveRequestBody), {
75
399
  headers: _objectSpread(_objectSpread({}, authHeader), {}, {
76
400
  'Content-Type': 'application/json',
77
401
  'X-Session-Id': DivaUtils.SessionId,
78
- 'X-Configurator-Id': (_DivaUtils$Configurat = DivaUtils.ConfigurationId) !== null && _DivaUtils$Configurat !== void 0 ? _DivaUtils$Configurat : ''
402
+ 'X-Configurator-Id': (_DivaUtils$Configurat2 = DivaUtils.ConfigurationId) !== null && _DivaUtils$Configurat2 !== void 0 ? _DivaUtils$Configurat2 : ''
79
403
  })
80
404
  });
81
- case 11:
82
- response = _context.sent;
83
- _context.next = 14;
405
+ case 22:
406
+ response = _context3.sent;
407
+ _context3.next = 25;
84
408
  return response.data;
85
- case 14:
86
- resultBasket = _context.sent;
409
+ case 25:
410
+ resultBasket = _context3.sent;
411
+ if (uploadRefs.length > 0) {
412
+ this.syncUploadedUrlsToLocalBasket(basket, resultBasket, uploadRefs);
413
+ }
87
414
  if (!saveToApi2) {
88
- _context.next = 19;
415
+ _context3.next = 34;
89
416
  break;
90
417
  }
91
- _context.next = 18;
418
+ _context3.next = 30;
92
419
  return this.api2SaveBasket({
93
- basket: basket,
420
+ basket: resultBasket,
94
421
  sessionGuid: sessionGuid,
95
422
  awaitPDF: awaitPDF,
96
423
  jwt: jwt,
97
424
  saveToApi2: saveToApi2,
98
425
  _id: resultBasket._id
99
426
  });
100
- case 18:
101
- api2Result = _context.sent;
102
- case 19:
103
- return _context.abrupt("return", (_api2Result = api2Result) !== null && _api2Result !== void 0 ? _api2Result : resultBasket);
104
- case 22:
105
- _context.prev = 22;
106
- _context.t0 = _context["catch"](7);
107
- if (!(((_e$response = _context.t0.response) === null || _e$response === void 0 ? void 0 : _e$response.status) === 409)) {
108
- _context.next = 29;
427
+ case 30:
428
+ api2Result = _context3.sent;
429
+ if (!api2Result) {
430
+ _context3.next = 34;
109
431
  break;
110
432
  }
111
- (_this$LOG2 = this.LOG) === null || _this$LOG2 === void 0 || _this$LOG2.error('Saving Basket failed - Entity already exists.');
112
- return _context.abrupt("return", BASKET_SAVE_ERROR.ERROR_NO_BASKET_SAVED_ENTITY_EXISTS);
113
- case 29:
114
- if (!(((_e$response2 = _context.t0.response) === null || _e$response2 === void 0 ? void 0 : _e$response2.status) !== 201)) {
115
- _context.next = 32;
433
+ basket.clearPendingUploads();
434
+ return _context3.abrupt("return", api2Result);
435
+ case 34:
436
+ basket.clearPendingUploads();
437
+ return _context3.abrupt("return", resultBasket);
438
+ case 38:
439
+ _context3.prev = 38;
440
+ _context3.t0 = _context3["catch"](7);
441
+ if (!(((_e$response = _context3.t0.response) === null || _e$response === void 0 ? void 0 : _e$response.status) === 409)) {
442
+ _context3.next = 45;
116
443
  break;
117
444
  }
118
- (_this$LOG3 = this.LOG) === null || _this$LOG3 === void 0 || _this$LOG3.error('Saving Basket failed.');
119
- return _context.abrupt("return", BASKET_SAVE_ERROR.ERROR_NO_BASKET_SAVED);
120
- case 32:
121
- (_this$LOG4 = this.LOG) === null || _this$LOG4 === void 0 || _this$LOG4.error('Saving Basket Failed. serverError ' + _context.t0.message, 'SELLER_0003');
122
- return _context.abrupt("return", BASKET_SAVE_ERROR.ERROR_NO_BASKET_SAVED);
123
- case 34:
445
+ (_this$LOG3 = this.LOG) === null || _this$LOG3 === void 0 || _this$LOG3.error('Saving Basket failed - Entity already exists.');
446
+ return _context3.abrupt("return", BASKET_SAVE_ERROR.ERROR_NO_BASKET_SAVED_ENTITY_EXISTS);
447
+ case 45:
448
+ if (!(((_e$response2 = _context3.t0.response) === null || _e$response2 === void 0 ? void 0 : _e$response2.status) !== 201)) {
449
+ _context3.next = 48;
450
+ break;
451
+ }
452
+ (_this$LOG4 = this.LOG) === null || _this$LOG4 === void 0 || _this$LOG4.error('Saving Basket failed.');
453
+ return _context3.abrupt("return", BASKET_SAVE_ERROR.ERROR_NO_BASKET_SAVED);
454
+ case 48:
455
+ (_this$LOG5 = this.LOG) === null || _this$LOG5 === void 0 || _this$LOG5.error('Saving Basket Failed. serverError ' + _context3.t0.message, 'SELLER_0003');
456
+ return _context3.abrupt("return", BASKET_SAVE_ERROR.ERROR_NO_BASKET_SAVED);
457
+ case 50:
124
458
  case "end":
125
- return _context.stop();
459
+ return _context3.stop();
126
460
  }
127
- }, _callee, this, [[7, 22]]);
461
+ }, _callee3, this, [[7, 38]]);
128
462
  }));
129
- function saveBasket(_x) {
463
+ function saveBasket(_x4) {
130
464
  return _saveBasket.apply(this, arguments);
131
465
  }
132
466
  return saveBasket;
@@ -134,29 +468,29 @@ var BasketHandler = /*#__PURE__*/function () {
134
468
  }, {
135
469
  key: "api2SaveBasket",
136
470
  value: function () {
137
- var _api2SaveBasket = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(_ref2) {
138
- var basket, sessionGuid, awaitPDF, _id, _this$LOG5, _this$LOG6, fullUrl, response, _DivaUtils$Configurat2, _response$Result, _this$LOG7, _this$LOG8;
139
- return _regeneratorRuntime.wrap(function _callee2$(_context2) {
140
- while (1) switch (_context2.prev = _context2.next) {
471
+ var _api2SaveBasket = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(_ref3) {
472
+ var basket, sessionGuid, awaitPDF, _id, _this$LOG6, _this$LOG7, fullUrl, response, _DivaUtils$Configurat3, _response$Result, _this$LOG8, _this$LOG9;
473
+ return _regeneratorRuntime.wrap(function _callee4$(_context4) {
474
+ while (1) switch (_context4.prev = _context4.next) {
141
475
  case 0:
142
- basket = _ref2.basket, sessionGuid = _ref2.sessionGuid, awaitPDF = _ref2.awaitPDF, _id = _ref2._id;
476
+ basket = _ref3.basket, sessionGuid = _ref3.sessionGuid, awaitPDF = _ref3.awaitPDF, _id = _ref3._id;
143
477
  if (basket.getAsJson().DivaNr) {
144
- _context2.next = 4;
478
+ _context4.next = 4;
145
479
  break;
146
480
  }
147
- (_this$LOG5 = this.LOG) === null || _this$LOG5 === void 0 || _this$LOG5.error('Saving Basket Failed. Error: DivaNr is empty', 'SELLER_0003');
148
- return _context2.abrupt("return", BASKET_SAVE_ERROR.ERROR_BASKET_AFTER_SAVE);
481
+ (_this$LOG6 = this.LOG) === null || _this$LOG6 === void 0 || _this$LOG6.error('Saving Basket Failed. Error: DivaNr is empty', 'SELLER_0003');
482
+ return _context4.abrupt("return", BASKET_SAVE_ERROR.ERROR_BASKET_AFTER_SAVE);
149
483
  case 4:
150
484
  if (sessionGuid) {
151
- _context2.next = 7;
485
+ _context4.next = 7;
152
486
  break;
153
487
  }
154
- (_this$LOG6 = this.LOG) === null || _this$LOG6 === void 0 || _this$LOG6.error('Cant create api2 Basket without sessionguid');
155
- return _context2.abrupt("return", BASKET_SAVE_ERROR.ERROR_BASKET_AFTER_SAVE);
488
+ (_this$LOG7 = this.LOG) === null || _this$LOG7 === void 0 || _this$LOG7.error('Cant create api2 Basket without sessionguid');
489
+ return _context4.abrupt("return", BASKET_SAVE_ERROR.ERROR_BASKET_AFTER_SAVE);
156
490
  case 7:
157
491
  fullUrl = this.api2Url + '?function=SetJsonBasketData3' + '&callHeadlessBrowserAsync=' + (!awaitPDF ? '1' : '0');
158
- _context2.prev = 8;
159
- _context2.next = 11;
492
+ _context4.prev = 8;
493
+ _context4.next = 11;
160
494
  return axios.post(fullUrl, JSON.stringify(_objectSpread(_objectSpread({}, basket), {}, {
161
495
  _id: _id
162
496
  })), {
@@ -164,7 +498,7 @@ var BasketHandler = /*#__PURE__*/function () {
164
498
  sessionGuid: sessionGuid,
165
499
  'Content-Type': 'application/json',
166
500
  'X-Session-Id': DivaUtils.SessionId,
167
- 'X-Configurator-Id': (_DivaUtils$Configurat2 = DivaUtils.ConfigurationId) !== null && _DivaUtils$Configurat2 !== void 0 ? _DivaUtils$Configurat2 : ''
501
+ 'X-Configurator-Id': (_DivaUtils$Configurat3 = DivaUtils.ConfigurationId) !== null && _DivaUtils$Configurat3 !== void 0 ? _DivaUtils$Configurat3 : ''
168
502
  }
169
503
  }).then(function (res) {
170
504
  if (res.status !== 200) {
@@ -173,30 +507,30 @@ var BasketHandler = /*#__PURE__*/function () {
173
507
  return res.data;
174
508
  });
175
509
  case 11:
176
- response = _context2.sent;
510
+ response = _context4.sent;
177
511
  if (!(response.Error || (_response$Result = response.Result) !== null && _response$Result !== void 0 && _response$Result.startsWith('Error'))) {
178
- _context2.next = 15;
512
+ _context4.next = 15;
179
513
  break;
180
514
  }
181
- (_this$LOG7 = this.LOG) === null || _this$LOG7 === void 0 || _this$LOG7.error('Saving Basket Failed. serverError: ' + response.Error, 'SELLER_0003');
182
- return _context2.abrupt("return", BASKET_SAVE_ERROR.ERROR_BASKET_AFTER_SAVE);
515
+ (_this$LOG8 = this.LOG) === null || _this$LOG8 === void 0 || _this$LOG8.error('Saving Basket Failed. serverError: ' + response.Error, 'SELLER_0003');
516
+ return _context4.abrupt("return", BASKET_SAVE_ERROR.ERROR_BASKET_AFTER_SAVE);
183
517
  case 15:
184
- _context2.next = 21;
518
+ _context4.next = 21;
185
519
  break;
186
520
  case 17:
187
- _context2.prev = 17;
188
- _context2.t0 = _context2["catch"](8);
189
- (_this$LOG8 = this.LOG) === null || _this$LOG8 === void 0 || _this$LOG8.error('Saving Basket Failed. serverError ' + _context2.t0.message, 'SELLER_0003');
190
- return _context2.abrupt("return", BASKET_SAVE_ERROR.ERROR_BASKET_AFTER_SAVE);
521
+ _context4.prev = 17;
522
+ _context4.t0 = _context4["catch"](8);
523
+ (_this$LOG9 = this.LOG) === null || _this$LOG9 === void 0 || _this$LOG9.error('Saving Basket Failed. serverError ' + _context4.t0.message, 'SELLER_0003');
524
+ return _context4.abrupt("return", BASKET_SAVE_ERROR.ERROR_BASKET_AFTER_SAVE);
191
525
  case 21:
192
- return _context2.abrupt("return", undefined);
526
+ return _context4.abrupt("return", undefined);
193
527
  case 22:
194
528
  case "end":
195
- return _context2.stop();
529
+ return _context4.stop();
196
530
  }
197
- }, _callee2, this, [[8, 17]]);
531
+ }, _callee4, this, [[8, 17]]);
198
532
  }));
199
- function api2SaveBasket(_x2) {
533
+ function api2SaveBasket(_x5) {
200
534
  return _api2SaveBasket.apply(this, arguments);
201
535
  }
202
536
  return api2SaveBasket;
@@ -204,18 +538,18 @@ var BasketHandler = /*#__PURE__*/function () {
204
538
  }, {
205
539
  key: "setOrdered",
206
540
  value: function () {
207
- var _setOrdered = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(_ref3) {
208
- var serviceUrl, organizationId, jwt, divaNr, documentVersion, body, _this$LOG9;
209
- return _regeneratorRuntime.wrap(function _callee3$(_context3) {
210
- while (1) switch (_context3.prev = _context3.next) {
541
+ var _setOrdered = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee5(_ref4) {
542
+ var serviceUrl, organizationId, jwt, divaNr, documentVersion, body, _this$LOG10;
543
+ return _regeneratorRuntime.wrap(function _callee5$(_context5) {
544
+ while (1) switch (_context5.prev = _context5.next) {
211
545
  case 0:
212
- serviceUrl = _ref3.serviceUrl, organizationId = _ref3.organizationId, jwt = _ref3.jwt, divaNr = _ref3.divaNr, documentVersion = _ref3.documentVersion;
213
- _context3.prev = 1;
546
+ serviceUrl = _ref4.serviceUrl, organizationId = _ref4.organizationId, jwt = _ref4.jwt, divaNr = _ref4.divaNr, documentVersion = _ref4.documentVersion;
547
+ _context5.prev = 1;
214
548
  body = {
215
549
  divaNr: divaNr,
216
550
  version: documentVersion
217
551
  };
218
- _context3.next = 5;
552
+ _context5.next = 5;
219
553
  return fetch("".concat(serviceUrl, "/orders?organizationId=").concat(organizationId), {
220
554
  method: 'POST',
221
555
  headers: {
@@ -227,20 +561,20 @@ var BasketHandler = /*#__PURE__*/function () {
227
561
  return r.json();
228
562
  });
229
563
  case 5:
230
- _context3.next = 11;
564
+ _context5.next = 11;
231
565
  break;
232
566
  case 7:
233
- _context3.prev = 7;
234
- _context3.t0 = _context3["catch"](1);
235
- (_this$LOG9 = this.LOG) === null || _this$LOG9 === void 0 || _this$LOG9.error('Could not set OrderStatus: ' + _context3.t0.message);
567
+ _context5.prev = 7;
568
+ _context5.t0 = _context5["catch"](1);
569
+ (_this$LOG10 = this.LOG) === null || _this$LOG10 === void 0 || _this$LOG10.error('Could not set OrderStatus: ' + _context5.t0.message);
236
570
  throw new Error('DivaNr not found');
237
571
  case 11:
238
572
  case "end":
239
- return _context3.stop();
573
+ return _context5.stop();
240
574
  }
241
- }, _callee3, this, [[1, 7]]);
575
+ }, _callee5, this, [[1, 7]]);
242
576
  }));
243
- function setOrdered(_x3) {
577
+ function setOrdered(_x6) {
244
578
  return _setOrdered.apply(this, arguments);
245
579
  }
246
580
  return setOrdered;
@@ -13,6 +13,19 @@ export default class BasketHandler {
13
13
  constructor(LOG: any, basketService: string, api2Url: string);
14
14
  get basketService(): string;
15
15
  get api2Url(): string;
16
+ private getAuthHeader;
17
+ private getUploadTupleKey;
18
+ /**
19
+ * Mirror the CDN URLs the backend wrote into the saved basket back onto the
20
+ * in-memory basket the UI still holds. Without this, after save the local
21
+ * Set2DImage / SetImages[].URL stay empty (they were sent empty) and the
22
+ * transient preview URLs get cleared, so 2D/AI images disappear from the
23
+ * checkout. Mirrors the backend resolveUploadTarget routing, incl. variants.
24
+ */
25
+ private syncUploadedUrlsToLocalBasket;
26
+ private validateAndFilterPendingUploads;
27
+ private initUploads;
28
+ private uploadPendingFiles;
16
29
  saveBasket({ jwt, basket, awaitPDF, utmCampaign, saveToApi2, sessionGuid, apiKey }: SaveBasketProps): Promise<any>;
17
30
  api2SaveBasket({ basket, sessionGuid, awaitPDF, _id }: SaveBasketProps2): Promise<BASKET_SAVE_ERROR.ERROR_BASKET_AFTER_SAVE | undefined>;
18
31
  setOrdered({ serviceUrl, organizationId, jwt, divaNr, documentVersion }: SetOrderedProps): Promise<void>;