NTP-27182 | firestore resync filter chunks

This commit is contained in:
Aman Chaturvedi
2025-01-10 14:29:57 +05:30
parent 65545c55a6
commit f97625152f
2 changed files with 50 additions and 24 deletions

View File

@@ -1,5 +1,5 @@
import { StyleSheet, View } from 'react-native';
import React from 'react';
import { Keyboard, StyleSheet, View } from 'react-native';
import React, { useEffect } from 'react';
import RNTextInput from '../../../../RN-UI-LIB/src/components/TextInput';
import { GenericStyles } from '../../../../RN-UI-LIB/src/styles';
import { Control, Controller } from 'react-hook-form';
@@ -32,6 +32,15 @@ const TextInput: React.FC<ITextInput> = (props) => {
return null;
}
useEffect(() => {
const hideSubscription = Keyboard.addListener('keyboardDidHide', () => {
Keyboard.dismiss();
});
return () => {
hideSubscription.remove();
};
}, []);
const handleChange = (text: string, onChange: (...event: any[]) => void) => {
let cleanedText = text;
if (question.metadata.keyboardType === 'decimal-pad') {
@@ -61,13 +70,14 @@ const TextInput: React.FC<ITextInput> = (props) => {
<Controller
control={props.control}
rules={{ validate: (data) => validateInput(data, question.metadata.validators) }}
render={({ field: { onChange, value } }) => (
render={({ field: { onChange, onBlur, value } }) => (
<RNTextInput
maskType={question.metadata.maskType || null}
keyboardType={question.metadata.keyboardType || 'default'}
onChangeText={(text) => handleChange(text, onChange)}
value={value?.answer || ''}
containerStyle={[GenericStyles.mt12]}
onBlur={onBlur}
placeholder={'Enter here'}
inputContainerStyle={styles.inputContainerStyle}
maxLength={question.metadata.validators?.phoneNumber?.value as number}

View File

@@ -14,6 +14,7 @@ import { CaseAllocationType } from '@screens/allCases/interface';
import { CaseDetail } from '@screens/caseDetails/interface';
import { CaseUpdates } from './useFirestoreUpdates';
import { getFirestoreResyncIntervalInMinutes } from '@common/AgentActivityConfigurableConstants';
import chunk from 'lodash/chunk';
const selectedAgentReferenceIDForMyCases = 'MY_CASES';
@@ -48,30 +49,44 @@ const useResyncFirebase = () => {
const fetchFirestoreCases = async (
caseIds: string[],
casesPath: string,
updateType: string = FirestoreUpdateTypes.ADDED
updateType = FirestoreUpdateTypes.ADDED
) => {
const caseDocs = await firestore()
.collection(casesPath)
.where('caseReferenceId', 'in', caseIds)
.get();
const CHUNK_SIZE = 10; // Firestore "in" filter supports up to 10 elements
const firebaseAllocatedCases: CaseUpdates[] = [];
caseDocs?.forEach((doc) => {
const firebaseCase = doc.data() as CaseDetail;
if (!firebaseCase?.caseReferenceId) {
return;
// Split caseIds into chunks
const caseIdChunks = chunk(caseIds, CHUNK_SIZE);
// Query Firestore for each chunk
for (const caseIdChunk of caseIdChunks) {
try {
const caseDocs = await firestore()
.collection(casesPath)
.where('caseReferenceId', 'in', caseIdChunk)
.get();
caseDocs.forEach((doc) => {
const firebaseCase = doc.data();
if (!firebaseCase?.caseReferenceId) {
return;
}
firebaseAllocatedCases.push({
updateType,
updatedCaseDetail: firebaseCase,
});
void addClickstreamEvent(CLICKSTREAM_EVENT_NAMES.FA_FIREBASE_RESYNC, {
[updateType === FirestoreUpdateTypes.ADDED
? FirestoreUpdateTypes.ADDED
: FirestoreUpdateTypes.MODIFIED]: firebaseCase.caseReferenceId,
syncedSource: SyncedSource.FIREBASE,
});
});
} catch (err) {
logError(err as Error, 'Error fetching cases from Firestore chunk');
}
firebaseAllocatedCases.push({
updateType,
updatedCaseDetail: firebaseCase,
});
void addClickstreamEvent(CLICKSTREAM_EVENT_NAMES.FA_FIREBASE_RESYNC, {
[updateType === FirestoreUpdateTypes.ADDED ? 'added' : 'update']:
firebaseCase.caseReferenceId,
syncedSource: SyncedSource.FIREBASE,
});
});
}
// If firebase case is not found, fetch from API
const firebaseCaseIdsSet = new Set(
@@ -80,6 +95,7 @@ const useResyncFirebase = () => {
const caseIdsToFetch = caseIds.filter((caseId) => !firebaseCaseIdsSet.has(caseId));
// Fetch remaining cases from API
for (const caseId of caseIdsToFetch) {
try {
const res = await _getCaseDetailsFromApi(caseId);
@@ -93,7 +109,7 @@ const useResyncFirebase = () => {
syncedSource: SyncedSource.API,
});
} catch (err) {
logError(err as Error, 'Error fetching cases from firestore');
logError(err as Error, 'Error fetching cases from API');
}
}