diff --git a/src/action/authActions.ts b/src/action/authActions.ts index 2a300d57..1fc63425 100644 --- a/src/action/authActions.ts +++ b/src/action/authActions.ts @@ -206,6 +206,12 @@ const firebaseSignout = async () => { export const handleLogout = () => async (dispatch: AppDispatch) => { try { + CosmosForegroundService.isRunning().then((isRunning) => { + if (isRunning) { + CosmosForegroundService.clearTasks(); + CosmosForegroundService.stopAll(); + } + }); await firebaseSignout(); await handleGoogleLogout(); await clearAllAsyncStorage(); diff --git a/src/action/callRecordingActions.tsx b/src/action/callRecordingActions.tsx index dcd7c602..c021ddd6 100644 --- a/src/action/callRecordingActions.tsx +++ b/src/action/callRecordingActions.tsx @@ -36,7 +36,7 @@ export const makeACallToCustomer = dispatch(setIsCallCreationLoading(true)); dispatch(setConnectingToCustomerBottomSheet(true)); axiosInstance - .post(url, {}, { headers: { donotHandleError: true } }) + .post(url, {}, { headers: { donotHandleError: true, autoLogoutOnUnauthorized: true } }) .catch((err: Error) => { if (details?.isCallHistory) { dispatch( diff --git a/src/action/caseApiActions.ts b/src/action/caseApiActions.ts index b622a906..12eb0bbd 100644 --- a/src/action/caseApiActions.ts +++ b/src/action/caseApiActions.ts @@ -7,6 +7,8 @@ import { setAddresses, setAddressLoading } from '../reducer/addressSlice'; import { MILLISECONDS_IN_A_MINUTE, _map } from '../../RN-UI-LIB/src/utlis/common'; import { logError } from '../components/utlis/errorUtils'; import { type IDocument, removeDocumentByQuestionKey } from '../reducer/feedbackImagesSlice'; +import { addClickstreamEvent } from '@services/clickstreamEventService'; +import { CLICKSTREAM_EVENT_NAMES } from '@common/Constants'; export const getRepaymentsData = (loanAccountNumber: string) => (dispatch: AppDispatch) => { dispatch(setRepaymentsLoading({ loanAccountNumber, isLoading: true })); @@ -141,6 +143,9 @@ export const uploadImages = dispatch(removeDocumentByQuestionKey({ caseKey, questionKey })); }) .catch((err) => { + addClickstreamEvent(CLICKSTREAM_EVENT_NAMES.FA_PERSIST_ORIGINAL_IMAGE_FAILURE, { + payload: formData, + }); logError(err as Error, 'Error uploading image to document service'); }); }); diff --git a/src/common/Constants.ts b/src/common/Constants.ts index cf6760fa..4517f6f1 100644 --- a/src/common/Constants.ts +++ b/src/common/Constants.ts @@ -1371,7 +1371,12 @@ export const CLICKSTREAM_EVENT_NAMES = { FA_POST_OPERATIVE_HOURS_SCREEN_LOADED: { name: 'FA_POST_OPERATIVE_HOURS_SCREEN_LOADED', description: 'Post operative hours screen loaded' - } + }, + + FA_PERSIST_ORIGINAL_IMAGE_FAILURE: { + name: 'FA_PERSIST_ORIGINAL_IMAGE_FAILURE', + description: 'Failed to persist original image' + }, } as const; export enum MimeType { diff --git a/src/components/utlis/apiHelper.ts b/src/components/utlis/apiHelper.ts index 480a99ae..e0145515 100644 --- a/src/components/utlis/apiHelper.ts +++ b/src/components/utlis/apiHelper.ts @@ -230,6 +230,8 @@ export const API_STATUS_CODE = { POST_OPERATIVE_HOURS_ACTIVITY: 451 }; +export const UNAUTHORIZED_VALUES = [API_STATUS_CODE.UNAUTHORIZED, API_STATUS_CODE.FORBIDDEN]; + const API_TIMEOUT_INTERVAL = 2e4; // 20s let dispatch: Dispatch; @@ -349,8 +351,10 @@ axiosInstance.interceptors.response.use( Number ); if ( - config?.headers?.donotHandleError || - donotHandleErrorOnStatusCode.includes(error?.response?.status) + (config?.headers?.donotHandleError || + donotHandleErrorOnStatusCode.includes(error?.response?.status)) && + // Logout even donotHandleError is true when status code is 401, 403 + !config?.headers?.autoLogoutOnUnauthorized ) { return Promise.reject(error); } diff --git a/src/hooks/capturingApi.ts b/src/hooks/capturingApi.ts index 15369213..4f020944 100644 --- a/src/hooks/capturingApi.ts +++ b/src/hooks/capturingApi.ts @@ -28,6 +28,7 @@ export const sendLocationAndActivenessToServerV2 = .post(getApiUrl(ApiKeys.SEND_LOCATION), geolocationBuffer, { headers: { donotHandleError: 'true', + autoLogoutOnUnauthorized: true }, }) .then(() => { @@ -84,7 +85,9 @@ export const sendCurrentGeolocationAndBuffer = export const getSyncTime = async () => { try { const url = getApiUrl(ApiKeys.SYNC_TIME); - const response = await axiosInstance.get(url, { headers: { donotHandleError: true } }); + const response = await axiosInstance.get(url, { + headers: { donotHandleError: true, autoLogoutOnUnauthorized: true }, + }); return response?.data?.currentTimestamp; } catch (error) { console.log(error);