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
JavaScript
// 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);
}
};