NTP-27182 | firestore resync filter chunks
This commit is contained in:
@@ -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}
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user