diff --git a/src/components/form/components/TextInput.tsx b/src/components/form/components/TextInput.tsx index 032d5767..4dd1a0dc 100644 --- a/src/components/form/components/TextInput.tsx +++ b/src/components/form/components/TextInput.tsx @@ -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 = (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 = (props) => { validateInput(data, question.metadata.validators) }} - render={({ field: { onChange, value } }) => ( + render={({ field: { onChange, onBlur, value } }) => ( 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} diff --git a/src/hooks/useResyncFirebase.ts b/src/hooks/useResyncFirebase.ts index 236eec79..4be9d86d 100644 --- a/src/hooks/useResyncFirebase.ts +++ b/src/hooks/useResyncFirebase.ts @@ -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'); } }