UNPKG

@causalfoundry/react-native-cf-core

Version:

causalfoundry.ai SDK for tracking logs for App Navigation (Core) content block.

186 lines (170 loc) 7.43 kB
import {NativeEventEmitter, NativeModules, Platform} from 'react-native'; import { ContentBlock, CoreCatalogEventType, CoreIngestEventType, IdentifyProperties, MediaCatalog, MediaProperties, NudgeScreenType, PageProperties, RateProperties, SearchProperties, SiteCatalog, UserProperties, } from "./typings"; import {EventsRegistry} from "react-native-navigation/lib/src/events/EventsRegistry"; const {CfLogCore} = NativeModules; /** * logIngestEvent are used to log user-related events that represent user register events, * user login events and the rest of the core related events. * and languages along with experience level. * @param eventType Type of the event tup be sent * @param properties Properties of the Event to be sent * @param updateImmediately is default set to true, you can use that to log events when the app * goes in the background or closed. */ const logIngestEvent = ( eventType: CoreIngestEventType, properties: IdentifyProperties | PageProperties | MediaProperties | SearchProperties | RateProperties, updateImmediately: boolean = false ) => { console.log(properties); if (Platform.OS === 'android' || Platform.OS === 'ios') { CfLogCore.logIngestEvent(eventType, JSON.stringify(properties), updateImmediately); } }; /** * Core catalog values * * @param catalogType type to the catalog being ingested * @param catalogModel Props for the catalog details */ const logCatalogEvent = (catalogType: CoreCatalogEventType, catalogModel: UserProperties | SiteCatalog | MediaCatalog) => { if (Platform.OS === 'android' || Platform.OS === 'ios') { CfLogCore.logCatalogEvent(catalogType, JSON.stringify(catalogModel)); } } /** * 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) CfLogCore.logMediaImpressionEvent(collection_id, JSON.stringify(visibleContent), search_id); } } /** * 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 CfLogCore.getNudgeResponse() let [cta_type, nudge_resource_type, nudge_resource_id] = returnedString.split('||') _callback(cta_type, nudge_resource_type, nudge_resource_id); } else if (Platform.OS === 'ios') { const event = new NativeEventEmitter(CfLogCore) event.addListener('NudgeOnClickEvent', ({nudgeItems}) => { let [cta_type, nudge_resource_type, nudge_resource_id] = nudgeItems.split('||') _callback(cta_type, nudge_resource_type, nudge_resource_id); }) CfLogCore.getNudgeResponse(); } 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 when it receives one. The in-app * nudges will still be auto fetched from the causalfoundry 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 = (nudgeScreenType: NudgeScreenType) => { console.log("showInAppMessage") if (Platform.OS === 'android' || Platform.OS === 'ios') { console.log("nudgeScreenType: ", nudgeScreenType) CfLogCore.showInAppMessage(nudgeScreenType) } } const uploadAllEvents = () => { if (Platform.OS === 'ios') { CfLogCore.uploadAllEvents() } } /** * To auto Track page events if you are using the react-native-navigation package. pass the Navigation.events() * and the content block for the app. * * @param NavigationEvent Navigation.events() for the app * @param contentBlock content block for the app, default to core. */ const setupScreenListener = (NavigationEvent: EventsRegistry, contentBlock: ContentBlock = ContentBlock.Core) => { let pageRenderStartTime = 0; let pageRenderTime = 0; let pageViewStartTime = 0; NavigationEvent.registerComponentWillAppearListener( ({componentName, componentType}) => { if (componentType === 'Component') { pageRenderStartTime = Date.now() } }); NavigationEvent.registerComponentDidAppearListener( ({componentName, componentType}) => { if (componentType === 'Component') { pageViewStartTime = Date.now() pageRenderTime = (pageViewStartTime - pageRenderStartTime) if (pageRenderTime <= 0) { pageRenderTime = 0 } else { pageRenderTime += 50 } } }); NavigationEvent.registerComponentDidDisappearListener( ({componentId, componentName, componentType}) => { if (componentType === 'Component') { let pageDuration = (Date.now() - pageViewStartTime) pageDuration /= 1000 if (pageDuration >= 1) { let pageProperties = { content_block: contentBlock, path: componentId, title: componentName, duration: pageDuration, render_time: pageRenderTime }; logIngestEvent(CoreIngestEventType.Page, pageProperties, false); } } }); } export default { logIngestEvent, logCatalogEvent, getNudgeResponse, logMediaImpressionEvent, showInAppMessage, setupScreenListener, uploadAllEvents }