@paystack/checkout-js 1.26.0-dev.12 → 1.26.0-dev.14

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/checkout.js CHANGED
@@ -19765,819 +19765,842 @@ var Paystack = (function (exports) {
19765
19765
  return PhoneNumber;
19766
19766
  }();
19767
19767
 
19768
- var MobileMoneyAPI = {
19769
- charge: function charge(_ref) {
19770
- var transaction = _ref.transaction,
19771
- phone = _ref.phone,
19772
- device = _ref.device,
19773
- channelName = _ref.channel_name,
19774
- provider = _ref.provider,
19775
- voucher = _ref.voucher,
19776
- registrationToken = _ref.registrationToken;
19777
- var params = {
19778
- transaction: transaction,
19779
- phone: phone,
19780
- device: device,
19781
- channel_name: channelName,
19782
- provider: provider,
19783
- voucher: voucher,
19784
- registration_token: registrationToken
19785
- };
19786
- var language = getLanguage();
19768
+ var isMobile_1 = isMobile;
19787
19769
 
19788
- var headers = _objectSpread2({}, language && {
19789
- 'Accept-Language': language
19790
- });
19770
+ function isMobile (ua) {
19771
+ if (!ua && typeof navigator != 'undefined') ua = navigator.userAgent;
19772
+ if (ua && ua.headers && typeof ua.headers['user-agent'] == 'string') {
19773
+ ua = ua.headers['user-agent'];
19774
+ }
19775
+ if (typeof ua != 'string') return false;
19791
19776
 
19792
- return axiosInstance.post("".concat(configToUse.paystackApiUrl, "charge/mobile_money"), params, {
19793
- headers: headers
19794
- }).then(function (response) {
19795
- return ChargeResponses.parse(response.data);
19796
- }).catch(function (_ref2) {
19797
- var response = _ref2.response;
19798
- return ChargeResponses.parse(response.data);
19799
- });
19800
- },
19801
- submitCode: function submitCode(_ref3) {
19802
- var transaction = _ref3.transaction,
19803
- code = _ref3.code;
19804
- var language = getLanguage();
19777
+ return /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(ua) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(ua.substr(0,4));
19778
+ }
19805
19779
 
19806
- var headers = _objectSpread2({}, language && {
19807
- 'Accept-Language': language
19808
- });
19780
+ var AnalyticsUtils = {
19781
+ initializeLog: function initializeLog(log) {
19782
+ var _ref = log || {},
19783
+ attempts = _ref.attempts,
19784
+ authentication = _ref.authentication,
19785
+ errors = _ref.errors,
19786
+ history = _ref.history;
19809
19787
 
19810
- var urlEncodedData = formUrlencoded({
19811
- transaction: transaction,
19812
- otp: code
19813
- });
19814
- var url = new URL('charge/momo_payin_finalize', configToUse.paymentBaseUrl).toString();
19815
- return axiosInstance.post(url, urlEncodedData, {
19816
- headers: headers
19817
- }).then(function (response) {
19818
- return ChargeResponses.parse(response.data);
19819
- });
19788
+ return {
19789
+ start_time: Math.round(Date.now() / 1000),
19790
+ time_spent: 0,
19791
+ attempts: attempts || 0,
19792
+ authentication: authentication,
19793
+ errors: errors || 0,
19794
+ success: false,
19795
+ mobile: isMobile_1(),
19796
+ input: [],
19797
+ history: history || []
19798
+ };
19799
+ },
19800
+ getTimeSpent: function getTimeSpent(startTime) {
19801
+ var currentTimeInSeconds = Math.round(Date.now() / 1000);
19802
+ return currentTimeInSeconds - startTime;
19820
19803
  }
19821
19804
  };
19822
19805
 
19823
- function validate$1(phoneNumber) {
19824
- return new Promise(function (resolve, reject) {
19825
- var validation = PhoneNumber.validate(phoneNumber);
19826
-
19827
- if (!validation.isValid) {
19828
- var errorMessage = phoneNumber ? validation.errors[0] : 'Please start a mobile money transaction with Transaction.chargeMobileMoney()';
19829
- reject(Error(errorMessage));
19830
- }
19806
+ var $ = _export;
19807
+ var global$1 = global$R;
19808
+ var getBuiltIn = getBuiltIn$a;
19809
+ var apply = functionApply;
19810
+ var uncurryThis = functionUncurryThis;
19811
+ var fails = fails$t;
19831
19812
 
19832
- resolve(validation);
19833
- });
19834
- }
19813
+ var Array$1 = global$1.Array;
19814
+ var $stringify = getBuiltIn('JSON', 'stringify');
19815
+ var exec = uncurryThis(/./.exec);
19816
+ var charAt = uncurryThis(''.charAt);
19817
+ var charCodeAt = uncurryThis(''.charCodeAt);
19818
+ var replace = uncurryThis(''.replace);
19819
+ var numberToString = uncurryThis(1.0.toString);
19835
19820
 
19836
- var mobileMoney = {};
19821
+ var tester = /[\uD800-\uDFFF]/g;
19822
+ var low = /^[\uD800-\uDBFF]$/;
19823
+ var hi = /^[\uDC00-\uDFFF]$/;
19837
19824
 
19838
- function mobileMoneyChargeAPI(params) {
19839
- var _this = this;
19825
+ var fix = function (match, offset, string) {
19826
+ var prev = charAt(string, offset - 1);
19827
+ var next = charAt(string, offset + 1);
19828
+ if ((exec(low, match) && !exec(hi, next)) || (exec(hi, match) && !exec(low, prev))) {
19829
+ return '\\u' + numberToString(charCodeAt(match, 0), 16);
19830
+ } return match;
19831
+ };
19840
19832
 
19841
- return MobileMoneyAPI.charge(params).then(function (response) {
19842
- if (response.status === 'success') {
19843
- mobileMoney = response;
19833
+ var FORCED = fails(function () {
19834
+ return $stringify('\uDF06\uD834') !== '"\\udf06\\ud834"'
19835
+ || $stringify('\uDEAD') !== '"\\udead"';
19836
+ });
19844
19837
 
19845
- if (response.data && response.data.display && response.data.display.otpSentCount === 1) {
19846
- _this.logTokenRequest('mobile money');
19847
- }
19838
+ if ($stringify) {
19839
+ // `JSON.stringify` method
19840
+ // https://tc39.es/ecma262/#sec-json.stringify
19841
+ // https://github.com/tc39/proposal-well-formed-stringify
19842
+ $({ target: 'JSON', stat: true, forced: FORCED }, {
19843
+ // eslint-disable-next-line no-unused-vars -- required for `.length`
19844
+ stringify: function stringify(it, replacer, space) {
19845
+ for (var i = 0, l = arguments.length, args = Array$1(l); i < l; i++) args[i] = arguments[i];
19846
+ var result = apply($stringify, null, args);
19847
+ return typeof result == 'string' ? replace(result, tester, fix) : result;
19848
19848
  }
19849
-
19850
- return response;
19851
19849
  });
19852
19850
  }
19853
19851
 
19854
- var MobileMoneyCharge = {
19855
- chargeMobileMoney: function chargeMobileMoney(_ref) {
19856
- var _this2 = this;
19857
-
19858
- var phoneNumber = _ref.phoneNumber,
19859
- provider = _ref.provider,
19860
- voucher = _ref.voucher,
19861
- registrationToken = _ref.registrationToken;
19862
- return validate$1(phoneNumber).then(function () {
19863
- _this2.logAttempt('mobile money');
19864
-
19865
- var params = {
19866
- provider: provider,
19867
- voucher: voucher,
19868
- registrationToken: registrationToken,
19869
- transaction: _this2.id,
19870
- phone: phoneNumber,
19871
- device: _this2.deviceFingerprint,
19872
- channel_name: "MOBILE_MONEY_".concat(_this2.id)
19873
- };
19874
- return mobileMoneyChargeAPI(params);
19875
- });
19876
- },
19877
- chargeMpesaOffline: function chargeMpesaOffline(_ref2) {
19878
- var provider = _ref2.provider,
19879
- voucher = _ref2.voucher,
19880
- registrationToken = _ref2.registrationToken;
19881
- this.logAttempt('mobile money');
19882
- var params = {
19883
- provider: provider,
19884
- voucher: voucher,
19885
- registrationToken: registrationToken,
19886
- transaction: this.id,
19887
- device: this.deviceFingerprint,
19888
- channel_name: "MOBILE_MONEY_".concat(this.id)
19889
- };
19890
- return mobileMoneyChargeAPI(params);
19891
- },
19892
- authenticateMobileMoney: function authenticateMobileMoney(payload) {
19893
- var _this3 = this;
19894
-
19895
- var phoneNumber = payload.phoneNumber,
19896
- provider = payload.provider,
19897
- registrationToken = payload.registrationToken;
19898
- return validate$1(phoneNumber).then(function () {
19899
- _this3.logMobileMoneyActions(payload);
19900
-
19901
- var params = {
19902
- provider: provider,
19903
- registrationToken: registrationToken,
19904
- transaction: _this3.id,
19905
- phone: phoneNumber,
19906
- device: _this3.deviceFingerprint,
19907
- channel_name: "MOBILE_MONEY_".concat(_this3.id)
19908
- };
19909
- return MobileMoneyAPI.charge(params).then(function (response) {
19910
- if (response.status === 'success') {
19911
- mobileMoney = response;
19912
-
19913
- if (response.data && response.data.display && response.data.display.otpSentCount === 1) {
19914
- _this3.logTokenRequest('mobile money');
19915
- }
19916
- } else if (response.errors && response.errors.data && response.errors.data.status === 'awaiting_registration_token') {
19917
- _this3.logTokenAuthenticationFailure(response.message);
19918
- } else {
19919
- _this3.logError(response.message);
19920
- }
19852
+ var AnalyticsAPIUtils = {
19853
+ saveLog: function saveLog(url, _ref) {
19854
+ var merchantKey = _ref.merchantKey,
19855
+ log = _ref.log;
19856
+ var language = getLanguage();
19921
19857
 
19922
- return response;
19923
- });
19858
+ var headers = _objectSpread2({
19859
+ Authorization: "Bearer ".concat(merchantKey)
19860
+ }, language && {
19861
+ 'Accept-Language': language
19924
19862
  });
19925
- },
19926
- submitMobileMoneyCode: function submitMobileMoneyCode(payload) {
19927
- var _this4 = this;
19928
19863
 
19929
- return MobileMoneyAPI.submitCode({
19930
- code: payload.code,
19931
- transaction: this.id
19864
+ return axiosInstance.post(url, {
19865
+ payload: JSON.stringify(log)
19866
+ }, {
19867
+ headers: headers
19932
19868
  }).then(function (response) {
19933
- _this4.logAPIResponse(response, 'mobile_money');
19934
-
19935
- return response;
19869
+ return response.data;
19936
19870
  });
19937
19871
  },
19938
- listenForMobileMoneyCharge: function listenForMobileMoneyCharge(callback) {
19939
- if (mobileMoney.status !== 'success') {
19940
- return Promise.reject(Error('Please start a mobile money charge with Transaction.chargeMobileMoney()'));
19941
- }
19942
-
19943
- var _mobileMoney$data = mobileMoney.data,
19944
- channel = _mobileMoney$data.channel,
19945
- channelName = _mobileMoney$data.channel_name;
19946
- var listenerOptions = {
19947
- channel: channel || channelName,
19948
- paymentMethod: 'mobile_money'
19949
- };
19950
- return this.listenForCharge(listenerOptions, callback);
19951
- }
19952
- };
19953
-
19954
- var DirectDebitAPI = {
19955
- loginToDirectDebitAccount: function loginToDirectDebitAccount(_ref) {
19956
- var email = _ref.email,
19957
- password = _ref.password;
19958
- var params = {
19959
- email: email,
19960
- password: password
19961
- };
19872
+ getIp: function getIp() {
19873
+ var url = 'https://api.paystack.co/decision/ip';
19962
19874
  var language = getLanguage();
19963
19875
 
19964
19876
  var headers = _objectSpread2({}, language && {
19965
19877
  'Accept-Language': language
19966
19878
  });
19967
19879
 
19968
- return axiosInstance.post("".concat(configToUse.paystackApiUrl, "login"), params, {
19880
+ return axiosInstance.get(url, {
19969
19881
  headers: headers
19970
19882
  }).then(function (response) {
19971
- return ChargeResponses.parse(response.data);
19883
+ return response.data.data.ip_address;
19972
19884
  });
19973
19885
  },
19974
- charge: function charge(_ref2) {
19975
- var accountCode = _ref2.account_code,
19976
- transaction = _ref2.transaction,
19977
- token = _ref2.token;
19886
+ saveIp: function saveIp(url, _ref2) {
19887
+ var merchantKey = _ref2.merchantKey;
19978
19888
  var language = getLanguage();
19979
19889
 
19980
19890
  var headers = _objectSpread2({
19981
- Authorization: "Bearer ".concat(token),
19982
- 'jwt-auth': true
19891
+ Authorization: "Bearer ".concat(merchantKey)
19983
19892
  }, language && {
19984
19893
  'Accept-Language': language
19985
19894
  });
19986
19895
 
19987
- var params = {
19988
- account_code: accountCode,
19989
- transaction: transaction
19990
- };
19991
- return axiosInstance.post("".concat(configToUse.paystackApiUrl, "directdebit/initiate"), params, {
19896
+ return axiosInstance.post(url, null, {
19992
19897
  headers: headers
19993
19898
  }).then(function (response) {
19994
- return ChargeResponses.parse(response.data);
19899
+ return response.data;
19995
19900
  });
19996
19901
  },
19997
- authenticate: function authenticate(_ref3) {
19998
- var otp = _ref3.otp,
19999
- transaction = _ref3.transaction,
20000
- token = _ref3.token;
19902
+ saveReferrer: function saveReferrer(url, _ref3) {
19903
+ var merchantKey = _ref3.merchantKey,
19904
+ referrer = _ref3.referrer;
20001
19905
  var language = getLanguage();
20002
19906
 
20003
19907
  var headers = _objectSpread2({
20004
- Authorization: "Bearer ".concat(token),
20005
- 'jwt-auth': true
19908
+ Authorization: "Bearer ".concat(merchantKey)
20006
19909
  }, language && {
20007
19910
  'Accept-Language': language
20008
19911
  });
20009
19912
 
20010
- var params = {
20011
- otp: otp,
20012
- transaction: transaction
20013
- };
20014
- return axiosInstance.post("".concat(configToUse.paystackApiUrl, "directdebit/validate"), params, {
19913
+ return axiosInstance.post(url, {
19914
+ referrer: referrer
19915
+ }, {
20015
19916
  headers: headers
20016
19917
  }).then(function (response) {
20017
- return ChargeResponses.parse(response.data);
19918
+ return response.data;
20018
19919
  });
20019
- },
20020
- getProvisionedAccounts: function getProvisionedAccounts(token) {
20021
- var language = getLanguage();
19920
+ }
19921
+ };
20022
19922
 
20023
- var headers = _objectSpread2({
20024
- Authorization: "Bearer ".concat(token),
20025
- 'jwt-auth': true
20026
- }, language && {
20027
- 'Accept-Language': language
19923
+ var AnalyticsAPI = {
19924
+ saveLog: function saveLog(transactionId, merchantKey, log) {
19925
+ var url = new URL("transaction/update_log/".concat(transactionId), configToUse.paystackApiUrl).toString();
19926
+ return AnalyticsAPIUtils.saveLog(url, {
19927
+ merchantKey: merchantKey,
19928
+ log: log
20028
19929
  });
20029
-
20030
- return axiosInstance.get("".concat(configToUse.paystackApiUrl, "directdebit/account"), {
20031
- headers: headers
20032
- }).then(function (response) {
20033
- return response.data;
19930
+ },
19931
+ getIp: function getIp() {
19932
+ return AnalyticsAPIUtils.getIp();
19933
+ },
19934
+ saveIp: function saveIp(transactionId, merchantKey) {
19935
+ var url = new URL("transaction/set_ip/".concat(transactionId), configToUse.paystackApiUrl).toString();
19936
+ return AnalyticsAPIUtils.saveIp(url, {
19937
+ merchantKey: merchantKey
19938
+ });
19939
+ },
19940
+ saveReferrer: function saveReferrer(transactionId, merchantKey, referrer) {
19941
+ var url = new URL("transaction/set_referrer/".concat(transactionId), configToUse.paystackApiUrl).toString();
19942
+ return AnalyticsAPIUtils.saveReferrer(url, {
19943
+ merchantKey: merchantKey,
19944
+ referrer: referrer
20034
19945
  });
20035
19946
  }
20036
19947
  };
20037
19948
 
20038
- var paymentMethod$1 = 'direct debit';
20039
- var DirectDebitCharge = {
20040
- loginToDirectDebitAccount: function loginToDirectDebitAccount(_ref) {
19949
+ var AnalyticsFunctions$1 = {
19950
+ initializeLog: function initializeLog(log) {
19951
+ this.log = AnalyticsUtils.initializeLog(log);
19952
+ },
19953
+ getTimeSpent: function getTimeSpent() {
19954
+ this.log.time_spent = AnalyticsUtils.getTimeSpent(this.log.start_time);
19955
+ return this.log.time_spent;
19956
+ },
19957
+ logPageOpen: function logPageOpen() {
19958
+ this.log.history.push({
19959
+ type: 'open',
19960
+ message: 'Opened checkout',
19961
+ time: this.getTimeSpent()
19962
+ });
19963
+ return this.saveLog();
19964
+ },
19965
+ logChannelSwitch: function logChannelSwitch(value) {
19966
+ this.log.history.push({
19967
+ type: 'action',
19968
+ message: "Set payment method to: ".concat(value),
19969
+ time: this.getTimeSpent()
19970
+ });
19971
+ return this.saveLog();
19972
+ },
19973
+ logValidationErrors: function logValidationErrors(inputs) {
20041
19974
  var _this = this;
20042
19975
 
20043
- var email = _ref.email,
20044
- password = _ref.password;
20045
- var params = {
20046
- email: email,
20047
- password: password
20048
- };
20049
-
20050
- if (!isValidEmail(email)) {
20051
- return Promise.reject(Error('Invalid email'));
20052
- }
20053
-
20054
- return DirectDebitAPI.loginToDirectDebitAccount(params).then(function (response) {
20055
- if (response.status === 'success') {
20056
- var _response$data = response.data,
20057
- token = _response$data.token,
20058
- permissions = _response$data.user.permissions;
20059
-
20060
- if (!permissions || permissions.length < 1) {
20061
- throw Error('You do not have the privileges to perform this action');
20062
- }
20063
-
20064
- if (permissions.find(function (permission) {
20065
- return permission === 'directdebit-*';
20066
- })) {
20067
- _this.directDebit.token = token;
20068
- return response;
20069
- }
20070
-
20071
- throw Error('You do not have the privileges to perform this action');
20072
- }
20073
-
20074
- return response;
19976
+ inputs.forEach(function (input) {
19977
+ _this.log.history.push({
19978
+ type: 'error',
19979
+ message: "Invalid ".concat(input),
19980
+ time: _this.getTimeSpent()
19981
+ });
20075
19982
  });
19983
+ return this.saveLog();
20076
19984
  },
20077
- chargeDirectDebit: function chargeDirectDebit(accountCode) {
20078
- var _this2 = this;
20079
-
20080
- if (!this.directDebit.token) {
20081
- return Promise.reject(Error('Please login with Transaction.loginToDirectDebitAccount() to start a Direct debit charge'));
20082
- }
20083
-
20084
- this.logAttempt(paymentMethod$1);
20085
- var params = {
20086
- account_code: accountCode,
20087
- transaction: this.id,
20088
- token: this.directDebit.token
20089
- };
20090
- return DirectDebitAPI.charge(params).then(function (response) {
20091
- _this2.logAPIResponse(response, paymentMethod$1);
20092
-
20093
- if (response.status) {
20094
- _this2.directDebit.chargeResponse = response;
20095
- }
20096
-
20097
- return response;
19985
+ logInput: function logInput(value) {
19986
+ var isUpdate = this.log.history.find(function (item) {
19987
+ return item.message === "Filled this field: ".concat(value);
19988
+ });
19989
+ this.log.history.push({
19990
+ type: 'input',
19991
+ message: "".concat(isUpdate ? 'Changed' : 'Filled', " this field: ").concat(value),
19992
+ time: this.getTimeSpent()
20098
19993
  });
19994
+ return this.saveLog();
20099
19995
  },
20100
- getProvisionedAccounts: function getProvisionedAccounts() {
20101
- var _this3 = this;
19996
+ logBankSelect: function logBankSelect(value) {
19997
+ this.log.history.push({
19998
+ type: 'action',
19999
+ message: "Selected bank: ".concat(value),
20000
+ time: this.getTimeSpent()
20001
+ });
20002
+ return this.saveLog();
20003
+ },
20004
+ logSavedCardSelect: function logSavedCardSelect() {
20005
+ this.log.history.push({
20006
+ type: 'action',
20007
+ message: 'Selected saved card',
20008
+ time: this.getTimeSpent()
20009
+ });
20010
+ return this.saveLog();
20011
+ },
20012
+ logAuthWindowOpen: function logAuthWindowOpen() {
20013
+ this.log.history.push({
20014
+ type: 'action',
20015
+ message: 'Third-party authentication window opened',
20016
+ time: this.getTimeSpent()
20017
+ });
20018
+ return this.saveLog();
20019
+ },
20020
+ logAuthWindowClose: function logAuthWindowClose() {
20021
+ this.log.history.push({
20022
+ type: 'action',
20023
+ message: 'Third-party authentication window closed',
20024
+ time: this.getTimeSpent()
20025
+ });
20026
+ return this.saveLog();
20027
+ },
20028
+ logAPIResponse: function logAPIResponse(response, channel) {
20029
+ switch (response.status) {
20030
+ case 'success':
20031
+ return this.logSuccess(channel);
20102
20032
 
20103
- return DirectDebitAPI.getProvisionedAccounts(this.directDebit.token).then(function (response) {
20104
- _this3.logAPIResponse(response, paymentMethod$1);
20033
+ case 'pending':
20034
+ return this.logPending(channel);
20105
20035
 
20106
- var status = response.status,
20107
- data = response.data;
20036
+ case 'failed':
20037
+ return this.logError(response.message);
20108
20038
 
20109
- if (status) {
20110
- if (data && data.length < 1) {
20111
- return Promise.reject(Error('You have not provisioned any bank account for Direct Debit yet'));
20112
- }
20039
+ case 'auth':
20040
+ return this.logAuth(response.data.auth);
20113
20041
 
20114
- _this3.directDebit.accounts = response.data;
20115
- }
20042
+ default:
20043
+ return false;
20044
+ }
20045
+ },
20046
+ logMobileMoneyActions: function logMobileMoneyActions(_ref) {
20047
+ var numberOfTokenRequests = _ref.numberOfTokenRequests,
20048
+ registrationToken = _ref.registrationToken;
20116
20049
 
20117
- return response;
20050
+ if (numberOfTokenRequests) {
20051
+ this.logTokenRequest('mobile money', numberOfTokenRequests);
20052
+ } else if (registrationToken) {
20053
+ this.logTokenSubmitted('mobile money');
20054
+ } else {
20055
+ this.logAttempt('mobile money');
20056
+ }
20057
+ },
20058
+ logAPIResponseMessage: function logAPIResponseMessage(message) {
20059
+ this.log.history.push({
20060
+ type: 'action',
20061
+ message: message,
20062
+ time: this.getTimeSpent()
20118
20063
  });
20064
+ return this.saveLog();
20119
20065
  },
20120
- authenticateAccount: function authenticateAccount(otp) {
20121
- var _this4 = this;
20066
+ logAttempt: function logAttempt(channel) {
20067
+ var message = 'Attempted to pay';
20122
20068
 
20123
- var params = {
20124
- otp: otp,
20125
- transaction: this.id,
20126
- token: this.directDebit.token
20127
- };
20128
- return DirectDebitAPI.authenticate(params).then(function (response) {
20129
- _this4.logAPIResponse(response, paymentMethod$1);
20069
+ if (channel) {
20070
+ message += " with ".concat(channel);
20071
+ }
20130
20072
 
20131
- return response;
20073
+ this.log.attempts += 1;
20074
+ this.log.history.push({
20075
+ type: 'action',
20076
+ message: message,
20077
+ time: this.getTimeSpent()
20132
20078
  });
20133
- }
20134
- };
20135
-
20136
- var ChargeFunctions = {
20137
- get: function get(channel) {
20138
- var chargeFunctions = {
20139
- card: CardCharge,
20140
- bank: BankAccountCharge,
20141
- ussd: USSDCharge,
20142
- qr: QRCharge,
20143
- mobile_money: MobileMoneyCharge,
20144
- direct_debit: DirectDebitCharge,
20145
- bank_transfer: PayWithTransferCharge,
20146
- eft: EFT,
20147
- payattitude: PayattitudeCharge,
20148
- apple_pay: ApplePayCharge,
20149
- paypal: PayPalCharge
20150
- };
20151
- return chargeFunctions[channel];
20152
- }
20153
- };
20154
-
20155
- var isMobile_1 = isMobile;
20156
-
20157
- function isMobile (ua) {
20158
- if (!ua && typeof navigator != 'undefined') ua = navigator.userAgent;
20159
- if (ua && ua.headers && typeof ua.headers['user-agent'] == 'string') {
20160
- ua = ua.headers['user-agent'];
20161
- }
20162
- if (typeof ua != 'string') return false;
20163
-
20164
- return /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(ua) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(ua.substr(0,4));
20165
- }
20079
+ return this.saveLog();
20080
+ },
20081
+ logTokenRequest: function logTokenRequest(channel) {
20082
+ var numberOfTokenRequests = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
20083
+ var message = numberOfTokenRequests === 0 ? 'Waiting for customer to submit OTP' : 'Customer requested to resend OTP';
20084
+ this.log.history.push({
20085
+ type: 'action',
20086
+ message: message,
20087
+ channel: channel,
20088
+ time: this.getTimeSpent()
20089
+ });
20090
+ return this.saveLog();
20091
+ },
20092
+ logTokenSubmitted: function logTokenSubmitted(channel) {
20093
+ var message = 'Customer submitted OTP';
20094
+ this.log.history.push({
20095
+ type: 'action',
20096
+ message: message,
20097
+ channel: channel,
20098
+ time: this.getTimeSpent()
20099
+ });
20100
+ return this.saveLog();
20101
+ },
20102
+ logTokenAuthenticationFailure: function logTokenAuthenticationFailure(error) {
20103
+ var message = error ? "Error: ".concat(error) : 'Error';
20104
+ this.log.errors += 1;
20105
+ this.log.history.push({
20106
+ type: 'error',
20107
+ message: message,
20108
+ authentication: 'failed',
20109
+ time: this.getTimeSpent()
20110
+ });
20111
+ return this.saveLog();
20112
+ },
20113
+ logError: function logError(error) {
20114
+ var message = 'Error';
20166
20115
 
20167
- var AnalyticsUtils = {
20168
- initializeLog: function initializeLog(log) {
20169
- var _ref = log || {},
20170
- attempts = _ref.attempts,
20171
- authentication = _ref.authentication,
20172
- errors = _ref.errors,
20173
- history = _ref.history;
20116
+ if (error) {
20117
+ message += ": ".concat(error);
20118
+ }
20174
20119
 
20175
- return {
20176
- start_time: Math.round(Date.now() / 1000),
20177
- time_spent: 0,
20178
- attempts: attempts || 0,
20179
- authentication: authentication,
20180
- errors: errors || 0,
20181
- success: false,
20182
- mobile: isMobile_1(),
20183
- input: [],
20184
- history: history || []
20185
- };
20120
+ this.log.errors += 1;
20121
+ this.log.history.push({
20122
+ type: 'error',
20123
+ message: message,
20124
+ time: this.getTimeSpent()
20125
+ });
20126
+ return this.saveLog();
20186
20127
  },
20187
- getTimeSpent: function getTimeSpent(startTime) {
20188
- var currentTimeInSeconds = Math.round(Date.now() / 1000);
20189
- return currentTimeInSeconds - startTime;
20190
- }
20191
- };
20128
+ logAuth: function logAuth(value) {
20129
+ this.log.authentication = value;
20130
+ this.log.history.push({
20131
+ type: 'auth',
20132
+ message: "Authentication Required: ".concat(value),
20133
+ time: this.getTimeSpent()
20134
+ });
20135
+ return this.saveLog();
20136
+ },
20137
+ logSuccess: function logSuccess(channel) {
20138
+ var message = 'Successfully paid';
20192
20139
 
20193
- var $ = _export;
20194
- var global$1 = global$R;
20195
- var getBuiltIn = getBuiltIn$a;
20196
- var apply = functionApply;
20197
- var uncurryThis = functionUncurryThis;
20198
- var fails = fails$t;
20140
+ if (channel) {
20141
+ message += " with ".concat(channel);
20142
+ }
20199
20143
 
20200
- var Array$1 = global$1.Array;
20201
- var $stringify = getBuiltIn('JSON', 'stringify');
20202
- var exec = uncurryThis(/./.exec);
20203
- var charAt = uncurryThis(''.charAt);
20204
- var charCodeAt = uncurryThis(''.charCodeAt);
20205
- var replace = uncurryThis(''.replace);
20206
- var numberToString = uncurryThis(1.0.toString);
20144
+ this.log.success = true;
20145
+ this.log.history.push({
20146
+ type: 'success',
20147
+ message: message,
20148
+ time: this.getTimeSpent()
20149
+ });
20150
+ return this.saveLog();
20151
+ },
20152
+ logPending: function logPending(channel) {
20153
+ var message = 'Payment in progress';
20207
20154
 
20208
- var tester = /[\uD800-\uDFFF]/g;
20209
- var low = /^[\uD800-\uDBFF]$/;
20210
- var hi = /^[\uDC00-\uDFFF]$/;
20155
+ if (channel) {
20156
+ message += " with ".concat(channel);
20157
+ }
20211
20158
 
20212
- var fix = function (match, offset, string) {
20213
- var prev = charAt(string, offset - 1);
20214
- var next = charAt(string, offset + 1);
20215
- if ((exec(low, match) && !exec(hi, next)) || (exec(hi, match) && !exec(low, prev))) {
20216
- return '\\u' + numberToString(charCodeAt(match, 0), 16);
20217
- } return match;
20159
+ this.log.history.push({
20160
+ type: 'pending',
20161
+ message: message,
20162
+ time: this.getTimeSpent()
20163
+ });
20164
+ return this.saveLog();
20165
+ },
20166
+ logPageClose: function logPageClose() {
20167
+ this.log.history.push({
20168
+ type: 'close',
20169
+ message: 'Closed checkout',
20170
+ time: this.getTimeSpent()
20171
+ });
20172
+ return this.saveLog();
20173
+ },
20174
+ logTransactionCurrencySwitch: function logTransactionCurrencySwitch(_ref2) {
20175
+ var currency = _ref2.currency,
20176
+ _ref2$isUserAction = _ref2.isUserAction,
20177
+ isUserAction = _ref2$isUserAction === void 0 ? true : _ref2$isUserAction;
20178
+ var prefix = isUserAction ? 'User switched' : 'Switched';
20179
+ this.log.history.push({
20180
+ type: 'action',
20181
+ message: "".concat(prefix, " transaction currency to ").concat(currency),
20182
+ time: this.getTimeSpent()
20183
+ });
20184
+ return this.saveLog();
20185
+ },
20186
+ saveLog: function saveLog() {
20187
+ return AnalyticsAPI.saveLog(this.id, this.merchant.key, this.log);
20188
+ },
20189
+ saveIpAddress: function saveIpAddress() {
20190
+ return AnalyticsAPI.saveIp(this.id, this.merchant.key);
20191
+ },
20192
+ saveReferrer: function saveReferrer(referrer) {
20193
+ return AnalyticsAPI.saveReferrer(this.id, this.merchant.key, referrer);
20194
+ }
20218
20195
  };
20219
20196
 
20220
- var FORCED = fails(function () {
20221
- return $stringify('\uDF06\uD834') !== '"\\udf06\\ud834"'
20222
- || $stringify('\uDEAD') !== '"\\udead"';
20223
- });
20224
-
20225
- if ($stringify) {
20226
- // `JSON.stringify` method
20227
- // https://tc39.es/ecma262/#sec-json.stringify
20228
- // https://github.com/tc39/proposal-well-formed-stringify
20229
- $({ target: 'JSON', stat: true, forced: FORCED }, {
20230
- // eslint-disable-next-line no-unused-vars -- required for `.length`
20231
- stringify: function stringify(it, replacer, space) {
20232
- for (var i = 0, l = arguments.length, args = Array$1(l); i < l; i++) args[i] = arguments[i];
20233
- var result = apply($stringify, null, args);
20234
- return typeof result == 'string' ? replace(result, tester, fix) : result;
20235
- }
20236
- });
20237
- }
20238
-
20239
- var AnalyticsAPIUtils = {
20240
- saveLog: function saveLog(url, _ref) {
20241
- var merchantKey = _ref.merchantKey,
20242
- log = _ref.log;
20197
+ var MobileMoneyAPI = {
20198
+ charge: function charge(_ref) {
20199
+ var transaction = _ref.transaction,
20200
+ phone = _ref.phone,
20201
+ device = _ref.device,
20202
+ channelName = _ref.channel_name,
20203
+ provider = _ref.provider,
20204
+ voucher = _ref.voucher,
20205
+ registrationToken = _ref.registrationToken;
20206
+ var params = {
20207
+ transaction: transaction,
20208
+ phone: phone,
20209
+ device: device,
20210
+ channel_name: channelName,
20211
+ provider: provider,
20212
+ voucher: voucher,
20213
+ registration_token: registrationToken
20214
+ };
20243
20215
  var language = getLanguage();
20244
20216
 
20245
- var headers = _objectSpread2({
20246
- Authorization: "Bearer ".concat(merchantKey)
20247
- }, language && {
20217
+ var headers = _objectSpread2({}, language && {
20248
20218
  'Accept-Language': language
20249
20219
  });
20250
20220
 
20251
- return axiosInstance.post(url, {
20252
- payload: JSON.stringify(log)
20253
- }, {
20221
+ return axiosInstance.post("".concat(configToUse.paystackApiUrl, "charge/mobile_money"), params, {
20254
20222
  headers: headers
20255
20223
  }).then(function (response) {
20256
- return response.data;
20224
+ return ChargeResponses.parse(response.data);
20225
+ }).catch(function (_ref2) {
20226
+ var response = _ref2.response;
20227
+ return ChargeResponses.parse(response.data);
20257
20228
  });
20258
20229
  },
20259
- getIp: function getIp() {
20260
- var url = 'https://api.paystack.co/decision/ip';
20230
+ submitCode: function submitCode(_ref3) {
20231
+ var transaction = _ref3.transaction,
20232
+ code = _ref3.code;
20261
20233
  var language = getLanguage();
20262
20234
 
20263
20235
  var headers = _objectSpread2({}, language && {
20264
20236
  'Accept-Language': language
20265
20237
  });
20266
20238
 
20267
- return axiosInstance.get(url, {
20239
+ var urlEncodedData = formUrlencoded({
20240
+ transaction: transaction,
20241
+ otp: code
20242
+ });
20243
+ var url = new URL('charge/momo_payin_finalize', configToUse.paymentBaseUrl).toString();
20244
+ return axiosInstance.post(url, urlEncodedData, {
20268
20245
  headers: headers
20269
20246
  }).then(function (response) {
20270
- return response.data.data.ip_address;
20247
+ return ChargeResponses.parse(response.data);
20271
20248
  });
20272
- },
20273
- saveIp: function saveIp(url, _ref2) {
20274
- var merchantKey = _ref2.merchantKey;
20275
- var language = getLanguage();
20276
-
20277
- var headers = _objectSpread2({
20278
- Authorization: "Bearer ".concat(merchantKey)
20279
- }, language && {
20249
+ }
20250
+ };
20251
+
20252
+ function validate$1(phoneNumber) {
20253
+ return new Promise(function (resolve, reject) {
20254
+ var validation = PhoneNumber.validate(phoneNumber);
20255
+
20256
+ if (!validation.isValid) {
20257
+ var errorMessage = phoneNumber ? validation.errors[0] : 'Please start a mobile money transaction with Transaction.chargeMobileMoney()';
20258
+ reject(Error(errorMessage));
20259
+ }
20260
+
20261
+ resolve(validation);
20262
+ });
20263
+ }
20264
+
20265
+ var mobileMoney = {};
20266
+
20267
+ function mobileMoneyChargeAPI(params) {
20268
+ return MobileMoneyAPI.charge(params).then( /*#__PURE__*/function () {
20269
+ var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(response) {
20270
+ return regeneratorRuntime.wrap(function _callee$(_context) {
20271
+ while (1) {
20272
+ switch (_context.prev = _context.next) {
20273
+ case 0:
20274
+ if (!(response.status === 'success')) {
20275
+ _context.next = 5;
20276
+ break;
20277
+ }
20278
+
20279
+ mobileMoney = response;
20280
+
20281
+ if (!(response.data && response.data.display && response.data.display.otpSentCount === 1)) {
20282
+ _context.next = 5;
20283
+ break;
20284
+ }
20285
+
20286
+ _context.next = 5;
20287
+ return AnalyticsFunctions$1.logTokenRequest('mobile money');
20288
+
20289
+ case 5:
20290
+ return _context.abrupt("return", response);
20291
+
20292
+ case 6:
20293
+ case "end":
20294
+ return _context.stop();
20295
+ }
20296
+ }
20297
+ }, _callee);
20298
+ }));
20299
+
20300
+ return function (_x) {
20301
+ return _ref.apply(this, arguments);
20302
+ };
20303
+ }());
20304
+ }
20305
+
20306
+ var MobileMoneyCharge = {
20307
+ chargeMobileMoney: function chargeMobileMoney(_ref2) {
20308
+ var _this = this;
20309
+
20310
+ var phoneNumber = _ref2.phoneNumber,
20311
+ provider = _ref2.provider,
20312
+ voucher = _ref2.voucher,
20313
+ registrationToken = _ref2.registrationToken;
20314
+ return validate$1(phoneNumber).then(function () {
20315
+ _this.logAttempt('mobile money');
20316
+
20317
+ var params = {
20318
+ provider: provider,
20319
+ voucher: voucher,
20320
+ registrationToken: registrationToken,
20321
+ transaction: _this.id,
20322
+ phone: phoneNumber,
20323
+ device: _this.deviceFingerprint,
20324
+ channel_name: "MOBILE_MONEY_".concat(_this.id)
20325
+ };
20326
+ return mobileMoneyChargeAPI(params);
20327
+ });
20328
+ },
20329
+ chargeMpesaOffline: function chargeMpesaOffline(_ref3) {
20330
+ var provider = _ref3.provider,
20331
+ voucher = _ref3.voucher,
20332
+ registrationToken = _ref3.registrationToken;
20333
+ this.logAttempt('mobile money');
20334
+ var params = {
20335
+ provider: provider,
20336
+ voucher: voucher,
20337
+ registrationToken: registrationToken,
20338
+ transaction: this.id,
20339
+ device: this.deviceFingerprint,
20340
+ channel_name: "MOBILE_MONEY_".concat(this.id)
20341
+ };
20342
+ return mobileMoneyChargeAPI(params);
20343
+ },
20344
+ authenticateMobileMoney: function authenticateMobileMoney(payload) {
20345
+ var _this2 = this;
20346
+
20347
+ var phoneNumber = payload.phoneNumber,
20348
+ provider = payload.provider,
20349
+ registrationToken = payload.registrationToken;
20350
+ return validate$1(phoneNumber).then(function () {
20351
+ _this2.logMobileMoneyActions(payload);
20352
+
20353
+ var params = {
20354
+ provider: provider,
20355
+ registrationToken: registrationToken,
20356
+ transaction: _this2.id,
20357
+ phone: phoneNumber,
20358
+ device: _this2.deviceFingerprint,
20359
+ channel_name: "MOBILE_MONEY_".concat(_this2.id)
20360
+ };
20361
+ return MobileMoneyAPI.charge(params).then(function (response) {
20362
+ if (response.status === 'success') {
20363
+ mobileMoney = response;
20364
+
20365
+ if (response.data && response.data.display && response.data.display.otpSentCount === 1) {
20366
+ _this2.logTokenRequest('mobile money');
20367
+ }
20368
+ } else if (response.errors && response.errors.data && response.errors.data.status === 'awaiting_registration_token') {
20369
+ _this2.logTokenAuthenticationFailure(response.message);
20370
+ } else {
20371
+ _this2.logError(response.message);
20372
+ }
20373
+
20374
+ return response;
20375
+ });
20376
+ });
20377
+ },
20378
+ submitMobileMoneyCode: function submitMobileMoneyCode(payload) {
20379
+ var _this3 = this;
20380
+
20381
+ return MobileMoneyAPI.submitCode({
20382
+ code: payload.code,
20383
+ transaction: this.id
20384
+ }).then(function (response) {
20385
+ _this3.logAPIResponse(response, 'mobile_money');
20386
+
20387
+ return response;
20388
+ });
20389
+ },
20390
+ listenForMobileMoneyCharge: function listenForMobileMoneyCharge(callback) {
20391
+ if (mobileMoney.status !== 'success') {
20392
+ return Promise.reject(Error('Please start a mobile money charge with Transaction.chargeMobileMoney()'));
20393
+ }
20394
+
20395
+ var _mobileMoney$data = mobileMoney.data,
20396
+ channel = _mobileMoney$data.channel,
20397
+ channelName = _mobileMoney$data.channel_name;
20398
+ var listenerOptions = {
20399
+ channel: channel || channelName,
20400
+ paymentMethod: 'mobile_money'
20401
+ };
20402
+ return this.listenForCharge(listenerOptions, callback);
20403
+ }
20404
+ };
20405
+
20406
+ var DirectDebitAPI = {
20407
+ loginToDirectDebitAccount: function loginToDirectDebitAccount(_ref) {
20408
+ var email = _ref.email,
20409
+ password = _ref.password;
20410
+ var params = {
20411
+ email: email,
20412
+ password: password
20413
+ };
20414
+ var language = getLanguage();
20415
+
20416
+ var headers = _objectSpread2({}, language && {
20280
20417
  'Accept-Language': language
20281
20418
  });
20282
20419
 
20283
- return axiosInstance.post(url, null, {
20420
+ return axiosInstance.post("".concat(configToUse.paystackApiUrl, "login"), params, {
20284
20421
  headers: headers
20285
20422
  }).then(function (response) {
20286
- return response.data;
20423
+ return ChargeResponses.parse(response.data);
20287
20424
  });
20288
20425
  },
20289
- saveReferrer: function saveReferrer(url, _ref3) {
20290
- var merchantKey = _ref3.merchantKey,
20291
- referrer = _ref3.referrer;
20426
+ charge: function charge(_ref2) {
20427
+ var accountCode = _ref2.account_code,
20428
+ transaction = _ref2.transaction,
20429
+ token = _ref2.token;
20292
20430
  var language = getLanguage();
20293
20431
 
20294
20432
  var headers = _objectSpread2({
20295
- Authorization: "Bearer ".concat(merchantKey)
20433
+ Authorization: "Bearer ".concat(token),
20434
+ 'jwt-auth': true
20296
20435
  }, language && {
20297
20436
  'Accept-Language': language
20298
20437
  });
20299
20438
 
20300
- return axiosInstance.post(url, {
20301
- referrer: referrer
20302
- }, {
20439
+ var params = {
20440
+ account_code: accountCode,
20441
+ transaction: transaction
20442
+ };
20443
+ return axiosInstance.post("".concat(configToUse.paystackApiUrl, "directdebit/initiate"), params, {
20303
20444
  headers: headers
20304
20445
  }).then(function (response) {
20305
- return response.data;
20446
+ return ChargeResponses.parse(response.data);
20306
20447
  });
20307
- }
20308
- };
20448
+ },
20449
+ authenticate: function authenticate(_ref3) {
20450
+ var otp = _ref3.otp,
20451
+ transaction = _ref3.transaction,
20452
+ token = _ref3.token;
20453
+ var language = getLanguage();
20309
20454
 
20310
- var AnalyticsAPI = {
20311
- saveLog: function saveLog(transactionId, merchantKey, log) {
20312
- var url = new URL("transaction/update_log/".concat(transactionId), configToUse.paystackApiUrl).toString();
20313
- return AnalyticsAPIUtils.saveLog(url, {
20314
- merchantKey: merchantKey,
20315
- log: log
20455
+ var headers = _objectSpread2({
20456
+ Authorization: "Bearer ".concat(token),
20457
+ 'jwt-auth': true
20458
+ }, language && {
20459
+ 'Accept-Language': language
20316
20460
  });
20317
- },
20318
- getIp: function getIp() {
20319
- return AnalyticsAPIUtils.getIp();
20320
- },
20321
- saveIp: function saveIp(transactionId, merchantKey) {
20322
- var url = new URL("transaction/set_ip/".concat(transactionId), configToUse.paystackApiUrl).toString();
20323
- return AnalyticsAPIUtils.saveIp(url, {
20324
- merchantKey: merchantKey
20461
+
20462
+ var params = {
20463
+ otp: otp,
20464
+ transaction: transaction
20465
+ };
20466
+ return axiosInstance.post("".concat(configToUse.paystackApiUrl, "directdebit/validate"), params, {
20467
+ headers: headers
20468
+ }).then(function (response) {
20469
+ return ChargeResponses.parse(response.data);
20325
20470
  });
20326
20471
  },
20327
- saveReferrer: function saveReferrer(transactionId, merchantKey, referrer) {
20328
- var url = new URL("transaction/set_referrer/".concat(transactionId), configToUse.paystackApiUrl).toString();
20329
- return AnalyticsAPIUtils.saveReferrer(url, {
20330
- merchantKey: merchantKey,
20331
- referrer: referrer
20472
+ getProvisionedAccounts: function getProvisionedAccounts(token) {
20473
+ var language = getLanguage();
20474
+
20475
+ var headers = _objectSpread2({
20476
+ Authorization: "Bearer ".concat(token),
20477
+ 'jwt-auth': true
20478
+ }, language && {
20479
+ 'Accept-Language': language
20480
+ });
20481
+
20482
+ return axiosInstance.get("".concat(configToUse.paystackApiUrl, "directdebit/account"), {
20483
+ headers: headers
20484
+ }).then(function (response) {
20485
+ return response.data;
20332
20486
  });
20333
20487
  }
20334
20488
  };
20335
20489
 
20336
- var AnalyticsFunctions$1 = {
20337
- initializeLog: function initializeLog(log) {
20338
- this.log = AnalyticsUtils.initializeLog(log);
20339
- },
20340
- getTimeSpent: function getTimeSpent() {
20341
- this.log.time_spent = AnalyticsUtils.getTimeSpent(this.log.start_time);
20342
- return this.log.time_spent;
20343
- },
20344
- logPageOpen: function logPageOpen() {
20345
- this.log.history.push({
20346
- type: 'open',
20347
- message: 'Opened checkout',
20348
- time: this.getTimeSpent()
20349
- });
20350
- return this.saveLog();
20351
- },
20352
- logChannelSwitch: function logChannelSwitch(value) {
20353
- this.log.history.push({
20354
- type: 'action',
20355
- message: "Set payment method to: ".concat(value),
20356
- time: this.getTimeSpent()
20357
- });
20358
- return this.saveLog();
20359
- },
20360
- logValidationErrors: function logValidationErrors(inputs) {
20490
+ var paymentMethod$1 = 'direct debit';
20491
+ var DirectDebitCharge = {
20492
+ loginToDirectDebitAccount: function loginToDirectDebitAccount(_ref) {
20361
20493
  var _this = this;
20362
20494
 
20363
- inputs.forEach(function (input) {
20364
- _this.log.history.push({
20365
- type: 'error',
20366
- message: "Invalid ".concat(input),
20367
- time: _this.getTimeSpent()
20368
- });
20369
- });
20370
- return this.saveLog();
20371
- },
20372
- logInput: function logInput(value) {
20373
- var isUpdate = this.log.history.find(function (item) {
20374
- return item.message === "Filled this field: ".concat(value);
20375
- });
20376
- this.log.history.push({
20377
- type: 'input',
20378
- message: "".concat(isUpdate ? 'Changed' : 'Filled', " this field: ").concat(value),
20379
- time: this.getTimeSpent()
20380
- });
20381
- return this.saveLog();
20382
- },
20383
- logBankSelect: function logBankSelect(value) {
20384
- this.log.history.push({
20385
- type: 'action',
20386
- message: "Selected bank: ".concat(value),
20387
- time: this.getTimeSpent()
20388
- });
20389
- return this.saveLog();
20390
- },
20391
- logSavedCardSelect: function logSavedCardSelect() {
20392
- this.log.history.push({
20393
- type: 'action',
20394
- message: 'Selected saved card',
20395
- time: this.getTimeSpent()
20396
- });
20397
- return this.saveLog();
20398
- },
20399
- logAuthWindowOpen: function logAuthWindowOpen() {
20400
- this.log.history.push({
20401
- type: 'action',
20402
- message: 'Third-party authentication window opened',
20403
- time: this.getTimeSpent()
20404
- });
20405
- return this.saveLog();
20406
- },
20407
- logAuthWindowClose: function logAuthWindowClose() {
20408
- this.log.history.push({
20409
- type: 'action',
20410
- message: 'Third-party authentication window closed',
20411
- time: this.getTimeSpent()
20412
- });
20413
- return this.saveLog();
20414
- },
20415
- logAPIResponse: function logAPIResponse(response, channel) {
20416
- switch (response.status) {
20417
- case 'success':
20418
- return this.logSuccess(channel);
20495
+ var email = _ref.email,
20496
+ password = _ref.password;
20497
+ var params = {
20498
+ email: email,
20499
+ password: password
20500
+ };
20419
20501
 
20420
- case 'pending':
20421
- return this.logPending(channel);
20502
+ if (!isValidEmail(email)) {
20503
+ return Promise.reject(Error('Invalid email'));
20504
+ }
20422
20505
 
20423
- case 'failed':
20424
- return this.logError(response.message);
20506
+ return DirectDebitAPI.loginToDirectDebitAccount(params).then(function (response) {
20507
+ if (response.status === 'success') {
20508
+ var _response$data = response.data,
20509
+ token = _response$data.token,
20510
+ permissions = _response$data.user.permissions;
20425
20511
 
20426
- case 'auth':
20427
- return this.logAuth(response.data.auth);
20512
+ if (!permissions || permissions.length < 1) {
20513
+ throw Error('You do not have the privileges to perform this action');
20514
+ }
20428
20515
 
20429
- default:
20430
- return false;
20431
- }
20432
- },
20433
- logMobileMoneyActions: function logMobileMoneyActions(_ref) {
20434
- var numberOfTokenRequests = _ref.numberOfTokenRequests,
20435
- registrationToken = _ref.registrationToken;
20516
+ if (permissions.find(function (permission) {
20517
+ return permission === 'directdebit-*';
20518
+ })) {
20519
+ _this.directDebit.token = token;
20520
+ return response;
20521
+ }
20436
20522
 
20437
- if (numberOfTokenRequests) {
20438
- this.logTokenRequest('mobile money', numberOfTokenRequests);
20439
- } else if (registrationToken) {
20440
- this.logTokenSubmitted('mobile money');
20441
- } else {
20442
- this.logAttempt('mobile money');
20443
- }
20444
- },
20445
- logAPIResponseMessage: function logAPIResponseMessage(message) {
20446
- this.log.history.push({
20447
- type: 'action',
20448
- message: message,
20449
- time: this.getTimeSpent()
20523
+ throw Error('You do not have the privileges to perform this action');
20524
+ }
20525
+
20526
+ return response;
20450
20527
  });
20451
- return this.saveLog();
20452
20528
  },
20453
- logAttempt: function logAttempt(channel) {
20454
- var message = 'Attempted to pay';
20529
+ chargeDirectDebit: function chargeDirectDebit(accountCode) {
20530
+ var _this2 = this;
20455
20531
 
20456
- if (channel) {
20457
- message += " with ".concat(channel);
20532
+ if (!this.directDebit.token) {
20533
+ return Promise.reject(Error('Please login with Transaction.loginToDirectDebitAccount() to start a Direct debit charge'));
20458
20534
  }
20459
20535
 
20460
- this.log.attempts += 1;
20461
- this.log.history.push({
20462
- type: 'action',
20463
- message: message,
20464
- time: this.getTimeSpent()
20465
- });
20466
- return this.saveLog();
20467
- },
20468
- logTokenRequest: function logTokenRequest(channel) {
20469
- var numberOfTokenRequests = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
20470
- var message = numberOfTokenRequests === 0 ? 'Waiting for customer to submit OTP' : 'Customer requested to resend OTP';
20471
- this.log.history.push({
20472
- type: 'action',
20473
- message: message,
20474
- channel: channel,
20475
- time: this.getTimeSpent()
20476
- });
20477
- return this.saveLog();
20478
- },
20479
- logTokenSubmitted: function logTokenSubmitted(channel) {
20480
- var message = 'Customer submitted OTP';
20481
- this.log.history.push({
20482
- type: 'action',
20483
- message: message,
20484
- channel: channel,
20485
- time: this.getTimeSpent()
20486
- });
20487
- return this.saveLog();
20488
- },
20489
- logTokenAuthenticationFailure: function logTokenAuthenticationFailure(error) {
20490
- var message = error ? "Error: ".concat(error) : 'Error';
20491
- this.log.errors += 1;
20492
- this.log.history.push({
20493
- type: 'error',
20494
- message: message,
20495
- authentication: 'failed',
20496
- time: this.getTimeSpent()
20497
- });
20498
- return this.saveLog();
20499
- },
20500
- logError: function logError(error) {
20501
- var message = 'Error';
20536
+ this.logAttempt(paymentMethod$1);
20537
+ var params = {
20538
+ account_code: accountCode,
20539
+ transaction: this.id,
20540
+ token: this.directDebit.token
20541
+ };
20542
+ return DirectDebitAPI.charge(params).then(function (response) {
20543
+ _this2.logAPIResponse(response, paymentMethod$1);
20502
20544
 
20503
- if (error) {
20504
- message += ": ".concat(error);
20505
- }
20545
+ if (response.status) {
20546
+ _this2.directDebit.chargeResponse = response;
20547
+ }
20506
20548
 
20507
- this.log.errors += 1;
20508
- this.log.history.push({
20509
- type: 'error',
20510
- message: message,
20511
- time: this.getTimeSpent()
20512
- });
20513
- return this.saveLog();
20514
- },
20515
- logAuth: function logAuth(value) {
20516
- this.log.authentication = value;
20517
- this.log.history.push({
20518
- type: 'auth',
20519
- message: "Authentication Required: ".concat(value),
20520
- time: this.getTimeSpent()
20549
+ return response;
20521
20550
  });
20522
- return this.saveLog();
20523
20551
  },
20524
- logSuccess: function logSuccess(channel) {
20525
- var message = 'Successfully paid';
20552
+ getProvisionedAccounts: function getProvisionedAccounts() {
20553
+ var _this3 = this;
20526
20554
 
20527
- if (channel) {
20528
- message += " with ".concat(channel);
20529
- }
20555
+ return DirectDebitAPI.getProvisionedAccounts(this.directDebit.token).then(function (response) {
20556
+ _this3.logAPIResponse(response, paymentMethod$1);
20530
20557
 
20531
- this.log.success = true;
20532
- this.log.history.push({
20533
- type: 'success',
20534
- message: message,
20535
- time: this.getTimeSpent()
20536
- });
20537
- return this.saveLog();
20538
- },
20539
- logPending: function logPending(channel) {
20540
- var message = 'Payment in progress';
20558
+ var status = response.status,
20559
+ data = response.data;
20541
20560
 
20542
- if (channel) {
20543
- message += " with ".concat(channel);
20544
- }
20561
+ if (status) {
20562
+ if (data && data.length < 1) {
20563
+ return Promise.reject(Error('You have not provisioned any bank account for Direct Debit yet'));
20564
+ }
20545
20565
 
20546
- this.log.history.push({
20547
- type: 'pending',
20548
- message: message,
20549
- time: this.getTimeSpent()
20550
- });
20551
- return this.saveLog();
20552
- },
20553
- logPageClose: function logPageClose() {
20554
- this.log.history.push({
20555
- type: 'close',
20556
- message: 'Closed checkout',
20557
- time: this.getTimeSpent()
20566
+ _this3.directDebit.accounts = response.data;
20567
+ }
20568
+
20569
+ return response;
20558
20570
  });
20559
- return this.saveLog();
20560
20571
  },
20561
- logTransactionCurrencySwitch: function logTransactionCurrencySwitch(_ref2) {
20562
- var currency = _ref2.currency,
20563
- _ref2$isUserAction = _ref2.isUserAction,
20564
- isUserAction = _ref2$isUserAction === void 0 ? true : _ref2$isUserAction;
20565
- var prefix = isUserAction ? 'User switched' : 'Switched';
20566
- this.log.history.push({
20567
- type: 'action',
20568
- message: "".concat(prefix, " transaction currency to ").concat(currency),
20569
- time: this.getTimeSpent()
20572
+ authenticateAccount: function authenticateAccount(otp) {
20573
+ var _this4 = this;
20574
+
20575
+ var params = {
20576
+ otp: otp,
20577
+ transaction: this.id,
20578
+ token: this.directDebit.token
20579
+ };
20580
+ return DirectDebitAPI.authenticate(params).then(function (response) {
20581
+ _this4.logAPIResponse(response, paymentMethod$1);
20582
+
20583
+ return response;
20570
20584
  });
20571
- return this.saveLog();
20572
- },
20573
- saveLog: function saveLog() {
20574
- return AnalyticsAPI.saveLog(this.id, this.merchant.key, this.log);
20575
- },
20576
- saveIpAddress: function saveIpAddress() {
20577
- return AnalyticsAPI.saveIp(this.id, this.merchant.key);
20578
- },
20579
- saveReferrer: function saveReferrer(referrer) {
20580
- return AnalyticsAPI.saveReferrer(this.id, this.merchant.key, referrer);
20585
+ }
20586
+ };
20587
+
20588
+ var ChargeFunctions = {
20589
+ get: function get(channel) {
20590
+ var chargeFunctions = {
20591
+ card: CardCharge,
20592
+ bank: BankAccountCharge,
20593
+ ussd: USSDCharge,
20594
+ qr: QRCharge,
20595
+ mobile_money: MobileMoneyCharge,
20596
+ direct_debit: DirectDebitCharge,
20597
+ bank_transfer: PayWithTransferCharge,
20598
+ eft: EFT,
20599
+ payattitude: PayattitudeCharge,
20600
+ apple_pay: ApplePayCharge,
20601
+ paypal: PayPalCharge
20602
+ };
20603
+ return chargeFunctions[channel];
20581
20604
  }
20582
20605
  };
20583
20606