From aad1ba8083a5f5f3b32ef55e997f52bb942668ce Mon Sep 17 00:00:00 2001 From: Aman Sethi Date: Wed, 29 Mar 2023 13:43:44 +0530 Subject: [PATCH] add 3 events for pin/unpin audit logging TP-22457 (#184) * add 4 events for [in/unpin audit logging TP-22457 * empty case for function handle TP-22457 * rename event TP-22457 --- src/common/Constants.ts | 5 +- src/components/utlis/commonFunctions.ts | 6 ++ src/reducer/allCasesSlice.ts | 65 ++++++++++++++++----- src/screens/allCases/CasesActionButtons.tsx | 18 +++++- src/screens/todoList/TodoList.tsx | 14 ++++- 5 files changed, 91 insertions(+), 17 deletions(-) diff --git a/src/common/Constants.ts b/src/common/Constants.ts index 5455b828..27161875 100644 --- a/src/common/Constants.ts +++ b/src/common/Constants.ts @@ -57,6 +57,9 @@ export const CLICKSTREAM_EVENT_NAMES = { AV_APP_BACKGROUND : {name: 'AV_APP_BACKGROUND', description: 'App went to background'}, AV_ERROR_PAGE_LOADED : {name: 'ERROR_PAGE_LOADED', description: 'Error page loaded'}, AV_NETWORK_STATUS_CHANGE: {name: 'AV_NETWORK_STATUS_CHANGE', description: 'Offline/online status change'}, + FA_ADD_TO_VISIT_PLAN_CTA: { name: 'FA_ADD_TO_VISIT_PLAN_CTA', description: 'Cases pinned' }, + FA_REMOVE_FROM_VISIT_PLAN_CTA: { name: 'FA_REMOVE_FROM_VISIT_PLAN_CTA', description: 'Cases unpinned' }, + FA_VISIT_PLAN_UPDATED: { name: 'FA_VISIT_PLAN_UPDATED', description: 'Updated cases pinned' }, // Login screen AV_LOGIN_SCREEN_LOAD: {name:'AV_LOGIN_SCREEN_LOAD', description: 'Login page loaded'}, @@ -140,7 +143,7 @@ export const CLICKSTREAM_EVENT_NAMES = { AV_FORM_SUBMIT_BUTTON_CLICKED : {name: 'AV_FORM_SUBMIT_BUTTON_CLICKED', description: 'Form submit journey CTA clicked'}, AV_FORM_SUBMIT_API_SUCCESS : {name: 'AV_FORM_SUBMIT_API_SUCCESS', description: 'Form submit API successful'}, AV_FORM_SUBMIT_API_FAILED : {name: 'AV_FORM_SUBMIT_API_FAILED', description: 'Form submit API failed'}, -} as Record; +} as const; export enum MimeType { 'image/jpeg' = 'image/jpeg', diff --git a/src/components/utlis/commonFunctions.ts b/src/components/utlis/commonFunctions.ts index 5abb3130..a99e69e4 100644 --- a/src/components/utlis/commonFunctions.ts +++ b/src/components/utlis/commonFunctions.ts @@ -9,6 +9,7 @@ import address from "../form/components/Address"; import { useWindowDimensions } from 'react-native'; import { GlobalImageMap } from '../../../App'; import { GenericType } from '../../common/GenericTypes'; +import { CaseDetail } from '../../screens/caseDetails/interface'; const fs = RNFetchBlob.fs; @@ -139,4 +140,9 @@ export const allSettled = (promises: Promise[]) => export function isNullOrUndefined(val: any): boolean { return val === undefined || val === null +} + +export const getLoanAccountNumber = (caseDetail: CaseDetail) => { + const { loanAccountNumber, loanDetails } = caseDetail ?? {}; + return loanAccountNumber ?? loanDetails?.loanAccountNumber ?? ''; } \ No newline at end of file diff --git a/src/reducer/allCasesSlice.ts b/src/reducer/allCasesSlice.ts index 5c7984d6..1dd3f8e7 100644 --- a/src/reducer/allCasesSlice.ts +++ b/src/reducer/allCasesSlice.ts @@ -24,6 +24,7 @@ import { CONTEXT_TASK_STATUSES, } from '../screens/caseDetails/interface'; import { addClickstreamEvent } from '../services/clickstreamEventService'; +import { getLoanAccountNumber } from '../components/utlis/commonFunctions'; export type ICasesMap = { [key: string]: ICaseItem }; @@ -231,9 +232,9 @@ const allCasesSlice = createSlice({ if (state.loading) { state.loading = false; } - let newVisitCaseCount: number = 0; - let newVisitCases: string[] = []; - let removedVisitedCases = 0; + let newVisitCaseLoanIds: string[] = []; + let newVisitCollectionCases: string[] = []; + let removedVisitedCasesLoanIds: string[] = []; caseUpdates.forEach(({ updateType, updatedCaseDetail }) => { const { caseType, caseReferenceId, id, pinRank } = updatedCaseDetail; @@ -246,13 +247,27 @@ const allCasesSlice = createSlice({ ); if (index !== -1) { if (pinRank && !state.casesList[index].pinRank) { - newVisitCaseCount++; + // this is a new visit case + newVisitCaseLoanIds.push( + state.caseDetails[caseId] + ?.loanAccountNumber ?? + state.caseDetails[caseId]?.loanDetails + ?.loanAccountNumber ?? + 0, + ); if(caseType === CaseAllocationType.COLLECTION_CASE) { - newVisitCases.push(caseId); + newVisitCollectionCases.push(caseId); } } if(!pinRank && state.casesList[index].pinRank) { - removedVisitedCases++; + // this is a removed visit case + removedVisitedCasesLoanIds.push( + state.caseDetails[caseId] + ?.loanAccountNumber ?? + state.caseDetails[caseId]?.loanDetails + ?.loanAccountNumber ?? + 0, + ); } state.casesList[index] = { ...state.casesList[index], @@ -282,7 +297,7 @@ const allCasesSlice = createSlice({ return; } if(pinRank && caseType === CaseAllocationType.COLLECTION_CASE) { - newVisitCases.push(caseId); + newVisitCollectionCases.push(caseId); } const caseListItem = { caseReferenceId: caseId, @@ -333,22 +348,44 @@ const allCasesSlice = createSlice({ state.pendingList = pendingList; state.completedList = completedList; state.pinnedList = pinnedList; - state.newVisitedCases = newVisitCases; + state.newVisitedCases = newVisitCollectionCases; - if (newVisitCaseCount) { + if (newVisitCaseLoanIds?.length > 0) { + addClickstreamEvent( + CLICKSTREAM_EVENT_NAMES.FIELD_APP_CASES_PINNED_UPDATED, + { + newPinCases: [...newVisitCaseLoanIds], + currentPinCases: pinnedList.map(item => + getLoanAccountNumber( + state.caseDetails[item?.caseReferenceId], + ), + ), + }, + ); toast({ type: 'info', - text1: `${newVisitCaseCount} case${ - newVisitCaseCount > 1 ? 's' : '' + text1: `${newVisitCaseLoanIds.length} case${ + newVisitCaseLoanIds.length > 1 ? 's' : '' } added to the visit plan`, }); return; } - if(removedVisitedCases) { + if(removedVisitedCasesLoanIds.length > 0) { + addClickstreamEvent( + CLICKSTREAM_EVENT_NAMES.FIELD_APP_CASES_PINNED_UPDATED, + { + newUnpinCases: [...removedVisitedCasesLoanIds], + currentPinCases: pinnedList.map(item => + getLoanAccountNumber( + state.caseDetails[item?.caseReferenceId], + ), + ), + }, + ); toast({ type: 'info', - text1: `${removedVisitedCases} case${ - removedVisitedCases > 1 ? 's' : '' + text1: `${removedVisitedCasesLoanIds.length} case${ + removedVisitedCasesLoanIds.length > 1 ? 's' : '' } removed from the visit plan`, }); } diff --git a/src/screens/allCases/CasesActionButtons.tsx b/src/screens/allCases/CasesActionButtons.tsx index 3debc287..a57d9f18 100644 --- a/src/screens/allCases/CasesActionButtons.tsx +++ b/src/screens/allCases/CasesActionButtons.tsx @@ -18,6 +18,7 @@ import { toast } from '../../../RN-UI-LIB/src/components/toast'; import { ToastMessages } from './constants'; import useIsOnline from '../../hooks/useIsOnline'; import { getCurrentScreen } from '../../components/utlis/navigationUtlis'; +import { getLoanAccountNumber } from '../../components/utlis/commonFunctions'; export const CasesActionButtons: React.FC = () => { const dispatch = useAppDispatch(); @@ -27,7 +28,8 @@ export const CasesActionButtons: React.FC = () => { selectedTodoListMap, casesList, caseDetails, - visitPlansUpdating + visitPlansUpdating, + pinnedList } = useAppSelector((state: RootState) => state.allCases); const isOnline = useIsOnline(); @@ -56,6 +58,7 @@ export const CasesActionButtons: React.FC = () => { } const updatedPinnedList: ICaseItem[] = []; const pinnedCasesPayload: IPinnedCasesPayload[] = []; + const newlyUnpinnedCaseLoanIds: string[] = []; const updatedCaseList: ICaseItem[] = casesList.map(caseItem => { const { caseReferenceId, pinRank } = caseItem; const updatedCaseItem = {...caseItem}; @@ -68,6 +71,10 @@ export const CasesActionButtons: React.FC = () => { if (selectedTodoListMap[caseReferenceId]) { updatedCaseItem.pinRank = null; updatedCaseItem.type = CaseTypes.CASE; + const index = updatedCaseItem.caseReferenceId; + newlyUnpinnedCaseLoanIds.push( + getLoanAccountNumber(caseDetails[index]) + ); } else if (pinRank !== null && pinRank !== undefined) { updatedPinnedList.push(caseItem) pinnedCasePayload.pinRank = caseItem.pinRank; @@ -75,6 +82,15 @@ export const CasesActionButtons: React.FC = () => { } return updatedCaseItem; }); + addClickstreamEvent( + CLICKSTREAM_EVENT_NAMES.FIELD_APP_CASES_UNPINNED_CTA, + { + newUnpinCases: [...newlyUnpinnedCaseLoanIds], + currentPinCases: pinnedList.map(item => + getLoanAccountNumber(caseDetails[item?.caseReferenceId]), + ), + }, + ); dispatch(postPinnedList(pinnedCasesPayload, updatedCaseList, 'REMOVED')); }; diff --git a/src/screens/todoList/TodoList.tsx b/src/screens/todoList/TodoList.tsx index d4313434..47ad2013 100644 --- a/src/screens/todoList/TodoList.tsx +++ b/src/screens/todoList/TodoList.tsx @@ -32,6 +32,7 @@ import Layout from '../layout/Layout'; import { toast } from '../../../RN-UI-LIB/src/components/toast'; import { ToastMessages } from '../allCases/constants'; import useIsOnline from '../../hooks/useIsOnline'; +import { getLoanAccountNumber } from '../../components/utlis/commonFunctions'; const TodoList = () => { const { @@ -63,11 +64,12 @@ const TodoList = () => { } const updatedPinnedList: ICaseItem[] = []; const pinnedCasesPayload: IPinnedCasesPayload[] = []; + const newPinedCasesLoanAccountNumbers: string[] = []; const updatedCaseList = casesList.map(caseItem => { const { caseReferenceId } = caseItem; const pinnedItem = intermediateTodoListMap[caseReferenceId]; - const { caseType, loanAccountNumber } = caseDetails[caseReferenceId]; + const { caseType } = caseDetails[caseReferenceId]; const pinnedCasePayload: IPinnedCasesPayload = { caseReferenceId, caseType: caseType || CaseAllocationType.ADDRESS_VERIFICATION_CASE, @@ -84,6 +86,7 @@ const TodoList = () => { updatedPinnedList.push(pinnedItem); pinnedCasePayload.pinRank = pinnedItem.pinRank; pinnedCasesPayload.push(pinnedCasePayload); + newPinedCasesLoanAccountNumbers.push(getLoanAccountNumber(caseDetails[caseReferenceId])); } return pinnedItem ? pinnedItem : caseItem; }); @@ -95,6 +98,15 @@ const TodoList = () => { return caseA.pinRank - caseB.pinRank }, ); + addClickstreamEvent( + CLICKSTREAM_EVENT_NAMES.FIELD_APP_CASES_PINNED_CTA, + { + newPinCases: [...newPinedCasesLoanAccountNumbers], + currentPinCases: pinnedList.map(item => + getLoanAccountNumber(caseDetails[item?.caseReferenceId]), + ), + }, + ); dispatch(postPinnedList(sortedPinnedCasesPayload, updatedCaseList, 'ADDED')); };