diff --git a/android/app/build.gradle b/android/app/build.gradle index e7386bc0..06f95816 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -113,8 +113,8 @@ def jscFlavor = 'org.webkit:android-jsc:+' def enableHermes = project.ext.react.get("enableHermes", false); -def VERSION_CODE = 264 -def VERSION_NAME = "2.19.5" +def VERSION_CODE = 266 +def VERSION_NAME = "2.19.7" android { namespace "com.avapp" diff --git a/android/app/src/main/java/com/avapp/MainApplication.java b/android/app/src/main/java/com/avapp/MainApplication.java index 37bd1c0b..166ed409 100644 --- a/android/app/src/main/java/com/avapp/MainApplication.java +++ b/android/app/src/main/java/com/avapp/MainApplication.java @@ -189,6 +189,7 @@ public class MainApplication extends Application implements ReactApplication, Ap anrEventProperties.put(APP_IN_FOREGROUND, String.valueOf(isAppInForeground())); anrEventProperties.put("isNae", "true"); anrEventProperties.put("errorTitle", "Something went wrong"); + anrEventProperties.put("vertical", "COLLECTIONS_FIELD"); if (isAlfredEnabledFromFirebase && AlfredManager.INSTANCE.isAlfredRecordingEnabled() && alfredConfig.getAnrEnableStatus() && isAppInForeground()) { @@ -219,6 +220,8 @@ public class MainApplication extends Application implements ReactApplication, Ap crashEventProperties.put(APP_IN_FOREGROUND, String.valueOf(isAppInForeground())); crashEventProperties.put("isNae", "true"); crashEventProperties.put("errorTitle", "Something went wrong"); + crashEventProperties.put("vertical", "COLLECTIONS_FIELD"); + if (isAlfredEnabledFromFirebase && AlfredManager.INSTANCE.isAlfredRecordingEnabled() && alfredConfig.getCrashEnableStatus() && isAppInForeground()) { StackTraceElement stackTraceElement = exception.getStackTrace()[0]; diff --git a/buildFlavor/field/buildNumber.txt b/buildFlavor/field/buildNumber.txt index 2b930fc4..c1d1ffbb 100644 --- a/buildFlavor/field/buildNumber.txt +++ b/buildFlavor/field/buildNumber.txt @@ -1 +1 @@ -265 +266 diff --git a/buildFlavor/field/buildVersion.txt b/buildFlavor/field/buildVersion.txt index 417faf23..7b054ef0 100644 --- a/buildFlavor/field/buildVersion.txt +++ b/buildFlavor/field/buildVersion.txt @@ -1 +1 @@ -2.19.6 +2.19.7 diff --git a/package.json b/package.json index 8bab9862..2c88b889 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "AV_APP", - "version": "2.19.5", - "buildNumber": "264", + "version": "2.19.7", + "buildNumber": "266", "private": true, "scripts": { "android:dev": "yarn move:dev && react-native run-android", diff --git a/src/common/Constants.ts b/src/common/Constants.ts index 613eb893..777900de 100644 --- a/src/common/Constants.ts +++ b/src/common/Constants.ts @@ -503,6 +503,10 @@ export const CLICKSTREAM_EVENT_NAMES = { name: 'FA_SHARE_SUCCESSFUL', description: 'When user is redirected to WhatsApp after clicking on share feedback', }, + FA_SHARE_FAILED:{ + name: 'FA_SHARE_FAILED', + description: 'When user is not redirected to WhatsApp after clicking on share feedback', + }, FA_PERFORMANCE_DASHBOARD_PERFORMANCE_GRAPH_CLICKED: { name: 'FA_PERFORMANCE_DASHBOARD_PERFORMANCE_GRAPH_CLICKED', description: 'When the user clicks on expand/collapse of the performance graph', @@ -905,7 +909,10 @@ export const CLICKSTREAM_EVENT_NAMES = { name: 'FA_FIREBASE_RESYNC_DATA', description: 'FA_FIREBASE_RESYNC_DATA', }, - + FA_FIREBASE_CASE_DIFF_FOUND:{ + name: 'FA_FIREBASE_CASE_DIFF_FOUND', + description: 'FA_FIREBASE_CASE_DIFF_FOUND' + }, //PUSH NOTIFICATIONS FA_PUSH_NOTIFICATION_RECEIVED: { name: 'FA_PUSH_NOTIFICATION_RECEIVED', diff --git a/src/components/utlis/commonFunctions.ts b/src/components/utlis/commonFunctions.ts index a97406a8..27244ffe 100644 --- a/src/components/utlis/commonFunctions.ts +++ b/src/components/utlis/commonFunctions.ts @@ -42,7 +42,10 @@ import { getSystemVersion, getTotalMemory, } from 'react-native-device-info'; -import { addClickstreamEvent } from '@services/clickstreamEventService'; +import { + addClickstreamEvent, + handleNegativeClickstreamEvent, +} from '@services/clickstreamEventService'; import { ITelephoneNumbers } from '@reducers/telephoneNumbersSlice'; import { ISignedRequest, getSignedApi } from '@actions/dataActions'; import axiosInstance, { ApiKeys, getApiUrl } from './apiHelper'; @@ -477,7 +480,7 @@ export const shareBase64ContentToWhatsapp = async ( whatsappMessage: string, fileName: string = 'temp_file', mimeType: string = MimeType['application/pdf'], - format: string = '.pdf' + format: string = '.pdf', ) => { try { const base64string = await getBase64StringFromUrl(url); @@ -497,6 +500,11 @@ export const shareBase64ContentToWhatsapp = async ( type: 'error', }); } else { + const errorMessage = error?.message; + handleNegativeClickstreamEvent(CLICKSTREAM_EVENT_NAMES.FA_SHARE_FAILED, { + shareType: 'whatsapp', + errorMessage, + }); toast({ text1: ToastMessages.WHATSAPP_FEEDBACK_SHARE_FAILURE, type: 'error', diff --git a/src/hooks/useResyncFirebase.ts b/src/hooks/useResyncFirebase.ts index 3f9cdce1..1a7f4017 100644 --- a/src/hooks/useResyncFirebase.ts +++ b/src/hooks/useResyncFirebase.ts @@ -5,7 +5,10 @@ import { CLICKSTREAM_EVENT_NAMES, FirestoreUpdateTypes, SyncedSource } from '@co import axiosInstance, { ApiKeys, getApiUrl } from '@utils/apiHelper'; import { getSyncCaseIds } from '@utils/firebaseFallbackUtils'; import { logError } from '@utils/errorUtils'; -import { addClickstreamEvent } from '@services/clickstreamEventService'; +import { + addClickstreamEvent, + handleNegativeClickstreamEvent, +} from '@services/clickstreamEventService'; import { setLastFirebaseResyncTimestamp } from '@reducers/metadataSlice'; import dayJs from 'dayjs'; import AsyncStorage from '@react-native-async-storage/async-storage'; @@ -95,6 +98,9 @@ const useResyncFirebase = () => { const caseIdsToFetch = caseIds.filter((caseId) => !firebaseCaseIdsSet.has(caseId)); + if (caseIdsToFetch?.length > 0) { + handleNegativeClickstreamEvent(CLICKSTREAM_EVENT_NAMES.FA_FIREBASE_CASE_DIFF_FOUND); + } // Fetch remaining cases from API for (const caseId of caseIdsToFetch) { try { diff --git a/src/services/FeedbackWhatsApp.ts b/src/services/FeedbackWhatsApp.ts index 3b758f7a..54e0dba9 100644 --- a/src/services/FeedbackWhatsApp.ts +++ b/src/services/FeedbackWhatsApp.ts @@ -1,10 +1,15 @@ import { sanitizeString, shareBase64ContentToWhatsapp } from '../components/utlis/commonFunctions'; -import { addClickstreamEvent } from '../services/clickstreamEventService'; +import { + addClickstreamEvent, + handleNegativeClickstreamEvent, +} from '../services/clickstreamEventService'; import { CLICKSTREAM_EVENT_NAMES } from '@common/Constants'; import { BUSINESS_DATE_FORMAT, dateFormat } from '@rn-ui-lib/utils/dates'; import { getSanitizedCommaAmount } from '@rn-ui-lib/utils/amount'; import { FEEDBACK_TYPE, FIELD_FEEDBACKS, IAnswerView, OPTION_TAG } from '../types/feedback.types'; import { InteractionStatuses } from '@screens/allCases/interface'; +import { toast } from '@rn-ui-lib/components/toast'; +import { ToastMessages } from '@screens/allCases/constants'; const getLocationLink = (latitude: string, longitude: string): string => { const link = `https://www.google.com/maps/search/?api=1&query=${latitude},${longitude}`; @@ -60,13 +65,21 @@ const sendToWhatsapp = ( caseId: caseDetails?.id, agentId: agentId, }); + if (!caseDetails?.id) { + handleNegativeClickstreamEvent(CLICKSTREAM_EVENT_NAMES.FA_SHARE_FAILED, { + shareType: 'whatsapp', + errorMessage: 'Case id is not available', + }); + } let message = `*Visit Feedback* for ${sanitizeString(caseDetails?.customerName)} -_${sanitizeString(dateFormat(new Date(feedbackItem?.createdAt), 'DD MMM, YYYY | HH:mm a.'))}_\n -*LAN*: ${sanitizeString(caseDetails?.loanAccountNumber)} -*Bucket*: ${sanitizeString(caseDetails?.dpdBucket)} -*EMI Amount*: ₹${getSanitizedCommaAmount(caseDetails?.currentOutstandingEmi)}\n -*Disposition*: ${sanitizeString(feedbackItem?.interactionStatus)}`; + _${sanitizeString( + dateFormat(new Date(feedbackItem?.createdAt), 'DD MMM, YYYY | HH:mm a.') + )}_\n + *LAN*: ${sanitizeString(caseDetails?.loanAccountNumber)} + *Bucket*: ${sanitizeString(caseDetails?.dpdBucket)} + *EMI Amount*: ₹${getSanitizedCommaAmount(caseDetails?.currentOutstandingEmi)}\n + *Disposition*: ${sanitizeString(feedbackItem?.interactionStatus)}`; const { ptpDateText, @@ -101,7 +114,8 @@ _${sanitizeString(dateFormat(new Date(feedbackItem?.createdAt), 'DD MMM, YYYY | } ); if (ptpDateText) { - message += ' for ' + sanitizeString(dateFormat(new Date(ptpDateText), BUSINESS_DATE_FORMAT)) + '\n\n'; + message += + ' for ' + sanitizeString(dateFormat(new Date(ptpDateText), BUSINESS_DATE_FORMAT)) + '\n\n'; } else { message += '\n\n'; } diff --git a/src/services/clickstreamEventService.ts b/src/services/clickstreamEventService.ts index 7bef1d84..bb7c0fde 100644 --- a/src/services/clickstreamEventService.ts +++ b/src/services/clickstreamEventService.ts @@ -80,7 +80,7 @@ export const addClickstreamEvent = async ( fireInstantly: boolean = false ) => { const { DEVICE_ID: deviceId, AGENT_ID: agentId, IS_IMPERSONATED } = GLOBAL; - const {isNae = false} = attributes || {}; + const { isNae = false } = attributes || {}; if (IS_IMPERSONATED || __DEV__) { // Disabled clickstream tracking for impersonated users and in dev mode return; @@ -188,8 +188,8 @@ export const sendApiToClickstreamEvent = ( response: statusCode === 400 ? response : '', screen: `${apiKey}_API_${method}`, }; - - if (isSuccess) { + const filterStatusCodes = new Set([401, 403, 429, 451, 410]); + if (isSuccess || filterStatusCodes.has(statusCode)) { addClickstreamEvent(eventDetails, attributesData); } else { handleNegativeClickstreamEvent(eventDetails, attributesData);