lean-react-native
Version:
A React Native wrapper for Lean's LinkSDK
104 lines (84 loc) • 3.11 kB
JavaScript
import {URL, URLSearchParams} from 'react-native-url-polyfill';
import {Linking} from 'react-native';
import Logger from './Logger';
class LeanWebClient {
static responseListener = null;
static onPageStarted() {
Logger.info('SDK initialization started');
}
static onPageFinished() {
Logger.info('SDK initialization completed');
}
static getResponseFromParams(url) {
const urlObject = new URL(url);
const urlParams = new URLSearchParams(urlObject.search);
return {
status: urlParams.get('status'),
message: urlParams.get('message'),
last_api_response: urlParams.get('last_api_response'),
exit_point: urlParams.get('exit_point'),
exit_intent_point: urlParams.get('exit_intent_point'),
exit_survey_reason: urlParams.get('exit_survey_reason'),
lean_correlation_id: urlParams.get('lean_correlation_id'),
secondary_status: urlParams.get('secondary_status'),
bank: {
bank_identifier: urlParams.get('bank_identifier'),
is_supported: Boolean(urlParams.get('bank_is_supported')),
},
};
}
static handleOverrideUrlLoading(event, callback) {
Logger.info('handleOverrideUrlLoading', event.url);
if (event.url.startsWith('file://') || event.url === 'about:blank') {
return false;
}
if (event.url.includes('https://cdn.leantech.me/link/loader')) {
return true;
}
if (callback) {
// Set value for response listener
this.responseListener = callback;
}
const urlObject = new URL(event.url);
/**
* Standard redirect URI from hosted HTML has three parts
* scheme - <scheme>://<host>?response_data :: leanlink | https | http
* host - <scheme>://<host>?response_data :: success | cancelled | error | redirect (matching callback's response.status)
* response - <scheme>://<host>?response_data :: response data from redirect (matching callback's response object) is received as query params
*/
if (urlObject.protocol === 'leanlink:') {
// Close SDK if it's an internal OpenBanking redirect
if (urlObject.hostname === 'redirect') {
this.onRedirectResponse({
status: 'SUCCESS',
message: 'Link closed after redirect',
lastApiResponse: null,
exitPoint: null,
exitIntentPoint: null,
exitSurveyReason: null,
leanCorrelationId: null,
secondaryStatus: null,
bank: {
bankId: null,
isSupported: null,
},
});
// Do not override URL loading
return false;
}
// Send response back caller for proper handling
this.onRedirectResponse(this.getResponseFromParams(event.url));
// Do not override URL loading
return false;
}
// Open all URLs in default web browser
Linking.openURL(event.url);
// Do not override URL loading
return false;
}
static onRedirectResponse(response) {
Logger.info('Response received', response);
this.responseListener(response);
}
}
export default LeanWebClient;