react-amwal-pay 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # react-amwal-pay
2
2
 
3
- amwal pay
3
+ A React Native library for integrating Amwal Pay payment gateway into your React Native applications.
4
4
 
5
5
  ## Installation
6
6
 
@@ -10,15 +10,83 @@ npm install react-amwal-pay
10
10
 
11
11
  ## Usage
12
12
 
13
-
14
13
  ```js
15
- import { multiply } from 'react-amwal-pay';
14
+ import {
15
+ AmwalPaySDK,
16
+ Environment,
17
+ Currency,
18
+ TransactionType,
19
+ type AmwalPayConfig,
20
+ type AmwalPayResponse
21
+ } from 'react-amwal-pay';
22
+
23
+ // Configure Amwal Pay
24
+ const config: AmwalPayConfig = {
25
+ environment: Environment.SIT, // or Environment.PRODUCTION
26
+ currency: Currency.OMR, // or other supported currencies
27
+ transactionType: TransactionType.CARD_WALLET,
28
+ locale: 'en', // or 'ar'
29
+ merchantId: '84131',
30
+ terminalId: '811018',
31
+ amount: '1',
32
+ secureHash: '8570CEED656C8818E4A7CE04F22206358F272DAD5F0227D322B654675ABF8F83',
33
+ customerId: 'customer-id', // optional
34
+ sessionToken: 'your-session-token', // optional
35
+ onCustomerId(customerId) {
36
+ console.log('Customer ID:', customerId);
37
+ },
38
+ onResponse(response) {
39
+ console.log('Payment Response:', response);
40
+ }
41
+ };
42
+
43
+ // Initialize and start payment
44
+ const handlePayment = async () => {
45
+ try {
46
+ // Validate required fields
47
+ if (!isConfigValid(config)) {
48
+ console.error('Please fill in all required fields');
49
+ return;
50
+ }
16
51
 
17
- // ...
52
+ const amwalPay = AmwalPaySDK.getInstance();
53
+ await amwalPay.startPayment(config);
54
+ } catch (error) {
55
+ console.error('Error starting payment:', error);
56
+ }
57
+ };
18
58
 
19
- const result = multiply(3, 7);
59
+ // Helper function to validate config
60
+ const isConfigValid = (config: Partial<AmwalPayConfig>): boolean => {
61
+ return Boolean(
62
+ config.environment &&
63
+ config.secureHash &&
64
+ config.currency &&
65
+ config.amount &&
66
+ config.merchantId &&
67
+ config.terminalId &&
68
+ config.locale &&
69
+ config.transactionType
70
+ );
71
+ };
20
72
  ```
21
73
 
74
+ ## Configuration
75
+
76
+ The `AmwalPayConfig` interface includes the following properties:
77
+
78
+ - `environment`: The environment to use (SIT or PRODUCTION)
79
+ - `currency`: The currency for the transaction (e.g., OMR)
80
+ - `transactionType`: The type of transaction (e.g., CARD_WALLET)
81
+ - `locale`: The language locale ('en' or 'ar')
82
+ - `merchantId`: Your merchant ID
83
+ - `terminalId`: Your terminal ID
84
+ - `amount`: The transaction amount
85
+ - `secureHash`: Your secure hash for authentication
86
+ - `customerId`: (Optional) The customer's ID
87
+ - `sessionToken`: (Optional) Your session token
88
+ - `onCustomerId`: (Optional) Callback function for customer ID updates
89
+ - `onResponse`: (Optional) Callback function for payment response
22
90
 
23
91
  ## Contributing
24
92
 
@@ -11,10 +11,11 @@ Pod::Spec.new do |s|
11
11
  s.authors = package["author"]
12
12
 
13
13
  s.platforms = { :ios => min_ios_version_supported }
14
- s.source = { :git => "https://.git", :tag => "#{s.version}" }
14
+ s.source = { :git => "https://github.com/amwal-pay/AnwalPaySDKReactNative.git", :tag => "#{s.version}" }
15
15
 
16
16
  s.source_files = "ios/**/*.{h,m,mm,cpp}"
17
17
  s.private_header_files = "ios/**/*.h"
18
18
 
19
+ s.dependency "amwalsdk"
19
20
  install_modules_dependencies(s)
20
21
  end
@@ -71,8 +71,6 @@ repositories {
71
71
  }
72
72
  rootProject.allprojects { Project subproject ->
73
73
  subproject.repositories {
74
- maven { url uri("E:/react_amwal_pay/android/repo") }
75
-
76
74
  maven { url = uri("https://storage.googleapis.com/download.flutter.io") }
77
75
  }
78
76
  }
@@ -81,7 +79,7 @@ def kotlin_version = getExtOrDefault("kotlinVersion")
81
79
  dependencies {
82
80
  implementation "com.facebook.react:react-android"
83
81
  implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
84
- implementation("com.amwal-pay:amwal_sdk:1.0.91"){
82
+ implementation("com.amwal-pay:amwal_sdk:+"){
85
83
  exclude group: 'com.android.support', module: 'support-v4'
86
84
  exclude group: 'com.android.support', module: 'design'
87
85
  }
@@ -1,5 +1,14 @@
1
1
  #import <ReactAmwalPaySpec/ReactAmwalPaySpec.h>
2
+ #import <React/RCTEventEmitter.h>
3
+ #import <amwalsdk/amwalsdk.h>
2
4
 
3
- @interface ReactAmwalPay : NSObject <NativeReactAmwalPaySpec>
5
+ @interface ReactAmwalPay : RCTEventEmitter <NativeReactAmwalPaySpec>
6
+
7
+ - (AmwalEnvironment)getEnvironmentFromString:(NSString *)env;
8
+ - (AmwalLocale)getLocaleFromString:(NSString *)locale;
9
+ - (AmwalTransactionType)getTransactionTypeFromString:(NSString *)type;
10
+ - (void)sendResponseEvent:(NSDictionary *)response;
11
+ - (void)sendCustomerIdEvent:(NSString *)customerId;
12
+ - (void)sendErrorEvent:(NSString *)errorMessage;
4
13
 
5
14
  @end
@@ -1,18 +1,141 @@
1
1
  #import "ReactAmwalPay.h"
2
+ #import <React/RCTBridgeModule.h>
3
+ #import <React/RCTEventEmitter.h>
4
+ #import <React/RCTUtils.h>
5
+ #import <amwalsdk/amwalsdk.h>
2
6
 
3
7
  @implementation ReactAmwalPay
4
8
  RCT_EXPORT_MODULE()
5
9
 
6
- - (NSNumber *)multiply:(double)a b:(double)b {
7
- NSNumber *result = @(a * b);
8
-
9
- return result;
10
- }
11
-
12
10
  - (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
13
11
  (const facebook::react::ObjCTurboModule::InitParams &)params
14
12
  {
15
13
  return std::make_shared<facebook::react::NativeReactAmwalPaySpecJSI>(params);
16
14
  }
17
15
 
16
+ - (AmwalEnvironment)getEnvironmentFromString:(NSString *)env {
17
+ if ([env isEqualToString:@"PROD"]) {
18
+ return AmwalEnvironmentPROD;
19
+ } else if ([env isEqualToString:@"UAT"]) {
20
+ return AmwalEnvironmentUAT;
21
+ }
22
+ return AmwalEnvironmentSIT;
23
+ }
24
+
25
+ - (AmwalLocale)getLocaleFromString:(NSString *)locale {
26
+ if ([locale isEqualToString:@"ar"]) {
27
+ return AmwalLocaleAr;
28
+ }
29
+ return AmwalLocaleEn;
30
+ }
31
+
32
+ - (AmwalTransactionType)getTransactionTypeFromString:(NSString *)type {
33
+ if ([type isEqualToString:@"NFC"]) {
34
+ return AmwalTransactionTypeNFC;
35
+ } else if ([type isEqualToString:@"APPLE_PAY"]) {
36
+ return AmwalTransactionTypeApplePay;
37
+ }
38
+ return AmwalTransactionTypeCardWallet;
39
+ }
40
+
41
+ - (void)initiate:(JS::NativeReactAmwalPay::AmwalPayNativeConfig &)config {
42
+ dispatch_async(dispatch_get_main_queue(), ^{
43
+ UIViewController *rootViewController = RCTPresentedViewController();
44
+ if (!rootViewController) {
45
+ [self sendErrorEvent:@"Activity context is not available"];
46
+ return;
47
+ }
48
+
49
+ @try {
50
+ // Get values using method calls
51
+ NSString *sessionToken = config.sessionToken();
52
+ NSString *amount = config.amount();
53
+ NSString *merchantId = config.merchantId();
54
+ NSString *terminalId = config.terminalId();
55
+ NSString *customerId = config.customerId();
56
+ NSString *environment = config.environment();
57
+ NSString *locale = config.locale();
58
+ NSString *transactionType = config.transactionType();
59
+
60
+ // Create config object with all required parameters
61
+ Config *sdkConfig = [[Config alloc] initWithEnvironment:[self getEnvironmentFromString:environment]
62
+ sessionToken:sessionToken
63
+ currency:AmwalCurrencyOMR
64
+ amount:amount
65
+ merchantId:merchantId
66
+ terminalId:terminalId
67
+ customerId:customerId
68
+ locale:[self getLocaleFromString:locale]
69
+ transactionType:[self getTransactionTypeFromString:transactionType]];
70
+
71
+ // Initialize AmwalSDK
72
+ AmwalSDK *amwalSDK = [[AmwalSDK alloc] init];
73
+
74
+ // Create and present the payment view controller
75
+ NSError *error = nil;
76
+ UIViewController *paymentVC = [amwalSDK createViewControllerWithConfig:sdkConfig
77
+ onResponse:^(NSString * _Nullable response) {
78
+ if (response) {
79
+ [self sendResponseEvent:@{@"response": response}];
80
+ }
81
+ }
82
+ onCustomerId:^(NSString *customerId) {
83
+ [self sendCustomerIdEvent:customerId];
84
+ }
85
+ error:&error];
86
+
87
+ if (error) {
88
+ [self sendErrorEvent:error.localizedDescription];
89
+ return;
90
+ }
91
+
92
+ if (paymentVC) {
93
+ [rootViewController presentViewController:paymentVC animated:YES completion:nil];
94
+ } else {
95
+ [self sendErrorEvent:@"Failed to create payment view controller"];
96
+ }
97
+
98
+ } @catch (NSException *exception) {
99
+ [self sendErrorEvent:exception.reason];
100
+ }
101
+ });
102
+ }
103
+
104
+ #pragma mark - Helper Methods
105
+
106
+ - (void)sendResponseEvent:(NSDictionary *)response {
107
+ NSMutableDictionary *params = [NSMutableDictionary dictionary];
108
+ params[@"type"] = @"onResponse";
109
+ params[@"data"] = response;
110
+
111
+ [self sendEventWithName:@"AmwalPayEvent" body:params];
112
+ }
113
+
114
+ - (void)sendCustomerIdEvent:(NSString *)customerId {
115
+ NSMutableDictionary *params = [NSMutableDictionary dictionary];
116
+ params[@"type"] = @"onCustomerId";
117
+ params[@"data"] = customerId;
118
+
119
+ [self sendEventWithName:@"AmwalPayEvent" body:params];
120
+ }
121
+
122
+ - (void)sendErrorEvent:(NSString *)errorMessage {
123
+ NSMutableDictionary *params = [NSMutableDictionary dictionary];
124
+ params[@"type"] = @"onResponse";
125
+
126
+ NSMutableDictionary *errorData = [NSMutableDictionary dictionary];
127
+ errorData[@"status"] = @"ERROR";
128
+ errorData[@"message"] = errorMessage;
129
+
130
+ params[@"data"] = errorData;
131
+
132
+ [self sendEventWithName:@"AmwalPayEvent" body:params];
133
+ }
134
+
135
+ // Add this to ensure the module is properly initialized
136
+ + (BOOL)requiresMainQueueSetup
137
+ {
138
+ return YES;
139
+ }
140
+
18
141
  @end
@@ -0,0 +1,47 @@
1
+ export type Environment = 'SIT' | 'UAT' | 'PROD';
2
+ export declare const Environment: {
3
+ SIT: Environment;
4
+ UAT: Environment;
5
+ PROD: Environment;
6
+ };
7
+ export type Currency = 'OMR';
8
+ export declare const Currency: {
9
+ OMR: "OMR";
10
+ };
11
+ export type TransactionType = 'NFC' | 'CARD_WALLET' | 'APPLE_PAY';
12
+ export declare const TransactionType: {
13
+ NFC: TransactionType;
14
+ CARD_WALLET: TransactionType;
15
+ APPLE_PAY: TransactionType;
16
+ };
17
+ export interface AmwalPayConfig {
18
+ environment: Environment;
19
+ secureHash: string;
20
+ currency: Currency;
21
+ amount: string;
22
+ merchantId: string;
23
+ terminalId: string;
24
+ locale: string;
25
+ customerId: string | null;
26
+ transactionType: TransactionType;
27
+ sessionToken?: string;
28
+ onResponse: (response: AmwalPayResponse) => void;
29
+ onCustomerIdResponse: (customerId: string) => void;
30
+ }
31
+ export interface AmwalPayResponse {
32
+ success: boolean;
33
+ transactionId?: string;
34
+ message?: string;
35
+ error?: string;
36
+ }
37
+ declare class AmwalPay {
38
+ private static instance;
39
+ private eventEmitter;
40
+ private constructor();
41
+ static getInstance(): AmwalPay;
42
+ private getSessionToken;
43
+ start(amwalPayConfig: AmwalPayConfig): Promise<void>;
44
+ private registerEventListeners;
45
+ removeEventListeners(): void;
46
+ }
47
+ export default AmwalPay;
@@ -0,0 +1,63 @@
1
+ import { NativeModules, NativeEventEmitter } from 'react-native';
2
+ import NetworkClient from './services/NetworkClient';
3
+ const { AmwalPaySDK } = NativeModules;
4
+ export const Environment = {
5
+ SIT: 'SIT',
6
+ UAT: 'UAT',
7
+ PROD: 'PROD'
8
+ };
9
+ export const Currency = {
10
+ OMR: 'OMR'
11
+ };
12
+ export const TransactionType = {
13
+ NFC: 'NFC',
14
+ CARD_WALLET: 'CARD_WALLET',
15
+ APPLE_PAY: 'APPLE_PAY'
16
+ };
17
+ class AmwalPay {
18
+ constructor() {
19
+ this.eventEmitter = new NativeEventEmitter(AmwalPaySDK);
20
+ }
21
+ static getInstance() {
22
+ if (!AmwalPay.instance) {
23
+ AmwalPay.instance = new AmwalPay();
24
+ }
25
+ return AmwalPay.instance;
26
+ }
27
+ async getSessionToken(config) {
28
+ const { environment, merchantId, customerId, secureHash } = config;
29
+ const sessionToken = await NetworkClient.getInstance().fetchSessionToken(environment, merchantId, customerId, secureHash);
30
+ return sessionToken;
31
+ }
32
+ async start(amwalPayConfig) {
33
+ const token = await this.getSessionToken(amwalPayConfig);
34
+ console.log(token);
35
+ if (token) {
36
+ amwalPayConfig.sessionToken = token;
37
+ try {
38
+ // Initialize the AmwalPay SDK
39
+ await AmwalPaySDK.initialize(amwalPayConfig);
40
+ // Register event listeners
41
+ this.registerEventListeners(amwalPayConfig);
42
+ }
43
+ catch (error) {
44
+ throw new Error(`Failed to initialize AmwalPay SDK: ${error}`);
45
+ }
46
+ }
47
+ }
48
+ registerEventListeners(amwalPayConfig) {
49
+ this.eventEmitter.addListener('AmwalPayEvent', async (event) => {
50
+ if (event.type === 'onResponse') {
51
+ amwalPayConfig.onResponse(event.data);
52
+ }
53
+ else if (event.type === 'onCustomerId') {
54
+ amwalPayConfig.onCustomerIdResponse(event.data);
55
+ }
56
+ });
57
+ }
58
+ removeEventListeners() {
59
+ this.eventEmitter.removeAllListeners('AmwalPayEvent');
60
+ }
61
+ }
62
+ export default AmwalPay;
63
+ //# sourceMappingURL=AmwalPay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AmwalPay.js","sourceRoot":"","sources":["../src/AmwalPay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,aAAa,MAAM,0BAA0B,CAAC;AAGrD,MAAM,EAAE,WAAW,EAAE,GAAG,aAAa,CAAC;AAItC,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,GAAG,EAAE,KAAoB;IACzB,GAAG,EAAE,KAAoB;IACzB,IAAI,EAAE,MAAqB;CAC5B,CAAC;AAGF,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,GAAG,EAAE,KAAiB;CACvB,CAAC;AAGF,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,GAAG,EAAE,KAAwB;IAC7B,WAAW,EAAE,aAAgC;IAC7C,SAAS,EAAE,WAA8B;CAC1C,CAAC;AAwBF,MAAM,QAAQ;IAIZ;QACE,IAAI,CAAC,YAAY,GAAG,IAAI,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAC1D,CAAC;IAEM,MAAM,CAAC,WAAW;QACvB,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;YACtB,QAAQ,CAAC,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;SACpC;QACD,OAAO,QAAQ,CAAC,QAAQ,CAAC;IAC3B,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,MAAsB;QAClD,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;QACnE,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,WAAW,EAAE,CAAC,iBAAiB,CACtE,WAAW,EACX,UAAU,EACV,UAAU,EACV,UAAU,CACX,CAAC;QACF,OAAO,YAAY,CAAC;IACtB,CAAC;IAEM,KAAK,CAAC,KAAK,CAAC,cAA8B;QAE/C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAEnB,IAAI,KAAK,EAAE;YACT,cAAc,CAAC,YAAY,GAAG,KAAK,CAAC;YAEpC,IAAI;gBACF,8BAA8B;gBAC9B,MAAM,WAAW,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;gBAE7C,2BAA2B;gBAC3B,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC;aAC7C;YAAC,OAAO,KAAK,EAAE;gBACd,MAAM,IAAI,KAAK,CAAC,sCAAsC,KAAK,EAAE,CAAC,CAAC;aAChE;SACF;IACH,CAAC;IAEO,sBAAsB,CAAC,cAA8B;QAC3D,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YAC7D,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE;gBAC/B,cAAc,CAAC,UAAU,CAAC,KAAK,CAAC,IAAwB,CAAC,CAAC;aAC3D;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE;gBACxC,cAAc,CAAC,oBAAoB,CAAC,KAAK,CAAC,IAAc,CAAC,CAAC;aAC3D;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,oBAAoB;QACzB,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC;IACxD,CAAC;CACF;AAED,eAAe,QAAQ,CAAC"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import AmwalPay, { Environment, Currency, TransactionType, AmwalPayConfig, AmwalPayResponse } from './AmwalPay';
2
+ export { AmwalPay, Environment, Currency, TransactionType };
3
+ export type { AmwalPayConfig, AmwalPayResponse };
4
+ export default AmwalPay;
package/lib/index.js ADDED
@@ -0,0 +1,4 @@
1
+ import AmwalPay, { Environment, Currency, TransactionType, } from './AmwalPay';
2
+ export { AmwalPay, Environment, Currency, TransactionType };
3
+ export default AmwalPay;
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,EAAE,EACf,WAAW,EACX,QAAQ,EACR,eAAe,GAGhB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,eAAe,EAAC,CAAC;AAG1D,eAAe,QAAQ,CAAC"}
@@ -15,9 +15,9 @@ class AmwalPaySDK {
15
15
  return AmwalPaySDK.instance;
16
16
  }
17
17
 
18
- /**
19
- * Initiates the payment process by first fetching a session token and then starting the payment flow
20
- * @param config The payment configuration
18
+ /**
19
+ * Initiates the payment process by first fetching a session token and then starting the payment flow
20
+ * @param config The payment configuration
21
21
  */
22
22
  async startPayment(config) {
23
23
  try {
@@ -51,9 +51,9 @@ class AmwalPaySDK {
51
51
  this.removeEventListeners();
52
52
  }
53
53
 
54
- /**
55
- * Sets up event listeners for AmwalPay events
56
- * @param config The payment configuration containing callback functions
54
+ /**
55
+ * Sets up event listeners for AmwalPay events
56
+ * @param config The payment configuration containing callback functions
57
57
  */
58
58
  setupEventListeners(config) {
59
59
  // Remove any existing listeners
@@ -68,8 +68,8 @@ class AmwalPaySDK {
68
68
  });
69
69
  }
70
70
 
71
- /**
72
- * Removes all event listeners
71
+ /**
72
+ * Removes all event listeners
73
73
  */
74
74
  removeEventListeners() {
75
75
  this.onResponseSubscription?.remove();
@@ -1 +1 @@
1
- {"version":3,"names":["initiate","onCustomerId","onResponse","NetworkClient","AmwalPaySDK","onResponseSubscription","onCustomerIdSubscription","constructor","getInstance","instance","startPayment","config","setupEventListeners","networkClient","sessionToken","fetchSessionToken","environment","merchantId","customerId","secureHash","completeConfig","error","console","dispose","removeEventListeners","response","log","remove"],"sourceRoot":"..\\..\\src","sources":["AmwalPaySDK.ts"],"mappings":";;AAAA,SAASA,QAAQ,EAAEC,YAAY,EAAEC,UAAU,QAA6B,YAAS;AACjF,OAAOC,aAAa,MAAM,4BAAyB;AAInD,MAAMC,WAAW,CAAC;EAGRC,sBAAsB,GAA2B,IAAI;EAErDC,wBAAwB,GAA2B,IAAI;EAEvDC,WAAWA,CAAA,EAAG;IACpB;EAAA;EAIF,OAAOC,WAAWA,CAAA,EAAgB;IAChC,IAAI,CAACJ,WAAW,CAACK,QAAQ,EAAE;MACzBL,WAAW,CAACK,QAAQ,GAAG,IAAIL,WAAW,CAAC,CAAC;IAC1C;IACA,OAAOA,WAAW,CAACK,QAAQ;EAC7B;;EAEA;AACF;AACA;AACA;EACE,MAAMC,YAAYA,CAACC,MAA4C,EAAiB;IAC9E,IAAI;MACF;MACA,IAAI,CAACC,mBAAmB,CAACD,MAAM,CAAC;;MAEhC;MACA,MAAME,aAAa,GAAGV,aAAa,CAACK,WAAW,CAAC,CAAC;;MAEjD;MACA,MAAMM,YAAY,GAAG,MAAMD,aAAa,CAACE,iBAAiB,CACxDJ,MAAM,CAACK,WAAW,EAClBL,MAAM,CAACM,UAAU,EACjBN,MAAM,CAACO,UAAU,EACjBP,MAAM,CAACQ,UACT,CAAC;MAED,IAAI,CAACL,YAAY,EAAE;QACjB;QACA;MACF;;MAEA;MACA,MAAMM,cAA8B,GAAG;QACrC,GAAGT,MAAM;QACTG;MACF,CAAC;;MAED;MACAd,QAAQ,CAACoB,cAAc,CAAC;IAC1B,CAAC,CAAC,OAAOC,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,yBAAyB,EAAEA,KAAK,CAAC;IACjD;EACF;EAEAE,OAAOA,CAAA,EAAS;IACd;IACA,IAAI,CAACC,oBAAoB,CAAC,CAAC;EAC7B;;EAEA;AACF;AACA;AACA;EACUZ,mBAAmBA,CAACD,MAA4C,EAAQ;IAC9E;IACA,IAAI,CAACa,oBAAoB,CAAC,CAAC;IAE3B,IAAI,CAACnB,sBAAsB,GAAGH,UAAU,CAAEuB,QAAQ,IAAK;MACrDH,OAAO,CAACI,GAAG,CAAC,4BAA4B,EAAED,QAAQ,CAAC;MACnDd,MAAM,CAACT,UAAU,CAACuB,QAAQ,CAAC;IAC7B,CAAC,CAAC;IAEF,IAAI,CAACnB,wBAAwB,GAAGL,YAAY,CAAEiB,UAAU,IAAK;MAC3DI,OAAO,CAACI,GAAG,CAAC,sBAAsB,EAAER,UAAU,CAAC;MAC/CP,MAAM,CAACV,YAAY,CAACiB,UAAU,CAAC;IACjC,CAAC,CAAC;EACJ;;EAEA;AACF;AACA;EACUM,oBAAoBA,CAAA,EAAS;IACnC,IAAI,CAACnB,sBAAsB,EAAEsB,MAAM,CAAC,CAAC;IACrC,IAAI,CAACrB,wBAAwB,EAAEqB,MAAM,CAAC,CAAC;IACvC,IAAI,CAACtB,sBAAsB,GAAG,IAAI;IAClC,IAAI,CAACC,wBAAwB,GAAG,IAAI;EACtC;AACF;AAEA,eAAeF,WAAW","ignoreList":[]}
1
+ {"version":3,"names":["initiate","onCustomerId","onResponse","NetworkClient","AmwalPaySDK","onResponseSubscription","onCustomerIdSubscription","constructor","getInstance","instance","startPayment","config","setupEventListeners","networkClient","sessionToken","fetchSessionToken","environment","merchantId","customerId","secureHash","completeConfig","error","console","dispose","removeEventListeners","response","log","remove"],"sourceRoot":"../../src","sources":["AmwalPaySDK.ts"],"mappings":";;AAAA,SAASA,QAAQ,EAAEC,YAAY,EAAEC,UAAU,QAA6B,YAAS;AACjF,OAAOC,aAAa,MAAM,4BAAyB;AAInD,MAAMC,WAAW,CAAC;EAGRC,sBAAsB,GAA2B,IAAI;EAErDC,wBAAwB,GAA2B,IAAI;EAEvDC,WAAWA,CAAA,EAAG;IACpB;EAAA;EAIF,OAAOC,WAAWA,CAAA,EAAgB;IAChC,IAAI,CAACJ,WAAW,CAACK,QAAQ,EAAE;MACzBL,WAAW,CAACK,QAAQ,GAAG,IAAIL,WAAW,CAAC,CAAC;IAC1C;IACA,OAAOA,WAAW,CAACK,QAAQ;EAC7B;;EAEA;AACF;AACA;AACA;EACE,MAAMC,YAAYA,CAACC,MAA4C,EAAiB;IAC9E,IAAI;MACF;MACA,IAAI,CAACC,mBAAmB,CAACD,MAAM,CAAC;;MAEhC;MACA,MAAME,aAAa,GAAGV,aAAa,CAACK,WAAW,CAAC,CAAC;;MAEjD;MACA,MAAMM,YAAY,GAAG,MAAMD,aAAa,CAACE,iBAAiB,CACxDJ,MAAM,CAACK,WAAW,EAClBL,MAAM,CAACM,UAAU,EACjBN,MAAM,CAACO,UAAU,EACjBP,MAAM,CAACQ,UACT,CAAC;MAED,IAAI,CAACL,YAAY,EAAE;QACjB;QACA;MACF;;MAEA;MACA,MAAMM,cAA8B,GAAG;QACrC,GAAGT,MAAM;QACTG;MACF,CAAC;;MAED;MACAd,QAAQ,CAACoB,cAAc,CAAC;IAC1B,CAAC,CAAC,OAAOC,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,yBAAyB,EAAEA,KAAK,CAAC;IACjD;EACF;EAEAE,OAAOA,CAAA,EAAS;IACd;IACA,IAAI,CAACC,oBAAoB,CAAC,CAAC;EAC7B;;EAEA;AACF;AACA;AACA;EACUZ,mBAAmBA,CAACD,MAA4C,EAAQ;IAC9E;IACA,IAAI,CAACa,oBAAoB,CAAC,CAAC;IAE3B,IAAI,CAACnB,sBAAsB,GAAGH,UAAU,CAAEuB,QAAQ,IAAK;MACrDH,OAAO,CAACI,GAAG,CAAC,4BAA4B,EAAED,QAAQ,CAAC;MACnDd,MAAM,CAACT,UAAU,CAACuB,QAAQ,CAAC;IAC7B,CAAC,CAAC;IAEF,IAAI,CAACnB,wBAAwB,GAAGL,YAAY,CAAEiB,UAAU,IAAK;MAC3DI,OAAO,CAACI,GAAG,CAAC,sBAAsB,EAAER,UAAU,CAAC;MAC/CP,MAAM,CAACV,YAAY,CAACiB,UAAU,CAAC;IACjC,CAAC,CAAC;EACJ;;EAEA;AACF;AACA;EACUM,oBAAoBA,CAAA,EAAS;IACnC,IAAI,CAACnB,sBAAsB,EAAEsB,MAAM,CAAC,CAAC;IACrC,IAAI,CAACrB,wBAAwB,EAAEqB,MAAM,CAAC,CAAC;IACvC,IAAI,CAACtB,sBAAsB,GAAG,IAAI;IAClC,IAAI,CAACC,wBAAwB,GAAG,IAAI;EACtC;AACF;AAEA,eAAeF,WAAW","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["TurboModuleRegistry","Environment","Currency","TransactionType","getEnforcing"],"sourceRoot":"..\\..\\src","sources":["NativeReactAmwalPay.ts"],"mappings":";;AACA,SAASA,mBAAmB,QAAQ,cAAc;AAGlD,WAAYC,WAAW,0BAAXA,WAAW;EAAXA,WAAW;EAAXA,WAAW;EAAXA,WAAW;EAAA,OAAXA,WAAW;AAAA;AAMvB,WAAYC,QAAQ,0BAARA,QAAQ;EAARA,QAAQ;EAAA,OAARA,QAAQ;AAAA;AAIpB,WAAYC,eAAe,0BAAfA,eAAe;EAAfA,eAAe;EAAfA,eAAe;EAAfA,eAAe;EAAA,OAAfA,eAAe;AAAA;;AAY3B;;AAgBA;;AAqBA,eAAeH,mBAAmB,CAACI,YAAY,CAAO,eAAe,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["TurboModuleRegistry","Environment","Currency","TransactionType","getEnforcing"],"sourceRoot":"../../src","sources":["NativeReactAmwalPay.ts"],"mappings":";;AACA,SAASA,mBAAmB,QAAQ,cAAc;AAGlD,WAAYC,WAAW,0BAAXA,WAAW;EAAXA,WAAW;EAAXA,WAAW;EAAXA,WAAW;EAAA,OAAXA,WAAW;AAAA;AAMvB,WAAYC,QAAQ,0BAARA,QAAQ;EAARA,QAAQ;EAAA,OAARA,QAAQ;AAAA;AAIpB,WAAYC,eAAe,0BAAfA,eAAe;EAAfA,eAAe;EAAfA,eAAe;EAAfA,eAAe;EAAA,OAAfA,eAAe;AAAA;;AAY3B;;AAgBA;;AAqBA,eAAeH,mBAAmB,CAACI,YAAY,CAAO,eAAe,CAAC","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["ReactAmwalPay","Environment","Currency","TransactionType","AmwalPaySDK","initiate","config","nativeConfig","environment","secureHash","currency","amount","merchantId","terminalId","locale","customerId","transactionType","sessionToken","onResponse","callback","onCustomerId"],"sourceRoot":"..\\..\\src","sources":["index.tsx"],"mappings":";;AAAA,OAAOA,aAAa,IAClBC,WAAW,EACXC,QAAQ,EACRC,eAAe,QAIV,0BAAuB;AAC9B,OAAOC,WAAW,MAAM,kBAAe;AAGvC;;AAEA,OAAO,SAASC,QAAQA,CAACC,MAAsB,EAAQ;EACrD,MAAMC,YAAkC,GAAG;IACzCC,WAAW,EAAEF,MAAM,CAACE,WAAW;IAC/BC,UAAU,EAAEH,MAAM,CAACG,UAAU;IAC7BC,QAAQ,EAAEJ,MAAM,CAACI,QAAQ;IACzBC,MAAM,EAAEL,MAAM,CAACK,MAAM;IACrBC,UAAU,EAAEN,MAAM,CAACM,UAAU;IAC7BC,UAAU,EAAEP,MAAM,CAACO,UAAU;IAC7BC,MAAM,EAAER,MAAM,CAACQ,MAAM;IACrBC,UAAU,EAAET,MAAM,CAACS,UAAU;IAC7BC,eAAe,EAAEV,MAAM,CAACU,eAAe;IACvCC,YAAY,EAAEX,MAAM,CAACW;EACvB,CAAC;;EAED;EACAjB,aAAa,CAACK,QAAQ,CAACE,YAAY,CAAC;AACtC;AAEA,OAAO,SAASW,UAAUA,CAACC,QAA8C,EAAoB;EAC3F,OAAOnB,aAAa,CAACkB,UAAU,CAACC,QAAQ,CAAC;AAC3C;AACA,OAAO,SAASC,YAAYA,CAACD,QAAsC,EAAoB;EACrF,OAAOnB,aAAa,CAACoB,YAAY,CAACD,QAAQ,CAAC;AAC7C;AAEA,SACElB,WAAW,EACXC,QAAQ,EACRC,eAAe,EAGfC,WAAW","ignoreList":[]}
1
+ {"version":3,"names":["ReactAmwalPay","Environment","Currency","TransactionType","AmwalPaySDK","initiate","config","nativeConfig","environment","secureHash","currency","amount","merchantId","terminalId","locale","customerId","transactionType","sessionToken","onResponse","callback","onCustomerId"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,OAAOA,aAAa,IAClBC,WAAW,EACXC,QAAQ,EACRC,eAAe,QAIV,0BAAuB;AAC9B,OAAOC,WAAW,MAAM,kBAAe;AAGvC;;AAEA,OAAO,SAASC,QAAQA,CAACC,MAAsB,EAAQ;EACrD,MAAMC,YAAkC,GAAG;IACzCC,WAAW,EAAEF,MAAM,CAACE,WAAW;IAC/BC,UAAU,EAAEH,MAAM,CAACG,UAAU;IAC7BC,QAAQ,EAAEJ,MAAM,CAACI,QAAQ;IACzBC,MAAM,EAAEL,MAAM,CAACK,MAAM;IACrBC,UAAU,EAAEN,MAAM,CAACM,UAAU;IAC7BC,UAAU,EAAEP,MAAM,CAACO,UAAU;IAC7BC,MAAM,EAAER,MAAM,CAACQ,MAAM;IACrBC,UAAU,EAAET,MAAM,CAACS,UAAU;IAC7BC,eAAe,EAAEV,MAAM,CAACU,eAAe;IACvCC,YAAY,EAAEX,MAAM,CAACW;EACvB,CAAC;;EAED;EACAjB,aAAa,CAACK,QAAQ,CAACE,YAAY,CAAC;AACtC;AAEA,OAAO,SAASW,UAAUA,CAACC,QAA8C,EAAoB;EAC3F,OAAOnB,aAAa,CAACkB,UAAU,CAACC,QAAQ,CAAC;AAC3C;AACA,OAAO,SAASC,YAAYA,CAACD,QAAsC,EAAoB;EACrF,OAAOnB,aAAa,CAACoB,YAAY,CAACD,QAAQ,CAAC;AAC7C;AAEA,SACElB,WAAW,EACXC,QAAQ,EACRC,eAAe,EAGfC,WAAW","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["Alert","Environment","SecureHashUtil","NetworkClient","constructor","getInstance","instance","getWebhookUrl","env","SIT","UAT","PROD","fetchSessionToken","merchantId","customerId","secureHashValue","webhookUrl","dataMap","secureHash","clearSecureHash","response","fetch","method","headers","body","JSON","stringify","responseData","json","ok","success","data","sessionToken","errorMessage","errorList","join","showErrorDialog","error","message","alert","text"],"sourceRoot":"..\\..\\..\\src","sources":["network/NetworkClient.ts"],"mappings":";;AAAA,SAASA,KAAK,QAAQ,cAAc;AACpC,SAASC,WAAW,QAAQ,2BAAwB;AACpD,OAAOC,cAAc,MAAM,4BAAyB;AAEpD,MAAMC,aAAa,CAAC;EAGVC,WAAWA,CAAA,EAAG,CAAC;EAEvB,OAAOC,WAAWA,CAAA,EAAkB;IAClC,IAAI,CAACF,aAAa,CAACG,QAAQ,EAAE;MAC3BH,aAAa,CAACG,QAAQ,GAAG,IAAIH,aAAa,CAAC,CAAC;IAC9C;IACA,OAAOA,aAAa,CAACG,QAAQ;EAC/B;EAEQC,aAAaA,CAACC,GAAgB,EAAU;IAC9C,QAAQA,GAAG;MACT,KAAKP,WAAW,CAACQ,GAAG;QAClB,OAAO,iCAAiC;MAC1C,KAAKR,WAAW,CAACS,GAAG;QAClB,OAAO,iCAAiC;MAC1C,KAAKT,WAAW,CAACU,IAAI;QACnB,OAAO,8BAA8B;MACvC;QACE,OAAO,iCAAiC;IAC5C;EACF;EAEA,MAAMC,iBAAiBA,CACrBJ,GAAgB,EAChBK,UAAkB,EAClBC,UAAyB,EACzBC,eAAuB,EACC;IACxB,IAAI;MACF,MAAMC,UAAU,GAAG,IAAI,CAACT,aAAa,CAACC,GAAG,CAAC;MAE1C,MAAMS,OAAO,GAAG;QACdJ,UAAU;QACVC;MACF,CAAC;MAED,MAAMI,UAAU,GAAGhB,cAAc,CAACiB,eAAe,CAACJ,eAAe,EAAEE,OAAO,CAAC;MAE3E,MAAMG,QAAQ,GAAG,MAAMC,KAAK,CAAC,GAAGL,UAAU,+BAA+B,EAAE;QACzEM,MAAM,EAAE,MAAM;QACdC,OAAO,EAAE;UACP,QAAQ,EAAE,YAAY;UACtB,iBAAiB,EAAE,gBAAgB;UACnC,cAAc,EAAE;QAClB,CAAC;QACDC,IAAI,EAAEC,IAAI,CAACC,SAAS,CAAC;UACnBb,UAAU;UACVE,eAAe,EAAEG,UAAU;UAC3BJ;QACF,CAAC;MACH,CAAC,CAAC;MAEF,MAAMa,YAAY,GAAG,MAAMP,QAAQ,CAACQ,IAAI,CAAC,CAAC;MAE1C,IAAIR,QAAQ,CAACS,EAAE,IAAIF,YAAY,CAACG,OAAO,EAAE;QACvC,OAAOH,YAAY,CAACI,IAAI,CAACC,YAAY;MACvC,CAAC,MAAM;QACL,MAAMC,YAAY,GAAGN,YAAY,CAACO,SAAS,EAAEC,IAAI,CAAC,GAAG,CAAC,IAAI,eAAe;QACzE,IAAI,CAACC,eAAe,CAACH,YAAY,CAAC;QAClC,OAAO,IAAI;MACb;IACF,CAAC,CAAC,OAAOI,KAAK,EAAE;MACd,IAAI,CAACD,eAAe,CAAC,sBAAsB,CAAC;MAC5C,OAAO,IAAI;IACb;EACF;EAEQA,eAAeA,CAACE,OAAe,EAAQ;IAC7CtC,KAAK,CAACuC,KAAK,CACT,OAAO,EACPD,OAAO,EACP,CAAC;MAAEE,IAAI,EAAE;IAAK,CAAC,CACjB,CAAC;EACH;AACF;AAEA,eAAerC,aAAa","ignoreList":[]}
1
+ {"version":3,"names":["Alert","Environment","SecureHashUtil","NetworkClient","constructor","getInstance","instance","getWebhookUrl","env","SIT","UAT","PROD","fetchSessionToken","merchantId","customerId","secureHashValue","webhookUrl","dataMap","secureHash","clearSecureHash","response","fetch","method","headers","body","JSON","stringify","responseData","json","ok","success","data","sessionToken","errorMessage","errorList","join","showErrorDialog","error","message","alert","text"],"sourceRoot":"../../../src","sources":["network/NetworkClient.ts"],"mappings":";;AAAA,SAASA,KAAK,QAAQ,cAAc;AACpC,SAASC,WAAW,QAAQ,2BAAwB;AACpD,OAAOC,cAAc,MAAM,4BAAyB;AAEpD,MAAMC,aAAa,CAAC;EAGVC,WAAWA,CAAA,EAAG,CAAC;EAEvB,OAAOC,WAAWA,CAAA,EAAkB;IAClC,IAAI,CAACF,aAAa,CAACG,QAAQ,EAAE;MAC3BH,aAAa,CAACG,QAAQ,GAAG,IAAIH,aAAa,CAAC,CAAC;IAC9C;IACA,OAAOA,aAAa,CAACG,QAAQ;EAC/B;EAEQC,aAAaA,CAACC,GAAgB,EAAU;IAC9C,QAAQA,GAAG;MACT,KAAKP,WAAW,CAACQ,GAAG;QAClB,OAAO,iCAAiC;MAC1C,KAAKR,WAAW,CAACS,GAAG;QAClB,OAAO,iCAAiC;MAC1C,KAAKT,WAAW,CAACU,IAAI;QACnB,OAAO,8BAA8B;MACvC;QACE,OAAO,iCAAiC;IAC5C;EACF;EAEA,MAAMC,iBAAiBA,CACrBJ,GAAgB,EAChBK,UAAkB,EAClBC,UAAyB,EACzBC,eAAuB,EACC;IACxB,IAAI;MACF,MAAMC,UAAU,GAAG,IAAI,CAACT,aAAa,CAACC,GAAG,CAAC;MAE1C,MAAMS,OAAO,GAAG;QACdJ,UAAU;QACVC;MACF,CAAC;MAED,MAAMI,UAAU,GAAGhB,cAAc,CAACiB,eAAe,CAACJ,eAAe,EAAEE,OAAO,CAAC;MAE3E,MAAMG,QAAQ,GAAG,MAAMC,KAAK,CAAC,GAAGL,UAAU,+BAA+B,EAAE;QACzEM,MAAM,EAAE,MAAM;QACdC,OAAO,EAAE;UACP,QAAQ,EAAE,YAAY;UACtB,iBAAiB,EAAE,gBAAgB;UACnC,cAAc,EAAE;QAClB,CAAC;QACDC,IAAI,EAAEC,IAAI,CAACC,SAAS,CAAC;UACnBb,UAAU;UACVE,eAAe,EAAEG,UAAU;UAC3BJ;QACF,CAAC;MACH,CAAC,CAAC;MAEF,MAAMa,YAAY,GAAG,MAAMP,QAAQ,CAACQ,IAAI,CAAC,CAAC;MAE1C,IAAIR,QAAQ,CAACS,EAAE,IAAIF,YAAY,CAACG,OAAO,EAAE;QACvC,OAAOH,YAAY,CAACI,IAAI,CAACC,YAAY;MACvC,CAAC,MAAM;QACL,MAAMC,YAAY,GAAGN,YAAY,CAACO,SAAS,EAAEC,IAAI,CAAC,GAAG,CAAC,IAAI,eAAe;QACzE,IAAI,CAACC,eAAe,CAACH,YAAY,CAAC;QAClC,OAAO,IAAI;MACb;IACF,CAAC,CAAC,OAAOI,KAAK,EAAE;MACd,IAAI,CAACD,eAAe,CAAC,sBAAsB,CAAC;MAC5C,OAAO,IAAI;IACb;EACF;EAEQA,eAAeA,CAACE,OAAe,EAAQ;IAC7CtC,KAAK,CAACuC,KAAK,CACT,OAAO,EACPD,OAAO,EACP,CAAC;MAAEE,IAAI,EAAE;IAAK,CAAC,CACjB,CAAC;EACH;AACF;AAEA,eAAerC,aAAa","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["HmacSHA256","Hex","SecureHashUtil","clearSecureHash","secretKey","data","secureHashValue","concatenatedString","composeData","generateSecureHash","requestParameters","Object","entries","sort","keyA","keyB","localeCompare","filter","_","value","map","key","join","message","keyBytes","match","byte","parseInt","Error","keyHex","toString","padStart","hash","parse","toUpperCase","e","console","error"],"sourceRoot":"..\\..\\..\\src","sources":["utils/SecureHashUtil.ts"],"mappings":";;AAAA,OAAOA,UAAU,MAAM,uBAAuB;AAC9C,OAAOC,GAAG,MAAM,mBAAmB;AAInC,MAAMC,cAAc,CAAC;EACnB,OAAOC,eAAeA,CAACC,SAAiB,EAAEC,IAAa,EAAU;IAC/D,OAAOA,IAAI,CAACC,eAAe;IAC3B,MAAMC,kBAAkB,GAAG,IAAI,CAACC,WAAW,CAACH,IAAI,CAAC;IACjD,OAAO,IAAI,CAACI,kBAAkB,CAACF,kBAAkB,EAAEH,SAAS,CAAC;EAC/D;EAEA,OAAeI,WAAWA,CAACE,iBAA0B,EAAU;IAC7D,OAAOC,MAAM,CAACC,OAAO,CAACF,iBAAiB,CAAC,CACrCG,IAAI,CAAC,CAAC,CAACC,IAAI,CAAC,EAAE,CAACC,IAAI,CAAC,KAAKD,IAAI,CAACE,aAAa,CAACD,IAAI,CAAC,CAAC,CAClDE,MAAM,CAAC,CAAC,CAACC,CAAC,EAAEC,KAAK,CAAC,KAAKA,KAAK,IAAI,IAAI,IAAIA,KAAK,KAAK,EAAE,CAAC,CACrDC,GAAG,CAAC,CAAC,CAACC,GAAG,EAAEF,KAAK,CAAC,KAAK,GAAGE,GAAG,IAAIF,KAAK,EAAE,CAAC,CACxCG,IAAI,CAAC,GAAG,CAAC;EACd;EAEA,OAAeb,kBAAkBA,CAACc,OAAe,EAAEnB,SAAiB,EAAU;IAC5E,IAAI;MACF;MACA,MAAMoB,QAAQ,GAAGpB,SAAS,CAACqB,KAAK,CAAC,OAAO,CAAC,EAAEL,GAAG,CAACM,IAAI,IAAIC,QAAQ,CAACD,IAAI,EAAE,EAAE,CAAC,CAAC;MAE1E,IAAI,CAACF,QAAQ,EAAE;QACb,MAAM,IAAII,KAAK,CAAC,2BAA2B,CAAC;MAC9C;;MAEA;MACA,MAAMC,MAAM,GAAGL,QAAQ,CAACJ,GAAG,CAACM,IAAI,IAAIA,IAAI,CAACI,QAAQ,CAAC,EAAE,CAAC,CAACC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAACT,IAAI,CAAC,EAAE,CAAC;;MAEhF;MACA,MAAMU,IAAI,GAAGhC,UAAU,CAACuB,OAAO,EAAEtB,GAAG,CAACgC,KAAK,CAACJ,MAAM,CAAC,CAAC;;MAEnD;MACA,OAAOG,IAAI,CAACF,QAAQ,CAAC7B,GAAG,CAAC,CAACiC,WAAW,CAAC,CAAC;IACzC,CAAC,CAAC,OAAOC,CAAC,EAAE;MACVC,OAAO,CAACC,KAAK,CAAC,+BAA+B,EAAEF,CAAC,CAAC;MACjD,OAAO,EAAE;IACX;EACF;AACF;AAEA,eAAejC,cAAc","ignoreList":[]}
1
+ {"version":3,"names":["HmacSHA256","Hex","SecureHashUtil","clearSecureHash","secretKey","data","secureHashValue","concatenatedString","composeData","generateSecureHash","requestParameters","Object","entries","sort","keyA","keyB","localeCompare","filter","_","value","map","key","join","message","keyBytes","match","byte","parseInt","Error","keyHex","toString","padStart","hash","parse","toUpperCase","e","console","error"],"sourceRoot":"../../../src","sources":["utils/SecureHashUtil.ts"],"mappings":";;AAAA,OAAOA,UAAU,MAAM,uBAAuB;AAC9C,OAAOC,GAAG,MAAM,mBAAmB;AAInC,MAAMC,cAAc,CAAC;EACnB,OAAOC,eAAeA,CAACC,SAAiB,EAAEC,IAAa,EAAU;IAC/D,OAAOA,IAAI,CAACC,eAAe;IAC3B,MAAMC,kBAAkB,GAAG,IAAI,CAACC,WAAW,CAACH,IAAI,CAAC;IACjD,OAAO,IAAI,CAACI,kBAAkB,CAACF,kBAAkB,EAAEH,SAAS,CAAC;EAC/D;EAEA,OAAeI,WAAWA,CAACE,iBAA0B,EAAU;IAC7D,OAAOC,MAAM,CAACC,OAAO,CAACF,iBAAiB,CAAC,CACrCG,IAAI,CAAC,CAAC,CAACC,IAAI,CAAC,EAAE,CAACC,IAAI,CAAC,KAAKD,IAAI,CAACE,aAAa,CAACD,IAAI,CAAC,CAAC,CAClDE,MAAM,CAAC,CAAC,CAACC,CAAC,EAAEC,KAAK,CAAC,KAAKA,KAAK,IAAI,IAAI,IAAIA,KAAK,KAAK,EAAE,CAAC,CACrDC,GAAG,CAAC,CAAC,CAACC,GAAG,EAAEF,KAAK,CAAC,KAAK,GAAGE,GAAG,IAAIF,KAAK,EAAE,CAAC,CACxCG,IAAI,CAAC,GAAG,CAAC;EACd;EAEA,OAAeb,kBAAkBA,CAACc,OAAe,EAAEnB,SAAiB,EAAU;IAC5E,IAAI;MACF;MACA,MAAMoB,QAAQ,GAAGpB,SAAS,CAACqB,KAAK,CAAC,OAAO,CAAC,EAAEL,GAAG,CAACM,IAAI,IAAIC,QAAQ,CAACD,IAAI,EAAE,EAAE,CAAC,CAAC;MAE1E,IAAI,CAACF,QAAQ,EAAE;QACb,MAAM,IAAII,KAAK,CAAC,2BAA2B,CAAC;MAC9C;;MAEA;MACA,MAAMC,MAAM,GAAGL,QAAQ,CAACJ,GAAG,CAACM,IAAI,IAAIA,IAAI,CAACI,QAAQ,CAAC,EAAE,CAAC,CAACC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAACT,IAAI,CAAC,EAAE,CAAC;;MAEhF;MACA,MAAMU,IAAI,GAAGhC,UAAU,CAACuB,OAAO,EAAEtB,GAAG,CAACgC,KAAK,CAACJ,MAAM,CAAC,CAAC;;MAEnD;MACA,OAAOG,IAAI,CAACF,QAAQ,CAAC7B,GAAG,CAAC,CAACiC,WAAW,CAAC,CAAC;IACzC,CAAC,CAAC,OAAOC,CAAC,EAAE;MACVC,OAAO,CAACC,KAAK,CAAC,+BAA+B,EAAEF,CAAC,CAAC;MACjD,OAAO,EAAE;IACX;EACF;AACF;AAEA,eAAejC,cAAc","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare const PaymentScreen: React.FC;
@@ -0,0 +1,133 @@
1
+ import React, { useState } from 'react';
2
+ import { View, Text, TextInput, TouchableOpacity, StyleSheet, ScrollView, Alert, } from 'react-native';
3
+ import { Picker } from '@react-native-picker/picker';
4
+ import AmwalPay, { Environment, Currency, TransactionType, } from '../AmwalPay';
5
+ export const PaymentScreen = () => {
6
+ const [config, setConfig] = useState({
7
+ environment: Environment.SIT,
8
+ currency: Currency.OMR,
9
+ transactionType: TransactionType.CARD_WALLET,
10
+ locale: 'en',
11
+ merchantId: '84131',
12
+ terminalId: '811018',
13
+ amount: '1',
14
+ secureHash: '8570CEED656C8818E4A7CE04F22206358F272DAD5F0227D322B654675ABF8F83',
15
+ onCustomerIdResponse(customerId) {
16
+ console.log('Customer ID:', customerId);
17
+ },
18
+ onResponse(response) {
19
+ console.log('Payment Response:', response);
20
+ },
21
+ });
22
+ const handleInitializePayment = async () => {
23
+ try {
24
+ if (!isConfigValid()) {
25
+ Alert.alert('Error', 'Please fill in all required fields');
26
+ return;
27
+ }
28
+ const amwalPay = AmwalPay.getInstance();
29
+ await amwalPay.start(config);
30
+ }
31
+ catch (e) {
32
+ Alert.alert('Error', 'Error starting payment');
33
+ console.log(e);
34
+ }
35
+ };
36
+ const isConfigValid = () => {
37
+ return Boolean(config.environment &&
38
+ config.secureHash &&
39
+ config.currency &&
40
+ config.amount &&
41
+ config.merchantId &&
42
+ config.terminalId &&
43
+ config.locale &&
44
+ config.transactionType);
45
+ };
46
+ return (<ScrollView style={styles.container}>
47
+ <Text style={styles.title}>Payment Configuration</Text>
48
+
49
+ <Text style={styles.label}>Environment</Text>
50
+ <View style={styles.pickerContainer}>
51
+ <Picker selectedValue={config.environment} onValueChange={value => setConfig({ ...config, environment: value })}>
52
+ {Object.values(Environment).map(env => (<Picker.Item key={env} label={env} value={env}/>))}
53
+ </Picker>
54
+ </View>
55
+
56
+ <Text style={styles.label}>Secure Hash</Text>
57
+ <TextInput style={styles.input} value={config.secureHash} onChangeText={value => setConfig({ ...config, secureHash: value })} placeholder="Enter Secure Hash"/>
58
+
59
+ <Text style={styles.label}>Currency</Text>
60
+ <View style={styles.pickerContainer}>
61
+ <Picker selectedValue={config.currency} onValueChange={value => setConfig({ ...config, currency: value })}>
62
+ {Object.values(Currency).map(curr => (<Picker.Item key={curr} label={curr} value={curr}/>))}
63
+ </Picker>
64
+ </View>
65
+ <Text style={styles.label}>Amount</Text>
66
+ <TextInput style={styles.input} value={config.amount} onChangeText={value => setConfig({ ...config, amount: value })} placeholder="Enter amount" keyboardType="decimal-pad"/>
67
+
68
+ <Text style={styles.label}>Merchant ID</Text>
69
+ <TextInput style={styles.input} value={config.merchantId} onChangeText={value => setConfig({ ...config, merchantId: value })} placeholder="Enter merchant ID"/>
70
+
71
+ <Text style={styles.label}>Terminal ID</Text>
72
+ <TextInput style={styles.input} value={config.terminalId} onChangeText={value => setConfig({ ...config, terminalId: value })} placeholder="Enter terminal ID"/>
73
+
74
+ <Text style={styles.label}>Transaction Type</Text>
75
+ <View style={styles.pickerContainer}>
76
+ <Picker selectedValue={config.transactionType} onValueChange={value => setConfig({ ...config, transactionType: value })}>
77
+ {Object.values(TransactionType).map(type => (<Picker.Item key={type} label={type} value={type}/>))}
78
+ </Picker>
79
+ </View>
80
+
81
+ <TouchableOpacity style={styles.button} onPress={handleInitializePayment}>
82
+ <Text style={styles.buttonText}>Start Payment</Text>
83
+ </TouchableOpacity>
84
+ </ScrollView>);
85
+ };
86
+ const styles = StyleSheet.create({
87
+ container: {
88
+ flex: 1,
89
+ padding: 16,
90
+ backgroundColor: '#fff',
91
+ },
92
+ title: {
93
+ fontSize: 24,
94
+ fontWeight: 'bold',
95
+ marginBottom: 24,
96
+ textAlign: 'center',
97
+ },
98
+ label: {
99
+ fontSize: 16,
100
+ marginBottom: 8,
101
+ color: '#333',
102
+ },
103
+ input: {
104
+ borderWidth: 1,
105
+ borderColor: '#ddd',
106
+ borderRadius: 8,
107
+ padding: 12,
108
+ marginBottom: 16,
109
+ fontSize: 16,
110
+ },
111
+ button: {
112
+ backgroundColor: '#007AFF',
113
+ padding: 16,
114
+ borderRadius: 8,
115
+ marginTop: 24,
116
+ marginBottom: 32,
117
+ },
118
+ buttonText: {
119
+ color: '#fff',
120
+ fontSize: 18,
121
+ fontWeight: 'bold',
122
+ textAlign: 'center',
123
+ },
124
+ pickerContainer: {
125
+ borderWidth: 1,
126
+ borderColor: '#ccc',
127
+ borderRadius: 8,
128
+ overflow: 'hidden',
129
+ width: '100%',
130
+ maxWidth: 300, // Optional: Limit max width
131
+ },
132
+ });
133
+ //# sourceMappingURL=PaymentScreen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PaymentScreen.js","sourceRoot":"","sources":["../../src/screens/PaymentScreen.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Environment } from '../AmwalPay';
2
+ declare class NetworkClient {
3
+ private static instance;
4
+ private constructor();
5
+ static getInstance(): NetworkClient;
6
+ private getWebhookUrl;
7
+ fetchSessionToken(env: Environment, merchantId: string, customerId: string | null, secureHashValue: string): Promise<string | null>;
8
+ private showErrorDialog;
9
+ }
10
+ export default NetworkClient;
@@ -0,0 +1,65 @@
1
+ import { Alert } from 'react-native';
2
+ import { Environment } from '../AmwalPay';
3
+ import SecureHashUtil from '../utils/SecureHashUtil';
4
+ class NetworkClient {
5
+ constructor() { }
6
+ static getInstance() {
7
+ if (!NetworkClient.instance) {
8
+ NetworkClient.instance = new NetworkClient();
9
+ }
10
+ return NetworkClient.instance;
11
+ }
12
+ getWebhookUrl(env) {
13
+ switch (env) {
14
+ case Environment.SIT:
15
+ return 'https://test.amwalpg.com:24443/';
16
+ case Environment.UAT:
17
+ return 'https://test.amwalpg.com:14443/';
18
+ case Environment.PROD:
19
+ return 'https://webhook.amwalpg.com/';
20
+ default:
21
+ return 'https://test.amwalpg.com:24443/';
22
+ }
23
+ }
24
+ async fetchSessionToken(env, merchantId, customerId, secureHashValue) {
25
+ try {
26
+ const webhookUrl = this.getWebhookUrl(env);
27
+ const dataMap = {
28
+ merchantId,
29
+ customerId
30
+ };
31
+ const secureHash = SecureHashUtil.clearSecureHash(secureHashValue, dataMap);
32
+ const response = await fetch(`${webhookUrl}Membership/GetSDKSessionToken`, {
33
+ method: 'POST',
34
+ headers: {
35
+ 'Accept': 'text/plain',
36
+ 'Accept-Language': 'en-US,en;q=0.9',
37
+ 'Content-Type': 'application/json',
38
+ },
39
+ body: JSON.stringify({
40
+ merchantId,
41
+ secureHashValue: secureHash,
42
+ customerId
43
+ })
44
+ });
45
+ const responseData = await response.json();
46
+ if (response.ok && responseData.success) {
47
+ return responseData.data.sessionToken;
48
+ }
49
+ else {
50
+ const errorMessage = responseData.errorList?.join(',') || 'Unknown error';
51
+ this.showErrorDialog(errorMessage);
52
+ return null;
53
+ }
54
+ }
55
+ catch (error) {
56
+ this.showErrorDialog('Something Went Wrong');
57
+ return null;
58
+ }
59
+ }
60
+ showErrorDialog(message) {
61
+ Alert.alert('Error', message, [{ text: 'OK' }]);
62
+ }
63
+ }
64
+ export default NetworkClient;
65
+ //# sourceMappingURL=NetworkClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NetworkClient.js","sourceRoot":"","sources":["../../src/services/NetworkClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,cAAc,MAAM,yBAAyB,CAAC;AAErD,MAAM,aAAa;IAGjB,gBAAuB,CAAC;IAExB,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;YAC3B,aAAa,CAAC,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;SAC9C;QACD,OAAO,aAAa,CAAC,QAAQ,CAAC;IAChC,CAAC;IAEO,aAAa,CAAC,GAAgB;QACpC,QAAQ,GAAG,EAAE;YACX,KAAK,WAAW,CAAC,GAAG;gBAClB,OAAO,iCAAiC,CAAC;YAC3C,KAAK,WAAW,CAAC,GAAG;gBAClB,OAAO,iCAAiC,CAAC;YAC3C,KAAK,WAAW,CAAC,IAAI;gBACnB,OAAO,8BAA8B,CAAC;YACxC;gBACE,OAAO,iCAAiC,CAAC;SAC5C;IACH,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,GAAgB,EAChB,UAAkB,EAClB,UAAyB,EACzB,eAAuB;QAEvB,IAAI;YACF,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YAE3C,MAAM,OAAO,GAAG;gBACd,UAAU;gBACV,UAAU;aACX,CAAC;YAEF,MAAM,UAAU,GAAG,cAAc,CAAC,eAAe,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;YAE5E,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,UAAU,+BAA+B,EAAE;gBACzE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,QAAQ,EAAE,YAAY;oBACtB,iBAAiB,EAAE,gBAAgB;oBACnC,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,UAAU;oBACV,eAAe,EAAE,UAAU;oBAC3B,UAAU;iBACX,CAAC;aACH,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAE3C,IAAI,QAAQ,CAAC,EAAE,IAAI,YAAY,CAAC,OAAO,EAAE;gBACvC,OAAO,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;aACvC;iBAAM;gBACL,MAAM,YAAY,GAAG,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC;gBAC1E,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;gBACnC,OAAO,IAAI,CAAC;aACb;SACF;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,CAAC,eAAe,CAAC,sBAAsB,CAAC,CAAC;YAC7C,OAAO,IAAI,CAAC;SACb;IACH,CAAC;IAEO,eAAe,CAAC,OAAe;QACrC,KAAK,CAAC,KAAK,CACT,OAAO,EACP,OAAO,EACP,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CACjB,CAAC;IACJ,CAAC;CACF;AAED,eAAe,aAAa,CAAC"}
@@ -0,0 +1,9 @@
1
+ type DataMap = {
2
+ [key: string]: string | null;
3
+ };
4
+ declare class SecureHashUtil {
5
+ static clearSecureHash(secretKey: string, data: DataMap): string;
6
+ private static composeData;
7
+ private static generateSecureHash;
8
+ }
9
+ export default SecureHashUtil;
@@ -0,0 +1,37 @@
1
+ import HmacSHA256 from 'crypto-js/hmac-sha256';
2
+ import Hex from 'crypto-js/enc-hex';
3
+ class SecureHashUtil {
4
+ static clearSecureHash(secretKey, data) {
5
+ delete data.secureHashValue;
6
+ const concatenatedString = this.composeData(data);
7
+ return this.generateSecureHash(concatenatedString, secretKey);
8
+ }
9
+ static composeData(requestParameters) {
10
+ return Object.entries(requestParameters)
11
+ .sort(([keyA], [keyB]) => keyA.localeCompare(keyB))
12
+ .filter(([_, value]) => value != null && value !== '')
13
+ .map(([key, value]) => `${key}=${value}`)
14
+ .join('&');
15
+ }
16
+ static generateSecureHash(message, secretKey) {
17
+ try {
18
+ // Convert hex string to byte array
19
+ const keyBytes = secretKey.match(/.{2}/g)?.map(byte => parseInt(byte, 16));
20
+ if (!keyBytes) {
21
+ throw new Error('Invalid secret key format');
22
+ }
23
+ // Convert key bytes to hex string for crypto-js
24
+ const keyHex = keyBytes.map(byte => byte.toString(16).padStart(2, '0')).join('');
25
+ // Generate HMAC-SHA256
26
+ const hash = HmacSHA256(message, Hex.parse(keyHex));
27
+ // Convert to uppercase hex string
28
+ return hash.toString(Hex).toUpperCase();
29
+ }
30
+ catch (e) {
31
+ console.error('Error generating secure hash:', e);
32
+ return '';
33
+ }
34
+ }
35
+ }
36
+ export default SecureHashUtil;
37
+ //# sourceMappingURL=SecureHashUtil.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SecureHashUtil.js","sourceRoot":"","sources":["../../src/utils/SecureHashUtil.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,uBAAuB,CAAC;AAC/C,OAAO,GAAG,MAAM,mBAAmB,CAAC;AAIpC,MAAM,cAAc;IAClB,MAAM,CAAC,eAAe,CAAC,SAAiB,EAAE,IAAa;QACrD,OAAO,IAAI,CAAC,eAAe,CAAC;QAC5B,MAAM,kBAAkB,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;IAChE,CAAC;IAEO,MAAM,CAAC,WAAW,CAAC,iBAA0B;QACnD,OAAO,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC;aACrC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;aAClD,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;aACrD,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;aACxC,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAEO,MAAM,CAAC,kBAAkB,CAAC,OAAe,EAAE,SAAiB;QAClE,IAAI;YACF,mCAAmC;YACnC,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;YAE3E,IAAI,CAAC,QAAQ,EAAE;gBACb,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;aAC9C;YAED,gDAAgD;YAChD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEjF,uBAAuB;YACvB,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;YAEpD,kCAAkC;YAClC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;SACzC;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,CAAC,CAAC,CAAC;YAClD,OAAO,EAAE,CAAC;SACX;IACH,CAAC;CACF;AAED,eAAe,cAAc,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-amwal-pay",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "amwal pay",
5
5
  "main": "./lib/module/index.js",
6
6
  "types": "./lib/typescript/src/index.d.ts",
@@ -14,9 +14,9 @@
14
14
  },
15
15
  "files": [
16
16
  "src",
17
- "lib",
18
17
  "android",
19
18
  "ios",
19
+ "lib",
20
20
  "cpp",
21
21
  "*.podspec",
22
22
  "react-native.config.js",
@@ -1,98 +1,98 @@
1
- import { initiate, onCustomerId, onResponse, type AmwalPayConfig } from './index';
2
- import NetworkClient from './network/NetworkClient';
3
- import { type EventSubscription } from 'react-native';
4
-
5
-
6
- class AmwalPaySDK {
7
- private static instance: AmwalPaySDK;
8
-
9
- private onResponseSubscription: EventSubscription|null = null;
10
-
11
- private onCustomerIdSubscription: EventSubscription|null = null;
12
-
13
- private constructor() {
14
- // Initialize the event emitter
15
-
16
- }
17
-
18
- static getInstance(): AmwalPaySDK {
19
- if (!AmwalPaySDK.instance) {
20
- AmwalPaySDK.instance = new AmwalPaySDK();
21
- }
22
- return AmwalPaySDK.instance;
23
- }
24
-
25
- /**
26
- * Initiates the payment process by first fetching a session token and then starting the payment flow
27
- * @param config The payment configuration
28
- */
29
- async startPayment(config: Omit<AmwalPayConfig, 'sessionToken'>): Promise<void> {
30
- try {
31
- // Set up event listeners before starting the payment process
32
- this.setupEventListeners(config);
33
-
34
- // Get network client instance
35
- const networkClient = NetworkClient.getInstance();
36
-
37
- // Fetch session token
38
- const sessionToken = await networkClient.fetchSessionToken(
39
- config.environment,
40
- config.merchantId,
41
- config.customerId,
42
- config.secureHash
43
- );
44
-
45
- if (!sessionToken) {
46
- // If session token is null, the error has already been shown by NetworkClient
47
- return;
48
- }
49
-
50
- // Create complete config with session token
51
- const completeConfig: AmwalPayConfig = {
52
- ...config,
53
- sessionToken
54
- };
55
-
56
- // Initiate the payment process
57
- initiate(completeConfig);
58
- } catch (error) {
59
- console.error('Error starting payment:', error);
60
- }
61
- }
62
-
63
- dispose(): void {
64
- // Remove all event listeners
65
- this.removeEventListeners();
66
- }
67
-
68
- /**
69
- * Sets up event listeners for AmwalPay events
70
- * @param config The payment configuration containing callback functions
71
- */
72
- private setupEventListeners(config: Omit<AmwalPayConfig, 'sessionToken'>): void {
73
- // Remove any existing listeners
74
- this.removeEventListeners();
75
-
76
- this.onResponseSubscription = onResponse((response) => {
77
- console.log('Received AmwalPayResponse:', response);
78
- config.onResponse(response);
79
- });
80
-
81
- this.onCustomerIdSubscription = onCustomerId((customerId) => {
82
- console.log('Received customerId:', customerId);
83
- config.onCustomerId(customerId);
84
- });
85
- }
86
-
87
- /**
88
- * Removes all event listeners
89
- */
90
- private removeEventListeners(): void {
91
- this.onResponseSubscription?.remove();
92
- this.onCustomerIdSubscription?.remove();
93
- this.onResponseSubscription = null;
94
- this.onCustomerIdSubscription = null;
95
- }
96
- }
97
-
1
+ import { initiate, onCustomerId, onResponse, type AmwalPayConfig } from './index';
2
+ import NetworkClient from './network/NetworkClient';
3
+ import { type EventSubscription } from 'react-native';
4
+
5
+
6
+ class AmwalPaySDK {
7
+ private static instance: AmwalPaySDK;
8
+
9
+ private onResponseSubscription: EventSubscription|null = null;
10
+
11
+ private onCustomerIdSubscription: EventSubscription|null = null;
12
+
13
+ private constructor() {
14
+ // Initialize the event emitter
15
+
16
+ }
17
+
18
+ static getInstance(): AmwalPaySDK {
19
+ if (!AmwalPaySDK.instance) {
20
+ AmwalPaySDK.instance = new AmwalPaySDK();
21
+ }
22
+ return AmwalPaySDK.instance;
23
+ }
24
+
25
+ /**
26
+ * Initiates the payment process by first fetching a session token and then starting the payment flow
27
+ * @param config The payment configuration
28
+ */
29
+ async startPayment(config: Omit<AmwalPayConfig, 'sessionToken'>): Promise<void> {
30
+ try {
31
+ // Set up event listeners before starting the payment process
32
+ this.setupEventListeners(config);
33
+
34
+ // Get network client instance
35
+ const networkClient = NetworkClient.getInstance();
36
+
37
+ // Fetch session token
38
+ const sessionToken = await networkClient.fetchSessionToken(
39
+ config.environment,
40
+ config.merchantId,
41
+ config.customerId,
42
+ config.secureHash
43
+ );
44
+
45
+ if (!sessionToken) {
46
+ // If session token is null, the error has already been shown by NetworkClient
47
+ return;
48
+ }
49
+
50
+ // Create complete config with session token
51
+ const completeConfig: AmwalPayConfig = {
52
+ ...config,
53
+ sessionToken
54
+ };
55
+
56
+ // Initiate the payment process
57
+ initiate(completeConfig);
58
+ } catch (error) {
59
+ console.error('Error starting payment:', error);
60
+ }
61
+ }
62
+
63
+ dispose(): void {
64
+ // Remove all event listeners
65
+ this.removeEventListeners();
66
+ }
67
+
68
+ /**
69
+ * Sets up event listeners for AmwalPay events
70
+ * @param config The payment configuration containing callback functions
71
+ */
72
+ private setupEventListeners(config: Omit<AmwalPayConfig, 'sessionToken'>): void {
73
+ // Remove any existing listeners
74
+ this.removeEventListeners();
75
+
76
+ this.onResponseSubscription = onResponse((response) => {
77
+ console.log('Received AmwalPayResponse:', response);
78
+ config.onResponse(response);
79
+ });
80
+
81
+ this.onCustomerIdSubscription = onCustomerId((customerId) => {
82
+ console.log('Received customerId:', customerId);
83
+ config.onCustomerId(customerId);
84
+ });
85
+ }
86
+
87
+ /**
88
+ * Removes all event listeners
89
+ */
90
+ private removeEventListeners(): void {
91
+ this.onResponseSubscription?.remove();
92
+ this.onCustomerIdSubscription?.remove();
93
+ this.onResponseSubscription = null;
94
+ this.onCustomerIdSubscription = null;
95
+ }
96
+ }
97
+
98
98
  export default AmwalPaySDK;
@@ -1,84 +1,84 @@
1
- import { Alert } from 'react-native';
2
- import { Environment } from '../NativeReactAmwalPay';
3
- import SecureHashUtil from '../utils/SecureHashUtil';
4
-
5
- class NetworkClient {
6
- private static instance: NetworkClient;
7
-
8
- private constructor() {}
9
-
10
- static getInstance(): NetworkClient {
11
- if (!NetworkClient.instance) {
12
- NetworkClient.instance = new NetworkClient();
13
- }
14
- return NetworkClient.instance;
15
- }
16
-
17
- private getWebhookUrl(env: Environment): string {
18
- switch (env) {
19
- case Environment.SIT:
20
- return 'https://test.amwalpg.com:24443/';
21
- case Environment.UAT:
22
- return 'https://test.amwalpg.com:14443/';
23
- case Environment.PROD:
24
- return 'https://webhook.amwalpg.com/';
25
- default:
26
- return 'https://test.amwalpg.com:24443/';
27
- }
28
- }
29
-
30
- async fetchSessionToken(
31
- env: Environment,
32
- merchantId: string,
33
- customerId: string | null,
34
- secureHashValue: string
35
- ): Promise<string | null> {
36
- try {
37
- const webhookUrl = this.getWebhookUrl(env);
38
-
39
- const dataMap = {
40
- merchantId,
41
- customerId
42
- };
43
-
44
- const secureHash = SecureHashUtil.clearSecureHash(secureHashValue, dataMap);
45
-
46
- const response = await fetch(`${webhookUrl}Membership/GetSDKSessionToken`, {
47
- method: 'POST',
48
- headers: {
49
- 'Accept': 'text/plain',
50
- 'Accept-Language': 'en-US,en;q=0.9',
51
- 'Content-Type': 'application/json',
52
- },
53
- body: JSON.stringify({
54
- merchantId,
55
- secureHashValue: secureHash,
56
- customerId
57
- })
58
- });
59
-
60
- const responseData = await response.json();
61
-
62
- if (response.ok && responseData.success) {
63
- return responseData.data.sessionToken;
64
- } else {
65
- const errorMessage = responseData.errorList?.join(',') || 'Unknown error';
66
- this.showErrorDialog(errorMessage);
67
- return null;
68
- }
69
- } catch (error) {
70
- this.showErrorDialog('Something Went Wrong');
71
- return null;
72
- }
73
- }
74
-
75
- private showErrorDialog(message: string): void {
76
- Alert.alert(
77
- 'Error',
78
- message,
79
- [{ text: 'OK' }]
80
- );
81
- }
82
- }
83
-
1
+ import { Alert } from 'react-native';
2
+ import { Environment } from '../NativeReactAmwalPay';
3
+ import SecureHashUtil from '../utils/SecureHashUtil';
4
+
5
+ class NetworkClient {
6
+ private static instance: NetworkClient;
7
+
8
+ private constructor() {}
9
+
10
+ static getInstance(): NetworkClient {
11
+ if (!NetworkClient.instance) {
12
+ NetworkClient.instance = new NetworkClient();
13
+ }
14
+ return NetworkClient.instance;
15
+ }
16
+
17
+ private getWebhookUrl(env: Environment): string {
18
+ switch (env) {
19
+ case Environment.SIT:
20
+ return 'https://test.amwalpg.com:24443/';
21
+ case Environment.UAT:
22
+ return 'https://test.amwalpg.com:14443/';
23
+ case Environment.PROD:
24
+ return 'https://webhook.amwalpg.com/';
25
+ default:
26
+ return 'https://test.amwalpg.com:24443/';
27
+ }
28
+ }
29
+
30
+ async fetchSessionToken(
31
+ env: Environment,
32
+ merchantId: string,
33
+ customerId: string | null,
34
+ secureHashValue: string
35
+ ): Promise<string | null> {
36
+ try {
37
+ const webhookUrl = this.getWebhookUrl(env);
38
+
39
+ const dataMap = {
40
+ merchantId,
41
+ customerId
42
+ };
43
+
44
+ const secureHash = SecureHashUtil.clearSecureHash(secureHashValue, dataMap);
45
+
46
+ const response = await fetch(`${webhookUrl}Membership/GetSDKSessionToken`, {
47
+ method: 'POST',
48
+ headers: {
49
+ 'Accept': 'text/plain',
50
+ 'Accept-Language': 'en-US,en;q=0.9',
51
+ 'Content-Type': 'application/json',
52
+ },
53
+ body: JSON.stringify({
54
+ merchantId,
55
+ secureHashValue: secureHash,
56
+ customerId
57
+ })
58
+ });
59
+
60
+ const responseData = await response.json();
61
+
62
+ if (response.ok && responseData.success) {
63
+ return responseData.data.sessionToken;
64
+ } else {
65
+ const errorMessage = responseData.errorList?.join(',') || 'Unknown error';
66
+ this.showErrorDialog(errorMessage);
67
+ return null;
68
+ }
69
+ } catch (error) {
70
+ this.showErrorDialog('Something Went Wrong');
71
+ return null;
72
+ }
73
+ }
74
+
75
+ private showErrorDialog(message: string): void {
76
+ Alert.alert(
77
+ 'Error',
78
+ message,
79
+ [{ text: 'OK' }]
80
+ );
81
+ }
82
+ }
83
+
84
84
  export default NetworkClient;
@@ -1,45 +1,45 @@
1
- import HmacSHA256 from 'crypto-js/hmac-sha256';
2
- import Hex from 'crypto-js/enc-hex';
3
-
4
- type DataMap = { [key: string]: string | null };
5
-
6
- class SecureHashUtil {
7
- static clearSecureHash(secretKey: string, data: DataMap): string {
8
- delete data.secureHashValue;
9
- const concatenatedString = this.composeData(data);
10
- return this.generateSecureHash(concatenatedString, secretKey);
11
- }
12
-
13
- private static composeData(requestParameters: DataMap): string {
14
- return Object.entries(requestParameters)
15
- .sort(([keyA], [keyB]) => keyA.localeCompare(keyB))
16
- .filter(([_, value]) => value != null && value !== '')
17
- .map(([key, value]) => `${key}=${value}`)
18
- .join('&');
19
- }
20
-
21
- private static generateSecureHash(message: string, secretKey: string): string {
22
- try {
23
- // Convert hex string to byte array
24
- const keyBytes = secretKey.match(/.{2}/g)?.map(byte => parseInt(byte, 16));
25
-
26
- if (!keyBytes) {
27
- throw new Error('Invalid secret key format');
28
- }
29
-
30
- // Convert key bytes to hex string for crypto-js
31
- const keyHex = keyBytes.map(byte => byte.toString(16).padStart(2, '0')).join('');
32
-
33
- // Generate HMAC-SHA256
34
- const hash = HmacSHA256(message, Hex.parse(keyHex));
35
-
36
- // Convert to uppercase hex string
37
- return hash.toString(Hex).toUpperCase();
38
- } catch (e) {
39
- console.error('Error generating secure hash:', e);
40
- return '';
41
- }
42
- }
43
- }
44
-
1
+ import HmacSHA256 from 'crypto-js/hmac-sha256';
2
+ import Hex from 'crypto-js/enc-hex';
3
+
4
+ type DataMap = { [key: string]: string | null };
5
+
6
+ class SecureHashUtil {
7
+ static clearSecureHash(secretKey: string, data: DataMap): string {
8
+ delete data.secureHashValue;
9
+ const concatenatedString = this.composeData(data);
10
+ return this.generateSecureHash(concatenatedString, secretKey);
11
+ }
12
+
13
+ private static composeData(requestParameters: DataMap): string {
14
+ return Object.entries(requestParameters)
15
+ .sort(([keyA], [keyB]) => keyA.localeCompare(keyB))
16
+ .filter(([_, value]) => value != null && value !== '')
17
+ .map(([key, value]) => `${key}=${value}`)
18
+ .join('&');
19
+ }
20
+
21
+ private static generateSecureHash(message: string, secretKey: string): string {
22
+ try {
23
+ // Convert hex string to byte array
24
+ const keyBytes = secretKey.match(/.{2}/g)?.map(byte => parseInt(byte, 16));
25
+
26
+ if (!keyBytes) {
27
+ throw new Error('Invalid secret key format');
28
+ }
29
+
30
+ // Convert key bytes to hex string for crypto-js
31
+ const keyHex = keyBytes.map(byte => byte.toString(16).padStart(2, '0')).join('');
32
+
33
+ // Generate HMAC-SHA256
34
+ const hash = HmacSHA256(message, Hex.parse(keyHex));
35
+
36
+ // Convert to uppercase hex string
37
+ return hash.toString(Hex).toUpperCase();
38
+ } catch (e) {
39
+ console.error('Error generating secure hash:', e);
40
+ return '';
41
+ }
42
+ }
43
+ }
44
+
45
45
  export default SecureHashUtil;