import { NativeModules } from 'react-native'; import { pageInfoMap, moduleNameMap, initialPropsMap, trackState, pageInfoAsync, currentPageInfo, pageviewListener, } from '../global'; import type { PageInfo, NativePageInfo } from '../global'; import getTitle from './title'; import Track from '../track'; import configGlobal from '../config'; import pageTimer from '../global/pageTimer'; import reactNavigationConfig from '../reactNavigation/reactNavigationConfig'; import getPageStack, { buildPage } from '../reactNavigation/getPageStack'; import trackReactNavigationPageView from '../reactNavigation/trackPageView'; const { RangersAppLogModule } = NativeModules; export default function trackPageView(rootTag: number, info: NativePageInfo) { if ( !trackState.enable || (!trackState.enablePageView && !trackState.enablePageLeave) ) { return; } const appKey = info.moduleName ?? moduleNameMap.get(rootTag)!; // info.page_title const pageInfo: PageInfo = { rootTag: rootTag, pageKey: appKey, pageTitle: getTitle(rootTag) ?? '', pageManualKey: '', pagePath: '', isBack: info.is_back ?? false, moduleName: appKey, pageCustom: initialPropsMap.get(rootTag) ?? {}, timer: pageTimer.buildPageTimer(), }; pageInfo.timer.start(); const pageConfig = configGlobal.getPageConfig(appKey); if (pageConfig) { Object.assign(pageInfo, { pageManualKey: pageConfig.pageID ?? '', pagePath: pageConfig.pagePath ?? '', }); } currentPageInfo.set(rootTag); pageInfoMap.set(rootTag, pageInfo); pageInfoAsync.trigger(); pageviewListener.trigger({ pageInfo }); if (!pageInfo.isBack) { RangersAppLogModule.updatePageInfo(rootTag, { page_key: pageInfo.pageKey, page_title: pageInfo.pageTitle, page_manual_key: pageInfo.pageManualKey, page_path: pageInfo.pagePath, }); } if (!trackState.enablePageView) { return; } const params = { page_key: pageInfo.pageKey, page_title: pageInfo.pageTitle, page_manual_key: pageInfo.pageManualKey, page_path: pageInfo.pagePath, page_custom: pageInfo.pageCustom, is_back: pageInfo.isBack, $rn_root_tag: rootTag, refer_page_key: info.refer_page_key ?? '', refer_page_title: info.refer_page_title ?? '', refer_page_manual_key: info.refer_page_manual_key ?? '', referrer_page_path: info.referrer_page_path ?? '', }; // work with react navigation // pv触发时,无法预知当前页面是否存在 reactnavigation 页面,所以 reactnavigation 采集前,会多一次 pv 埋点 const navigationConfig = reactNavigationConfig.getReactNavigationConfig(); if (trackState.enableReactNavigation && navigationConfig.combineApp) { if (info.refer_react_tag) { const currentReactNavigationPage = getPageStack( info.refer_react_tag ).getCurrent(); if (currentReactNavigationPage) { const refer = buildPage(currentReactNavigationPage); Object.assign(params, { refer_page_key: refer.page_key, refer_page_title: refer.page_title, refer_page_manual_key: refer.page_manual_key, referrer_page_path: refer.page_path, }); } } if (info.is_back) { const currentReactNavigationPage = getPageStack( pageInfo.rootTag ).getCurrent(); if (currentReactNavigationPage) { currentReactNavigationPage.isback = true; trackReactNavigationPageView( currentReactNavigationPage, undefined, info ); } } } if (trackState.enableReactNavigation && navigationConfig.disableApp) { const currentReactNavigationPage = getPageStack( pageInfo.rootTag ).getCurrent(); if (currentReactNavigationPage) { return; } } if (configGlobal.getIgnorePageSet().has(appKey)) { return; } // send event Track.pageview(params); // console.info('pageview', rootTag) }