Files
address-verification-app/App.tsx

198 lines
6.5 KiB
TypeScript
Raw Normal View History

import React, { useEffect, useState } from 'react';
import {
2023-04-18 01:27:28 +05:30
AppState,
LogBox,
2023-08-31 14:51:03 +05:30
type Permission,
2023-04-18 01:27:28 +05:30
PermissionsAndroid,
Platform,
StatusBar,
} from 'react-native';
2023-10-17 18:08:22 +05:30
import { Provider } from 'react-redux';
import { init as initApm } from '@cobo/apm-rum-react-native';
import { PersistGate } from 'redux-persist/integration/react';
import { NavigationContainer } from '@react-navigation/native';
2023-08-31 14:51:03 +05:30
import * as Sentry from '@sentry/react-native';
import codePush from 'react-native-code-push';
import AsyncStorage from '@react-native-async-storage/async-storage';
import CodePush from 'react-native-code-push';
import store, { persistor, RootState } from './src/store/store';
2023-08-31 14:51:03 +05:30
2023-04-18 01:27:28 +05:30
import { navigationRef } from './src/components/utlis/navigationUtlis';
2022-12-06 18:22:09 +05:30
import FullScreenLoader from './RN-UI-LIB/src/components/FullScreenLoader';
2023-04-18 01:27:28 +05:30
import { toastConfigs, ToastContainer } from './RN-UI-LIB/src/components/toast';
import { APM_APP_NAME, APM_BASE_URL, ENV } from './src/constants/config';
import { COLORS } from './RN-UI-LIB/src/styles/colors';
2023-09-19 12:49:35 +05:30
import { CLICKSTREAM_EVENT_NAMES, LocalStorageKeys } from './src/common/Constants';
import Permissions from './src/screens/permissions/Permissions';
2023-04-18 01:27:28 +05:30
import { setJsErrorHandler } from './src/services/exception-handler.service';
import SuspenseLoader from './RN-UI-LIB/src/components/suspense_loader/SuspenseLoader';
2023-04-18 01:27:28 +05:30
import ErrorBoundary from './src/common/ErrorBoundary';
2023-08-31 14:51:03 +05:30
import { type TDocumentObj } from './src/screens/caseDetails/interface';
2023-04-18 01:27:28 +05:30
import AuthRouter from './src/screens/auth/AuthRouter';
2023-05-25 13:55:15 +05:30
import { initSentry } from './src/components/utlis/sentry';
import {
getPermissionsToRequest,
getPermissionsToValidate,
} from './src/components/utlis/PermissionUtils';
import usePolling from './src/hooks/usePolling';
import { MILLISECONDS_IN_A_SECOND } from './RN-UI-LIB/src/utlis/common';
import { setItem } from './src/components/utlis/storageHelper';
import { StorageKeys } from './src/types/storageKeys';
import dayJs from 'dayjs';
2023-09-13 00:40:45 +05:30
import { GlobalImageMap, hydrateGlobalImageMap } from './src/common/CachedImage';
2023-09-06 18:09:10 +05:30
import analytics from '@react-native-firebase/analytics';
import fetchUpdatedRemoteConfig from './src/services/firebaseFetchAndUpdate.service';
2023-09-19 12:49:35 +05:30
import { addClickstreamEvent } from './src/services/clickstreamEventService';
import ScreenshotBlocker from './src/components/utlis/ScreenshotBlocker';
2023-06-08 15:20:51 +05:30
initSentry();
2023-06-05 12:26:34 +05:30
if (ENV !== 'prod') {
// mockApiServer();
}
2023-05-25 13:55:15 +05:30
setJsErrorHandler();
LogBox.ignoreAllLogs();
export let GlobalDocumentMap: Record<string, TDocumentObj | string> = {};
async function checkCodePushAndSync() {
2023-04-18 01:27:28 +05:30
try {
await CodePush.sync({
installMode: codePush.InstallMode.IMMEDIATE,
});
} catch (error) {}
}
function handleAppStateChange(nextAppState: any) {
2023-04-18 01:27:28 +05:30
if (nextAppState == 'active') {
checkCodePushAndSync();
}
}
const PERMISSION_CHECK_POLL_INTERVAL = 5 * MILLISECONDS_IN_A_SECOND;
2023-08-31 14:51:03 +05:30
function App() {
2023-04-18 01:27:28 +05:30
const [permissions, setPermissions] = React.useState(true);
const [isGlobalDocumentMapLoaded, setIsGlobalDocumentMapLoaded] = React.useState(false);
2023-08-31 14:51:03 +05:30
const [routeName, setRouteName] = useState('Unknown');
2023-08-29 17:00:05 +05:30
const askForPermissions = async () => {
const permissionsToRequest = await getPermissionsToRequest();
2023-08-29 17:00:05 +05:30
if (Platform.OS === 'android') {
PermissionsAndroid.requestMultiple(permissionsToRequest)
2023-08-29 17:00:05 +05:30
.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);
});
}
};
2023-09-06 18:09:10 +05:30
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 || '';
};
2023-09-19 12:49:35 +05:30
async function setForegroundTimeStampAndClickstream() {
const now = dayJs().toString();
await setItem(StorageKeys.APP_FOREGROUND_TIMESTAMP, now);
2023-09-19 12:49:35 +05:30
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();
}, []);
2023-04-18 01:27:28 +05:30
React.useEffect(() => {
fetchUpdatedRemoteConfig();
askForPermissions();
2023-08-29 13:17:02 +05:30
const appStateChange = AppState.addEventListener('change', async (change) => {
2023-04-18 01:27:28 +05:30
handleAppStateChange(change);
2023-09-13 14:50:17 +05:30
hydrateGlobalImageMap();
2023-04-18 01:27:28 +05:30
});
(async () => {
const data = await AsyncStorage.getItem(LocalStorageKeys.GLOBAL_DOCUMENT_MAP);
if (data) {
const parsedData = JSON.parse(data);
GlobalDocumentMap = parsedData;
}
setIsGlobalDocumentMapLoaded(true);
})();
checkCodePushAndSync();
2023-09-19 12:49:35 +05:30
setForegroundTimeStampAndClickstream();
2023-04-18 01:27:28 +05:30
return () => {
appStateChange.remove();
};
}, []);
2023-04-18 01:27:28 +05:30
return (
<Provider store={store}>
2023-09-07 13:34:19 +05:30
<PersistGate
loading={<FullScreenLoader loading isTranslucent={false} />}
persistor={persistor}
>
2023-10-09 10:53:14 +05:30
<NavigationContainer
2023-08-31 14:51:03 +05:30
ref={navigationRef}
onStateChange={async (state) => {
const currentRouteName = getActiveRouteName(state);
if (routeName !== currentRouteName) {
2023-09-06 17:51:50 +05:30
await analytics().logScreenView({
screen_name: currentRouteName,
screen_class: currentRouteName,
});
2023-08-31 14:51:03 +05:30
await analytics().logEvent('screen_view', {
screen_name: currentRouteName,
screen_class: currentRouteName,
});
setRouteName(currentRouteName);
}
}}
>
2023-04-18 01:27:28 +05:30
<StatusBar backgroundColor={COLORS.BACKGROUND.INDIGO_DARK} />
<SuspenseLoader
2023-09-07 13:34:19 +05:30
fallBack={<FullScreenLoader loading isTranslucent={false} />}
2023-04-18 01:27:28 +05:30
loading={!isGlobalDocumentMapLoaded}
children={
2023-10-09 14:26:40 +05:30
<ErrorBoundary>{permissions ? <AuthRouter /> : <Permissions />}</ErrorBoundary>
}
2023-04-18 01:27:28 +05:30
/>
</NavigationContainer>
2023-10-09 10:53:14 +05:30
<ToastContainer config={toastConfigs} position="top" topOffset={18} />
2023-04-18 01:27:28 +05:30
</PersistGate>
</Provider>
);
2023-08-31 14:51:03 +05:30
}
2022-11-30 10:13:33 +05:30
2023-05-25 13:55:15 +05:30
const AppWithSentry = Sentry.wrap(App);
export default AppWithSentry;