UNPKG

@rudderstack/rudder-integration-appsflyer-react-native

Version:

Rudder React Native SDK Appsflyer Device mode support for Android and iOS

323 lines (311 loc) 13.1 kB
import { NativeModules, NativeEventEmitter, Platform } from 'react-native'; /****************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */ function __awaiter(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); } function __generator(thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype); return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (g && (g = 0, op[0] && (_ = 0)), _) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } } typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { var e = new Error(message); return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; }; var RudderIntegrationAppsflyerReactNative$1 = NativeModules.RudderIntegrationAppsflyerReactNative; if (!RudderIntegrationAppsflyerReactNative$1) { throw new Error('Unable to import Rudder-Appsflyer native module'); } function isStringArray(elements) { if (!Array.isArray(elements)) return false; return elements.every(function (element) { return isString(element); }); } function isString(element) { return typeof element === 'string'; } function getStringArray(element) { if (isStringArray(element)) return element; if (isString(element)) return [element]; return null; } var RudderIntegrationAppsflyerReactNative = NativeModules.RudderIntegrationAppsflyerReactNative; var appsFlyerEventEmitter = new NativeEventEmitter(RudderIntegrationAppsflyerReactNative); var devKey = ''; var appleAppId = ''; var isDebug = false; var onInstallConversionDataListener = true; var onDeepLinkListener = false; var timeToWaitForATTUserAuthorization = 0; // Setup the integration function setup() { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: if (!(Platform.OS === 'ios')) return [3 /*break*/, 2]; return [4 /*yield*/, RudderIntegrationAppsflyerReactNative$1.setup(devKey, isDebug === true, onInstallConversionDataListener === true, onDeepLinkListener === true, appleAppId, timeToWaitForATTUserAuthorization)]; case 1: _a.sent(); return [3 /*break*/, 4]; case 2: if (!(Platform.OS === 'android')) return [3 /*break*/, 4]; return [4 /*yield*/, RudderIntegrationAppsflyerReactNative$1.setup(devKey, isDebug === true, onInstallConversionDataListener === true, onDeepLinkListener === true)]; case 3: _a.sent(); _a.label = 4; case 4: return [2 /*return*/]; } }); }); } function setOptions(options) { if (options == null) { throw new Error('RudderSDK: Warn: Options is Invalid, Aborting Appsflyer Initialization'); } if (options.devKey) { if (typeof options.devKey !== 'string' || typeof options.devKey === 'undefined') { throw new Error('RudderSDK: Warn: devKey should be a string!'); } devKey = options.devKey; } if (options.appleAppId) { if (typeof options.appleAppId !== 'string' || typeof options.appleAppId === 'undefined') { throw new Error('RudderSDK: Warn: appleAppId should be a string!'); } appleAppId = options.appleAppId; } if (options.isDebug) { if (typeof options.isDebug !== 'boolean') { console.log('RudderSDK: Warn: isDebug should be a boolean!'); return; } isDebug = options.isDebug; } if (options.onInstallConversionDataListener) { if (typeof options.onInstallConversionDataListener !== 'boolean') { console.log('RudderSDK: Warn: onInstallConversionDataListener should be a boolean!'); return; } onInstallConversionDataListener = options.onInstallConversionDataListener; } if (options.onDeepLinkListener) { if (typeof options.onDeepLinkListener !== 'boolean') { console.log('RudderSDK: Warn: onDeepLinkListener should be a boolean!'); return; } onDeepLinkListener = options.onDeepLinkListener; } if (options.timeToWaitForATTUserAuthorization) { if (!Number.isInteger(options.timeToWaitForATTUserAuthorization)) { console.log('RudderSDK: Warn: timeToWaitForATTUserAuthorization should be an integer!'); return; } timeToWaitForATTUserAuthorization = options.timeToWaitForATTUserAuthorization; } } function onInstallConversionData(callback) { var listener = appsFlyerEventEmitter.addListener('onInstallConversionDataLoaded', function (_data) { if (callback && typeof callback === typeof Function) { try { var data = JSON.parse(_data); callback(data); } catch (_error) { callback('Invalid data structure'); } } }); // unregister listener (suppose should be called from componentWillUnmount() ) return function remove() { listener.remove(); }; } function onInstallConversionFailure(callback) { var listener = appsFlyerEventEmitter.addListener('onInstallConversionFailure', function (_data) { if (callback && typeof callback === typeof Function) { try { var data = JSON.parse(_data); callback(data); } catch (_error) { callback('Invalid data structure'); } } }); // unregister listener (suppose should be called from componentWillUnmount() ) return function remove() { listener.remove(); }; } function onAppOpenAttribution(callback) { var listener = appsFlyerEventEmitter.addListener('onAppOpenAttribution', function (_data) { if (callback && typeof callback === typeof Function) { try { var data = JSON.parse(_data); callback(data); } catch (_error) { callback('Invalid data structure'); } } }); // unregister listener (suppose should be called from componentWillUnmount() ) return function remove() { listener.remove(); }; } function onAttributionFailure(callback) { var listener = appsFlyerEventEmitter.addListener('onAttributionFailure', function (_data) { if (callback && typeof callback === typeof Function) { try { var data = JSON.parse(_data); callback(data); } catch (_error) { callback(new Error('Invalid data structure: ' + _data)); } } }); // unregister listener (suppose should be called from componentWillUnmount() ) return function remove() { listener.remove(); }; } function onDeepLink(callback) { var listener = appsFlyerEventEmitter.addListener('onDeepLinking', function (_data) { if (callback && typeof callback === typeof Function) { try { var data = JSON.parse(_data); callback(data); } catch (_error) { callback(new Error('Invalid data structure: ' + _data)); } } }); // unregister listener (suppose should be called from componentWillUnmount() ) return function remove() { listener.remove(); }; } /** * Manually pass the Firebase / GCM Device Token for Uninstall measurement. * * @param token Firebase Device Token. * @param successC success callback function. */ function updateServerUninstallToken(token, successC) { if (token == null) { token = ''; } if (typeof token != 'string') { token = token.toString(); } if (successC) { return RudderIntegrationAppsflyerReactNative$1.updateServerUninstallToken(token, successC); } else { return RudderIntegrationAppsflyerReactNative$1.updateServerUninstallToken(token, function (result) { return console.log(result); }); } } /** * Setting your own customer ID enables you to cross-reference your own unique ID with AppsFlyer’s unique ID and the other devices’ IDs. * This ID is available in AppsFlyer CSV reports along with Postback APIs for cross-referencing with your internal IDs. * * @param {string} userId Customer ID for client. * @param successC callback function. */ function setCustomerUserId(userId, successC) { if (userId == null) { userId = ''; } if (typeof userId != 'string') { userId = userId.toString(); } if (successC) { return RudderIntegrationAppsflyerReactNative$1.setCustomerUserId(userId, successC); } else { return RudderIntegrationAppsflyerReactNative$1.setCustomerUserId(userId, function (result) { return console.log(result); }); } } /** * Set Onelink custom/branded domains * Use this API during the SDK Initialization to indicate branded domains. * For more information please refer to https://support.appsflyer.com/hc/en-us/articles/360002329137-Implementing-Branded-Links * @param domains array of strings * @param successC success callback function. * @param errorC error callback function. */ function setOneLinkCustomDomains(domains, successC, errorC) { if (!(isString(domains) || isStringArray(domains))) { throw new Error('RudderSDK: Appsflyer: setOneLinkCustomDomains: domains should be a string or an array of strings!'); } var domainsArray = getStringArray(domains); if (domainsArray === null) { throw new Error('RudderSDK: Appsflyer: setOneLinkCustomDomains: failed to process domains array!'); } return RudderIntegrationAppsflyerReactNative$1.setOneLinkCustomDomains(getStringArray(domains), successC, errorC); } function getAppsFlyerId() { return __awaiter(this, void 0, void 0, function () { var appsflyerId, error_1; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2,, 3]); return [4 /*yield*/, RudderIntegrationAppsflyerReactNative$1.getAppsFlyerId()]; case 1: appsflyerId = _a.sent(); return [2 /*return*/, appsflyerId]; case 2: error_1 = _a.sent(); console.log('getAppsFlyerId: Failed to getAppsFlyerId: ', error_1); return [2 /*return*/, null]; case 3: return [2 /*return*/]; } }); }); } export { setup as default, getAppsFlyerId, onAppOpenAttribution, onAttributionFailure, onDeepLink, onInstallConversionData, onInstallConversionFailure, setCustomerUserId, setOneLinkCustomDomains, setOptions, updateServerUninstallToken };