swell-js 3.12.2 → 3.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/api.js CHANGED
@@ -10,7 +10,7 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
10
10
 
11
11
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
12
12
 
13
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
13
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
14
14
 
15
15
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
16
16
 
@@ -246,7 +246,7 @@ function _request() {
246
246
 
247
247
  if (typeof window !== 'undefined') {
248
248
  window.swell = {
249
- version: '3.12.2'
249
+ version: '3.13.0'
250
250
  };
251
251
  }
252
252
 
package/dist/cache.js CHANGED
@@ -10,13 +10,13 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
10
10
 
11
11
  var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
12
12
 
13
- function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, 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 normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
13
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, 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 normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
14
14
 
15
15
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
16
16
 
17
17
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
18
18
 
19
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
19
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
20
20
 
21
21
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
22
22
 
package/dist/cart.js CHANGED
@@ -8,7 +8,7 @@ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"))
8
8
 
9
9
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
10
10
 
11
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
11
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
12
12
 
13
13
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
14
14
 
package/dist/content.js CHANGED
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
 
5
5
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
6
6
 
7
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
7
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
8
8
 
9
9
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
10
10
 
package/dist/cookie.js CHANGED
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
 
5
5
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
6
6
 
7
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
7
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
8
8
 
9
9
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
10
10
 
package/dist/payment.js CHANGED
@@ -8,11 +8,11 @@ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"))
8
8
 
9
9
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
10
10
 
11
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
11
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
12
12
 
13
13
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
14
14
 
15
- function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, 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 normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
15
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, 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 normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
16
16
 
17
17
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
18
18
 
@@ -48,6 +48,9 @@ var _require3 = require('./utils/quickpay'),
48
48
  var _require4 = require('./utils/paysafecard'),
49
49
  createPaysafecardPayment = _require4.createPaysafecardPayment;
50
50
 
51
+ var _require5 = require('./utils/klarna'),
52
+ createKlarnaSession = _require5.createKlarnaSession;
53
+
51
54
  var LOADING_SCRIPTS = {};
52
55
  var CARD_ELEMENTS = {};
53
56
  var API = {};
@@ -611,7 +614,7 @@ function _stripeElements() {
611
614
  case 0:
612
615
  publishable_key = payMethods.card.publishable_key;
613
616
  stripe = window.Stripe(publishable_key);
614
- elements = stripe.elements();
617
+ elements = stripe.elements(params.config);
615
618
 
616
619
  createElement = function createElement(type) {
617
620
  var elementParams = get(params, "card[".concat(type, "]")) || params.card || params.ideal;
@@ -720,10 +723,11 @@ function _payPalButton() {
720
723
  var payer = authorization.payer;
721
724
  var shipping = get(authorization, 'purchase_units[0].shipping');
722
725
  var authorizationID = get(authorization, 'purchase_units[0].payments.authorizations[0].id');
723
- return cartApi.methods(request).update({
726
+ return cartApi.methods(request).update(_objectSpread(_objectSpread({}, !cart.account_logged_in && {
724
727
  account: {
725
728
  email: payer.email_address
726
- },
729
+ }
730
+ }), {}, {
727
731
  billing: {
728
732
  method: 'paypal',
729
733
  paypal: {
@@ -739,7 +743,7 @@ function _payPalButton() {
739
743
  zip: shipping.address.postal_code,
740
744
  country: shipping.address.country_code
741
745
  }
742
- });
746
+ }));
743
747
  }).then(onSuccess)["catch"](onError);
744
748
  }
745
749
  }, onError).render(elementId || '#paypal-button');
@@ -846,7 +850,7 @@ function paymentTokenize(_x24, _x25, _x26, _x27) {
846
850
 
847
851
  function _paymentTokenize() {
848
852
  _paymentTokenize = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee13(request, params, payMethods, cart) {
849
- var onError, stripe, paymentMethod, currency, amount, stripeCustomer, intent, _yield$stripe$confirm, paymentIntent, error, _intent, _yield$createIDealPay, _error, _paymentMethod, _currency, _amount, _intent2, publishable_key, _stripe, settings, _yield$createKlarnaSo, _error2, source, _publishable_key, _stripe2, _yield$createBanconta, _error3, _source, _intent3;
853
+ var onError, stripe, paymentMethod, currency, amount, stripeCustomer, intent, _yield$stripe$confirm, paymentIntent, error, _intent, _yield$createIDealPay, _error, _paymentMethod, _currency, _amount, _intent2, session, publishable_key, _stripe, settings, _yield$createKlarnaSo, _error2, source, _publishable_key, _stripe2, _yield$createBanconta, _error3, _source, _intent3;
850
854
 
851
855
  return _regenerator["default"].wrap(function _callee13$(_context13) {
852
856
  while (1) {
@@ -1015,7 +1019,7 @@ function _paymentTokenize() {
1015
1019
  createQuickpayCard(methods(request).authorizeGateway)["catch"](onError);
1016
1020
 
1017
1021
  case 48:
1018
- _context13.next = 121;
1022
+ _context13.next = 128;
1019
1023
  break;
1020
1024
 
1021
1025
  case 50:
@@ -1108,44 +1112,59 @@ function _paymentTokenize() {
1108
1112
  return _context13.abrupt("return", _context13.t5);
1109
1113
 
1110
1114
  case 75:
1111
- _context13.next = 121;
1115
+ _context13.next = 128;
1112
1116
  break;
1113
1117
 
1114
1118
  case 77:
1115
1119
  if (!(params.klarna && payMethods.klarna)) {
1116
- _context13.next = 97;
1120
+ _context13.next = 104;
1117
1121
  break;
1118
1122
  }
1119
1123
 
1124
+ if (!(payMethods.klarna.gateway === 'klarna')) {
1125
+ _context13.next = 85;
1126
+ break;
1127
+ }
1128
+
1129
+ _context13.next = 81;
1130
+ return createKlarnaSession(cart, methods(request).createIntent)["catch"](function (err) {
1131
+ return onError(err);
1132
+ });
1133
+
1134
+ case 81:
1135
+ session = _context13.sent;
1136
+ return _context13.abrupt("return", session && window.location.replace(session.redirect_url));
1137
+
1138
+ case 85:
1120
1139
  if (!(payMethods.card && payMethods.card.gateway === 'stripe')) {
1121
- _context13.next = 95;
1140
+ _context13.next = 102;
1122
1141
  break;
1123
1142
  }
1124
1143
 
1125
1144
  if (window.Stripe) {
1126
- _context13.next = 82;
1145
+ _context13.next = 89;
1127
1146
  break;
1128
1147
  }
1129
1148
 
1130
- _context13.next = 82;
1149
+ _context13.next = 89;
1131
1150
  return loadScript('stripe-js', 'https://js.stripe.com/v3/');
1132
1151
 
1133
- case 82:
1152
+ case 89:
1134
1153
  publishable_key = payMethods.card.publishable_key;
1135
1154
  _stripe = window.Stripe(publishable_key);
1136
1155
  _context13.t6 = toSnake;
1137
- _context13.next = 87;
1156
+ _context13.next = 94;
1138
1157
  return settingsApi.methods(request, options).get();
1139
1158
 
1140
- case 87:
1159
+ case 94:
1141
1160
  _context13.t7 = _context13.sent;
1142
1161
  settings = (0, _context13.t6)(_context13.t7);
1143
- _context13.next = 91;
1162
+ _context13.next = 98;
1144
1163
  return createKlarnaSource(_stripe, _objectSpread(_objectSpread({}, cart), {}, {
1145
1164
  settings: settings.store
1146
1165
  }));
1147
1166
 
1148
- case 91:
1167
+ case 98:
1149
1168
  _yield$createKlarnaSo = _context13.sent;
1150
1169
  _error2 = _yield$createKlarnaSo.error;
1151
1170
  source = _yield$createKlarnaSo.source;
@@ -1159,36 +1178,36 @@ function _paymentTokenize() {
1159
1178
  return onError(err);
1160
1179
  }));
1161
1180
 
1162
- case 95:
1163
- _context13.next = 121;
1181
+ case 102:
1182
+ _context13.next = 128;
1164
1183
  break;
1165
1184
 
1166
- case 97:
1185
+ case 104:
1167
1186
  if (!(params.bancontact && payMethods.bancontact)) {
1168
- _context13.next = 112;
1187
+ _context13.next = 119;
1169
1188
  break;
1170
1189
  }
1171
1190
 
1172
1191
  if (!(payMethods.card && payMethods.card.gateway === 'stripe')) {
1173
- _context13.next = 110;
1192
+ _context13.next = 117;
1174
1193
  break;
1175
1194
  }
1176
1195
 
1177
1196
  if (window.Stripe) {
1178
- _context13.next = 102;
1197
+ _context13.next = 109;
1179
1198
  break;
1180
1199
  }
1181
1200
 
1182
- _context13.next = 102;
1201
+ _context13.next = 109;
1183
1202
  return loadScript('stripe-js', 'https://js.stripe.com/v3/');
1184
1203
 
1185
- case 102:
1204
+ case 109:
1186
1205
  _publishable_key = payMethods.card.publishable_key;
1187
1206
  _stripe2 = window.Stripe(_publishable_key);
1188
- _context13.next = 106;
1207
+ _context13.next = 113;
1189
1208
  return createBancontactSource(_stripe2, cart);
1190
1209
 
1191
- case 106:
1210
+ case 113:
1192
1211
  _yield$createBanconta = _context13.sent;
1193
1212
  _error3 = _yield$createBanconta.error;
1194
1213
  _source = _yield$createBanconta.source;
@@ -1202,31 +1221,31 @@ function _paymentTokenize() {
1202
1221
  return onError(err);
1203
1222
  }));
1204
1223
 
1205
- case 110:
1206
- _context13.next = 121;
1224
+ case 117:
1225
+ _context13.next = 128;
1207
1226
  break;
1208
1227
 
1209
- case 112:
1228
+ case 119:
1210
1229
  if (!(params.paysafecard && payMethods.paysafecard)) {
1211
- _context13.next = 121;
1230
+ _context13.next = 128;
1212
1231
  break;
1213
1232
  }
1214
1233
 
1215
- _context13.next = 115;
1234
+ _context13.next = 122;
1216
1235
  return createPaysafecardPayment(cart, methods(request).createIntent)["catch"](onError);
1217
1236
 
1218
- case 115:
1237
+ case 122:
1219
1238
  _intent3 = _context13.sent;
1220
1239
 
1221
1240
  if (_intent3) {
1222
- _context13.next = 118;
1241
+ _context13.next = 125;
1223
1242
  break;
1224
1243
  }
1225
1244
 
1226
1245
  return _context13.abrupt("return");
1227
1246
 
1228
- case 118:
1229
- _context13.next = 120;
1247
+ case 125:
1248
+ _context13.next = 127;
1230
1249
  return cartApi.methods(request, options).update({
1231
1250
  billing: {
1232
1251
  method: 'paysafecard',
@@ -1238,10 +1257,10 @@ function _paymentTokenize() {
1238
1257
  }
1239
1258
  });
1240
1259
 
1241
- case 120:
1260
+ case 127:
1242
1261
  return _context13.abrupt("return", window.location.replace(_intent3.redirect.auth_url));
1243
1262
 
1244
- case 121:
1263
+ case 128:
1245
1264
  case "end":
1246
1265
  return _context13.stop();
1247
1266
  }
@@ -1263,7 +1282,7 @@ function _handleRedirect3() {
1263
1282
  switch (_context14.prev = _context14.next) {
1264
1283
  case 0:
1265
1284
  onError = function onError(error) {
1266
- var errorHandler = get(params, 'card.onError') || get(params, 'paysafecard.onError');
1285
+ var errorHandler = get(params, 'card.onError') || get(params, 'paysafecard.onError') || get(params, 'klarna.onError');
1267
1286
 
1268
1287
  if (isFunction(errorHandler)) {
1269
1288
  return errorHandler(error);
@@ -1273,7 +1292,7 @@ function _handleRedirect3() {
1273
1292
  };
1274
1293
 
1275
1294
  onSuccess = function onSuccess(result) {
1276
- var successHandler = get(params, 'card.onSuccess') || get(params, 'paysafecard.onSuccess');
1295
+ var successHandler = get(params, 'card.onSuccess') || get(params, 'paysafecard.onSuccess') || get(params, 'klarna.onSuccess');
1277
1296
 
1278
1297
  if (isFunction(successHandler)) {
1279
1298
  return successHandler(result);
@@ -1296,12 +1315,12 @@ function _handleRedirect3() {
1296
1315
 
1297
1316
  case 8:
1298
1317
  result = _context14.sent;
1299
- _context14.next = 15;
1318
+ _context14.next = 21;
1300
1319
  break;
1301
1320
 
1302
1321
  case 11:
1303
1322
  if (!(gateway === 'paysafecard')) {
1304
- _context14.next = 15;
1323
+ _context14.next = 17;
1305
1324
  break;
1306
1325
  }
1307
1326
 
@@ -1310,27 +1329,41 @@ function _handleRedirect3() {
1310
1329
 
1311
1330
  case 14:
1312
1331
  result = _context14.sent;
1332
+ _context14.next = 21;
1333
+ break;
1313
1334
 
1314
- case 15:
1335
+ case 17:
1336
+ if (!(gateway === 'klarna_direct')) {
1337
+ _context14.next = 21;
1338
+ break;
1339
+ }
1340
+
1341
+ _context14.next = 20;
1342
+ return handleDirectKlarnaRedirectAction(request, cart, params, queryParams);
1343
+
1344
+ case 20:
1345
+ result = _context14.sent;
1346
+
1347
+ case 21:
1315
1348
  if (result) {
1316
- _context14.next = 19;
1349
+ _context14.next = 25;
1317
1350
  break;
1318
1351
  }
1319
1352
 
1320
1353
  return _context14.abrupt("return");
1321
1354
 
1322
- case 19:
1355
+ case 25:
1323
1356
  if (!result.error) {
1324
- _context14.next = 23;
1357
+ _context14.next = 29;
1325
1358
  break;
1326
1359
  }
1327
1360
 
1328
1361
  return _context14.abrupt("return", onError(result.error));
1329
1362
 
1330
- case 23:
1363
+ case 29:
1331
1364
  return _context14.abrupt("return", onSuccess(result));
1332
1365
 
1333
- case 24:
1366
+ case 30:
1334
1367
  case "end":
1335
1368
  return _context14.stop();
1336
1369
  }
@@ -1493,6 +1526,56 @@ function _handlePaysafecardRedirectAction() {
1493
1526
  return _handlePaysafecardRedirectAction.apply(this, arguments);
1494
1527
  }
1495
1528
 
1529
+ function handleDirectKlarnaRedirectAction(_x37, _x38, _x39, _x40) {
1530
+ return _handleDirectKlarnaRedirectAction.apply(this, arguments);
1531
+ }
1532
+
1533
+ function _handleDirectKlarnaRedirectAction() {
1534
+ _handleDirectKlarnaRedirectAction = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee17(request, cart, params, queryParams) {
1535
+ var authorization_token;
1536
+ return _regenerator["default"].wrap(function _callee17$(_context17) {
1537
+ while (1) {
1538
+ switch (_context17.prev = _context17.next) {
1539
+ case 0:
1540
+ authorization_token = queryParams.authorization_token;
1541
+
1542
+ if (authorization_token) {
1543
+ _context17.next = 3;
1544
+ break;
1545
+ }
1546
+
1547
+ return _context17.abrupt("return", {
1548
+ error: {
1549
+ message: 'We are unable to authenticate your payment method. Please choose a different payment method and try again.'
1550
+ }
1551
+ });
1552
+
1553
+ case 3:
1554
+ _context17.next = 5;
1555
+ return cartApi.methods(request, options).update({
1556
+ billing: {
1557
+ method: 'klarna',
1558
+ klarna: {
1559
+ token: authorization_token
1560
+ }
1561
+ }
1562
+ });
1563
+
1564
+ case 5:
1565
+ return _context17.abrupt("return", {
1566
+ success: true
1567
+ });
1568
+
1569
+ case 6:
1570
+ case "end":
1571
+ return _context17.stop();
1572
+ }
1573
+ }
1574
+ }, _callee17);
1575
+ }));
1576
+ return _handleDirectKlarnaRedirectAction.apply(this, arguments);
1577
+ }
1578
+
1496
1579
  function getTotalsDueRemaining(cart) {
1497
1580
  var grand_total = cart.grand_total,
1498
1581
  account = cart.account,
package/dist/products.js CHANGED
@@ -12,13 +12,13 @@ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
12
12
 
13
13
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
14
14
 
15
- function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, 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 normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
15
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, 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 normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
16
16
 
17
17
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
18
18
 
19
19
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
20
20
 
21
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
21
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
22
22
 
23
23
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
24
24
 
package/dist/settings.js CHANGED
@@ -10,13 +10,13 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
10
10
 
11
11
  var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
12
12
 
13
- function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, 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 normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
13
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, 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 normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
14
14
 
15
15
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
16
16
 
17
17
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
18
18
 
19
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
19
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
20
20
 
21
21
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
22
22
 
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
6
+
7
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
8
+
9
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
+
11
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
12
+
13
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
14
+
15
+ var _require = require('lodash'),
16
+ map = _require.map,
17
+ get = _require.get,
18
+ reduce = _require.reduce,
19
+ toNumber = _require.toNumber;
20
+
21
+ var addressFieldsMap = {
22
+ given_name: 'first_name',
23
+ family_name: 'last_name',
24
+ city: 'city',
25
+ country: 'country',
26
+ phone: 'phone',
27
+ postal_code: 'zip',
28
+ street_address: 'address1',
29
+ street_address2: 'address2',
30
+ region: 'state'
31
+ };
32
+
33
+ var mapFields = function mapFields(fieldsMap, data) {
34
+ return reduce(fieldsMap, function (acc, srcKey, destKey) {
35
+ var value = data[srcKey];
36
+
37
+ if (value) {
38
+ acc[destKey] = value;
39
+ }
40
+
41
+ return acc;
42
+ }, {});
43
+ };
44
+
45
+ var mapAddressFields = function mapAddressFields(cart, addressField) {
46
+ return _objectSpread(_objectSpread({}, mapFields(addressFieldsMap, cart[addressField])), {}, {
47
+ email: get(cart, 'account.email')
48
+ });
49
+ };
50
+
51
+ function getOrderLines(cart) {
52
+ var items = map(cart.items, function (item) {
53
+ return {
54
+ type: 'physical',
55
+ name: get(item, 'product.name'),
56
+ reference: get(item, 'product.sku') || get(item, 'product.slug'),
57
+ quantity: item.quantity,
58
+ unit_price: Math.round(toNumber(item.price - item.discount_each) * 100),
59
+ total_amount: Math.round(toNumber(item.price_total - item.discount_total) * 100),
60
+ tax_rate: 0,
61
+ total_tax_amount: 0
62
+ };
63
+ });
64
+ var tax = get(cart, 'tax_included_total');
65
+ var taxAmount = toNumber(tax) * 100;
66
+
67
+ if (tax) {
68
+ items.push({
69
+ type: 'sales_tax',
70
+ name: 'Taxes',
71
+ quantity: 1,
72
+ unit_price: taxAmount,
73
+ total_amount: taxAmount,
74
+ tax_rate: 0,
75
+ total_tax_amount: 0
76
+ });
77
+ }
78
+
79
+ var shipping = get(cart, 'shipping', {});
80
+ var shippingTotal = get(cart, 'shipment_total', {});
81
+ var shippingAmount = toNumber(shippingTotal) * 100;
82
+
83
+ if (shipping.price) {
84
+ items.push({
85
+ type: 'shipping_fee',
86
+ name: shipping.service_name,
87
+ quantity: 1,
88
+ unit_price: shippingAmount,
89
+ total_amount: shippingAmount,
90
+ tax_rate: 0,
91
+ total_tax_amount: 0
92
+ });
93
+ }
94
+
95
+ return items;
96
+ }
97
+
98
+ function createKlarnaSession(_x, _x2) {
99
+ return _createKlarnaSession.apply(this, arguments);
100
+ }
101
+
102
+ function _createKlarnaSession() {
103
+ _createKlarnaSession = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(cart, createIntent) {
104
+ var returnUrl, successUrl;
105
+ return _regenerator["default"].wrap(function _callee$(_context) {
106
+ while (1) {
107
+ switch (_context.prev = _context.next) {
108
+ case 0:
109
+ returnUrl = "".concat(window.location.origin).concat(window.location.pathname, "?gateway=klarna_direct&sid={{session_id}}");
110
+ successUrl = "".concat(returnUrl, "&authorization_token={{authorization_token}}");
111
+ return _context.abrupt("return", createIntent({
112
+ gateway: 'klarna',
113
+ intent: {
114
+ locale: get(cart, 'settings.locale') || 'en-US',
115
+ purchase_country: get(cart, 'billing.country') || get(cart, 'shipping.country'),
116
+ purchase_currency: cart.currency,
117
+ billing_address: mapAddressFields(cart, 'billing'),
118
+ shipping_address: mapAddressFields(cart, 'shipping'),
119
+ order_amount: Math.round(get(cart, 'grand_total', 0) * 100),
120
+ order_lines: JSON.stringify(getOrderLines(cart)),
121
+ merchant_urls: {
122
+ success: successUrl,
123
+ back: returnUrl,
124
+ cancel: returnUrl,
125
+ error: returnUrl,
126
+ failure: returnUrl
127
+ }
128
+ }
129
+ }));
130
+
131
+ case 3:
132
+ case "end":
133
+ return _context.stop();
134
+ }
135
+ }
136
+ }, _callee);
137
+ }));
138
+ return _createKlarnaSession.apply(this, arguments);
139
+ }
140
+
141
+ module.exports = {
142
+ createKlarnaSession: createKlarnaSession
143
+ };
@@ -6,8 +6,8 @@ Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
8
  exports.createQuickpayCard = createQuickpayCard;
9
- exports.createQuickpayPayment = createQuickpayPayment;
10
9
  exports.getQuickpayCardDetais = getQuickpayCardDetais;
10
+ exports.createQuickpayPayment = createQuickpayPayment;
11
11
 
12
12
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
13
13
 
@@ -8,7 +8,7 @@ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/
8
8
 
9
9
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
10
 
11
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
11
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
12
12
 
13
13
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
14
14
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "swell-js",
3
- "version": "3.12.2",
3
+ "version": "3.13.0",
4
4
  "description": "Swell JS library for client-side stores",
5
5
  "repository": {
6
6
  "type": "git",
package/src/payment.js CHANGED
@@ -22,6 +22,7 @@ const {
22
22
  getQuickpayCardDetais,
23
23
  } = require('./utils/quickpay');
24
24
  const { createPaysafecardPayment } = require('./utils/paysafecard');
25
+ const { createKlarnaSession } = require('./utils/klarna');
25
26
 
26
27
  const LOADING_SCRIPTS = {};
27
28
  const CARD_ELEMENTS = {};
@@ -223,7 +224,7 @@ const loadScript = async (id, src) => {
223
224
  async function stripeElements(request, payMethods, params) {
224
225
  const { publishable_key } = payMethods.card;
225
226
  const stripe = window.Stripe(publishable_key);
226
- const elements = stripe.elements();
227
+ const elements = stripe.elements(params.config);
227
228
  const createElement = (type) => {
228
229
  const elementParams = get(params, `card[${type}]`) || params.card || params.ideal;
229
230
  const elementOptions = elementParams.options || {};
@@ -310,9 +311,11 @@ async function payPalButton(request, cart, payMethods, params) {
310
311
  'purchase_units[0].payments.authorizations[0].id',
311
312
  );
312
313
  return cartApi.methods(request).update({
313
- account: {
314
- email: payer.email_address,
315
- },
314
+ ...(!cart.account_logged_in && {
315
+ account: {
316
+ email: payer.email_address,
317
+ },
318
+ }),
316
319
  billing: { method: 'paypal', paypal: { authorization_id: authorizationID } },
317
320
  shipping: {
318
321
  name: shipping.name.full_name,
@@ -532,7 +535,12 @@ async function paymentTokenize(request, params, payMethods, cart) {
532
535
  }
533
536
  }
534
537
  } else if (params.klarna && payMethods.klarna) {
535
- if (payMethods.card && payMethods.card.gateway === 'stripe') {
538
+ if (payMethods.klarna.gateway === 'klarna') {
539
+ const session = await createKlarnaSession(cart, methods(request).createIntent).catch((err) =>
540
+ onError(err),
541
+ );
542
+ return session && window.location.replace(session.redirect_url);
543
+ } else if (payMethods.card && payMethods.card.gateway === 'stripe') {
536
544
  if (!window.Stripe) {
537
545
  await loadScript('stripe-js', 'https://js.stripe.com/v3/');
538
546
  }
@@ -604,14 +612,20 @@ async function paymentTokenize(request, params, payMethods, cart) {
604
612
 
605
613
  async function handleRedirect(request, params, cart) {
606
614
  const onError = (error) => {
607
- const errorHandler = get(params, 'card.onError') || get(params, 'paysafecard.onError');
615
+ const errorHandler =
616
+ get(params, 'card.onError') ||
617
+ get(params, 'paysafecard.onError') ||
618
+ get(params, 'klarna.onError');
608
619
  if (isFunction(errorHandler)) {
609
620
  return errorHandler(error);
610
621
  }
611
622
  throw new Error(error.message);
612
623
  };
613
624
  const onSuccess = (result) => {
614
- const successHandler = get(params, 'card.onSuccess') || get(params, 'paysafecard.onSuccess');
625
+ const successHandler =
626
+ get(params, 'card.onSuccess') ||
627
+ get(params, 'paysafecard.onSuccess') ||
628
+ get(params, 'klarna.onSuccess');
615
629
  if (isFunction(successHandler)) {
616
630
  return successHandler(result);
617
631
  }
@@ -626,6 +640,8 @@ async function handleRedirect(request, params, cart) {
626
640
  result = await handleQuickpayRedirectAction(request, cart, params, queryParams);
627
641
  } else if (gateway === 'paysafecard') {
628
642
  result = await handlePaysafecardRedirectAction(request, cart, params, queryParams);
643
+ } else if (gateway === 'klarna_direct') {
644
+ result = await handleDirectKlarnaRedirectAction(request, cart, params, queryParams);
629
645
  }
630
646
 
631
647
  if (!result) {
@@ -701,6 +717,29 @@ async function handlePaysafecardRedirectAction(request, cart) {
701
717
  }
702
718
  }
703
719
 
720
+ async function handleDirectKlarnaRedirectAction(request, cart, params, queryParams) {
721
+ const { authorization_token } = queryParams;
722
+
723
+ if (!authorization_token) {
724
+ return {
725
+ error: {
726
+ message:
727
+ 'We are unable to authenticate your payment method. Please choose a different payment method and try again.',
728
+ },
729
+ };
730
+ }
731
+
732
+ await cartApi.methods(request, options).update({
733
+ billing: {
734
+ method: 'klarna',
735
+ klarna: {
736
+ token: authorization_token,
737
+ },
738
+ },
739
+ });
740
+ return { success: true };
741
+ }
742
+
704
743
  function getTotalsDueRemaining(cart) {
705
744
  const { grand_total, account, account_credit_amount, giftcards } = cart;
706
745
 
@@ -719,9 +758,7 @@ function getTotalsDueRemaining(cart) {
719
758
  }
720
759
 
721
760
  const accountCreditAmount =
722
- typeof account_credit_amount === 'number'
723
- ? account_credit_amount
724
- : account && account.balance;
761
+ typeof account_credit_amount === 'number' ? account_credit_amount : account && account.balance;
725
762
  if (accountCreditAmount > 0) {
726
763
  totalDue -= accountCreditAmount;
727
764
  if (totalDue < 0) {
@@ -0,0 +1,104 @@
1
+ const { map, get, reduce, toNumber } = require('lodash');
2
+
3
+ const addressFieldsMap = {
4
+ given_name: 'first_name',
5
+ family_name: 'last_name',
6
+ city: 'city',
7
+ country: 'country',
8
+ phone: 'phone',
9
+ postal_code: 'zip',
10
+ street_address: 'address1',
11
+ street_address2: 'address2',
12
+ region: 'state',
13
+ };
14
+
15
+ const mapFields = (fieldsMap, data) =>
16
+ reduce(
17
+ fieldsMap,
18
+ (acc, srcKey, destKey) => {
19
+ const value = data[srcKey];
20
+ if (value) {
21
+ acc[destKey] = value;
22
+ }
23
+ return acc;
24
+ },
25
+ {},
26
+ );
27
+
28
+ const mapAddressFields = (cart, addressField) => ({
29
+ ...mapFields(addressFieldsMap, cart[addressField]),
30
+ email: get(cart, 'account.email'),
31
+ });
32
+
33
+ function getOrderLines(cart) {
34
+ const items = map(cart.items, (item) => ({
35
+ type: 'physical',
36
+ name: get(item, 'product.name'),
37
+ reference: get(item, 'product.sku') || get(item, 'product.slug'),
38
+ quantity: item.quantity,
39
+ unit_price: Math.round(toNumber(item.price - item.discount_each) * 100),
40
+ total_amount: Math.round(toNumber(item.price_total - item.discount_total) * 100),
41
+ tax_rate: 0,
42
+ total_tax_amount: 0,
43
+ }));
44
+
45
+ const tax = get(cart, 'tax_included_total');
46
+ const taxAmount = toNumber(tax) * 100;
47
+ if (tax) {
48
+ items.push({
49
+ type: 'sales_tax',
50
+ name: 'Taxes',
51
+ quantity: 1,
52
+ unit_price: taxAmount,
53
+ total_amount: taxAmount,
54
+ tax_rate: 0,
55
+ total_tax_amount: 0,
56
+ });
57
+ }
58
+
59
+ const shipping = get(cart, 'shipping', {});
60
+ const shippingTotal = get(cart, 'shipment_total', {});
61
+ const shippingAmount = toNumber(shippingTotal) * 100;
62
+ if (shipping.price) {
63
+ items.push({
64
+ type: 'shipping_fee',
65
+ name: shipping.service_name,
66
+ quantity: 1,
67
+ unit_price: shippingAmount,
68
+ total_amount: shippingAmount,
69
+ tax_rate: 0,
70
+ total_tax_amount: 0,
71
+ });
72
+ }
73
+
74
+ return items;
75
+ }
76
+
77
+ async function createKlarnaSession(cart, createIntent) {
78
+ const returnUrl = `${window.location.origin}${window.location.pathname}?gateway=klarna_direct&sid={{session_id}}`;
79
+ const successUrl = `${returnUrl}&authorization_token={{authorization_token}}`;
80
+
81
+ return createIntent({
82
+ gateway: 'klarna',
83
+ intent: {
84
+ locale: get(cart, 'settings.locale') || 'en-US',
85
+ purchase_country: get(cart, 'billing.country') || get(cart, 'shipping.country'),
86
+ purchase_currency: cart.currency,
87
+ billing_address: mapAddressFields(cart, 'billing'),
88
+ shipping_address: mapAddressFields(cart, 'shipping'),
89
+ order_amount: Math.round(get(cart, 'grand_total', 0) * 100),
90
+ order_lines: JSON.stringify(getOrderLines(cart)),
91
+ merchant_urls: {
92
+ success: successUrl,
93
+ back: returnUrl,
94
+ cancel: returnUrl,
95
+ error: returnUrl,
96
+ failure: returnUrl,
97
+ },
98
+ },
99
+ });
100
+ }
101
+
102
+ module.exports = {
103
+ createKlarnaSession,
104
+ };
@@ -113,6 +113,7 @@ class Sidebar extends React.Component {
113
113
  'Paysafecard',
114
114
  'Square',
115
115
  'Braintree',
116
+ 'Klarna',
116
117
  ],
117
118
  },
118
119
  ].map((item, index) =>
@@ -0,0 +1,101 @@
1
+ import React from 'react';
2
+ import { connect } from 'react-redux';
3
+ import { compose } from 'recompose';
4
+ import { withStyles } from '@material-ui/core/styles';
5
+ import { Card, CardContent, Button } from '@material-ui/core';
6
+ import Info from '../../components/info';
7
+
8
+ const styles = {
9
+ root: {
10
+ display: 'flex',
11
+ flexDirection: 'column',
12
+ },
13
+ input: {
14
+ margin: 20,
15
+ },
16
+ card: {
17
+ marginBottom: 20,
18
+ overflow: 'visible',
19
+ },
20
+ submitContainer: {
21
+ display: 'flex',
22
+ justifyContent: 'space-around',
23
+ },
24
+ button: {
25
+ width: '30%',
26
+ },
27
+ };
28
+
29
+ class Klarna extends React.Component {
30
+ constructor(props) {
31
+ super(props);
32
+ this.state = {
33
+ tokenized: false,
34
+ };
35
+ }
36
+
37
+ componentDidMount() {
38
+ const { api, onError } = this.props;
39
+ api.payment.handleRedirect({
40
+ klarna: { onError, onSuccess: () => this.setState({ tokenized: true }) },
41
+ });
42
+ }
43
+
44
+ onClickTokenize(event) {
45
+ const { api, onError } = this.props;
46
+
47
+ event.preventDefault();
48
+ api.payment.tokenize({
49
+ klarna: {
50
+ onError,
51
+ },
52
+ });
53
+ }
54
+
55
+ render() {
56
+ const {
57
+ classes,
58
+ onOrderSubmit,
59
+ cart: { billing: { method, klarna } = {} },
60
+ } = this.props;
61
+ const { tokenized } = this.state;
62
+
63
+ return (
64
+ <div className={classes.root}>
65
+ <Card classes={{ root: classes.card }}>
66
+ <CardContent>
67
+ {tokenized && <Info title="Billing" source={{ method, klarna }} />}
68
+ <div className={classes.submitContainer}>
69
+ <Button
70
+ id="stripe-submit-button"
71
+ variant="contained"
72
+ color="primary"
73
+ size="small"
74
+ classes={{ root: classes.button }}
75
+ onClick={this.onClickTokenize.bind(this)}
76
+ >
77
+ Tokenize
78
+ </Button>
79
+ <Button
80
+ variant="contained"
81
+ color="secondary"
82
+ size="small"
83
+ disabled={!tokenized}
84
+ classes={{ root: classes.button }}
85
+ onClick={onOrderSubmit}
86
+ >
87
+ Submit
88
+ </Button>
89
+ </div>
90
+ </CardContent>
91
+ </Card>
92
+ </div>
93
+ );
94
+ }
95
+ }
96
+
97
+ const mapStateToProps = ({ api }) => ({
98
+ api,
99
+ });
100
+
101
+ export default compose(connect(mapStateToProps), withStyles(styles))(Klarna);
@@ -24,6 +24,7 @@ import StripeKlarna from './stripe-klarna';
24
24
  import StripeBancontact from './stripe-bancontact';
25
25
  import Quickpay from './quickpay';
26
26
  import Paysafecard from './paysafecard';
27
+ import Klarna from './klarna';
27
28
  import Info from '../../components/info';
28
29
 
29
30
  const styles = {
@@ -186,6 +187,15 @@ class Payment extends React.Component {
186
187
  onError={onError}
187
188
  />
188
189
  );
190
+ case 'klarna':
191
+ return (
192
+ <Klarna
193
+ cart={cart}
194
+ onCartUpdate={onCartUpdate}
195
+ onOrderSubmit={onOrderSubmit}
196
+ onError={onError}
197
+ />
198
+ );
189
199
  case 'square':
190
200
  return <Typography variant="h4">Coming soon</Typography>;
191
201
  case 'braintree':
@@ -1,8 +1,17 @@
1
- import React from 'react';
1
+ import React, { Fragment } from 'react';
2
2
  import { connect } from 'react-redux';
3
3
  import { compose } from 'recompose';
4
4
  import { withStyles } from '@material-ui/core/styles';
5
- import { Card, CardContent, Button } from '@material-ui/core';
5
+ import {
6
+ Card,
7
+ CardContent,
8
+ Button,
9
+ FormControl,
10
+ FormLabel,
11
+ RadioGroup,
12
+ FormControlLabel,
13
+ Radio,
14
+ } from '@material-ui/core';
6
15
 
7
16
  const styles = {
8
17
  root: {
@@ -29,29 +38,84 @@ class Stripe extends React.Component {
29
38
  super(props);
30
39
  this.state = {
31
40
  tokenized: false,
41
+ type: 'card',
42
+ font: 'default',
32
43
  };
44
+
45
+ this.onTokenize = this.onTokenize.bind(this);
46
+ this.onError = this.onError.bind(this);
47
+ this.onClickTokenize = this.onClickTokenize.bind(this);
48
+ this.onChangeType = this.onChangeType.bind(this);
49
+ this.onChangeFont = this.onChangeFont.bind(this);
33
50
  }
34
51
 
35
52
  componentDidMount() {
36
- const { api, onError } = this.props;
37
- api.payment.createElements({
38
- card: {
39
- options: {
40
- style: {
41
- base: {
42
- fontWeight: 500,
43
- fontSize: '16px',
44
- },
45
- },
46
- },
47
- onSuccess: () => {
48
- this.setState({ tokenized: true });
53
+ this.renderStripeElements();
54
+ }
55
+
56
+ componentDidUpdate() {
57
+ this.renderStripeElements();
58
+ }
59
+
60
+ renderStripeElements() {
61
+ const { type, font } = this.state;
62
+ const options = {
63
+ showIcon: true,
64
+ style: {
65
+ base: {
66
+ fontWeight: 500,
67
+ fontSize: '16px',
49
68
  },
50
- onError: (err) => onError(err.message),
69
+ },
70
+ };
71
+
72
+ switch (font) {
73
+ case 'audiowide':
74
+ options.style.base.fontFamily = 'Audiowide';
75
+ break;
76
+ case 'festive':
77
+ options.style.base.fontFamily = 'Festive';
78
+ break;
79
+ default:
80
+ break;
81
+ }
82
+
83
+ this.props.api.payment.createElements({
84
+ config: {
85
+ fonts: [
86
+ {
87
+ cssSrc: 'https://fonts.googleapis.com/css?family=Audiowide',
88
+ },
89
+ {
90
+ cssSrc: 'https://fonts.googleapis.com/css?family=Festive',
91
+ },
92
+ ],
93
+ },
94
+ card: {
95
+ ...(type === 'card'
96
+ ? {
97
+ options,
98
+ }
99
+ : {
100
+ separateElements: true,
101
+ cardNumber: { options },
102
+ cardExpiry: { options },
103
+ cardCvc: { options },
104
+ }),
105
+ onSuccess: this.onTokenize,
106
+ onError: this.onError,
51
107
  },
52
108
  });
53
109
  }
54
110
 
111
+ onTokenize() {
112
+ this.setState({ tokenized: true });
113
+ }
114
+
115
+ onError(err) {
116
+ this.props.onError(err.message);
117
+ }
118
+
55
119
  onClickTokenize(event) {
56
120
  const { api } = this.props;
57
121
 
@@ -59,15 +123,46 @@ class Stripe extends React.Component {
59
123
  api.payment.tokenize();
60
124
  }
61
125
 
126
+ onChangeType(event, type) {
127
+ this.setState({ type });
128
+ }
129
+
130
+ onChangeFont(event, font) {
131
+ this.setState({ font });
132
+ }
133
+
62
134
  render() {
63
135
  const { classes, onOrderSubmit } = this.props;
64
- const { tokenized } = this.state;
136
+ const { tokenized, type } = this.state;
65
137
 
66
138
  return (
67
139
  <div className={classes.root}>
68
140
  <Card classes={{ root: classes.card }}>
69
141
  <CardContent>
70
- <div id="card-element" className={classes.cardInput} />
142
+ <FormControl>
143
+ <FormLabel>Type</FormLabel>
144
+ <RadioGroup defaultValue="card" row onChange={this.onChangeType}>
145
+ <FormControlLabel value="card" control={<Radio />} label="Card" />
146
+ <FormControlLabel value="separate" control={<Radio />} label="Separate elements" />
147
+ </RadioGroup>
148
+ </FormControl>
149
+ <FormControl>
150
+ <FormLabel>Font</FormLabel>
151
+ <RadioGroup defaultValue="default" row onChange={this.onChangeFont}>
152
+ <FormControlLabel value="default" control={<Radio />} label="Default" />
153
+ <FormControlLabel value="audiowide" control={<Radio />} label="Audiowide" />
154
+ <FormControlLabel value="festive" control={<Radio />} label="Festive" />
155
+ </RadioGroup>
156
+ </FormControl>
157
+ {type === 'card' ? (
158
+ <div id="card-element" className={classes.cardInput} />
159
+ ) : (
160
+ <Fragment>
161
+ <div id="cardNumber-element" className={classes.cardInput} />
162
+ <div id="cardExpiry-element" className={classes.cardInput} />
163
+ <div id="cardCvc-element" className={classes.cardInput} />
164
+ </Fragment>
165
+ )}
71
166
  <div className={classes.submitContainer}>
72
167
  <Button
73
168
  id="stripe-submit-button"
@@ -75,7 +170,7 @@ class Stripe extends React.Component {
75
170
  color="primary"
76
171
  size="small"
77
172
  classes={{ root: classes.button }}
78
- onClick={this.onClickTokenize.bind(this)}
173
+ onClick={this.onClickTokenize}
79
174
  >
80
175
  Tokenize
81
176
  </Button>