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,
191 lines (173 loc) • 5.87 kB
JavaScript
// src/PredefinedEvents.js
import AsyncStorage from "@react-native-community/async-storage";
import { postEventData } from "../apiConfig/api";
import { isValid } from "../utils";
const PredefinedEvents = {
// Event Handlers
eventHandlers: {
initialize: async (props) => {
try {
const requiredFields = [
"fcmToken",
"deviceId",
"appId",
"appSecret",
"appName",
"programCode",
"webSiteUrl",
"url_type",
"osVersion",
"sdkVersion",
"deviceModel",
"manufacturer",
"screenResolution",
"timeZone",
"locale",
"networkType",
"carrierName",
"installTime",
"appVersion",
"batteryLevel",
];
const booleanFields = ["isRooted", "isCharging"];
const objectFields = ["permissions", "deviceStorage", "connectionInfo"];
// Check for missing required fields
for (const field of requiredFields) {
if (!props[field]) {
throw new Error(`${field} is required`);
}
}
// Check boolean fields explicitly
for (const field of booleanFields) {
if (typeof props[field] !== "boolean") {
throw new Error(`${field} must be a boolean`);
}
}
// Check if object fields are empty (if provided)
for (const field of objectFields) {
if (props[field] && Object.keys(props[field]).length === 0) {
throw new Error(`${field} cannot be an empty object`);
}
}
// Store values in AsyncStorage
const entries = Object.entries(props);
for (const [key, value] of entries) {
if (value !== undefined && value !== null) {
try {
await AsyncStorage.setItem(key, String(value));
} catch (error) {
console.error("Error saving data to AsyncStorage:", error);
}
}
}
return {
name: "initialize",
data: {
...props,
},
timestamp: new Date().toISOString(),
};
} catch (error) {
console.error("Initialization error:", error.message);
throw error;
}
},
login: async ({ userName, userId, ...otherData }) => {
const deviceId = await AsyncStorage.getItem("deviceId");
const appId = await AsyncStorage.getItem("appId");
const appName = await AsyncStorage.getItem("appName");
const webSiteUrl = await AsyncStorage.getItem("webSiteUrl");
if (!userName || !userId) {
throw new Error(
"userName/email/mobile number and userId are required."
);
}
await AsyncStorage.setItem("userName", userName || "");
await AsyncStorage.setItem("userId", userId || "");
return {
name: "login",
data: { ...otherData },
timestamp: new Date().toISOString(),
deviceId: deviceId,
appId: appId,
appName: appName,
userId: userId?.length > 0 ? userId : null,
userName: userName?.length > 0 ? userName : null,
webSiteUrl: webSiteUrl,
};
},
register: async ({ userName, userId, ...otherData }) => {
const deviceId = await AsyncStorage.getItem("deviceId");
const appId = await AsyncStorage.getItem("appId");
const appName = await AsyncStorage.getItem("appName");
const webSiteUrl = await AsyncStorage.getItem("webSiteUrl");
if (!userName || !userId) {
throw new Error(
"userName/email/mobile number and userId are required."
);
}
await AsyncStorage.setItem("userName", userName || "");
await AsyncStorage.setItem("userId", userId || "");
return {
name: "register",
data: { ...otherData },
timestamp: new Date().toISOString(),
deviceId: deviceId,
appId: appId,
appName: appName,
userId: userId?.length > 0 ? userId : null,
userName: userName?.length > 0 ? userName : null,
webSiteUrl: webSiteUrl,
};
},
logout: async () => {
try {
const deviceId = await AsyncStorage.getItem("deviceId");
const appId = await AsyncStorage.getItem("appId");
const appName = await AsyncStorage.getItem("appName");
const userName = await AsyncStorage.getItem("userName");
const userId = await AsyncStorage.getItem("userId");
const webSiteUrl = await AsyncStorage.getItem("webSiteUrl");
await AsyncStorage.setItem("userName", "");
await AsyncStorage.setItem("userId", "");
if (!deviceId) {
throw new Error("Device Id not found");
}
return {
name: "logout",
timestamp: new Date().toISOString(),
deviceId: deviceId,
appId: appId,
appName: appName,
userId: userId?.length > 0 ? userId : null,
userName: userName?.length > 0 ? userName : null,
webSiteUrl: webSiteUrl,
};
} catch (error) {
console.error("Error retrieving deviceId from AsyncStorage:", error);
}
},
},
// Function to handle predefined events
async handleEvent(eventName, data) {
if (this.eventHandlers[eventName]) {
try {
const event = await this.eventHandlers[eventName](data);
if (event) {
this.sendEvent(event);
}
} catch (error) {
console.error(`Error handling event '${eventName}':`, error.message);
}
}
},
// Common function to send the event
async sendEvent(event) {
try {
await postEventData(event);
} catch (error) {
console.error(`Failed to send event '${event?.name}':`, error);
}
},
};
export default PredefinedEvents;