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

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,721 +19765,538 @@ var Paystack = (function (exports) {
19765
19765
  return PhoneNumber;
19766
19766
  }();
19767
19767
 
19768
- var isMobile_1 = isMobile;
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();
19769
19787
 
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;
19788
+ var headers = _objectSpread2({}, language && {
19789
+ 'Accept-Language': language
19790
+ });
19776
19791
 
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
- }
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();
19779
19805
 
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;
19806
+ var headers = _objectSpread2({}, language && {
19807
+ 'Accept-Language': language
19808
+ });
19787
19809
 
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;
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
+ });
19803
19820
  }
19804
19821
  };
19805
19822
 
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;
19823
+ function validate$1(phoneNumber) {
19824
+ return new Promise(function (resolve, reject) {
19825
+ var validation = PhoneNumber.validate(phoneNumber);
19812
19826
 
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);
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
+ }
19820
19831
 
19821
- var tester = /[\uD800-\uDFFF]/g;
19822
- var low = /^[\uD800-\uDBFF]$/;
19823
- var hi = /^[\uDC00-\uDFFF]$/;
19832
+ resolve(validation);
19833
+ });
19834
+ }
19824
19835
 
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
- };
19836
+ var MobileMoneyCharge = {
19837
+ mobileMoneyChargeAPI: function mobileMoneyChargeAPI(params) {
19838
+ var _this = this;
19832
19839
 
19833
- var FORCED = fails(function () {
19834
- return $stringify('\uDF06\uD834') !== '"\\udf06\\ud834"'
19835
- || $stringify('\uDEAD') !== '"\\udead"';
19836
- });
19840
+ return MobileMoneyAPI.charge(params).then(function (response) {
19841
+ if (response.status === 'success') {
19842
+ _this.mobileMoney = response;
19837
19843
 
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
- }
19849
- });
19850
- }
19844
+ if (response.data && response.data.display && response.data.display.otpSentCount === 1) {
19845
+ _this.logTokenRequest('mobile money');
19846
+ }
19847
+ }
19851
19848
 
19852
- var AnalyticsAPIUtils = {
19853
- saveLog: function saveLog(url, _ref) {
19854
- var merchantKey = _ref.merchantKey,
19855
- log = _ref.log;
19856
- var language = getLanguage();
19849
+ return response;
19850
+ });
19851
+ },
19852
+ chargeMobileMoney: function chargeMobileMoney(_ref) {
19853
+ var _this2 = this;
19857
19854
 
19858
- var headers = _objectSpread2({
19859
- Authorization: "Bearer ".concat(merchantKey)
19860
- }, language && {
19861
- 'Accept-Language': language
19855
+ var phoneNumber = _ref.phoneNumber,
19856
+ provider = _ref.provider,
19857
+ voucher = _ref.voucher,
19858
+ registrationToken = _ref.registrationToken;
19859
+ return validate$1(phoneNumber).then(function () {
19860
+ _this2.logAttempt('mobile money');
19861
+
19862
+ var params = {
19863
+ provider: provider,
19864
+ voucher: voucher,
19865
+ registrationToken: registrationToken,
19866
+ transaction: _this2.id,
19867
+ phone: phoneNumber,
19868
+ device: _this2.deviceFingerprint,
19869
+ channel_name: "MOBILE_MONEY_".concat(_this2.id)
19870
+ };
19871
+ return _this2.mobileMoneyChargeAPI(params);
19862
19872
  });
19873
+ },
19874
+ chargeMpesaOffline: function chargeMpesaOffline(_ref2) {
19875
+ var provider = _ref2.provider,
19876
+ voucher = _ref2.voucher,
19877
+ registrationToken = _ref2.registrationToken;
19878
+ this.logAttempt('mobile money');
19879
+ var params = {
19880
+ provider: provider,
19881
+ voucher: voucher,
19882
+ registrationToken: registrationToken,
19883
+ transaction: this.id,
19884
+ device: this.deviceFingerprint,
19885
+ channel_name: "MOBILE_MONEY_".concat(this.id)
19886
+ };
19887
+ return this.mobileMoneyChargeAPI(params);
19888
+ },
19889
+ authenticateMobileMoney: function authenticateMobileMoney(payload) {
19890
+ var _this3 = this;
19863
19891
 
19864
- return axiosInstance.post(url, {
19865
- payload: JSON.stringify(log)
19866
- }, {
19867
- headers: headers
19892
+ var phoneNumber = payload.phoneNumber,
19893
+ provider = payload.provider,
19894
+ registrationToken = payload.registrationToken;
19895
+ return validate$1(phoneNumber).then(function () {
19896
+ _this3.logMobileMoneyActions(payload);
19897
+
19898
+ var params = {
19899
+ provider: provider,
19900
+ registrationToken: registrationToken,
19901
+ transaction: _this3.id,
19902
+ phone: phoneNumber,
19903
+ device: _this3.deviceFingerprint,
19904
+ channel_name: "MOBILE_MONEY_".concat(_this3.id)
19905
+ };
19906
+ return MobileMoneyAPI.charge(params).then(function (response) {
19907
+ if (response.status === 'success') {
19908
+ _this3.mobileMoney = response;
19909
+
19910
+ if (response.data && response.data.display && response.data.display.otpSentCount === 1) {
19911
+ _this3.logTokenRequest('mobile money');
19912
+ }
19913
+ } else if (response.errors && response.errors.data && response.errors.data.status === 'awaiting_registration_token') {
19914
+ _this3.logTokenAuthenticationFailure(response.message);
19915
+ } else {
19916
+ _this3.logError(response.message);
19917
+ }
19918
+
19919
+ return response;
19920
+ });
19921
+ });
19922
+ },
19923
+ submitMobileMoneyCode: function submitMobileMoneyCode(payload) {
19924
+ var _this4 = this;
19925
+
19926
+ return MobileMoneyAPI.submitCode({
19927
+ code: payload.code,
19928
+ transaction: this.id
19868
19929
  }).then(function (response) {
19869
- return response.data;
19930
+ _this4.logAPIResponse(response, 'mobile_money');
19931
+
19932
+ return response;
19870
19933
  });
19871
19934
  },
19872
- getIp: function getIp() {
19873
- var url = 'https://api.paystack.co/decision/ip';
19935
+ listenForMobileMoneyCharge: function listenForMobileMoneyCharge(callback) {
19936
+ if (this.mobileMoney.status !== 'success') {
19937
+ return Promise.reject(Error('Please start a mobile money charge with Transaction.chargeMobileMoney()'));
19938
+ }
19939
+
19940
+ var _this$mobileMoney$dat = this.mobileMoney.data,
19941
+ channel = _this$mobileMoney$dat.channel,
19942
+ channelName = _this$mobileMoney$dat.channel_name;
19943
+ var listenerOptions = {
19944
+ channel: channel || channelName,
19945
+ paymentMethod: 'mobile_money'
19946
+ };
19947
+ return this.listenForCharge(listenerOptions, callback);
19948
+ }
19949
+ };
19950
+
19951
+ var DirectDebitAPI = {
19952
+ loginToDirectDebitAccount: function loginToDirectDebitAccount(_ref) {
19953
+ var email = _ref.email,
19954
+ password = _ref.password;
19955
+ var params = {
19956
+ email: email,
19957
+ password: password
19958
+ };
19874
19959
  var language = getLanguage();
19875
19960
 
19876
19961
  var headers = _objectSpread2({}, language && {
19877
19962
  'Accept-Language': language
19878
19963
  });
19879
19964
 
19880
- return axiosInstance.get(url, {
19965
+ return axiosInstance.post("".concat(configToUse.paystackApiUrl, "login"), params, {
19881
19966
  headers: headers
19882
19967
  }).then(function (response) {
19883
- return response.data.data.ip_address;
19968
+ return ChargeResponses.parse(response.data);
19884
19969
  });
19885
19970
  },
19886
- saveIp: function saveIp(url, _ref2) {
19887
- var merchantKey = _ref2.merchantKey;
19971
+ charge: function charge(_ref2) {
19972
+ var accountCode = _ref2.account_code,
19973
+ transaction = _ref2.transaction,
19974
+ token = _ref2.token;
19888
19975
  var language = getLanguage();
19889
19976
 
19890
19977
  var headers = _objectSpread2({
19891
- Authorization: "Bearer ".concat(merchantKey)
19978
+ Authorization: "Bearer ".concat(token),
19979
+ 'jwt-auth': true
19892
19980
  }, language && {
19893
19981
  'Accept-Language': language
19894
19982
  });
19895
19983
 
19896
- return axiosInstance.post(url, null, {
19984
+ var params = {
19985
+ account_code: accountCode,
19986
+ transaction: transaction
19987
+ };
19988
+ return axiosInstance.post("".concat(configToUse.paystackApiUrl, "directdebit/initiate"), params, {
19897
19989
  headers: headers
19898
19990
  }).then(function (response) {
19899
- return response.data;
19991
+ return ChargeResponses.parse(response.data);
19900
19992
  });
19901
19993
  },
19902
- saveReferrer: function saveReferrer(url, _ref3) {
19903
- var merchantKey = _ref3.merchantKey,
19904
- referrer = _ref3.referrer;
19994
+ authenticate: function authenticate(_ref3) {
19995
+ var otp = _ref3.otp,
19996
+ transaction = _ref3.transaction,
19997
+ token = _ref3.token;
19905
19998
  var language = getLanguage();
19906
19999
 
19907
20000
  var headers = _objectSpread2({
19908
- Authorization: "Bearer ".concat(merchantKey)
20001
+ Authorization: "Bearer ".concat(token),
20002
+ 'jwt-auth': true
19909
20003
  }, language && {
19910
20004
  'Accept-Language': language
19911
20005
  });
19912
20006
 
19913
- return axiosInstance.post(url, {
19914
- referrer: referrer
19915
- }, {
20007
+ var params = {
20008
+ otp: otp,
20009
+ transaction: transaction
20010
+ };
20011
+ return axiosInstance.post("".concat(configToUse.paystackApiUrl, "directdebit/validate"), params, {
19916
20012
  headers: headers
19917
20013
  }).then(function (response) {
19918
- return response.data;
19919
- });
19920
- }
19921
- };
19922
-
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
20014
+ return ChargeResponses.parse(response.data);
19929
20015
  });
19930
20016
  },
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
20017
+ getProvisionedAccounts: function getProvisionedAccounts(token) {
20018
+ var language = getLanguage();
20019
+
20020
+ var headers = _objectSpread2({
20021
+ Authorization: "Bearer ".concat(token),
20022
+ 'jwt-auth': true
20023
+ }, language && {
20024
+ 'Accept-Language': language
19938
20025
  });
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
20026
+
20027
+ return axiosInstance.get("".concat(configToUse.paystackApiUrl, "directdebit/account"), {
20028
+ headers: headers
20029
+ }).then(function (response) {
20030
+ return response.data;
19945
20031
  });
19946
20032
  }
19947
20033
  };
19948
20034
 
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) {
20035
+ var paymentMethod$1 = 'direct debit';
20036
+ var DirectDebitCharge = {
20037
+ loginToDirectDebitAccount: function loginToDirectDebitAccount(_ref) {
19974
20038
  var _this = this;
19975
20039
 
19976
- inputs.forEach(function (input) {
19977
- _this.log.history.push({
19978
- type: 'error',
19979
- message: "Invalid ".concat(input),
19980
- time: _this.getTimeSpent()
19981
- });
19982
- });
19983
- return this.saveLog();
19984
- },
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()
19993
- });
19994
- return this.saveLog();
19995
- },
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);
20040
+ var email = _ref.email,
20041
+ password = _ref.password;
20042
+ var params = {
20043
+ email: email,
20044
+ password: password
20045
+ };
20032
20046
 
20033
- case 'pending':
20034
- return this.logPending(channel);
20047
+ if (!isValidEmail(email)) {
20048
+ return Promise.reject(Error('Invalid email'));
20049
+ }
20035
20050
 
20036
- case 'failed':
20037
- return this.logError(response.message);
20051
+ return DirectDebitAPI.loginToDirectDebitAccount(params).then(function (response) {
20052
+ if (response.status === 'success') {
20053
+ var _response$data = response.data,
20054
+ token = _response$data.token,
20055
+ permissions = _response$data.user.permissions;
20038
20056
 
20039
- case 'auth':
20040
- return this.logAuth(response.data.auth);
20057
+ if (!permissions || permissions.length < 1) {
20058
+ throw Error('You do not have the privileges to perform this action');
20059
+ }
20041
20060
 
20042
- default:
20043
- return false;
20044
- }
20045
- },
20046
- logMobileMoneyActions: function logMobileMoneyActions(_ref) {
20047
- var numberOfTokenRequests = _ref.numberOfTokenRequests,
20048
- registrationToken = _ref.registrationToken;
20061
+ if (permissions.find(function (permission) {
20062
+ return permission === 'directdebit-*';
20063
+ })) {
20064
+ _this.directDebit.token = token;
20065
+ return response;
20066
+ }
20049
20067
 
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()
20068
+ throw Error('You do not have the privileges to perform this action');
20069
+ }
20070
+
20071
+ return response;
20063
20072
  });
20064
- return this.saveLog();
20065
20073
  },
20066
- logAttempt: function logAttempt(channel) {
20067
- var message = 'Attempted to pay';
20074
+ chargeDirectDebit: function chargeDirectDebit(accountCode) {
20075
+ var _this2 = this;
20068
20076
 
20069
- if (channel) {
20070
- message += " with ".concat(channel);
20077
+ if (!this.directDebit.token) {
20078
+ return Promise.reject(Error('Please login with Transaction.loginToDirectDebitAccount() to start a Direct debit charge'));
20071
20079
  }
20072
20080
 
20073
- this.log.attempts += 1;
20074
- this.log.history.push({
20075
- type: 'action',
20076
- message: message,
20077
- time: this.getTimeSpent()
20081
+ this.logAttempt(paymentMethod$1);
20082
+ var params = {
20083
+ account_code: accountCode,
20084
+ transaction: this.id,
20085
+ token: this.directDebit.token
20086
+ };
20087
+ return DirectDebitAPI.charge(params).then(function (response) {
20088
+ _this2.logAPIResponse(response, paymentMethod$1);
20089
+
20090
+ if (response.status) {
20091
+ _this2.directDebit.chargeResponse = response;
20092
+ }
20093
+
20094
+ return response;
20078
20095
  });
20079
- return this.saveLog();
20080
20096
  },
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()
20097
+ getProvisionedAccounts: function getProvisionedAccounts() {
20098
+ var _this3 = this;
20099
+
20100
+ return DirectDebitAPI.getProvisionedAccounts(this.directDebit.token).then(function (response) {
20101
+ _this3.logAPIResponse(response, paymentMethod$1);
20102
+
20103
+ var status = response.status,
20104
+ data = response.data;
20105
+
20106
+ if (status) {
20107
+ if (data && data.length < 1) {
20108
+ return Promise.reject(Error('You have not provisioned any bank account for Direct Debit yet'));
20109
+ }
20110
+
20111
+ _this3.directDebit.accounts = response.data;
20112
+ }
20113
+
20114
+ return response;
20089
20115
  });
20090
- return this.saveLog();
20091
20116
  },
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';
20117
+ authenticateAccount: function authenticateAccount(otp) {
20118
+ var _this4 = this;
20115
20119
 
20116
- if (error) {
20117
- message += ": ".concat(error);
20118
- }
20120
+ var params = {
20121
+ otp: otp,
20122
+ transaction: this.id,
20123
+ token: this.directDebit.token
20124
+ };
20125
+ return DirectDebitAPI.authenticate(params).then(function (response) {
20126
+ _this4.logAPIResponse(response, paymentMethod$1);
20119
20127
 
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();
20127
- },
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()
20128
+ return response;
20134
20129
  });
20135
- return this.saveLog();
20136
- },
20137
- logSuccess: function logSuccess(channel) {
20138
- var message = 'Successfully paid';
20130
+ }
20131
+ };
20139
20132
 
20140
- if (channel) {
20141
- message += " with ".concat(channel);
20142
- }
20133
+ var ChargeFunctions = {
20134
+ get: function get(channel) {
20135
+ var chargeFunctions = {
20136
+ card: CardCharge,
20137
+ bank: BankAccountCharge,
20138
+ ussd: USSDCharge,
20139
+ qr: QRCharge,
20140
+ mobile_money: MobileMoneyCharge,
20141
+ direct_debit: DirectDebitCharge,
20142
+ bank_transfer: PayWithTransferCharge,
20143
+ eft: EFT,
20144
+ payattitude: PayattitudeCharge,
20145
+ apple_pay: ApplePayCharge,
20146
+ paypal: PayPalCharge
20147
+ };
20148
+ return chargeFunctions[channel];
20149
+ }
20150
+ };
20143
20151
 
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';
20152
+ var isMobile_1 = isMobile;
20154
20153
 
20155
- if (channel) {
20156
- message += " with ".concat(channel);
20157
- }
20154
+ function isMobile (ua) {
20155
+ if (!ua && typeof navigator != 'undefined') ua = navigator.userAgent;
20156
+ if (ua && ua.headers && typeof ua.headers['user-agent'] == 'string') {
20157
+ ua = ua.headers['user-agent'];
20158
+ }
20159
+ if (typeof ua != 'string') return false;
20158
20160
 
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);
20161
+ 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));
20162
+ }
20163
+
20164
+ var AnalyticsUtils = {
20165
+ initializeLog: function initializeLog(log) {
20166
+ var _ref = log || {},
20167
+ attempts = _ref.attempts,
20168
+ authentication = _ref.authentication,
20169
+ errors = _ref.errors,
20170
+ history = _ref.history;
20171
+
20172
+ return {
20173
+ start_time: Math.round(Date.now() / 1000),
20174
+ time_spent: 0,
20175
+ attempts: attempts || 0,
20176
+ authentication: authentication,
20177
+ errors: errors || 0,
20178
+ success: false,
20179
+ mobile: isMobile_1(),
20180
+ input: [],
20181
+ history: history || []
20182
+ };
20191
20183
  },
20192
- saveReferrer: function saveReferrer(referrer) {
20193
- return AnalyticsAPI.saveReferrer(this.id, this.merchant.key, referrer);
20184
+ getTimeSpent: function getTimeSpent(startTime) {
20185
+ var currentTimeInSeconds = Math.round(Date.now() / 1000);
20186
+ return currentTimeInSeconds - startTime;
20194
20187
  }
20195
20188
  };
20196
20189
 
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
- };
20190
+ var $ = _export;
20191
+ var global$1 = global$R;
20192
+ var getBuiltIn = getBuiltIn$a;
20193
+ var apply = functionApply;
20194
+ var uncurryThis = functionUncurryThis;
20195
+ var fails = fails$t;
20196
+
20197
+ var Array$1 = global$1.Array;
20198
+ var $stringify = getBuiltIn('JSON', 'stringify');
20199
+ var exec = uncurryThis(/./.exec);
20200
+ var charAt = uncurryThis(''.charAt);
20201
+ var charCodeAt = uncurryThis(''.charCodeAt);
20202
+ var replace = uncurryThis(''.replace);
20203
+ var numberToString = uncurryThis(1.0.toString);
20204
+
20205
+ var tester = /[\uD800-\uDFFF]/g;
20206
+ var low = /^[\uD800-\uDBFF]$/;
20207
+ var hi = /^[\uDC00-\uDFFF]$/;
20208
+
20209
+ var fix = function (match, offset, string) {
20210
+ var prev = charAt(string, offset - 1);
20211
+ var next = charAt(string, offset + 1);
20212
+ if ((exec(low, match) && !exec(hi, next)) || (exec(hi, match) && !exec(low, prev))) {
20213
+ return '\\u' + numberToString(charCodeAt(match, 0), 16);
20214
+ } return match;
20215
+ };
20216
+
20217
+ var FORCED = fails(function () {
20218
+ return $stringify('\uDF06\uD834') !== '"\\udf06\\ud834"'
20219
+ || $stringify('\uDEAD') !== '"\\udead"';
20220
+ });
20221
+
20222
+ if ($stringify) {
20223
+ // `JSON.stringify` method
20224
+ // https://tc39.es/ecma262/#sec-json.stringify
20225
+ // https://github.com/tc39/proposal-well-formed-stringify
20226
+ $({ target: 'JSON', stat: true, forced: FORCED }, {
20227
+ // eslint-disable-next-line no-unused-vars -- required for `.length`
20228
+ stringify: function stringify(it, replacer, space) {
20229
+ for (var i = 0, l = arguments.length, args = Array$1(l); i < l; i++) args[i] = arguments[i];
20230
+ var result = apply($stringify, null, args);
20231
+ return typeof result == 'string' ? replace(result, tester, fix) : result;
20232
+ }
20233
+ });
20234
+ }
20235
+
20236
+ var AnalyticsAPIUtils = {
20237
+ saveLog: function saveLog(url, _ref) {
20238
+ var merchantKey = _ref.merchantKey,
20239
+ log = _ref.log;
20215
20240
  var language = getLanguage();
20216
20241
 
20217
- var headers = _objectSpread2({}, language && {
20242
+ var headers = _objectSpread2({
20243
+ Authorization: "Bearer ".concat(merchantKey)
20244
+ }, language && {
20218
20245
  'Accept-Language': language
20219
20246
  });
20220
20247
 
20221
- return axiosInstance.post("".concat(configToUse.paystackApiUrl, "charge/mobile_money"), params, {
20248
+ return axiosInstance.post(url, {
20249
+ payload: JSON.stringify(log)
20250
+ }, {
20222
20251
  headers: headers
20223
20252
  }).then(function (response) {
20224
- return ChargeResponses.parse(response.data);
20225
- }).catch(function (_ref2) {
20226
- var response = _ref2.response;
20227
- return ChargeResponses.parse(response.data);
20253
+ return response.data;
20228
20254
  });
20229
20255
  },
20230
- submitCode: function submitCode(_ref3) {
20231
- var transaction = _ref3.transaction,
20232
- code = _ref3.code;
20256
+ getIp: function getIp() {
20257
+ var url = 'https://api.paystack.co/decision/ip';
20233
20258
  var language = getLanguage();
20234
20259
 
20235
20260
  var headers = _objectSpread2({}, language && {
20236
20261
  'Accept-Language': language
20237
20262
  });
20238
20263
 
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, {
20264
+ return axiosInstance.get(url, {
20245
20265
  headers: headers
20246
20266
  }).then(function (response) {
20247
- return ChargeResponses.parse(response.data);
20267
+ return response.data.data.ip_address;
20248
20268
  });
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 && {
20417
- 'Accept-Language': language
20418
- });
20419
-
20420
- return axiosInstance.post("".concat(configToUse.paystackApiUrl, "login"), params, {
20421
- headers: headers
20422
- }).then(function (response) {
20423
- return ChargeResponses.parse(response.data);
20424
- });
20425
- },
20426
- charge: function charge(_ref2) {
20427
- var accountCode = _ref2.account_code,
20428
- transaction = _ref2.transaction,
20429
- token = _ref2.token;
20430
- var language = getLanguage();
20431
-
20432
- var headers = _objectSpread2({
20433
- Authorization: "Bearer ".concat(token),
20434
- 'jwt-auth': true
20435
- }, language && {
20436
- 'Accept-Language': language
20437
- });
20438
-
20439
- var params = {
20440
- account_code: accountCode,
20441
- transaction: transaction
20442
- };
20443
- return axiosInstance.post("".concat(configToUse.paystackApiUrl, "directdebit/initiate"), params, {
20444
- headers: headers
20445
- }).then(function (response) {
20446
- return ChargeResponses.parse(response.data);
20447
- });
20448
- },
20449
- authenticate: function authenticate(_ref3) {
20450
- var otp = _ref3.otp,
20451
- transaction = _ref3.transaction,
20452
- token = _ref3.token;
20453
- var language = getLanguage();
20269
+ },
20270
+ saveIp: function saveIp(url, _ref2) {
20271
+ var merchantKey = _ref2.merchantKey;
20272
+ var language = getLanguage();
20454
20273
 
20455
20274
  var headers = _objectSpread2({
20456
- Authorization: "Bearer ".concat(token),
20457
- 'jwt-auth': true
20275
+ Authorization: "Bearer ".concat(merchantKey)
20458
20276
  }, language && {
20459
20277
  'Accept-Language': language
20460
20278
  });
20461
20279
 
20462
- var params = {
20463
- otp: otp,
20464
- transaction: transaction
20465
- };
20466
- return axiosInstance.post("".concat(configToUse.paystackApiUrl, "directdebit/validate"), params, {
20280
+ return axiosInstance.post(url, null, {
20467
20281
  headers: headers
20468
20282
  }).then(function (response) {
20469
- return ChargeResponses.parse(response.data);
20283
+ return response.data;
20470
20284
  });
20471
20285
  },
20472
- getProvisionedAccounts: function getProvisionedAccounts(token) {
20286
+ saveReferrer: function saveReferrer(url, _ref3) {
20287
+ var merchantKey = _ref3.merchantKey,
20288
+ referrer = _ref3.referrer;
20473
20289
  var language = getLanguage();
20474
20290
 
20475
20291
  var headers = _objectSpread2({
20476
- Authorization: "Bearer ".concat(token),
20477
- 'jwt-auth': true
20292
+ Authorization: "Bearer ".concat(merchantKey)
20478
20293
  }, language && {
20479
20294
  'Accept-Language': language
20480
20295
  });
20481
20296
 
20482
- return axiosInstance.get("".concat(configToUse.paystackApiUrl, "directdebit/account"), {
20297
+ return axiosInstance.post(url, {
20298
+ referrer: referrer
20299
+ }, {
20483
20300
  headers: headers
20484
20301
  }).then(function (response) {
20485
20302
  return response.data;
@@ -20487,120 +20304,277 @@ var Paystack = (function (exports) {
20487
20304
  }
20488
20305
  };
20489
20306
 
20490
- var paymentMethod$1 = 'direct debit';
20491
- var DirectDebitCharge = {
20492
- loginToDirectDebitAccount: function loginToDirectDebitAccount(_ref) {
20493
- var _this = this;
20494
-
20495
- var email = _ref.email,
20496
- password = _ref.password;
20497
- var params = {
20498
- email: email,
20499
- password: password
20500
- };
20501
-
20502
- if (!isValidEmail(email)) {
20503
- return Promise.reject(Error('Invalid email'));
20504
- }
20505
-
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;
20511
-
20512
- if (!permissions || permissions.length < 1) {
20513
- throw Error('You do not have the privileges to perform this action');
20514
- }
20515
-
20516
- if (permissions.find(function (permission) {
20517
- return permission === 'directdebit-*';
20518
- })) {
20519
- _this.directDebit.token = token;
20520
- return response;
20521
- }
20522
-
20523
- throw Error('You do not have the privileges to perform this action');
20524
- }
20525
-
20526
- return response;
20307
+ var AnalyticsAPI = {
20308
+ saveLog: function saveLog(transactionId, merchantKey, log) {
20309
+ var url = new URL("transaction/update_log/".concat(transactionId), configToUse.paystackApiUrl).toString();
20310
+ return AnalyticsAPIUtils.saveLog(url, {
20311
+ merchantKey: merchantKey,
20312
+ log: log
20527
20313
  });
20528
20314
  },
20529
- chargeDirectDebit: function chargeDirectDebit(accountCode) {
20530
- var _this2 = this;
20531
-
20532
- if (!this.directDebit.token) {
20533
- return Promise.reject(Error('Please login with Transaction.loginToDirectDebitAccount() to start a Direct debit charge'));
20534
- }
20535
-
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);
20544
-
20545
- if (response.status) {
20546
- _this2.directDebit.chargeResponse = response;
20547
- }
20548
-
20549
- return response;
20315
+ getIp: function getIp() {
20316
+ return AnalyticsAPIUtils.getIp();
20317
+ },
20318
+ saveIp: function saveIp(transactionId, merchantKey) {
20319
+ var url = new URL("transaction/set_ip/".concat(transactionId), configToUse.paystackApiUrl).toString();
20320
+ return AnalyticsAPIUtils.saveIp(url, {
20321
+ merchantKey: merchantKey
20550
20322
  });
20551
20323
  },
20552
- getProvisionedAccounts: function getProvisionedAccounts() {
20553
- var _this3 = this;
20324
+ saveReferrer: function saveReferrer(transactionId, merchantKey, referrer) {
20325
+ var url = new URL("transaction/set_referrer/".concat(transactionId), configToUse.paystackApiUrl).toString();
20326
+ return AnalyticsAPIUtils.saveReferrer(url, {
20327
+ merchantKey: merchantKey,
20328
+ referrer: referrer
20329
+ });
20330
+ }
20331
+ };
20554
20332
 
20555
- return DirectDebitAPI.getProvisionedAccounts(this.directDebit.token).then(function (response) {
20556
- _this3.logAPIResponse(response, paymentMethod$1);
20333
+ var AnalyticsFunctions$1 = {
20334
+ initializeLog: function initializeLog(log) {
20335
+ this.log = AnalyticsUtils.initializeLog(log);
20336
+ },
20337
+ getTimeSpent: function getTimeSpent() {
20338
+ this.log.time_spent = AnalyticsUtils.getTimeSpent(this.log.start_time);
20339
+ return this.log.time_spent;
20340
+ },
20341
+ logPageOpen: function logPageOpen() {
20342
+ this.log.history.push({
20343
+ type: 'open',
20344
+ message: 'Opened checkout',
20345
+ time: this.getTimeSpent()
20346
+ });
20347
+ return this.saveLog();
20348
+ },
20349
+ logChannelSwitch: function logChannelSwitch(value) {
20350
+ this.log.history.push({
20351
+ type: 'action',
20352
+ message: "Set payment method to: ".concat(value),
20353
+ time: this.getTimeSpent()
20354
+ });
20355
+ return this.saveLog();
20356
+ },
20357
+ logValidationErrors: function logValidationErrors(inputs) {
20358
+ var _this = this;
20557
20359
 
20558
- var status = response.status,
20559
- data = response.data;
20360
+ inputs.forEach(function (input) {
20361
+ _this.log.history.push({
20362
+ type: 'error',
20363
+ message: "Invalid ".concat(input),
20364
+ time: _this.getTimeSpent()
20365
+ });
20366
+ });
20367
+ return this.saveLog();
20368
+ },
20369
+ logInput: function logInput(value) {
20370
+ var isUpdate = this.log.history.find(function (item) {
20371
+ return item.message === "Filled this field: ".concat(value);
20372
+ });
20373
+ this.log.history.push({
20374
+ type: 'input',
20375
+ message: "".concat(isUpdate ? 'Changed' : 'Filled', " this field: ").concat(value),
20376
+ time: this.getTimeSpent()
20377
+ });
20378
+ return this.saveLog();
20379
+ },
20380
+ logBankSelect: function logBankSelect(value) {
20381
+ this.log.history.push({
20382
+ type: 'action',
20383
+ message: "Selected bank: ".concat(value),
20384
+ time: this.getTimeSpent()
20385
+ });
20386
+ return this.saveLog();
20387
+ },
20388
+ logSavedCardSelect: function logSavedCardSelect() {
20389
+ this.log.history.push({
20390
+ type: 'action',
20391
+ message: 'Selected saved card',
20392
+ time: this.getTimeSpent()
20393
+ });
20394
+ return this.saveLog();
20395
+ },
20396
+ logAuthWindowOpen: function logAuthWindowOpen() {
20397
+ this.log.history.push({
20398
+ type: 'action',
20399
+ message: 'Third-party authentication window opened',
20400
+ time: this.getTimeSpent()
20401
+ });
20402
+ return this.saveLog();
20403
+ },
20404
+ logAuthWindowClose: function logAuthWindowClose() {
20405
+ this.log.history.push({
20406
+ type: 'action',
20407
+ message: 'Third-party authentication window closed',
20408
+ time: this.getTimeSpent()
20409
+ });
20410
+ return this.saveLog();
20411
+ },
20412
+ logAPIResponse: function logAPIResponse(response, channel) {
20413
+ switch (response.status) {
20414
+ case 'success':
20415
+ return this.logSuccess(channel);
20560
20416
 
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
- }
20417
+ case 'pending':
20418
+ return this.logPending(channel);
20565
20419
 
20566
- _this3.directDebit.accounts = response.data;
20567
- }
20420
+ case 'failed':
20421
+ return this.logError(response.message);
20568
20422
 
20569
- return response;
20423
+ case 'auth':
20424
+ return this.logAuth(response.data.auth);
20425
+
20426
+ default:
20427
+ return false;
20428
+ }
20429
+ },
20430
+ logMobileMoneyActions: function logMobileMoneyActions(_ref) {
20431
+ var numberOfTokenRequests = _ref.numberOfTokenRequests,
20432
+ registrationToken = _ref.registrationToken;
20433
+
20434
+ if (numberOfTokenRequests) {
20435
+ this.logTokenRequest('mobile money', numberOfTokenRequests);
20436
+ } else if (registrationToken) {
20437
+ this.logTokenSubmitted('mobile money');
20438
+ } else {
20439
+ this.logAttempt('mobile money');
20440
+ }
20441
+ },
20442
+ logAPIResponseMessage: function logAPIResponseMessage(message) {
20443
+ this.log.history.push({
20444
+ type: 'action',
20445
+ message: message,
20446
+ time: this.getTimeSpent()
20570
20447
  });
20448
+ return this.saveLog();
20571
20449
  },
20572
- authenticateAccount: function authenticateAccount(otp) {
20573
- var _this4 = this;
20450
+ logAttempt: function logAttempt(channel) {
20451
+ var message = 'Attempted to pay';
20574
20452
 
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);
20453
+ if (channel) {
20454
+ message += " with ".concat(channel);
20455
+ }
20582
20456
 
20583
- return response;
20457
+ this.log.attempts += 1;
20458
+ this.log.history.push({
20459
+ type: 'action',
20460
+ message: message,
20461
+ time: this.getTimeSpent()
20584
20462
  });
20585
- }
20586
- };
20463
+ return this.saveLog();
20464
+ },
20465
+ logTokenRequest: function logTokenRequest(channel) {
20466
+ var numberOfTokenRequests = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
20467
+ var message = numberOfTokenRequests === 0 ? 'Waiting for customer to submit OTP' : 'Customer requested to resend OTP';
20468
+ this.log.history.push({
20469
+ type: 'action',
20470
+ message: message,
20471
+ channel: channel,
20472
+ time: this.getTimeSpent()
20473
+ });
20474
+ return this.saveLog();
20475
+ },
20476
+ logTokenSubmitted: function logTokenSubmitted(channel) {
20477
+ var message = 'Customer submitted OTP';
20478
+ this.log.history.push({
20479
+ type: 'action',
20480
+ message: message,
20481
+ channel: channel,
20482
+ time: this.getTimeSpent()
20483
+ });
20484
+ return this.saveLog();
20485
+ },
20486
+ logTokenAuthenticationFailure: function logTokenAuthenticationFailure(error) {
20487
+ var message = error ? "Error: ".concat(error) : 'Error';
20488
+ this.log.errors += 1;
20489
+ this.log.history.push({
20490
+ type: 'error',
20491
+ message: message,
20492
+ authentication: 'failed',
20493
+ time: this.getTimeSpent()
20494
+ });
20495
+ return this.saveLog();
20496
+ },
20497
+ logError: function logError(error) {
20498
+ var message = 'Error';
20587
20499
 
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];
20500
+ if (error) {
20501
+ message += ": ".concat(error);
20502
+ }
20503
+
20504
+ this.log.errors += 1;
20505
+ this.log.history.push({
20506
+ type: 'error',
20507
+ message: message,
20508
+ time: this.getTimeSpent()
20509
+ });
20510
+ return this.saveLog();
20511
+ },
20512
+ logAuth: function logAuth(value) {
20513
+ this.log.authentication = value;
20514
+ this.log.history.push({
20515
+ type: 'auth',
20516
+ message: "Authentication Required: ".concat(value),
20517
+ time: this.getTimeSpent()
20518
+ });
20519
+ return this.saveLog();
20520
+ },
20521
+ logSuccess: function logSuccess(channel) {
20522
+ var message = 'Successfully paid';
20523
+
20524
+ if (channel) {
20525
+ message += " with ".concat(channel);
20526
+ }
20527
+
20528
+ this.log.success = true;
20529
+ this.log.history.push({
20530
+ type: 'success',
20531
+ message: message,
20532
+ time: this.getTimeSpent()
20533
+ });
20534
+ return this.saveLog();
20535
+ },
20536
+ logPending: function logPending(channel) {
20537
+ var message = 'Payment in progress';
20538
+
20539
+ if (channel) {
20540
+ message += " with ".concat(channel);
20541
+ }
20542
+
20543
+ this.log.history.push({
20544
+ type: 'pending',
20545
+ message: message,
20546
+ time: this.getTimeSpent()
20547
+ });
20548
+ return this.saveLog();
20549
+ },
20550
+ logPageClose: function logPageClose() {
20551
+ this.log.history.push({
20552
+ type: 'close',
20553
+ message: 'Closed checkout',
20554
+ time: this.getTimeSpent()
20555
+ });
20556
+ return this.saveLog();
20557
+ },
20558
+ logTransactionCurrencySwitch: function logTransactionCurrencySwitch(_ref2) {
20559
+ var currency = _ref2.currency,
20560
+ _ref2$isUserAction = _ref2.isUserAction,
20561
+ isUserAction = _ref2$isUserAction === void 0 ? true : _ref2$isUserAction;
20562
+ var prefix = isUserAction ? 'User switched' : 'Switched';
20563
+ this.log.history.push({
20564
+ type: 'action',
20565
+ message: "".concat(prefix, " transaction currency to ").concat(currency),
20566
+ time: this.getTimeSpent()
20567
+ });
20568
+ return this.saveLog();
20569
+ },
20570
+ saveLog: function saveLog() {
20571
+ return AnalyticsAPI.saveLog(this.id, this.merchant.key, this.log);
20572
+ },
20573
+ saveIpAddress: function saveIpAddress() {
20574
+ return AnalyticsAPI.saveIp(this.id, this.merchant.key);
20575
+ },
20576
+ saveReferrer: function saveReferrer(referrer) {
20577
+ return AnalyticsAPI.saveReferrer(this.id, this.merchant.key, referrer);
20604
20578
  }
20605
20579
  };
20606
20580
 
@@ -20636,6 +20610,7 @@ var Paystack = (function (exports) {
20636
20610
  this.rememberMeEnabled = data.is_remember_me_enabled;
20637
20611
  this.card = {};
20638
20612
  this.bankAccount = {};
20613
+ this.mobileMoney = {};
20639
20614
  this.ussd = {};
20640
20615
  this.bankTransfer = {};
20641
20616
  this.qr = {};