diff --git a/src/PersistStorageEngine.ts b/src/PersistStorageEngine.ts new file mode 100644 index 00000000..c54438c1 --- /dev/null +++ b/src/PersistStorageEngine.ts @@ -0,0 +1,55 @@ +import { MMKV } from 'react-native-mmkv'; +import AsyncStorage from '@react-native-async-storage/async-storage'; +import { GenericObject } from '@common/GenericTypes'; + +let storageEngine: GenericObject | null = null; + +const initializeStorageEngine = () => { + /* + only want to enable mmkv for production build due + to limitation of mmkv not working with react native debugger + since its dependent on JSI + */ + + if (!__DEV__) { + const storage = new MMKV(); + const reduxStorage: Storage = { + setItem: async (key, value) => { + storage.set(key, value); + return await Promise.resolve(true); + }, + getItem: async (key) => { + const value = storage.getString(key); + return await Promise.resolve(value); + }, + removeItem: async (key) => { + storage.delete(key); + await Promise.resolve(); + }, + clearAll: async () => { + storage.clearAll(); + await Promise.resolve(); + }, + }; + storageEngine = reduxStorage; + return reduxStorage; + } + + storageEngine = AsyncStorage; + + return AsyncStorage; +}; + +export const getStorageEngine = () => { + if (storageEngine) { + return storageEngine; + } + return initializeStorageEngine(); +}; + +export const clearStorageEngine = async () => { + if (storageEngine?.clearAll) { + storageEngine.clearAll(); + } + await AsyncStorage.clear(); +}; diff --git a/src/action/authActions.ts b/src/action/authActions.ts index 322ec48f..4d8b2b14 100644 --- a/src/action/authActions.ts +++ b/src/action/authActions.ts @@ -38,6 +38,7 @@ import { resetProfileData } from '../reducer/profileSlice'; import CosmosForegroundService from '../services/foregroundServices/foreground.service'; import { resetReportees } from '../reducer/reporteesSlice'; import { resetPerformanceData } from '@reducers/agentPerformanceSlice'; +import { clearStorageEngine, getStorageEngine } from '../PersistStorageEngine'; export interface GenerateOTPPayload { phoneNumber: string; @@ -201,6 +202,7 @@ export const handleLogout = () => async (dispatch: AppDispatch) => { await auth().signOut(); await handleGoogleLogout(); await clearAllAsyncStorage(); + await clearStorageEngine(); setGlobalUserData({ token: '', agentId: '', @@ -236,6 +238,8 @@ export const handleImpersonatedUserLogin = .then(async (response: AxiosResponse) => { //clear current user data await clearAllAsyncStorage(); + //clear redux store if stored in mmkv + await clearStorageEngine(); CosmosForegroundService.clearTasks(); await foregroundService.stopAll(); dispatch(resetCasesData()); diff --git a/src/common/BlockerScreen.tsx b/src/common/BlockerScreen.tsx index c4c8d988..2adb66b4 100644 --- a/src/common/BlockerScreen.tsx +++ b/src/common/BlockerScreen.tsx @@ -67,28 +67,20 @@ const BlockerScreen = (props: IBlockerScreen) => { }, [JSON.stringify(forceUninstallData || {})]); React.useEffect(() => { - handleBlacklistedAppsForBlockingCosmos().then((blacklistedAppsInstalled) => - dispatch( - setBlacklistedAppsInstalledData({ blacklistedAppsInstalled: blacklistedAppsInstalled }) - ) - ); const appStateChange = AppState.addEventListener('change', async (change) => { - setTimeout(async () => { const trace = await perf().startTrace('blacklistedAppsInstalled'); handleBlacklistedAppsForBlockingCosmos().then((blacklistedAppsInstalled) => - dispatch( - setBlacklistedAppsInstalledData({ blacklistedAppsInstalled: blacklistedAppsInstalled }) - ) + dispatch( + setBlacklistedAppsInstalledData({ blacklistedAppsInstalled: blacklistedAppsInstalled }) + ) ); await trace.stop(); }, 3000); - - }); return () => appStateChange.remove(); - }, [BLACKLISTED_APPS_LIST]); + }, []); const handleDownloadNewApp = () => { if (forceReinstallData?.reinstall_endpoint) { @@ -163,7 +155,9 @@ const BlockerScreen = (props: IBlockerScreen) => { } if (blacklistedAppsInstalled?.length > 0) { - addClickstreamEvent(CLICKSTREAM_EVENT_NAMES.FA_BLOCKER_SCREEN_LOADED_FOR_BLACKLISTED_APPS); + addClickstreamEvent(CLICKSTREAM_EVENT_NAMES.FA_BLOCKER_SCREEN_LOADED_FOR_BLACKLISTED_APPS, { + installedApps: blacklistedAppsInstalled, + }); return ; } diff --git a/src/components/utlis/commonFunctions.ts b/src/components/utlis/commonFunctions.ts index ecd8191e..42aa523c 100644 --- a/src/components/utlis/commonFunctions.ts +++ b/src/components/utlis/commonFunctions.ts @@ -23,6 +23,7 @@ import { RouteProp } from '@react-navigation/native'; import crashlytics from '@react-native-firebase/crashlytics'; import { deflate } from 'react-native-gzip'; import { IGeolocationCoordinate } from '../../types/addressGeolocation.types'; +import { MMKV } from 'react-native-mmkv'; const fs = ReactNativeBlobUtil.fs; @@ -125,6 +126,10 @@ export const clearAllAsyncStorage = async () => { return; }; +export const clearAllMmkvStorage = async () => { + MMKV.clearStore(); +}; + export const sanitizeString = (str = '') => { return str?.trim() || DEFAULT_TEXT; }; diff --git a/src/screens/allCases/index.tsx b/src/screens/allCases/index.tsx index ac29fa3a..df5654ec 100644 --- a/src/screens/allCases/index.tsx +++ b/src/screens/allCases/index.tsx @@ -80,9 +80,6 @@ const AllCasesMain = () => { }); if (nextTab === BOTTOM_TAB_ROUTES.Dashboard) addClickstreamEvent(CLICKSTREAM_EVENT_NAMES.FA_PERFORMANCE_DASHBOARD_BUTTON_CLICKED, {}); - if (e?.data?.routeName === BOTTOM_TAB_ROUTES.Profile) { - dispatch(getSelfieDocument()); - } }; useEffect(() => { diff --git a/src/screens/auth/AuthRouter.tsx b/src/screens/auth/AuthRouter.tsx index 277d92eb..c9b3d3f1 100644 --- a/src/screens/auth/AuthRouter.tsx +++ b/src/screens/auth/AuthRouter.tsx @@ -65,6 +65,7 @@ function AuthRouter() { alfredSetUserId(deviceId); } alfredSetCodePushVersion(getAppVersion()); + NetworkStatusService.listenForOnline(dispatch); }, []); // for setting user token in global.ts for api calling's @@ -80,8 +81,6 @@ function AuthRouter() { // Sets the dispatch for apiHelper registerNavigateAndDispatch(dispatch); - NetworkStatusService.listenForOnline(dispatch); - useEffect(() => { Linking.addEventListener('url', (event) => handleUrl(event.url)); }, []); diff --git a/src/store/store.ts b/src/store/store.ts index a95ae124..fbc3fe76 100644 --- a/src/store/store.ts +++ b/src/store/store.ts @@ -12,6 +12,9 @@ import { } from 'redux-persist'; import AsyncStorage from '@react-native-async-storage/async-storage'; +import blacklistedAppsInstalledSlice from '@reducers/blacklistedAppsInstalledSlice'; +import feedbackFiltersSlice from '@reducers/feedbackFiltersSlice'; +import { MMKV } from 'react-native-mmkv'; import caseReducer from '../reducer/caseReducer'; import userSlice from '../reducer/userSlice'; import loginSlice from '../reducer/loginSlice'; @@ -31,27 +34,8 @@ import feedbackImagesSlice from '../reducer/feedbackImagesSlice'; import configSlice from '../reducer/configSlice'; import profileSlice from '../reducer/profileSlice'; import reporteesSlice from '../reducer/reporteesSlice'; -import blacklistedAppsInstalledSlice from '@reducers/blacklistedAppsInstalledSlice'; -import feedbackFiltersSlice from '@reducers/feedbackFiltersSlice'; import agentPerformanceSlice from '../reducer/agentPerformanceSlice'; -import { MMKV } from 'react-native-mmkv'; - -const storage = new MMKV(); - -export const reduxStorage: Storage = { - setItem: (key, value) => { - storage.set(key, value); - return Promise.resolve(true); - }, - getItem: (key) => { - const value = storage.getString(key); - return Promise.resolve(value); - }, - removeItem: (key) => { - storage.delete(key); - return Promise.resolve(); - }, -}; +import { getStorageEngine } from '../PersistStorageEngine'; const rootReducer = combineReducers({ case: caseReducer, @@ -81,7 +65,7 @@ const rootReducer = combineReducers({ const persistConfig = { key: 'root', version: 1, - storage: reduxStorage, + storage: getStorageEngine(), whitelist: [ 'case', 'allCases',