react-native-upi-payment
Version:
<img width="778" alt="art" src="https://user-images.githubusercontent.com/13037986/46161228-a1369700-c2a2-11e8-9b9d-d0c40a3e0f38.png">
132 lines (111 loc) • 3.42 kB
JavaScript
import { NativeModules } from 'react-native';
const UpiModule = NativeModules.UpiPayment;
const RNUpiPayment = {
requiredFields: ['vpa', 'amount', 'payeeName', 'transactionRef'],
upiConfig: {
vpa: 'pa',
payeeName: 'pn',
transactionRef: 'tr',
amount: 'am',
transactionNote: 'tn',
currency: 'cu',
merchantCode: 'mc',
},
defaultValues: {
currency: 'INR',
merchantCode: '',
},
UPI_APP_NOT_INSTALLED: 'UPI supporting app not installed',
REQUEST_CODE_MISMATCH: 'Request Code Mismatch',
NO_ACTION_TAKEN: 'No action taken',
validateObject(config: Object) {
const errorArray = [];
this.requiredFields.forEach((eachField) => {
if (!config[eachField]) {
errorArray.push(eachField);
}
});
return errorArray;
},
successCallback(success: Function) {
return (data) => {
data = JSON.parse(data);
const successString = data.nameValuePairs && data.nameValuePairs.message;
let successObj = this.convertStringToObject(successString);
successObj.status = data.status;
success(successObj);
};
},
failureCallback(failure: Function) {
return (data) => {
data = JSON.parse(data);
let failureObj = {};
if (typeof data.nameValuePairs.message == 'undefined') {
failure(data.nameValuePairs);
} else {
const failureString =
data.nameValuePairs && data.nameValuePairs.message;
if (
failureString === this.UPI_APP_NOT_INSTALLED ||
failureString === this.REQUEST_CODE_MISMATCH ||
failureString === this.NO_ACTION_TAKEN
) {
failure(data.nameValuePairs);
} else {
failureObj = this.convertStringToObject(failureString);
failure(failureObj);
}
}
};
},
convertStringToObject(responseString: string) {
let object = {};
const stringArray = responseString.split('&');
object = stringArray.reduce((accumulator, current) => {
const currentArray = current.split('=');
accumulator[currentArray[0]] = currentArray[1];
return accumulator;
}, {});
return object;
},
initializePayment(config, success, failure) {
if (typeof success !== 'function') {
throw new Error('Success callback not a function');
}
if (typeof failure !== 'function') {
throw new Error('Failure callback not a function');
}
if (typeof config !== 'object') {
throw new Error('config not of type object');
}
const errorArray = this.validateObject(config);
if (errorArray.length > 0) {
throw new Error(
`Following keys are required ${JSON.stringify(errorArray)}`
);
}
config.currency = 'INR';
let upiString = 'upi://pay?';
let queryString = Object.keys(config).reduce((accumulator, current) => {
let prefix = '';
if (accumulator) {
prefix = '&';
}
accumulator =
accumulator +
prefix +
`${this.upiConfig[current]}=${encodeURIComponent(
config[current] || this.defaultValues[current] || ''
)}`;
return accumulator;
}, '');
const upiConfig = {};
upiConfig.upiString = `upi://pay?${queryString}`;
UpiModule.intializePayment(
upiConfig,
this.successCallback(success),
this.failureCallback(failure)
);
},
};
module.exports = RNUpiPayment;