@benshi.ai/react-native-bsh-core
Version:
benshi.ai SDK for tracking logs for App Navigation (Core) content block
265 lines (252 loc) • 15.5 kB
text/typescript
import {
NativeModules,
Platform
} from 'react-native';
import {
IdentityProperties, MediaProperties, PageProperties, SearchProperties, TrackProperties, RateProperties, SearchEventWithSingleResultType
} from "./typings";
const { BsLogCore } = NativeModules;
/**
* logIdentityEvent are used to log user-related events that represent user register events,
* user login events and user logout events. SDK will store the userId provided in the identity
* events and log the remaining events with that userId. So you don't have to provide the userId
* again. In case of logout event, SDK will auto-erase all of the stored data including the
* userId. Identity events require 2 main params:
*
* @param user_id is the user id that is using the app, userId should be the id from your
* platform that is assigned to the user.
* @param identity_action enum is the identity Action that defines whether the user is logging
* in or a new user or logging out.
* @param user_properties is the object for defining the user properties like country, region_state,
* city, experience, language, ... SDK by default provides enums for country names
* and languages along with experience level.
* @param meta is to send any other data you want to send with the ingest, can be null.
* @param updateImmediately is default set to true, you can use that to log events when the app
* goes in the background or closed.
*/
const logIdentityEvent = (properties: IdentityProperties) => {
if (Platform.OS === 'android') {
console.log(properties)
if(properties.user_properties === null){
BsLogCore.logIdentityEvent(properties.user_id, properties.identity_action, null, null, false)
}else{
BsLogCore.logIdentityEvent(properties.user_id, properties.identity_action, JSON.stringify(properties.user_properties), null, false)
}
}
}
/**
* logPageEvent are auto-triggered, but if you want to track any special case then you can use
* this event to track the page. It needs 3 main params
*
* @param content_block is used to specify the type of module the page is in. Page can be
* in any multiple modules i.e. core, e-commerce, e-learning, ...
* @param page_path is for the page path, where the page/screen is inside the code packages.
* @param page_title is the page name, the name of the class.
* @param duration is the duration (in seconds, integer) the user spent on that page, it is
* ideal to log this event when a user moves to the next page so that you can
* track the time user spent on the page.
* @param meta is to send any other data you want to send with the ingest, can be null.
* @param updateImmediately is default set to true, you can use that to log events when the app
* goes in the background or closed.
*/
const logPageEvent = (properties: PageProperties) => {
if (Platform.OS === 'android') {
console.log(properties)
BsLogCore.logPageEvent(properties.content_block, properties.page_path, properties.page_title, properties.duration, false)
}
}
/**
* logMediaEvent can be used to log events regarding media, for logging the user interaction with
* the media controls. For example video, image, and audio. You can track different interaction
* events based on your implementation like when the user plays or pauses the video or audio,
* if they seek the video or audio to a certain time frame or if they watched the video or
* finished listening to the audio. Params details are as below:
*
* @param content_block is used to specify the type of module the media is in. Media can be
* in any multiple modules i.e. core, e-commerce, e-learning, ...
* @param media_id is for the mediaId used in your system, should be a string.
* @param media_type enum is for the media type that if it is a video, audio, or image.
* @param media_action enum is for the actions performed on the media, it includes play, pause,
* seek and finish. For Image media type the default media action is to play
* which represents image open event. The same will be used if the user swipes
* in a fullscreen image browser.
* @param time is the timeframe in milliseconds for the video and audio, this is the
* actual time of the media when the event is triggered.
* @param media_catalog is to proc=vide the catalog details about the media in event.
* @param meta is to send any other data you want to send with the ingest, can be null.
* @param updateImmediately is default set to true, you can use that to log events when the app
* goes in the background or closed.
*/
const logMediaEvent = (properties: MediaProperties) => {
if (Platform.OS === 'android') {
console.log(properties)
if(properties.media_catalog === null || properties.media_catalog.length === 0){
BsLogCore.logMediaEvent(properties.content_block, properties.media_id, properties.media_type, properties.media_action, properties.time, null, null, false)
}else{
BsLogCore.logMediaEvent(properties.content_block, properties.media_id, properties.media_type, properties.media_action, properties.time, JSON.stringify(properties.media_catalog), null, false)
}
}
}
/**
* logMediaImpressionEvent is for the recyclerListView events when you are showing results form a
* list or from a search and log the impressions on media elements. This will help in logging
* easily and manages multiple views in a single instance as well
*
* @param collection_id is required to associate the current recycler impression listener to a
* unique UI element.
* @param visible_item_indices is the list if current visible elements at any time on a screen, provided
* by {onVisibleIndicesChanged} from the recyclerListView
* @param content_list is the mapped list of elements for the impression view to look into.
* This should be mapped with Item Model provided by the SDK
* @param search_id is the for use case when the recyclerListView is for the search results
* and searchId should be the one provided by the search log.
*/
const logMediaImpressionEvent = (collection_id : string, visible_item_indices : any, content_list : any, search_id : string) => {
if (Platform.OS === 'android') {
var visibleContent = visible_item_indices.map((x: any) => content_list[x]);
// console.log(visibleContent)
BsLogCore.logMediaImpressionEvent(collection_id, JSON.stringify(visibleContent), search_id);
}
}
/**
* logSearchEvent can be used with the search query to log search results based on the module
* context, it is divided into 4 params.
*
* logSearchEvent also returns the search ID associated to that search. This search Id needs to
* be sent with item view events that are a result of the search query to map the user-item
* view actions for that search.
*
* @param content_block enum is for the module the search is used in the core, e-commerce, e-learning, ...
* @param query is for the search query which the user is searching for.
* @param results_list is the list of result ids returned in the search, can be an empty list in
* case of no results returned.
* @param filter is the filters applied on search, filters should be mapped as a hashmap
* data type with <String, String> format. in case the search does not offer
* any filters you can also send null in place of the filter param.
* @param page_number is required to log the the current page of the search result. Pages
* can start from page 1 and move to the number of results that search
* is returning. Default page number is 1.
* @param is_new_search isNewSearch can be used to distinguish if the search is happening
* as a new search or just to update the page number and result ids.
* If [true] then a new search id will be generated and returned in
* the [getSearchId].
* @param meta is to send any other data you want to send with the ingest, can be null.
* @param updateImmediately is default set to true, you can use that to log events when the app
* goes in the background or closed.
*/
const logSearchEvent = async (properties: SearchProperties, _callback : Function) => {
if(Platform.OS === 'android'){
console.log(properties)
const searchId = await BsLogCore.logSearchEvent(properties.content_block, properties.query, JSON.stringify(properties.results_list),
Object.fromEntries(properties.filters), properties.page_number, properties.is_new_search, null, false)
_callback(searchId);
}
else{
_callback("");
}
}
const logSearchEventWithSingleResultType = async (properties: SearchEventWithSingleResultType, _callback : Function) => {
if(Platform.OS === 'android'){
console.log(properties)
const searchId = await BsLogCore.logSearchEventWithSingleResultType(properties.content_block, properties.query,
properties.results_type, JSON.stringify(properties.result_ids),
Object.fromEntries(properties.filters), properties.page_number, properties.is_new_search, null, false)
_callback(searchId);
}
else{
_callback("");
}
}
/**
* logTrackEvent is to log user interactions with custom components inside the app. Track events
* is required to log events related to UI elements, viewing a list, viewing an item, and also if
* user taps on an external link. There are 3 types of track at the moment which included view
* list, view the item, and open an external link.
*
* @param track_action is for providing the type of track being logged. For Track events you
* need to set the track type to differentiate among multiple track types.
* TrackType can be viewing a list of elements, tapping an item from the list
* to view more details on that but in such case passing the item id is
* required to log the event.
* @param item_id is required to set the item Id for the item being viewed. It is required if
* the track type is view_item. For others, you may skip this.
* @param meta is to send any other data you want to send with the ingest, can be null.
* @param updateImmediately is default set to true, you can use that to log events when the app
* goes in the background or closed.
*/
const logTrackEvent = (properties: TrackProperties) => {
if(Platform.OS === 'android'){
console.log(properties)
BsLogCore.logTrackEvent(properties.track_action, properties.item_id, null, false)
}
}
/**
* logRateEvent is required to log events related to providing rate experience for the
* elements in the app. Rating the order placing experience, rating the course completing
* experience or rating the overall app.
*
* @param content_block enum is for the module the rate is used in the core, e-commerce, e-learning, ...
* @param rateValue is for the providing the value for the rate. Should be in between 0 to 5,
* if there are more elements like 0 to 10, make sure to divide the value by 2.
* @param type is for the providing the type of type being rated. By default SDK
* provides enum values for the rate type to log the events base don specific types but
* you can also use string values as well. Below is the function for logging rate type
* using string.Remember to use the same strings as provided in the enums or else the
* event will be discarded.
* @param subjectId is required to set the subject Id for the item being rated. It is required
* in all cases, if the app is rated then provide the application id
* @param meta is to send any other data you want to send with the ingest, can be null.
* @param updateImmediately is default set to true, you can use that to log events when the app
* goes in the background or closed.
*/
const logRateEvent = (properties: RateProperties) => {
if(Platform.OS === 'android'){
console.log(properties)
BsLogCore.logRateEvent(properties.content_block, properties.rate_value, properties.type, properties.subject_id, null, false)
}
}
/**
* getNudgeResponse is for following up on the CTA for the nudges for experimentation,
* it can be to open a product page or adding an element directly to the cart.
* It can also be to play a video directly on the app from the nudge sent.
*
* @param _callback _callback contains the function to be called when the nudge response
* is parsed to be used by the SDK, function to open a new page or add to cart,
* for details, please see readme or demo app.
*/
const getNudgeResponse = async (_callback : Function) => {
if(Platform.OS === 'android'){
let returnedString = await BsLogCore.getNudgeResponse()
let [cta_type, nudge_resource_type, nudge_resource_id] = returnedString.split('||')
_callback(cta_type, nudge_resource_type, nudge_resource_id);
}
else{
_callback("", "", "");
}
}
/**
* showInAppNudge is for showing the in-app message nudge yourself at your own pace and screen.
* by default the sdk auto triggers the nudge based on the when it receives one. The in-app
* nudges will still be auto fetched from the benshi platform but will be stacked until this
* function is not called.
*
* To make SDK listen for this, make sure to pass false for `setAutoShowInAppNudge` boolean
* in the init function to false.
*/
const showInAppMessage = () => {
if(Platform.OS === 'android'){
BsLogCore.showInAppMessage()
}
}
export default {
logIdentityEvent,
logMediaEvent,
logPageEvent,
logSearchEvent,
logSearchEventWithSingleResultType,
logTrackEvent,
getNudgeResponse,
logMediaImpressionEvent,
logRateEvent,
showInAppMessage
}