diff --git a/package.json b/package.json index 23652e85..f328fc9f 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "dependencies": { "@react-native-async-storage/async-storage": "1.17.11", "@react-native-firebase/app": "16.4.6", + "@react-native-firebase/auth": "16.5.0", "@react-native-firebase/crashlytics": "16.5.0", "@react-native-firebase/database": "16.4.6", "@react-native-firebase/firestore": "16.5.0", diff --git a/src/hooks/useFirestoreUpdates.ts b/src/hooks/useFirestoreUpdates.ts index c203b89f..9ca0e924 100644 --- a/src/hooks/useFirestoreUpdates.ts +++ b/src/hooks/useFirestoreUpdates.ts @@ -7,6 +7,7 @@ import { updateCaseDetailsFirestore } from '../reducer/allCasesSlice'; import { CaseDetail } from '../screens/caseDetails/interface'; import { FirestoreUpdateTypes } from '../common/Constants'; import { toast } from '../../RN-UI-LIB/src/components/toast'; +import auth from '@react-native-firebase/auth'; export interface CaseUpdates { updateType: string; @@ -16,41 +17,40 @@ export interface CaseUpdates { const useFirestoreUpdates = () => { const reduxStoreData = useAppSelector((state: RootState) => state); const { - user: { user, isLoggedIn }, + user: { user, isLoggedIn, sessionDetails }, + allCases: { caseDetails }, } = reduxStoreData; + let casesSubscriber: any; + let templateSubscriber: any; + let configSubscriber: any; + const dispatch = useAppDispatch(); const handleCasesUpdate = ( querySnapshot: FirebaseFirestoreTypes.QuerySnapshot, ) => { - // stale data => no pending writes - console.log("querySnapshot.metadata.hasPendingWrites", querySnapshot.metadata) - if (querySnapshot.metadata.hasPendingWrites) { - return; - } let newlyAddedCases = 0; const caseUpdates: CaseUpdates[] = []; querySnapshot .docChanges() .forEach( (documentSnapshot: FirebaseFirestoreTypes.DocumentChange) => { - console.log('type....', documentSnapshot.type); - console.log( - 'Updated Chbages .........', - documentSnapshot.doc.data(), - ); const updateType = documentSnapshot.type; const updatedCaseDetail = documentSnapshot.doc.data() as CaseDetail; if (updateType === FirestoreUpdateTypes.ADDED) { - newlyAddedCases++; + if (!caseDetails[updatedCaseDetail.id]) { + newlyAddedCases++; + caseUpdates.push({ updateType, updatedCaseDetail }); + } + } else { + caseUpdates.push({ updateType, updatedCaseDetail }); } - console.log(newlyAddedCases); - caseUpdates.push({ updateType, updatedCaseDetail }); }, ); - // dispatch(updateCaseDetailsFirestore({ caseUpdates })); + + dispatch(updateCaseDetailsFirestore({ caseUpdates })); if (newlyAddedCases > 0) { toast({ type: 'success', @@ -65,69 +65,61 @@ const useFirestoreUpdates = () => { console.log('Error while fetching firestore snapshot', err); }; - const fakeAddCase = () => { - setTimeout(() => { - firestore() - // .doc(`users/${user?.referenceId}/cases/caseId2`) - .collection('case') - .add({ - allocatedAt: 1670806248220, - caseStatus: 'IN_PROGRESS', - context: { - currentTask: null, - taskContext: [Object], - taskSequence: null, - }, - createdAt: 1671086418938, - currentAllocationReferenceId: - 'c495d1db-ee11-4235-84bd-6ab7e9b70e27', - currentTask: 'CALLING_TASK', - customerInfo: { - customerName: 'Herik', - customerReferenceId: - 'e6d122cb-ca9c-4a16-85c9-7c354efe8c8e', - geoLocation: - 'https://maps.google.com/?q=26.4273034,74.642422', - imageURL: - 'https://ca.slack-edge.com/TEV8SHPQB-U03RK8J6N7Q-7035c43b0621-512', - primaryPhoneNumber: '8436942857', - }, - id: '1d57089f-f367-4cd4-8b6c-124ef2e042e5', - isSynced: false, - loanDetails: { - disbursalDate: '2022-12-12', - disbursementAmount: 100, - firstDueDate: '2022-12-12', - loanAccountNumber: 'LAN3003', - loanAccountStatus: 'ACTIVE', - loanType: 'PERSONAL_LOAN', - productCode: 'PL-003', - tenureMonths: 10, - }, - taskSequence: [ - 'COMMUNICATION_ADDRESS_VERIFICATION_TASK', - 'PERMANENT_ADDRESS_VERIFICATION_TASK', - 'GEO_LOCATION_VERIFICATION_TASK', - 'CALLING_TASK', - 'NEW_ADDRESS_VERIFICATION_TASK', - ], - tasks: null, - updatedAt: 1672736996727, - }); - }, 10000); - } + const isUserSignedIn = () => { + return auth().currentUser ? true : false; + }; - useEffect(() => { - if (!isLoggedIn) { + const signInUserToFirebase = () => { + if (!sessionDetails) { return; } - // fakeAddCase(); - const casesSubscriber = firestore() + auth() + .signInWithCustomToken(sessionDetails?.firebaseToken) + .then(userCredential => { + console.log('user....', userCredential.user); + casesSubscriber = subscribeToCases(); + }) + .catch(error => { + console.log(error); + }); + }; + + const subscribeToCases = () => { + firestore() .collection(`allocations/${user?.referenceId}/cases`) - // .collection(`users/${user?.referenceId}/case`) .onSnapshot(handleCasesUpdate, handleError); - // Stop listening for updates when no longer required - return () => casesSubscriber(); + }; + + const subscribeToTemplate = () => { + firestore() + .collection(`allocations/${user?.referenceId}/cases`) + .onSnapshot(handleCasesUpdate, handleError); + }; + + const subscribeToUserConfig = () => { + firestore() + .collection(`allocations/${user?.referenceId}/cases`) + .onSnapshot(handleCasesUpdate, handleError); + }; + + const subscribeToFirestore = () => { + casesSubscriber = subscribeToCases(); + // templateSubscriber = subscribeToTemplate(); + // configSubscriber = subscribeToUserConfig(); + }; + + useEffect(() => { + if (!isLoggedIn || !sessionDetails?.firebaseToken) { + return; + } + if (isUserSignedIn()) { + subscribeToFirestore(); + } else { + signInUserToFirebase(); + } + return () => { + casesSubscriber && casesSubscriber(); + }; }, [isLoggedIn]); }; diff --git a/src/reducer/allCasesSlice.ts b/src/reducer/allCasesSlice.ts index 6c28eb35..a21413cf 100644 --- a/src/reducer/allCasesSlice.ts +++ b/src/reducer/allCasesSlice.ts @@ -247,10 +247,10 @@ const allCasesSlice = createSlice({ pinRank: updatedCaseDetail.pinRank || null, }; } - const currentTask = state.caseDetails[id].tasks.find( + const currentTask = updatedCaseDetail.tasks.find( task => task.taskType === - (state.caseDetails[id].currentTask as string), + (updatedCaseDetail.currentTask as string), ); state.caseDetails[id] = { ...updatedCaseDetail, @@ -260,6 +260,9 @@ const allCasesSlice = createSlice({ break; } case FirestoreUpdateTypes.ADDED: { + if(state.caseDetails[id]) { + return; + } const caseListItem: ICaseItem = { caseReferenceId: id, updatedAt, @@ -270,14 +273,14 @@ const allCasesSlice = createSlice({ pinRank: updatedCaseDetail.pinRank || null, }; state.casesList.push(caseListItem); - state.caseDetails[id].tasks.find( + const currentTaskAdd = updatedCaseDetail.tasks.find( task => task.taskType === - (state.caseDetails[id].currentTask as string), + (updatedCaseDetail.currentTask as string), ); state.caseDetails[id] = { ...updatedCaseDetail, - currentTask, + currentTask: currentTaskAdd, isSynced: true, }; break; diff --git a/src/reducer/userSlice.ts b/src/reducer/userSlice.ts index e4023ed5..8e13c22c 100644 --- a/src/reducer/userSlice.ts +++ b/src/reducer/userSlice.ts @@ -4,6 +4,7 @@ import { setGlobalUserData } from '../constants/Global'; interface ISessionDetails { sessionToken: string; sessionExpiry: number; + firebaseToken: string; } interface IUserDetails { diff --git a/yarn.lock b/yarn.lock index b7fd9280..b6bd1cca 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1387,7 +1387,15 @@ opencollective-postinstall "^2.0.1" superstruct "^0.6.2" -"@react-native-firebase/crashlytics@^16.5.0": +"@react-native-firebase/auth@16.5.0": + version "16.5.0" + resolved "https://registry.yarnpkg.com/@react-native-firebase/auth/-/auth-16.5.0.tgz#8fcce3aaf89c6c260ab8dba87644c83ef1595cf1" + integrity sha512-LV3x5I7vMGHhqPqKo+lgLlxQMlFYKF2hYX/F51NmXsL+QXesfUvIWMm8YyUNwspc928QD7PU2mY37V5lrvYuSg== + dependencies: + "@expo/config-plugins" "^5.0.4" + plist "^3.0.5" + +"@react-native-firebase/crashlytics@16.5.0": version "16.5.0" resolved "https://registry.yarnpkg.com/@react-native-firebase/crashlytics/-/crashlytics-16.5.0.tgz#5c3e22c1bfdccd0157aad78571298d489e4d871d" integrity sha512-wCZyF3OHi6PSQ0LH2YT0ewDYsEpMCKwTuIe27unBaE+ikIKJhIYY38+A2K4xUDwj9Gnpd52QE0eSfWS0BxfeNQ== @@ -1477,46 +1485,46 @@ redux-thunk "^2.4.2" reselect "^4.1.7" -"@sentry/browser@^7.28.1": - version "7.28.1" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.28.1.tgz#c8086e26079809aa401a05d9b4a6e4df63a9c965" - integrity sha512-N8j93IcrWKWorfJ5D+RSKVAvcR4S5tIcZ/HvFPMrQWnfVa/jtJcrKThdjZYteA0wjmPiy8/D3KA8nB91yulBPA== +"@sentry/browser@7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.29.0.tgz#eb162b50adec33ac49ecd3dc930bdffbfda8098e" + integrity sha512-Af+dIcntaw405Wt7myDOMGDxiszfy4aBdshrEKYbGgcfHjgXBIdF3iKlNatvl6nrOm+IOVuKgSpCLOr2hiCwzw== dependencies: - "@sentry/core" "7.28.1" - "@sentry/replay" "7.28.1" - "@sentry/types" "7.28.1" - "@sentry/utils" "7.28.1" + "@sentry/core" "7.29.0" + "@sentry/replay" "7.29.0" + "@sentry/types" "7.29.0" + "@sentry/utils" "7.29.0" tslib "^1.9.3" -"@sentry/core@7.28.1": - version "7.28.1" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.28.1.tgz#c712ce17469b18b01606108817be24a99ed2116e" - integrity sha512-7wvnuvn/mrAfcugWoCG/3pqDIrUgH5t+HisMJMGw0h9Tc33KqrmqMDCQVvjlrr2pWrw/vuUCFdm8CbUHJ832oQ== +"@sentry/core@7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.29.0.tgz#bc4b54d56cf7652598d4430cf43ea97cc069f6fe" + integrity sha512-+e9aIp2ljtT4EJq3901z6TfEVEeqZd5cWzbKEuQzPn2UO6If9+Utd7kY2Y31eQYb4QnJgZfiIEz1HonuYY6zqQ== dependencies: - "@sentry/types" "7.28.1" - "@sentry/utils" "7.28.1" + "@sentry/types" "7.29.0" + "@sentry/utils" "7.29.0" tslib "^1.9.3" -"@sentry/replay@7.28.1": - version "7.28.1" - resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.28.1.tgz#fbdd377923e082423b95e3f128cb9af9451aca70" - integrity sha512-Os0PzMjKlwtHwzTU0kfVzGzsi4Vaj3g2arCl4Qnr3b6kYTb9WOFZo/n/v56ss7Z+nZG3K8W5PisoD4MRsRJRig== +"@sentry/replay@7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.29.0.tgz#75d5bb9df39e0a31994be245032c9998af62a304" + integrity sha512-Gw7HgviJQu6pX5RFQGVY38Av4qFn9otrZdwSSl/QK5hIyg6yhlh5h7U0ydZkrYYGiW6Z6SYYRpEWCJc/Wbh+ZQ== dependencies: - "@sentry/core" "7.28.1" - "@sentry/types" "7.28.1" - "@sentry/utils" "7.28.1" + "@sentry/core" "7.29.0" + "@sentry/types" "7.29.0" + "@sentry/utils" "7.29.0" -"@sentry/types@7.28.1": - version "7.28.1" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.28.1.tgz#9018b4c152b475de9bedd267237393d3c9b1253d" - integrity sha512-DvSplMVrVEmOzR2M161V5+B8Up3vR71xMqJOpWTzE9TqtFJRGPtqT/5OBsNJJw1+/j2ssMcnKwbEo9Q2EGeS6g== +"@sentry/types@7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.29.0.tgz#ed829b6014ee19049035fec6af2b4fea44ff28b8" + integrity sha512-DmoEpoqHPty3VxqubS/5gxarwebHRlcBd/yuno+PS3xy++/i9YPjOWLZhU2jYs1cW68M9R6CcCOiC9f2ckJjdw== -"@sentry/utils@7.28.1": - version "7.28.1" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.28.1.tgz#0a7b6aa4b09e91e4d1aded2a8c8dbaf818cee96e" - integrity sha512-75/jzLUO9HH09iC9TslNimGbxOP3jgn89P+q7uR+rp2fJfRExHVeKJZQdK0Ij4/SmE7TJ3Uh2r154N0INZEx1g== +"@sentry/utils@7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.29.0.tgz#cbf8f87dd851b0fdc7870db9c68014c321c3bab8" + integrity sha512-ICcBwTiBGK8NQA8H2BJo0JcMN6yCeKLqNKNMVampRgS6wSfSk1edvcTdhRkW3bSktIGrIPZrKskBHyMwDGF2XQ== dependencies: - "@sentry/types" "7.28.1" + "@sentry/types" "7.29.0" tslib "^1.9.3" "@sideway/address@^4.1.3":