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
This commit is contained in:
Aman Sethi
2023-03-29 13:43:44 +05:30
committed by GitHub Enterprise
parent 6004c8e8f9
commit aad1ba8083
5 changed files with 91 additions and 17 deletions

View File

@@ -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<string, {name: string, description: string}>;
} as const;
export enum MimeType {
'image/jpeg' = 'image/jpeg',

View File

@@ -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<GenericType>[]) =>
export function isNullOrUndefined(val: any): boolean {
return val === undefined || val === null
}
export const getLoanAccountNumber = (caseDetail: CaseDetail) => {
const { loanAccountNumber, loanDetails } = caseDetail ?? {};
return loanAccountNumber ?? loanDetails?.loanAccountNumber ?? '';
}

View File

@@ -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`,
});
}

View File

@@ -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'));
};

View File

@@ -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'));
};