UNPKG

zence-marketing-react

Version:

zence-marketing-react is a React Native Android SDK designed to streamline event tracking and notifications for mobile applications. This SDK enables seamless integration with Android / iOS apps, capturing user actions like clicks, add-to-cart, purchases,

117 lines (109 loc) 3.62 kB
// Core import axios from "axios"; import axiosRetry from "axios-retry"; import AsyncStorage from "@react-native-community/async-storage"; import { apiInfo } from "../constants"; import { Alert } from "react-native"; // Create a custom axios instance const client = axios.create({ timeout: 30000, headers: { "Content-Type": "application/json" }, }); // Function to get a new token const getToken = async () => { try { const applicationId = await AsyncStorage.getItem("appId"); const applicationSecret = await AsyncStorage.getItem("appSecret"); const programCode = await AsyncStorage.getItem("programCode"); const url_type = await AsyncStorage.getItem("url_type"); const webSiteUrl = await AsyncStorage.getItem("webSiteUrl"); const response = await axios.post( apiInfo.TOKEN_URL, //prod { clientID: applicationId, clientSecret: applicationSecret, programCode: programCode, url_type: url_type, webSiteUrl: webSiteUrl, } ); const { token, webhook_url, clicksWebhookUrl } = response.data; if (token && webhook_url) { await AsyncStorage.setItem("token", token || ""); await AsyncStorage.setItem("webhook_url", webhook_url || ""); await AsyncStorage.setItem("clicksWebhookUrl", clicksWebhookUrl || ""); client.defaults.headers["Authorization"] = `Bearer ${token}`; } else { Alert.alert( "zence-marketing-react", "Something went wrong in authentication, Please contact your vendor.", [{ text: "OK", onPress: () => {} }] ); } return { token, webhook_url, clicksWebhookUrl }; } catch (error) { console.error("Failed to retrieve token:", error?.response?.data || error); throw error; } }; // Apply retry logic to the axios instance axiosRetry(client, { retries: 3, retryDelay: (retryCount) => retryCount * 1000, retryCondition: async (error) => { if (error.response?.status === 401) { try { await getToken(); return true; } catch (tokenError) { console.error("Token retrieval failed:", tokenError); return false; } } return error.response?.status >= 500 || !error.response; }, }); // Function to post event data to the server const postEvent = async (url, event) => { try { const response = await client.post(url, event); console.log(`Event '${event?.name}' sent successfully`, event); return response?.data; } catch (error) { console.error( "Error posting event after retries:", error?.response?.data || error ); throw error; } }; // Function to handle posting event data export const postEventData = async (event) => { try { const token = await AsyncStorage.getItem("token"); const webhook_url = await AsyncStorage.getItem("webhook_url"); const clicksWebhookUrl = await AsyncStorage.getItem("clicksWebhookUrl"); if (token && webhook_url) { client.defaults.headers["Authorization"] = `Bearer ${token}`; const eventData = await postEvent( event?.name === "notification-click" ? clicksWebhookUrl : webhook_url, event ); return eventData; } else { const response = await getToken(); if (response?.webhook_url && response?.token) { const eventData = await postEvent( event?.name === "notification-click" ? response?.clicksWebhookUrl : response?.webhook_url, event ); return eventData; } } } catch (error) { console.error("Final error after retries:", error); } };