@commercetools-frontend-extensions/import-resources-modal 1.0.1 → 1.0.3

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.
Files changed (17) hide show
  1. package/dist/{active-drag-drop-area-be3680ab.cjs.prod.js → active-drag-drop-area-8340b842.cjs.prod.js} +1 -1
  2. package/dist/{active-drag-drop-area-fae899bd.cjs.dev.js → active-drag-drop-area-ca5f76cc.cjs.dev.js} +1 -1
  3. package/dist/{active-drag-drop-area-06cef014.esm.js → active-drag-drop-area-fda704be.esm.js} +1 -1
  4. package/dist/commercetools-frontend-extensions-import-resources-modal.cjs.dev.js +1 -1
  5. package/dist/commercetools-frontend-extensions-import-resources-modal.cjs.prod.js +1 -1
  6. package/dist/commercetools-frontend-extensions-import-resources-modal.esm.js +1 -1
  7. package/dist/declarations/src/@types/file-upload.d.ts +3 -0
  8. package/dist/{enabled-drop-area-56d860b6.cjs.dev.js → enabled-drop-area-2ebd7852.cjs.dev.js} +1 -1
  9. package/dist/{enabled-drop-area-69507fae.esm.js → enabled-drop-area-9e4288ea.esm.js} +1 -1
  10. package/dist/{enabled-drop-area-32e0dc61.cjs.prod.js → enabled-drop-area-a1a4aa0e.cjs.prod.js} +1 -1
  11. package/dist/{file-dropped-area-6f365e02.esm.js → file-dropped-area-3b89854b.esm.js} +1 -1
  12. package/dist/{file-dropped-area-e856a71f.cjs.prod.js → file-dropped-area-4c06923d.cjs.prod.js} +1 -1
  13. package/dist/{file-dropped-area-6acf82c0.cjs.dev.js → file-dropped-area-78d3771e.cjs.dev.js} +1 -1
  14. package/dist/{index-bb7f975c.cjs.dev.js → index-5ca9f09a.cjs.dev.js} +94 -43
  15. package/dist/{index-d79bbd8e.cjs.prod.js → index-5d350d4e.cjs.prod.js} +94 -43
  16. package/dist/{index-a4665b30.esm.js → index-b00b8ce7.esm.js} +96 -45
  17. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var dist_commercetoolsFrontendExtensionsImportResourcesModal = require('./index-d79bbd8e.cjs.prod.js');
3
+ var dist_commercetoolsFrontendExtensionsImportResourcesModal = require('./index-5d350d4e.cjs.prod.js');
4
4
  var jsxRuntime = require('@emotion/react/jsx-runtime');
5
5
  require('@babel/runtime-corejs3/core-js-stable/object/keys');
6
6
  require('@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols');
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var dist_commercetoolsFrontendExtensionsImportResourcesModal = require('./index-bb7f975c.cjs.dev.js');
3
+ var dist_commercetoolsFrontendExtensionsImportResourcesModal = require('./index-5ca9f09a.cjs.dev.js');
4
4
  var jsxRuntime = require('@emotion/react/jsx-runtime');
5
5
  require('@babel/runtime-corejs3/core-js-stable/object/keys');
6
6
  require('@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols');
@@ -1,4 +1,4 @@
1
- import { F as FileDropped, E as EnabledDropArea } from './index-a4665b30.esm.js';
1
+ import { F as FileDropped, E as EnabledDropArea } from './index-b00b8ce7.esm.js';
2
2
  import { jsx } from '@emotion/react/jsx-runtime';
3
3
  import '@babel/runtime-corejs3/core-js-stable/object/keys';
4
4
  import '@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols';
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var dist_commercetoolsFrontendExtensionsImportResourcesModal = require('./index-bb7f975c.cjs.dev.js');
5
+ var dist_commercetoolsFrontendExtensionsImportResourcesModal = require('./index-5ca9f09a.cjs.dev.js');
6
6
  require('@babel/runtime-corejs3/core-js-stable/object/keys');
7
7
  require('@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols');
8
8
  require('@babel/runtime-corejs3/core-js-stable/instance/filter');
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var dist_commercetoolsFrontendExtensionsImportResourcesModal = require('./index-d79bbd8e.cjs.prod.js');
5
+ var dist_commercetoolsFrontendExtensionsImportResourcesModal = require('./index-5d350d4e.cjs.prod.js');
6
6
  require('@babel/runtime-corejs3/core-js-stable/object/keys');
7
7
  require('@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols');
8
8
  require('@babel/runtime-corejs3/core-js-stable/instance/filter');
@@ -1,4 +1,4 @@
1
- export { I as default } from './index-a4665b30.esm.js';
1
+ export { I as default } from './index-b00b8ce7.esm.js';
2
2
  import '@babel/runtime-corejs3/core-js-stable/object/keys';
3
3
  import '@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols';
4
4
  import '@babel/runtime-corejs3/core-js-stable/instance/filter';
@@ -40,6 +40,9 @@ export interface FileUploadRequestParameters {
40
40
  resourceType: ResourceType;
41
41
  file: File;
42
42
  abortSignal?: AbortSignal;
43
+ onSuccess: (data: FileUploadResponse) => void;
44
+ onProgress: (progress: number) => void;
45
+ onError: (error: Error) => void;
43
46
  }
44
47
  export interface ProcessUploadedFileRequestParameters {
45
48
  projectKey: string;
@@ -11,7 +11,7 @@ var _Object$defineProperty = require('@babel/runtime-corejs3/core-js-stable/obje
11
11
  var _defineProperty = require('@babel/runtime-corejs3/helpers/defineProperty');
12
12
  require('react');
13
13
  var uiKit = require('@commercetools-frontend/ui-kit');
14
- var dist_commercetoolsFrontendExtensionsImportResourcesModal = require('./index-bb7f975c.cjs.dev.js');
14
+ var dist_commercetoolsFrontendExtensionsImportResourcesModal = require('./index-5ca9f09a.cjs.dev.js');
15
15
  var jsxRuntime = require('@emotion/react/jsx-runtime');
16
16
  require('react-intl');
17
17
  require('@commercetools-frontend/application-shell-connectors');
@@ -9,7 +9,7 @@ import _Object$defineProperty from '@babel/runtime-corejs3/core-js-stable/object
9
9
  import _defineProperty from '@babel/runtime-corejs3/helpers/esm/defineProperty';
10
10
  import 'react';
11
11
  import { Spacings, Text, Link } from '@commercetools-frontend/ui-kit';
12
- import { m as messages } from './index-a4665b30.esm.js';
12
+ import { m as messages } from './index-b00b8ce7.esm.js';
13
13
  import { jsxs, jsx } from '@emotion/react/jsx-runtime';
14
14
  import 'react-intl';
15
15
  import '@commercetools-frontend/application-shell-connectors';
@@ -11,7 +11,7 @@ var _Object$defineProperty = require('@babel/runtime-corejs3/core-js-stable/obje
11
11
  var _defineProperty = require('@babel/runtime-corejs3/helpers/defineProperty');
12
12
  require('react');
13
13
  var uiKit = require('@commercetools-frontend/ui-kit');
14
- var dist_commercetoolsFrontendExtensionsImportResourcesModal = require('./index-d79bbd8e.cjs.prod.js');
14
+ var dist_commercetoolsFrontendExtensionsImportResourcesModal = require('./index-5d350d4e.cjs.prod.js');
15
15
  var jsxRuntime = require('@emotion/react/jsx-runtime');
16
16
  require('react-intl');
17
17
  require('@commercetools-frontend/application-shell-connectors');
@@ -1,6 +1,6 @@
1
1
  import { useIntl } from 'react-intl';
2
2
  import { Spacings, PaperclipIcon, Constraints, Text, SecondaryButton } from '@commercetools-frontend/ui-kit';
3
- import { u as useImportResourcesContext, m as messages } from './index-a4665b30.esm.js';
3
+ import { u as useImportResourcesContext, m as messages } from './index-b00b8ce7.esm.js';
4
4
  import 'react';
5
5
  import '@commercetools-frontend/application-shell-connectors';
6
6
  import '@commercetools-frontend/sdk';
@@ -2,7 +2,7 @@
2
2
 
3
3
  var reactIntl = require('react-intl');
4
4
  var uiKit = require('@commercetools-frontend/ui-kit');
5
- var dist_commercetoolsFrontendExtensionsImportResourcesModal = require('./index-d79bbd8e.cjs.prod.js');
5
+ var dist_commercetoolsFrontendExtensionsImportResourcesModal = require('./index-5d350d4e.cjs.prod.js');
6
6
  require('react');
7
7
  require('@commercetools-frontend/application-shell-connectors');
8
8
  require('@commercetools-frontend/sdk');
@@ -2,7 +2,7 @@
2
2
 
3
3
  var reactIntl = require('react-intl');
4
4
  var uiKit = require('@commercetools-frontend/ui-kit');
5
- var dist_commercetoolsFrontendExtensionsImportResourcesModal = require('./index-bb7f975c.cjs.dev.js');
5
+ var dist_commercetoolsFrontendExtensionsImportResourcesModal = require('./index-5ca9f09a.cjs.dev.js');
6
6
  require('react');
7
7
  require('@commercetools-frontend/application-shell-connectors');
8
8
  require('@commercetools-frontend/sdk');
@@ -329,49 +329,74 @@ let HttpError = /*#__PURE__*/function (_Error) {
329
329
  }( /*#__PURE__*/_wrapNativeSuper(Error));
330
330
 
331
331
  function ownKeys$e(e, r) { var t = _Object$keys__default["default"](e); if (_Object$getOwnPropertySymbols__default["default"]) { var o = _Object$getOwnPropertySymbols__default["default"](e); r && (o = _filterInstanceProperty__default["default"](o).call(o, function (r) { return _Object$getOwnPropertyDescriptor__default["default"](e, r).enumerable; })), t.push.apply(t, o); } return t; }
332
- function _objectSpread$e(e) { for (var r = 1; r < arguments.length; r++) { var _context2, _context3; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty__default["default"](_context2 = ownKeys$e(Object(t), !0)).call(_context2, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors__default["default"] ? _Object$defineProperties__default["default"](e, _Object$getOwnPropertyDescriptors__default["default"](t)) : _forEachInstanceProperty__default["default"](_context3 = ownKeys$e(Object(t))).call(_context3, function (r) { _Object$defineProperty__default["default"](e, r, _Object$getOwnPropertyDescriptor__default["default"](t, r)); }); } return e; }
332
+ function _objectSpread$e(e) { for (var r = 1; r < arguments.length; r++) { var _context3, _context4; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty__default["default"](_context3 = ownKeys$e(Object(t), !0)).call(_context3, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors__default["default"] ? _Object$defineProperties__default["default"](e, _Object$getOwnPropertyDescriptors__default["default"](t)) : _forEachInstanceProperty__default["default"](_context4 = ownKeys$e(Object(t))).call(_context4, function (r) { _Object$defineProperty__default["default"](e, r, _Object$getOwnPropertyDescriptor__default["default"](t, r)); }); } return e; }
333
333
  const addProxyPrefixToUrl = (uri, proxy) => {
334
334
  var _context;
335
335
  return proxy ? _concatInstanceProperty__default["default"](_context = "/proxy/".concat(proxy)).call(_context, uri) : uri;
336
336
  };
337
- const fetcher = async _ref => {
338
- let url = _ref.url,
339
- payload = _ref.payload,
340
- config = _ref.config;
341
- const data = await applicationShell.executeHttpClientRequest(async options => {
342
- const res = await fetch(applicationShell.buildApiUrl(addProxyPrefixToUrl(url, config === null || config === void 0 ? void 0 : config.proxy)), _objectSpread$e(_objectSpread$e({}, options), {}, {
343
- method: config === null || config === void 0 ? void 0 : config.method,
344
- body: payload,
345
- signal: config === null || config === void 0 ? void 0 : config.abortSignal
346
- }));
347
- if (!res.ok) {
348
- const errorData = await res.json();
349
- throw new HttpError(res.status, res.statusText, errorData);
350
- }
351
- const data = res.json();
352
- return {
353
- data,
354
- statusCode: res.status,
355
- getHeader: key => res.headers.get(key)
356
- };
357
- }, {
337
+ const fetchUsingXhr = _ref2 => {
338
+ let url = _ref2.url,
339
+ payload = _ref2.payload,
340
+ config = _ref2.config,
341
+ onProgress = _ref2.onProgress,
342
+ onSuccess = _ref2.onSuccess,
343
+ onError = _ref2.onError;
344
+ const options = applicationShell.createHttpClientOptions({
358
345
  headers: _objectSpread$e({
359
346
  'Content-Type': 'application/json'
360
347
  }, config === null || config === void 0 ? void 0 : config.headers)
361
348
  });
362
- return data;
349
+ const xhr = new XMLHttpRequest();
350
+ xhr.open(config === null || config === void 0 ? void 0 : config.method, applicationShell.buildApiUrl(addProxyPrefixToUrl(url, config === null || config === void 0 ? void 0 : config.proxy)), true);
351
+ if (options.headers) {
352
+ var _context2;
353
+ _forEachInstanceProperty__default["default"](_context2 = _Object$keys__default["default"](options.headers)).call(_context2, key => {
354
+ xhr.setRequestHeader(key, options.headers[key]);
355
+ });
356
+ }
357
+ xhr.upload.onprogress = function (event) {
358
+ if (event.lengthComputable) {
359
+ const percentComplete = event.loaded / event.total * 100;
360
+ onProgress(percentComplete);
361
+ }
362
+ };
363
+ xhr.onload = function () {
364
+ const data = JSON.parse(xhr.responseText);
365
+ // Code copied from `executeHttpClientRequest` to replicate the same behavior
366
+ const refreshedSessionToken = xhr.getResponseHeader('x-refreshed-session-token');
367
+ if (refreshedSessionToken) {
368
+ applicationShellConnectors.oidcStorage.setActiveSession(refreshedSessionToken);
369
+ }
370
+ if (xhr.status >= 200 && xhr.status < 300) {
371
+ onSuccess(data);
372
+ } else {
373
+ onError(new HttpError(xhr.status, xhr.statusText, data));
374
+ }
375
+ };
376
+ xhr.onerror = function () {
377
+ const errorData = JSON.parse(xhr.responseText);
378
+ onError(new HttpError(xhr.status, xhr.statusText, errorData));
379
+ };
380
+ xhr.onabort = function () {
381
+ onError(new DOMException('Aborted', 'AbortError'));
382
+ };
383
+ xhr.send(payload);
384
+ return xhr;
363
385
  };
364
386
 
365
- async function uploadFileForImport(_ref) {
387
+ function uploadFileForImport(_ref) {
366
388
  let projectKey = _ref.projectKey,
367
389
  containerKey = _ref.containerKey,
368
390
  resourceType = _ref.resourceType,
369
391
  file = _ref.file,
370
- abortSignal = _ref.abortSignal;
392
+ abortSignal = _ref.abortSignal,
393
+ onSuccess = _ref.onSuccess,
394
+ onProgress = _ref.onProgress,
395
+ onError = _ref.onError;
371
396
  const uri = getFileUploadURL(projectKey, resourceType, containerKey);
372
397
  const formData = new FormData();
373
398
  formData.append('file', file, file.name);
374
- const response = await fetcher({
399
+ return fetchUsingXhr({
375
400
  url: uri,
376
401
  payload: formData,
377
402
  config: {
@@ -381,9 +406,11 @@ async function uploadFileForImport(_ref) {
381
406
  headers: {
382
407
  'Content-Type': null
383
408
  }
384
- }
409
+ },
410
+ onProgress,
411
+ onSuccess,
412
+ onError
385
413
  });
386
- return response;
387
414
  }
388
415
 
389
416
  function ownKeys$d(e, r) { var t = _Object$keys__default["default"](e); if (_Object$getOwnPropertySymbols__default["default"]) { var o = _Object$getOwnPropertySymbols__default["default"](e); r && (o = _filterInstanceProperty__default["default"](o).call(o, function (r) { return _Object$getOwnPropertyDescriptor__default["default"](e, r).enumerable; })), t.push.apply(t, o); } return t; }
@@ -439,7 +466,8 @@ function ownKeys$c(e, r) { var t = _Object$keys__default["default"](e); if (_Obj
439
466
  function _objectSpread$c(e) { for (var r = 1; r < arguments.length; r++) { var _context, _context2; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty__default["default"](_context = ownKeys$c(Object(t), !0)).call(_context, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors__default["default"] ? _Object$defineProperties__default["default"](e, _Object$getOwnPropertyDescriptors__default["default"](t)) : _forEachInstanceProperty__default["default"](_context2 = ownKeys$c(Object(t))).call(_context2, function (r) { _Object$defineProperty__default["default"](e, r, _Object$getOwnPropertyDescriptor__default["default"](t, r)); }); } return e; }
440
467
  function reducer(state, action) {
441
468
  if (action.type === 'setCurrentStep') return _objectSpread$c(_objectSpread$c({}, state), {}, {
442
- currentStep: action.currentStep
469
+ currentStep: action.currentStep,
470
+ progress: 0
443
471
  });
444
472
  if (action.type === 'setUploadFileResponse') return _objectSpread$c(_objectSpread$c({}, state), {}, {
445
473
  uploadFileResponse: action.uploadFileResponse
@@ -456,7 +484,8 @@ function reducer(state, action) {
456
484
  fileUploadClientSideErrors: [],
457
485
  uploadFileResponse: undefined,
458
486
  droppedFile: undefined,
459
- dropAreaState: 'disabled'
487
+ dropAreaState: 'disabled',
488
+ progress: 0
460
489
  });
461
490
  if (action.type === 'uploadNewFile') return _objectSpread$c(_objectSpread$c({}, state), {}, {
462
491
  currentStep: 1,
@@ -464,7 +493,8 @@ function reducer(state, action) {
464
493
  fileUploadClientSideErrors: [],
465
494
  uploadFileResponse: undefined,
466
495
  droppedFile: undefined,
467
- dropAreaState: 'ready-for-drop'
496
+ dropAreaState: 'ready-for-drop',
497
+ progress: 0
468
498
  });
469
499
  if (action.type === 'setDroppedFile') {
470
500
  return _objectSpread$c(_objectSpread$c({}, state), {}, {
@@ -481,6 +511,11 @@ function reducer(state, action) {
481
511
  abortController: action.abortController
482
512
  });
483
513
  }
514
+ if (action.type === 'setProgress') {
515
+ return _objectSpread$c(_objectSpread$c({}, state), {}, {
516
+ progress: action.progress
517
+ });
518
+ }
484
519
  throw new Error(getUnknownActionError(action));
485
520
  }
486
521
  function getUnknownActionError(actionType) {
@@ -493,7 +528,8 @@ const initialState = {
493
528
  uploadFileResponse: undefined,
494
529
  fileUploadClientSideErrors: [],
495
530
  resourceType: 'category',
496
- containerKey: undefined
531
+ containerKey: undefined,
532
+ progress: 0
497
533
  };
498
534
 
499
535
  function ownKeys$b(e, r) { var t = _Object$keys__default["default"](e); if (_Object$getOwnPropertySymbols__default["default"]) { var o = _Object$getOwnPropertySymbols__default["default"](e); r && (o = _filterInstanceProperty__default["default"](o).call(o, function (r) { return _Object$getOwnPropertyDescriptor__default["default"](e, r).enumerable; })), t.push.apply(t, o); } return t; }
@@ -548,6 +584,10 @@ const ImportResourcesProvider = props => {
548
584
  type: 'setFileUploadClientSideErrors',
549
585
  fileUploadClientSideErrors: nextFileUploadClientSideErrors
550
586
  });
587
+ const setProgress = progress => dispatch({
588
+ type: 'setProgress',
589
+ progress
590
+ });
551
591
  const handleClose = function () {
552
592
  let _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
553
593
  shouldDeleteImportContainer = _ref.shouldDeleteImportContainer;
@@ -573,7 +613,8 @@ const ImportResourcesProvider = props => {
573
613
  setDroppedFile,
574
614
  setContainerKey,
575
615
  setAbortController,
576
- setFileUploadClientSideErrors
616
+ setFileUploadClientSideErrors,
617
+ setProgress
577
618
  }
578
619
  },
579
620
  children: props.children
@@ -732,25 +773,33 @@ const useUpload = () => {
732
773
  actions.setCurrentStep(2);
733
774
  const containerKey = encodeFileNameWithTimestampToContainerKey(state.droppedFile.name);
734
775
  actions.setContainerKey(containerKey);
735
- const newAbortController = new AbortController();
736
- actions.setAbortController(newAbortController);
737
776
  try {
738
777
  await createImportContainerForFileUpload({
739
778
  key: containerKey,
740
779
  resourceType: state.resourceType
741
780
  }, projectKey, asyncDispatch);
742
- const fileUploadResponse = await uploadFileForImport({
781
+ const newAbortController = uploadFileForImport({
743
782
  projectKey,
744
783
  containerKey,
745
784
  resourceType: state.resourceType,
746
785
  file: state.droppedFile,
747
- abortSignal: newAbortController.signal
786
+ onSuccess: fileUploadResponse => {
787
+ actions.setUploadFileResponse(fileUploadResponse);
788
+ actions.setCurrentStep(3);
789
+ },
790
+ onProgress: progress => {
791
+ actions.setProgress(progress);
792
+ },
793
+ onError: error => {
794
+ deleteImportContainer(projectKey, containerKey, asyncDispatch);
795
+ handleUploadError(error);
796
+ actions.setCurrentStep(3);
797
+ }
748
798
  });
749
- actions.setUploadFileResponse(fileUploadResponse);
799
+ actions.setAbortController(newAbortController);
750
800
  } catch (error) {
751
801
  deleteImportContainer(projectKey, containerKey, asyncDispatch);
752
802
  handleUploadError(error);
753
- } finally {
754
803
  actions.setCurrentStep(3);
755
804
  }
756
805
  };
@@ -830,13 +879,13 @@ function getDefaultDropWrapperStyles(_dropAreaState) {
830
879
  return /*#__PURE__*/react.css(process.env.NODE_ENV === "production" ? "" : ";label:getDefaultDropWrapperStyles;", process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImRyb3AtYXJlYS13cmFwcGVyLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUE0QlkiLCJmaWxlIjoiZHJvcC1hcmVhLXdyYXBwZXIudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHN0eWxlZCBmcm9tICdAZW1vdGlvbi9zdHlsZWQnXG5pbXBvcnQgeyBjc3MgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCdcbmltcG9ydCB7IHR5cGUgRHJvcHpvbmVSb290UHJvcHMgfSBmcm9tICdyZWFjdC1kcm9wem9uZSdcbmltcG9ydCB7IHN0eWxlcyB9IGZyb20gJy4vc3R5bGVzJ1xuaW1wb3J0IHsgdHlwZSBEcm9wQXJlYVN0YXRlIH0gZnJvbSAnQHR5cGVzJ1xuXG5pbnRlcmZhY2UgRHJvcFdyYXBwZXJQcm9wcyBleHRlbmRzIERyb3B6b25lUm9vdFByb3BzIHtcbiAgZHJvcEFyZWFTdGF0ZTogRHJvcEFyZWFTdGF0ZVxufVxuZXhwb3J0IGNvbnN0IERyb3BXcmFwcGVyID0gc3R5bGVkLmRpdjxEcm9wV3JhcHBlclByb3BzPmBcbiAgJHtzdHlsZXMuYmFzZX1cbiAgJHsocHJvcHMpID0+IHtcbiAgICBpZiAocHJvcHMuZHJvcEFyZWFTdGF0ZSA9PT0gJ2Rpc2FibGVkJykge1xuICAgICAgcmV0dXJuIHN0eWxlcy5kaXNhYmxlZFxuICAgIH1cbiAgICBpZiAocHJvcHMuZHJvcEFyZWFTdGF0ZSA9PT0gJ3JlYWR5LWZvci1kcm9wJykge1xuICAgICAgcmV0dXJuIHN0eWxlcy5yZWFkeUZvckRyb3BcbiAgICB9XG4gICAgaWYgKHByb3BzLmRyb3BBcmVhU3RhdGUgPT09ICdhY3RpdmUtZHJhZycpIHtcbiAgICAgIHJldHVybiBzdHlsZXMuYWN0aXZlRHJhZ1xuICAgIH1cbiAgICBpZiAocHJvcHMuZHJvcEFyZWFTdGF0ZSA9PT0gJ2ZpbGUtZHJvcHBlZCcpIHtcbiAgICAgIHJldHVybiBzdHlsZXMuZmlsZURyb3BwZWRcbiAgICB9XG4gICAgcmV0dXJuIGdldERlZmF1bHREcm9wV3JhcHBlclN0eWxlcyhwcm9wcy5kcm9wQXJlYVN0YXRlKVxuICB9fVxuYFxuZnVuY3Rpb24gZ2V0RGVmYXVsdERyb3BXcmFwcGVyU3R5bGVzKF9kcm9wQXJlYVN0YXRlOiBuZXZlcikge1xuICByZXR1cm4gY3NzYGBcbn1cbiJdfQ== */");
831
880
  }
832
881
 
833
- var ActiveDragDropArea = /*#__PURE__*/React.lazy(() => Promise.resolve().then(function () { return require('./active-drag-drop-area-fae899bd.cjs.dev.js' /* webpackChunkName: "active-drag-drop-area" */); }));
882
+ var ActiveDragDropArea = /*#__PURE__*/React.lazy(() => Promise.resolve().then(function () { return require('./active-drag-drop-area-ca5f76cc.cjs.dev.js' /* webpackChunkName: "active-drag-drop-area" */); }));
834
883
 
835
884
  var DisabledDropArea = /*#__PURE__*/React.lazy(() => Promise.resolve().then(function () { return require('./disabled-drop-area-aa78075b.cjs.dev.js' /* webpackChunkName: "disabled-drop-area" */); }));
836
885
 
837
- var EnabledDropArea = /*#__PURE__*/React.lazy(() => Promise.resolve().then(function () { return require('./enabled-drop-area-56d860b6.cjs.dev.js' /* webpackChunkName: "enabled-drop-area" */); }));
886
+ var EnabledDropArea = /*#__PURE__*/React.lazy(() => Promise.resolve().then(function () { return require('./enabled-drop-area-2ebd7852.cjs.dev.js' /* webpackChunkName: "enabled-drop-area" */); }));
838
887
 
839
- var FileDropped = /*#__PURE__*/React.lazy(() => Promise.resolve().then(function () { return require('./file-dropped-area-6acf82c0.cjs.dev.js' /* webpackChunkName: "filed-dropped-area" */); }));
888
+ var FileDropped = /*#__PURE__*/React.lazy(() => Promise.resolve().then(function () { return require('./file-dropped-area-78d3771e.cjs.dev.js' /* webpackChunkName: "filed-dropped-area" */); }));
840
889
 
841
890
  function getDropArea(_ref) {
842
891
  let dropAreaState = _ref.dropAreaState,
@@ -1735,6 +1784,7 @@ const Uploading = () => {
1735
1784
  const intl = reactIntl.useIntl();
1736
1785
  const _useImportResourcesCo = useImportResourcesContext(),
1737
1786
  state = _useImportResourcesCo.state,
1787
+ actions = _useImportResourcesCo.actions,
1738
1788
  onClose = _useImportResourcesCo.onClose;
1739
1789
  const resourceTypePlural = resourceTypeToDisplayName({
1740
1790
  resourceType: state.resourceType,
@@ -1770,13 +1820,14 @@ const Uploading = () => {
1770
1820
  size: "medium",
1771
1821
  label: intl.formatMessage(sharedMessages.cancel),
1772
1822
  onClick: () => {
1823
+ actions.setCurrentStep(1);
1773
1824
  state.abortController.abort();
1774
1825
  }
1775
1826
  })]
1776
1827
  }), jsxRuntime.jsx(uiKit.ProgressBar, {
1777
1828
  barWidth: "scale",
1778
1829
  height: "10",
1779
- progress: 100
1830
+ progress: state.progress
1780
1831
  }), jsxRuntime.jsx("div", {})]
1781
1832
  })
1782
1833
  });
@@ -329,49 +329,74 @@ let HttpError = /*#__PURE__*/function (_Error) {
329
329
  }( /*#__PURE__*/_wrapNativeSuper(Error));
330
330
 
331
331
  function ownKeys$e(e, r) { var t = _Object$keys__default["default"](e); if (_Object$getOwnPropertySymbols__default["default"]) { var o = _Object$getOwnPropertySymbols__default["default"](e); r && (o = _filterInstanceProperty__default["default"](o).call(o, function (r) { return _Object$getOwnPropertyDescriptor__default["default"](e, r).enumerable; })), t.push.apply(t, o); } return t; }
332
- function _objectSpread$e(e) { for (var r = 1; r < arguments.length; r++) { var _context2, _context3; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty__default["default"](_context2 = ownKeys$e(Object(t), !0)).call(_context2, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors__default["default"] ? _Object$defineProperties__default["default"](e, _Object$getOwnPropertyDescriptors__default["default"](t)) : _forEachInstanceProperty__default["default"](_context3 = ownKeys$e(Object(t))).call(_context3, function (r) { _Object$defineProperty__default["default"](e, r, _Object$getOwnPropertyDescriptor__default["default"](t, r)); }); } return e; }
332
+ function _objectSpread$e(e) { for (var r = 1; r < arguments.length; r++) { var _context3, _context4; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty__default["default"](_context3 = ownKeys$e(Object(t), !0)).call(_context3, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors__default["default"] ? _Object$defineProperties__default["default"](e, _Object$getOwnPropertyDescriptors__default["default"](t)) : _forEachInstanceProperty__default["default"](_context4 = ownKeys$e(Object(t))).call(_context4, function (r) { _Object$defineProperty__default["default"](e, r, _Object$getOwnPropertyDescriptor__default["default"](t, r)); }); } return e; }
333
333
  const addProxyPrefixToUrl = (uri, proxy) => {
334
334
  var _context;
335
335
  return proxy ? _concatInstanceProperty__default["default"](_context = "/proxy/".concat(proxy)).call(_context, uri) : uri;
336
336
  };
337
- const fetcher = async _ref => {
338
- let url = _ref.url,
339
- payload = _ref.payload,
340
- config = _ref.config;
341
- const data = await applicationShell.executeHttpClientRequest(async options => {
342
- const res = await fetch(applicationShell.buildApiUrl(addProxyPrefixToUrl(url, config === null || config === void 0 ? void 0 : config.proxy)), _objectSpread$e(_objectSpread$e({}, options), {}, {
343
- method: config === null || config === void 0 ? void 0 : config.method,
344
- body: payload,
345
- signal: config === null || config === void 0 ? void 0 : config.abortSignal
346
- }));
347
- if (!res.ok) {
348
- const errorData = await res.json();
349
- throw new HttpError(res.status, res.statusText, errorData);
350
- }
351
- const data = res.json();
352
- return {
353
- data,
354
- statusCode: res.status,
355
- getHeader: key => res.headers.get(key)
356
- };
357
- }, {
337
+ const fetchUsingXhr = _ref2 => {
338
+ let url = _ref2.url,
339
+ payload = _ref2.payload,
340
+ config = _ref2.config,
341
+ onProgress = _ref2.onProgress,
342
+ onSuccess = _ref2.onSuccess,
343
+ onError = _ref2.onError;
344
+ const options = applicationShell.createHttpClientOptions({
358
345
  headers: _objectSpread$e({
359
346
  'Content-Type': 'application/json'
360
347
  }, config === null || config === void 0 ? void 0 : config.headers)
361
348
  });
362
- return data;
349
+ const xhr = new XMLHttpRequest();
350
+ xhr.open(config === null || config === void 0 ? void 0 : config.method, applicationShell.buildApiUrl(addProxyPrefixToUrl(url, config === null || config === void 0 ? void 0 : config.proxy)), true);
351
+ if (options.headers) {
352
+ var _context2;
353
+ _forEachInstanceProperty__default["default"](_context2 = _Object$keys__default["default"](options.headers)).call(_context2, key => {
354
+ xhr.setRequestHeader(key, options.headers[key]);
355
+ });
356
+ }
357
+ xhr.upload.onprogress = function (event) {
358
+ if (event.lengthComputable) {
359
+ const percentComplete = event.loaded / event.total * 100;
360
+ onProgress(percentComplete);
361
+ }
362
+ };
363
+ xhr.onload = function () {
364
+ const data = JSON.parse(xhr.responseText);
365
+ // Code copied from `executeHttpClientRequest` to replicate the same behavior
366
+ const refreshedSessionToken = xhr.getResponseHeader('x-refreshed-session-token');
367
+ if (refreshedSessionToken) {
368
+ applicationShellConnectors.oidcStorage.setActiveSession(refreshedSessionToken);
369
+ }
370
+ if (xhr.status >= 200 && xhr.status < 300) {
371
+ onSuccess(data);
372
+ } else {
373
+ onError(new HttpError(xhr.status, xhr.statusText, data));
374
+ }
375
+ };
376
+ xhr.onerror = function () {
377
+ const errorData = JSON.parse(xhr.responseText);
378
+ onError(new HttpError(xhr.status, xhr.statusText, errorData));
379
+ };
380
+ xhr.onabort = function () {
381
+ onError(new DOMException('Aborted', 'AbortError'));
382
+ };
383
+ xhr.send(payload);
384
+ return xhr;
363
385
  };
364
386
 
365
- async function uploadFileForImport(_ref) {
387
+ function uploadFileForImport(_ref) {
366
388
  let projectKey = _ref.projectKey,
367
389
  containerKey = _ref.containerKey,
368
390
  resourceType = _ref.resourceType,
369
391
  file = _ref.file,
370
- abortSignal = _ref.abortSignal;
392
+ abortSignal = _ref.abortSignal,
393
+ onSuccess = _ref.onSuccess,
394
+ onProgress = _ref.onProgress,
395
+ onError = _ref.onError;
371
396
  const uri = getFileUploadURL(projectKey, resourceType, containerKey);
372
397
  const formData = new FormData();
373
398
  formData.append('file', file, file.name);
374
- const response = await fetcher({
399
+ return fetchUsingXhr({
375
400
  url: uri,
376
401
  payload: formData,
377
402
  config: {
@@ -381,9 +406,11 @@ async function uploadFileForImport(_ref) {
381
406
  headers: {
382
407
  'Content-Type': null
383
408
  }
384
- }
409
+ },
410
+ onProgress,
411
+ onSuccess,
412
+ onError
385
413
  });
386
- return response;
387
414
  }
388
415
 
389
416
  function ownKeys$d(e, r) { var t = _Object$keys__default["default"](e); if (_Object$getOwnPropertySymbols__default["default"]) { var o = _Object$getOwnPropertySymbols__default["default"](e); r && (o = _filterInstanceProperty__default["default"](o).call(o, function (r) { return _Object$getOwnPropertyDescriptor__default["default"](e, r).enumerable; })), t.push.apply(t, o); } return t; }
@@ -439,7 +466,8 @@ function ownKeys$c(e, r) { var t = _Object$keys__default["default"](e); if (_Obj
439
466
  function _objectSpread$c(e) { for (var r = 1; r < arguments.length; r++) { var _context, _context2; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty__default["default"](_context = ownKeys$c(Object(t), !0)).call(_context, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors__default["default"] ? _Object$defineProperties__default["default"](e, _Object$getOwnPropertyDescriptors__default["default"](t)) : _forEachInstanceProperty__default["default"](_context2 = ownKeys$c(Object(t))).call(_context2, function (r) { _Object$defineProperty__default["default"](e, r, _Object$getOwnPropertyDescriptor__default["default"](t, r)); }); } return e; }
440
467
  function reducer(state, action) {
441
468
  if (action.type === 'setCurrentStep') return _objectSpread$c(_objectSpread$c({}, state), {}, {
442
- currentStep: action.currentStep
469
+ currentStep: action.currentStep,
470
+ progress: 0
443
471
  });
444
472
  if (action.type === 'setUploadFileResponse') return _objectSpread$c(_objectSpread$c({}, state), {}, {
445
473
  uploadFileResponse: action.uploadFileResponse
@@ -456,7 +484,8 @@ function reducer(state, action) {
456
484
  fileUploadClientSideErrors: [],
457
485
  uploadFileResponse: undefined,
458
486
  droppedFile: undefined,
459
- dropAreaState: 'disabled'
487
+ dropAreaState: 'disabled',
488
+ progress: 0
460
489
  });
461
490
  if (action.type === 'uploadNewFile') return _objectSpread$c(_objectSpread$c({}, state), {}, {
462
491
  currentStep: 1,
@@ -464,7 +493,8 @@ function reducer(state, action) {
464
493
  fileUploadClientSideErrors: [],
465
494
  uploadFileResponse: undefined,
466
495
  droppedFile: undefined,
467
- dropAreaState: 'ready-for-drop'
496
+ dropAreaState: 'ready-for-drop',
497
+ progress: 0
468
498
  });
469
499
  if (action.type === 'setDroppedFile') {
470
500
  return _objectSpread$c(_objectSpread$c({}, state), {}, {
@@ -481,6 +511,11 @@ function reducer(state, action) {
481
511
  abortController: action.abortController
482
512
  });
483
513
  }
514
+ if (action.type === 'setProgress') {
515
+ return _objectSpread$c(_objectSpread$c({}, state), {}, {
516
+ progress: action.progress
517
+ });
518
+ }
484
519
  throw new Error(getUnknownActionError(action));
485
520
  }
486
521
  function getUnknownActionError(actionType) {
@@ -493,7 +528,8 @@ const initialState = {
493
528
  uploadFileResponse: undefined,
494
529
  fileUploadClientSideErrors: [],
495
530
  resourceType: 'category',
496
- containerKey: undefined
531
+ containerKey: undefined,
532
+ progress: 0
497
533
  };
498
534
 
499
535
  function ownKeys$b(e, r) { var t = _Object$keys__default["default"](e); if (_Object$getOwnPropertySymbols__default["default"]) { var o = _Object$getOwnPropertySymbols__default["default"](e); r && (o = _filterInstanceProperty__default["default"](o).call(o, function (r) { return _Object$getOwnPropertyDescriptor__default["default"](e, r).enumerable; })), t.push.apply(t, o); } return t; }
@@ -548,6 +584,10 @@ const ImportResourcesProvider = props => {
548
584
  type: 'setFileUploadClientSideErrors',
549
585
  fileUploadClientSideErrors: nextFileUploadClientSideErrors
550
586
  });
587
+ const setProgress = progress => dispatch({
588
+ type: 'setProgress',
589
+ progress
590
+ });
551
591
  const handleClose = function () {
552
592
  let _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
553
593
  shouldDeleteImportContainer = _ref.shouldDeleteImportContainer;
@@ -573,7 +613,8 @@ const ImportResourcesProvider = props => {
573
613
  setDroppedFile,
574
614
  setContainerKey,
575
615
  setAbortController,
576
- setFileUploadClientSideErrors
616
+ setFileUploadClientSideErrors,
617
+ setProgress
577
618
  }
578
619
  },
579
620
  children: props.children
@@ -732,25 +773,33 @@ const useUpload = () => {
732
773
  actions.setCurrentStep(2);
733
774
  const containerKey = encodeFileNameWithTimestampToContainerKey(state.droppedFile.name);
734
775
  actions.setContainerKey(containerKey);
735
- const newAbortController = new AbortController();
736
- actions.setAbortController(newAbortController);
737
776
  try {
738
777
  await createImportContainerForFileUpload({
739
778
  key: containerKey,
740
779
  resourceType: state.resourceType
741
780
  }, projectKey, asyncDispatch);
742
- const fileUploadResponse = await uploadFileForImport({
781
+ const newAbortController = uploadFileForImport({
743
782
  projectKey,
744
783
  containerKey,
745
784
  resourceType: state.resourceType,
746
785
  file: state.droppedFile,
747
- abortSignal: newAbortController.signal
786
+ onSuccess: fileUploadResponse => {
787
+ actions.setUploadFileResponse(fileUploadResponse);
788
+ actions.setCurrentStep(3);
789
+ },
790
+ onProgress: progress => {
791
+ actions.setProgress(progress);
792
+ },
793
+ onError: error => {
794
+ deleteImportContainer(projectKey, containerKey, asyncDispatch);
795
+ handleUploadError(error);
796
+ actions.setCurrentStep(3);
797
+ }
748
798
  });
749
- actions.setUploadFileResponse(fileUploadResponse);
799
+ actions.setAbortController(newAbortController);
750
800
  } catch (error) {
751
801
  deleteImportContainer(projectKey, containerKey, asyncDispatch);
752
802
  handleUploadError(error);
753
- } finally {
754
803
  actions.setCurrentStep(3);
755
804
  }
756
805
  };
@@ -827,13 +876,13 @@ function getDefaultDropWrapperStyles(_dropAreaState) {
827
876
  return /*#__PURE__*/react.css("" , "" );
828
877
  }
829
878
 
830
- var ActiveDragDropArea = /*#__PURE__*/React.lazy(() => Promise.resolve().then(function () { return require('./active-drag-drop-area-be3680ab.cjs.prod.js' /* webpackChunkName: "active-drag-drop-area" */); }));
879
+ var ActiveDragDropArea = /*#__PURE__*/React.lazy(() => Promise.resolve().then(function () { return require('./active-drag-drop-area-8340b842.cjs.prod.js' /* webpackChunkName: "active-drag-drop-area" */); }));
831
880
 
832
881
  var DisabledDropArea = /*#__PURE__*/React.lazy(() => Promise.resolve().then(function () { return require('./disabled-drop-area-99c1fa0b.cjs.prod.js' /* webpackChunkName: "disabled-drop-area" */); }));
833
882
 
834
- var EnabledDropArea = /*#__PURE__*/React.lazy(() => Promise.resolve().then(function () { return require('./enabled-drop-area-32e0dc61.cjs.prod.js' /* webpackChunkName: "enabled-drop-area" */); }));
883
+ var EnabledDropArea = /*#__PURE__*/React.lazy(() => Promise.resolve().then(function () { return require('./enabled-drop-area-a1a4aa0e.cjs.prod.js' /* webpackChunkName: "enabled-drop-area" */); }));
835
884
 
836
- var FileDropped = /*#__PURE__*/React.lazy(() => Promise.resolve().then(function () { return require('./file-dropped-area-e856a71f.cjs.prod.js' /* webpackChunkName: "filed-dropped-area" */); }));
885
+ var FileDropped = /*#__PURE__*/React.lazy(() => Promise.resolve().then(function () { return require('./file-dropped-area-4c06923d.cjs.prod.js' /* webpackChunkName: "filed-dropped-area" */); }));
837
886
 
838
887
  function getDropArea(_ref) {
839
888
  let dropAreaState = _ref.dropAreaState,
@@ -1729,6 +1778,7 @@ const Uploading = () => {
1729
1778
  const intl = reactIntl.useIntl();
1730
1779
  const _useImportResourcesCo = useImportResourcesContext(),
1731
1780
  state = _useImportResourcesCo.state,
1781
+ actions = _useImportResourcesCo.actions,
1732
1782
  onClose = _useImportResourcesCo.onClose;
1733
1783
  const resourceTypePlural = resourceTypeToDisplayName({
1734
1784
  resourceType: state.resourceType,
@@ -1764,13 +1814,14 @@ const Uploading = () => {
1764
1814
  size: "medium",
1765
1815
  label: intl.formatMessage(sharedMessages.cancel),
1766
1816
  onClick: () => {
1817
+ actions.setCurrentStep(1);
1767
1818
  state.abortController.abort();
1768
1819
  }
1769
1820
  })]
1770
1821
  }), jsxRuntime.jsx(uiKit.ProgressBar, {
1771
1822
  barWidth: "scale",
1772
1823
  height: "10",
1773
- progress: 100
1824
+ progress: state.progress
1774
1825
  }), jsxRuntime.jsx("div", {})]
1775
1826
  })
1776
1827
  });
@@ -8,7 +8,7 @@ import _Object$defineProperties from '@babel/runtime-corejs3/core-js-stable/obje
8
8
  import _Object$defineProperty from '@babel/runtime-corejs3/core-js-stable/object/define-property';
9
9
  import _defineProperty from '@babel/runtime-corejs3/helpers/esm/defineProperty';
10
10
  import { defineMessages, useIntl, FormattedMessage, IntlProvider } from 'react-intl';
11
- import { useApplicationContext } from '@commercetools-frontend/application-shell-connectors';
11
+ import { oidcStorage, useApplicationContext } from '@commercetools-frontend/application-shell-connectors';
12
12
  import _slicedToArray from '@babel/runtime-corejs3/helpers/esm/slicedToArray';
13
13
  import React, { useContext, lazy, useState, useEffect } from 'react';
14
14
  import { actions, useAsyncDispatch } from '@commercetools-frontend/sdk';
@@ -29,7 +29,7 @@ import _someInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instanc
29
29
  import '@babel/runtime-corejs3/core-js-stable/instance/starts-with';
30
30
  import 'querystring';
31
31
  import 'ramda';
32
- import { executeHttpClientRequest, buildApiUrl } from '@commercetools-frontend/application-shell';
32
+ import { createHttpClientOptions, buildApiUrl } from '@commercetools-frontend/application-shell';
33
33
  import _Reflect$construct from '@babel/runtime-corejs3/core-js-stable/reflect/construct';
34
34
  import _createClass from '@babel/runtime-corejs3/helpers/esm/createClass';
35
35
  import _classCallCheck from '@babel/runtime-corejs3/helpers/esm/classCallCheck';
@@ -298,49 +298,74 @@ let HttpError = /*#__PURE__*/function (_Error) {
298
298
  }( /*#__PURE__*/_wrapNativeSuper(Error));
299
299
 
300
300
  function ownKeys$e(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = _filterInstanceProperty(o).call(o, function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
301
- function _objectSpread$e(e) { for (var r = 1; r < arguments.length; r++) { var _context2, _context3; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context2 = ownKeys$e(Object(t), !0)).call(_context2, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context3 = ownKeys$e(Object(t))).call(_context3, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
301
+ function _objectSpread$e(e) { for (var r = 1; r < arguments.length; r++) { var _context3, _context4; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context3 = ownKeys$e(Object(t), !0)).call(_context3, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context4 = ownKeys$e(Object(t))).call(_context4, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
302
302
  const addProxyPrefixToUrl = (uri, proxy) => {
303
303
  var _context;
304
304
  return proxy ? _concatInstanceProperty(_context = "/proxy/".concat(proxy)).call(_context, uri) : uri;
305
305
  };
306
- const fetcher = async _ref => {
307
- let url = _ref.url,
308
- payload = _ref.payload,
309
- config = _ref.config;
310
- const data = await executeHttpClientRequest(async options => {
311
- const res = await fetch(buildApiUrl(addProxyPrefixToUrl(url, config === null || config === void 0 ? void 0 : config.proxy)), _objectSpread$e(_objectSpread$e({}, options), {}, {
312
- method: config === null || config === void 0 ? void 0 : config.method,
313
- body: payload,
314
- signal: config === null || config === void 0 ? void 0 : config.abortSignal
315
- }));
316
- if (!res.ok) {
317
- const errorData = await res.json();
318
- throw new HttpError(res.status, res.statusText, errorData);
319
- }
320
- const data = res.json();
321
- return {
322
- data,
323
- statusCode: res.status,
324
- getHeader: key => res.headers.get(key)
325
- };
326
- }, {
306
+ const fetchUsingXhr = _ref2 => {
307
+ let url = _ref2.url,
308
+ payload = _ref2.payload,
309
+ config = _ref2.config,
310
+ onProgress = _ref2.onProgress,
311
+ onSuccess = _ref2.onSuccess,
312
+ onError = _ref2.onError;
313
+ const options = createHttpClientOptions({
327
314
  headers: _objectSpread$e({
328
315
  'Content-Type': 'application/json'
329
316
  }, config === null || config === void 0 ? void 0 : config.headers)
330
317
  });
331
- return data;
318
+ const xhr = new XMLHttpRequest();
319
+ xhr.open(config === null || config === void 0 ? void 0 : config.method, buildApiUrl(addProxyPrefixToUrl(url, config === null || config === void 0 ? void 0 : config.proxy)), true);
320
+ if (options.headers) {
321
+ var _context2;
322
+ _forEachInstanceProperty(_context2 = _Object$keys(options.headers)).call(_context2, key => {
323
+ xhr.setRequestHeader(key, options.headers[key]);
324
+ });
325
+ }
326
+ xhr.upload.onprogress = function (event) {
327
+ if (event.lengthComputable) {
328
+ const percentComplete = event.loaded / event.total * 100;
329
+ onProgress(percentComplete);
330
+ }
331
+ };
332
+ xhr.onload = function () {
333
+ const data = JSON.parse(xhr.responseText);
334
+ // Code copied from `executeHttpClientRequest` to replicate the same behavior
335
+ const refreshedSessionToken = xhr.getResponseHeader('x-refreshed-session-token');
336
+ if (refreshedSessionToken) {
337
+ oidcStorage.setActiveSession(refreshedSessionToken);
338
+ }
339
+ if (xhr.status >= 200 && xhr.status < 300) {
340
+ onSuccess(data);
341
+ } else {
342
+ onError(new HttpError(xhr.status, xhr.statusText, data));
343
+ }
344
+ };
345
+ xhr.onerror = function () {
346
+ const errorData = JSON.parse(xhr.responseText);
347
+ onError(new HttpError(xhr.status, xhr.statusText, errorData));
348
+ };
349
+ xhr.onabort = function () {
350
+ onError(new DOMException('Aborted', 'AbortError'));
351
+ };
352
+ xhr.send(payload);
353
+ return xhr;
332
354
  };
333
355
 
334
- async function uploadFileForImport(_ref) {
356
+ function uploadFileForImport(_ref) {
335
357
  let projectKey = _ref.projectKey,
336
358
  containerKey = _ref.containerKey,
337
359
  resourceType = _ref.resourceType,
338
360
  file = _ref.file,
339
- abortSignal = _ref.abortSignal;
361
+ abortSignal = _ref.abortSignal,
362
+ onSuccess = _ref.onSuccess,
363
+ onProgress = _ref.onProgress,
364
+ onError = _ref.onError;
340
365
  const uri = getFileUploadURL(projectKey, resourceType, containerKey);
341
366
  const formData = new FormData();
342
367
  formData.append('file', file, file.name);
343
- const response = await fetcher({
368
+ return fetchUsingXhr({
344
369
  url: uri,
345
370
  payload: formData,
346
371
  config: {
@@ -350,9 +375,11 @@ async function uploadFileForImport(_ref) {
350
375
  headers: {
351
376
  'Content-Type': null
352
377
  }
353
- }
378
+ },
379
+ onProgress,
380
+ onSuccess,
381
+ onError
354
382
  });
355
- return response;
356
383
  }
357
384
 
358
385
  function ownKeys$d(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = _filterInstanceProperty(o).call(o, function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
@@ -408,7 +435,8 @@ function ownKeys$c(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySy
408
435
  function _objectSpread$c(e) { for (var r = 1; r < arguments.length; r++) { var _context, _context2; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context = ownKeys$c(Object(t), !0)).call(_context, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context2 = ownKeys$c(Object(t))).call(_context2, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
409
436
  function reducer(state, action) {
410
437
  if (action.type === 'setCurrentStep') return _objectSpread$c(_objectSpread$c({}, state), {}, {
411
- currentStep: action.currentStep
438
+ currentStep: action.currentStep,
439
+ progress: 0
412
440
  });
413
441
  if (action.type === 'setUploadFileResponse') return _objectSpread$c(_objectSpread$c({}, state), {}, {
414
442
  uploadFileResponse: action.uploadFileResponse
@@ -425,7 +453,8 @@ function reducer(state, action) {
425
453
  fileUploadClientSideErrors: [],
426
454
  uploadFileResponse: undefined,
427
455
  droppedFile: undefined,
428
- dropAreaState: 'disabled'
456
+ dropAreaState: 'disabled',
457
+ progress: 0
429
458
  });
430
459
  if (action.type === 'uploadNewFile') return _objectSpread$c(_objectSpread$c({}, state), {}, {
431
460
  currentStep: 1,
@@ -433,7 +462,8 @@ function reducer(state, action) {
433
462
  fileUploadClientSideErrors: [],
434
463
  uploadFileResponse: undefined,
435
464
  droppedFile: undefined,
436
- dropAreaState: 'ready-for-drop'
465
+ dropAreaState: 'ready-for-drop',
466
+ progress: 0
437
467
  });
438
468
  if (action.type === 'setDroppedFile') {
439
469
  return _objectSpread$c(_objectSpread$c({}, state), {}, {
@@ -450,6 +480,11 @@ function reducer(state, action) {
450
480
  abortController: action.abortController
451
481
  });
452
482
  }
483
+ if (action.type === 'setProgress') {
484
+ return _objectSpread$c(_objectSpread$c({}, state), {}, {
485
+ progress: action.progress
486
+ });
487
+ }
453
488
  throw new Error(getUnknownActionError(action));
454
489
  }
455
490
  function getUnknownActionError(actionType) {
@@ -462,7 +497,8 @@ const initialState = {
462
497
  uploadFileResponse: undefined,
463
498
  fileUploadClientSideErrors: [],
464
499
  resourceType: 'category',
465
- containerKey: undefined
500
+ containerKey: undefined,
501
+ progress: 0
466
502
  };
467
503
 
468
504
  function ownKeys$b(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = _filterInstanceProperty(o).call(o, function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
@@ -517,6 +553,10 @@ const ImportResourcesProvider = props => {
517
553
  type: 'setFileUploadClientSideErrors',
518
554
  fileUploadClientSideErrors: nextFileUploadClientSideErrors
519
555
  });
556
+ const setProgress = progress => dispatch({
557
+ type: 'setProgress',
558
+ progress
559
+ });
520
560
  const handleClose = function () {
521
561
  let _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
522
562
  shouldDeleteImportContainer = _ref.shouldDeleteImportContainer;
@@ -542,7 +582,8 @@ const ImportResourcesProvider = props => {
542
582
  setDroppedFile,
543
583
  setContainerKey,
544
584
  setAbortController,
545
- setFileUploadClientSideErrors
585
+ setFileUploadClientSideErrors,
586
+ setProgress
546
587
  }
547
588
  },
548
589
  children: props.children
@@ -701,25 +742,33 @@ const useUpload = () => {
701
742
  actions.setCurrentStep(2);
702
743
  const containerKey = encodeFileNameWithTimestampToContainerKey(state.droppedFile.name);
703
744
  actions.setContainerKey(containerKey);
704
- const newAbortController = new AbortController();
705
- actions.setAbortController(newAbortController);
706
745
  try {
707
746
  await createImportContainerForFileUpload({
708
747
  key: containerKey,
709
748
  resourceType: state.resourceType
710
749
  }, projectKey, asyncDispatch);
711
- const fileUploadResponse = await uploadFileForImport({
750
+ const newAbortController = uploadFileForImport({
712
751
  projectKey,
713
752
  containerKey,
714
753
  resourceType: state.resourceType,
715
754
  file: state.droppedFile,
716
- abortSignal: newAbortController.signal
755
+ onSuccess: fileUploadResponse => {
756
+ actions.setUploadFileResponse(fileUploadResponse);
757
+ actions.setCurrentStep(3);
758
+ },
759
+ onProgress: progress => {
760
+ actions.setProgress(progress);
761
+ },
762
+ onError: error => {
763
+ deleteImportContainer(projectKey, containerKey, asyncDispatch);
764
+ handleUploadError(error);
765
+ actions.setCurrentStep(3);
766
+ }
717
767
  });
718
- actions.setUploadFileResponse(fileUploadResponse);
768
+ actions.setAbortController(newAbortController);
719
769
  } catch (error) {
720
770
  deleteImportContainer(projectKey, containerKey, asyncDispatch);
721
771
  handleUploadError(error);
722
- } finally {
723
772
  actions.setCurrentStep(3);
724
773
  }
725
774
  };
@@ -799,13 +848,13 @@ function getDefaultDropWrapperStyles(_dropAreaState) {
799
848
  return /*#__PURE__*/css(process.env.NODE_ENV === "production" ? "" : ";label:getDefaultDropWrapperStyles;", process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImRyb3AtYXJlYS13cmFwcGVyLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUE0QlkiLCJmaWxlIjoiZHJvcC1hcmVhLXdyYXBwZXIudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHN0eWxlZCBmcm9tICdAZW1vdGlvbi9zdHlsZWQnXG5pbXBvcnQgeyBjc3MgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCdcbmltcG9ydCB7IHR5cGUgRHJvcHpvbmVSb290UHJvcHMgfSBmcm9tICdyZWFjdC1kcm9wem9uZSdcbmltcG9ydCB7IHN0eWxlcyB9IGZyb20gJy4vc3R5bGVzJ1xuaW1wb3J0IHsgdHlwZSBEcm9wQXJlYVN0YXRlIH0gZnJvbSAnQHR5cGVzJ1xuXG5pbnRlcmZhY2UgRHJvcFdyYXBwZXJQcm9wcyBleHRlbmRzIERyb3B6b25lUm9vdFByb3BzIHtcbiAgZHJvcEFyZWFTdGF0ZTogRHJvcEFyZWFTdGF0ZVxufVxuZXhwb3J0IGNvbnN0IERyb3BXcmFwcGVyID0gc3R5bGVkLmRpdjxEcm9wV3JhcHBlclByb3BzPmBcbiAgJHtzdHlsZXMuYmFzZX1cbiAgJHsocHJvcHMpID0+IHtcbiAgICBpZiAocHJvcHMuZHJvcEFyZWFTdGF0ZSA9PT0gJ2Rpc2FibGVkJykge1xuICAgICAgcmV0dXJuIHN0eWxlcy5kaXNhYmxlZFxuICAgIH1cbiAgICBpZiAocHJvcHMuZHJvcEFyZWFTdGF0ZSA9PT0gJ3JlYWR5LWZvci1kcm9wJykge1xuICAgICAgcmV0dXJuIHN0eWxlcy5yZWFkeUZvckRyb3BcbiAgICB9XG4gICAgaWYgKHByb3BzLmRyb3BBcmVhU3RhdGUgPT09ICdhY3RpdmUtZHJhZycpIHtcbiAgICAgIHJldHVybiBzdHlsZXMuYWN0aXZlRHJhZ1xuICAgIH1cbiAgICBpZiAocHJvcHMuZHJvcEFyZWFTdGF0ZSA9PT0gJ2ZpbGUtZHJvcHBlZCcpIHtcbiAgICAgIHJldHVybiBzdHlsZXMuZmlsZURyb3BwZWRcbiAgICB9XG4gICAgcmV0dXJuIGdldERlZmF1bHREcm9wV3JhcHBlclN0eWxlcyhwcm9wcy5kcm9wQXJlYVN0YXRlKVxuICB9fVxuYFxuZnVuY3Rpb24gZ2V0RGVmYXVsdERyb3BXcmFwcGVyU3R5bGVzKF9kcm9wQXJlYVN0YXRlOiBuZXZlcikge1xuICByZXR1cm4gY3NzYGBcbn1cbiJdfQ== */");
800
849
  }
801
850
 
802
- var ActiveDragDropArea = /*#__PURE__*/lazy(() => import('./active-drag-drop-area-06cef014.esm.js' /* webpackChunkName: "active-drag-drop-area" */));
851
+ var ActiveDragDropArea = /*#__PURE__*/lazy(() => import('./active-drag-drop-area-fda704be.esm.js' /* webpackChunkName: "active-drag-drop-area" */));
803
852
 
804
853
  var DisabledDropArea = /*#__PURE__*/lazy(() => import('./disabled-drop-area-2c088477.esm.js' /* webpackChunkName: "disabled-drop-area" */));
805
854
 
806
- var EnabledDropArea = /*#__PURE__*/lazy(() => import('./enabled-drop-area-69507fae.esm.js' /* webpackChunkName: "enabled-drop-area" */));
855
+ var EnabledDropArea = /*#__PURE__*/lazy(() => import('./enabled-drop-area-9e4288ea.esm.js' /* webpackChunkName: "enabled-drop-area" */));
807
856
 
808
- var FileDropped = /*#__PURE__*/lazy(() => import('./file-dropped-area-6f365e02.esm.js' /* webpackChunkName: "filed-dropped-area" */));
857
+ var FileDropped = /*#__PURE__*/lazy(() => import('./file-dropped-area-3b89854b.esm.js' /* webpackChunkName: "filed-dropped-area" */));
809
858
 
810
859
  function getDropArea(_ref) {
811
860
  let dropAreaState = _ref.dropAreaState,
@@ -1704,6 +1753,7 @@ const Uploading = () => {
1704
1753
  const intl = useIntl();
1705
1754
  const _useImportResourcesCo = useImportResourcesContext(),
1706
1755
  state = _useImportResourcesCo.state,
1756
+ actions = _useImportResourcesCo.actions,
1707
1757
  onClose = _useImportResourcesCo.onClose;
1708
1758
  const resourceTypePlural = resourceTypeToDisplayName({
1709
1759
  resourceType: state.resourceType,
@@ -1739,13 +1789,14 @@ const Uploading = () => {
1739
1789
  size: "medium",
1740
1790
  label: intl.formatMessage(sharedMessages.cancel),
1741
1791
  onClick: () => {
1792
+ actions.setCurrentStep(1);
1742
1793
  state.abortController.abort();
1743
1794
  }
1744
1795
  })]
1745
1796
  }), jsx(ProgressBar, {
1746
1797
  barWidth: "scale",
1747
1798
  height: "10",
1748
- progress: 100
1799
+ progress: state.progress
1749
1800
  }), jsx("div", {})]
1750
1801
  })
1751
1802
  });
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@commercetools-frontend-extensions/import-resources-modal",
3
3
  "description": "Shared import modal for importing resources",
4
- "version": "1.0.1",
4
+ "version": "1.0.3",
5
5
  "license": "BSD-3-Clause",
6
6
  "publishConfig": {
7
7
  "access": "public"