import React, { useEffect } from 'react'; import { AppState, LogBox, PermissionsAndroid, Platform, StatusBar, } from 'react-native'; import { default as codePush, default as CodePush } from 'react-native-code-push'; import { Provider } from 'react-redux'; import { PersistGate } from 'redux-persist/integration/react'; import store, { persistor } from './src/store/store'; import FullScreenLoader from './RN-UI-LIB/src/components/FullScreenLoader'; import { toastConfigs, ToastContainer } from './RN-UI-LIB/src/components/toast'; import { navigationRef } from './src/components/utlis/navigationUtlis'; import { sendDeviceDetailsToClickstream } from '@components/utlis/commonFunctions'; import { linkingConf } from '@components/utlis/deeplinkingUtils'; import { getBuildFlavour } from '@components/utlis/DeviceUtils'; import { setGlobalBuildFlavour } from '@constants/Global'; import analytics from '@react-native-firebase/analytics'; import dayJs from 'dayjs'; import { COLORS } from './RN-UI-LIB/src/styles/colors'; import { MILLISECONDS_IN_A_SECOND } from './RN-UI-LIB/src/utlis/common'; import { hydrateGlobalImageMap } from './src/common/CachedImage'; import { CLICKSTREAM_EVENT_NAMES, LocalStorageKeys } from './src/common/Constants'; import ErrorBoundary from './src/common/ErrorBoundary'; import { getPermissionsToRequest } from './src/components/utlis/PermissionUtils'; import ScreenshotBlocker from './src/components/utlis/ScreenshotBlocker'; import { initSentry } from './src/components/utlis/sentry'; import { setItem } from './src/components/utlis/storageHelper'; import { APM_APP_NAME, APM_BASE_URL, ENV } from './src/constants/config'; import usePolling from './src/hooks/usePolling'; import AuthRouter from './src/screens/auth/AuthRouter'; import { type TDocumentObj } from './src/screens/caseDetails/interface'; import Permissions from './src/screens/permissions/Permissions'; import { addClickstreamEvent } from './src/services/clickstreamEventService'; import { setJsErrorHandler } from './src/services/exception-handler.service'; import fetchUpdatedRemoteConfig from './src/services/firebaseFetchAndUpdate.service'; import { StorageKeys } from './src/types/storageKeys'; initSentry(); if (ENV !== 'prod') { // mockApiServer(); } setJsErrorHandler(); LogBox.ignoreAllLogs(); export let GlobalDocumentMap: Record = {}; async function checkCodePushAndSync() { try { await CodePush.sync({ installMode: codePush.InstallMode.IMMEDIATE, }); } catch (error) {} } function handleAppStateChange(nextAppState: any) { if (nextAppState == 'active') { checkCodePushAndSync(); } } const PERMISSION_CHECK_POLL_INTERVAL = 5 * MILLISECONDS_IN_A_SECOND; function App() { const [permissions, setPermissions] = React.useState(true); const askForPermissions = async () => { const permissionsToRequest = await getPermissionsToRequest(); if (Platform.OS === 'android') { PermissionsAndroid.requestMultiple(permissionsToRequest) .then(async (result) => { let isAllPermissionsGranted = true; for (const permission in result) { if (result?.[permission as Permission] !== PermissionsAndroid.RESULTS.GRANTED) { isAllPermissionsGranted = false; break; } } setPermissions(isAllPermissionsGranted); }) .catch((err) => { setPermissions(false); }); } }; const getActiveRouteName = (state) => { if (!state || typeof state.index !== 'number') { return 'Unknown'; } const route = state.routes[state.index]; if (route.state) { return getActiveRouteName(route.state); } return route?.name || ''; }; async function setForegroundTimeStampAndClickstream() { const now = dayJs().toString(); await setItem(StorageKeys.APP_FOREGROUND_TIMESTAMP, now); addClickstreamEvent(CLICKSTREAM_EVENT_NAMES.AV_APP_FOREGROUND, { now }); } usePolling(askForPermissions, PERMISSION_CHECK_POLL_INTERVAL); initApm({ serviceName: APM_APP_NAME, serverUrl: APM_BASE_URL, serviceVersion: '1.0.0', environment: ENV, active: true, }); useEffect(() => { ScreenshotBlocker.unblockScreenshots(); getBuildFlavour().then((flavour) => { setGlobalBuildFlavour(flavour); }); // Device Details sendDeviceDetailsToClickstream(); }, []); React.useEffect(() => { fetchUpdatedRemoteConfig(); askForPermissions(); const appStateChange = AppState.addEventListener('change', async (change) => { handleAppStateChange(change); hydrateGlobalImageMap(); }); (async () => { const data = await AsyncStorage.getItem(LocalStorageKeys.GLOBAL_DOCUMENT_MAP); if (data) { const parsedData = JSON.parse(data); GlobalDocumentMap = parsedData; } })(); checkCodePushAndSync(); setForegroundTimeStampAndClickstream(); return () => { appStateChange.remove(); }; }, []); return ( } persistor={persistor} > { const currentRouteName = getActiveRouteName(state); await analytics().logScreenView({ screen_name: currentRouteName, screen_class: currentRouteName, }); await analytics().logEvent('screen_view', { screen_name: currentRouteName, screen_class: currentRouteName, }); }} > {permissions ? : } ); } const AppWithSentry = Sentry.wrap(App); export default AppWithSentry;