Feedback bugs 1 || Aman Singh (#49)

* WaterMelon Db Integration

* Fix flow

* Success Icon fix

* Deleting offline images - once sync

* Fix api fail

* Watermelon DB - fix delete flow

* Fix review comment

* Fix review comment - change js to ts files

* folder name change

* changed opacity of pending tasks to 0.4

* fixes

* bugs fixex

* changed dimenshion

* chnaged submodule id

Co-authored-by: himanshu-kansal <himanshu.kansal@navi.com>
Co-authored-by: kunalsharma <kunal.sharma@navi.com>
This commit is contained in:
Aman Singh
2023-01-10 12:50:20 +05:30
committed by GitHub Enterprise
parent 20ea9276a6
commit daf7683201
10 changed files with 102 additions and 23 deletions

View File

@@ -15,6 +15,7 @@
"@nozbe/watermelondb": "0.24.0",
"@nozbe/with-observables": "1.4.1",
"@react-native-async-storage/async-storage": "1.17.11",
"@react-native-community/netinfo": "9.3.7",
"@react-native-firebase/app": "16.4.6",
"@react-native-firebase/auth": "16.5.0",
"@react-native-firebase/crashlytics": "16.5.0",

View File

@@ -85,6 +85,7 @@ export const verifyOTP =
dispatch(resetLoginForm());
})
.catch(err => {
console.log(err)
dispatch(setVerifyOTPError('Invalid OTP, try again'));
});
};

View File

@@ -13,6 +13,7 @@ import {
setLoading,
setTodoListOffline,
updateCaseDetailAfterApiCall,
updateCaseDetailBeforeApiCall,
updateSingleCase,
} from '../reducer/allCasesSlice';
import { ICaseItem } from '../screens/allCases/interface';
@@ -97,7 +98,9 @@ export const syncCaseDetail = (data: any) => (dispatch: AppDispatch) => {
dispatch(updateSingleCase({ data: res.data, id: data.id }));
OfflineImageDAO.deleteImages(offlineImageIdList);
})
.catch(err => console.log(err, 'error'));
.catch(err => {
dispatch(updateCaseDetailBeforeApiCall({caseId: data.id}))
});
};
/**

View File

@@ -23,6 +23,7 @@ import {
import RadioGroup from '../../../../../RN-UI-LIB/src/components/radio_button/RadioGroup';
import RadioButton from '../../../../../RN-UI-LIB/src/components/radio_button/RadioButton';
import {Search} from '../../../../../RN-UI-LIB/src/utlis/search';
import SearchIcon from '../../../../../RN-UI-LIB/src/Icons/SearchIcon';
interface FilterContainerProps {
closeFilterModal: () => void;
@@ -324,6 +325,7 @@ const FiltersContainer: React.FC<FilterContainerProps> = props => {
<>
<View style={[GenericStyles.pt16, styles.ph7]}>
<TextInput
LeftComponent={<SearchIcon />}
placeholder="Search..."
defaultValue={filterSearchString}
onChangeText={value =>

31
src/hooks/useIsOnline.tsx Normal file
View File

@@ -0,0 +1,31 @@
import { View, Text } from 'react-native'
import React from 'react'
import NetInfo from '@react-native-community/netinfo';
const useIsOnline = () => {
const [isOnline, setIsOnline] = React.useState(true);
NetInfo.configure({
reachabilityUrl: 'https://google.com',
reachabilityTest: async response => response.status === 200,
reachabilityLongTimeout: 30 * 1000, // 60s
reachabilityShortTimeout: 5 * 1000, // 5s
reachabilityRequestTimeout: 15 * 1000, // 15s
});
NetInfo.configure({
reachabilityUrl: 'https://google.com',
reachabilityTest: async response => response.status === 200,
reachabilityLongTimeout: 30 * 1000, // 60s
reachabilityShortTimeout: 5 * 1000, // 5s
reachabilityRequestTimeout: 15 * 1000, // 15s
});
NetInfo.addEventListener(state => {
if (isOnline !== state.isConnected) {
setIsOnline(!!state.isConnected && !!state.isInternetReachable);
}
});
return isOnline;
}
export default useIsOnline

View File

@@ -87,13 +87,26 @@ const allCasesSlice = createSlice({
caseReferenceId: item.caseReferenceId,
pinRank: item.pinRank,
});
prev[item.caseReferenceId] = {
...item,
isSynced: true,
isApiCalled: false,
};
console.log(initialValue?.[item.caseReferenceId], item ,state.caseDetails?.[item.caseReferenceId]?.isSynced, "is synced")
if(state.caseDetails[item.caseReferenceId]?.isSynced === false){
console.log("*************************->")
prev[item.caseReferenceId] = {
...initialValue[item.caseReferenceId],
...item,
isSynced: false,
isApiCalled: false,
};
}else{
prev[item.caseReferenceId] = {
...item,
isSynced: true,
isApiCalled: false,
};
}
return prev;
}, initialValue);
console.log(detailsData, "detail data")
state.caseDetails = detailsData;
state.casesList = listData;
}
@@ -120,7 +133,6 @@ const allCasesSlice = createSlice({
state.caseDetails[id] = {
...state.caseDetails[id],
...caseDetail,
isSynced: true,
currentTask,
context,
};
@@ -370,6 +382,7 @@ const allCasesSlice = createSlice({
...action.payload,
};
let filterCount = 0;
console.log(state.selectedFilters);
Object.keys(state.selectedFilters).forEach(filterKey => {
switch (typeof state.selectedFilters[filterKey]) {
case 'object':
@@ -399,6 +412,10 @@ const allCasesSlice = createSlice({
const { caseId } = action.payload;
state.caseDetails[caseId].isApiCalled = true;
},
updateCaseDetailBeforeApiCall: (state, action) => {
const { caseId } = action.payload;
state.caseDetails[caseId].isApiCalled = false;
},
toggleNewlyAddedCase: (state, action) => {
state.caseDetails[action.payload].isNewlyAdded = false;
},
@@ -434,6 +451,7 @@ export const {
updateCaseDetailAfterApiCall,
toggleNewlyAddedCase,
resetCasesData,
updateCaseDetailBeforeApiCall
} = allCasesSlice.actions;
export default allCasesSlice.reducer;

View File

@@ -107,8 +107,6 @@ const ListItem: React.FC<IListItem> = props => {
<Pressable onPress={handleCaseClick}>
<View
style={[
GenericStyles.ph16,
styles.pv12,
GenericStyles.row,
{
backgroundColor: isNewlyAdded
@@ -119,21 +117,38 @@ const ListItem: React.FC<IListItem> = props => {
},
]}>
<TouchableOpacity
style={[styles.avatarContainer, styles.alignSelf]}
style={[
{
padding: 8
},
styles.alignSelf,
{ height: '100%', alignItems:'center' },
]}
onPress={handleAvatarClick}>
<CaseItemAvatar
caseSelected={caseSelected}
caseData={caseData}
/>
</TouchableOpacity>
<View style={[GenericStyles.ml8, styles.fb80]}>
<View
style={[
GenericStyles.ml8,
styles.fb80,
{
paddingTop: 8,
paddingLeft: 0,
paddingBottom: 8,
paddingRight: 8,
},
]}>
<Heading numberOfLines={1} type={'h5'} bold dark>
{detail.customerInfo?.name ||
detail.customerInfo?.customerName}
</Heading>
{!compleatedList && (
<Text dark ellipsizeMode="tail" numberOfLines={2}>
<Text dark style={{width: '90%'}} ellipsizeMode="tail" >
{/* @ts-ignore */}
{taskTitle && TaskTitleUIMapping[taskTitle]}:{' '}
<Text>{displayAddress}</Text>
</Text>
@@ -163,7 +178,7 @@ const styles = StyleSheet.create({
},
avatarContainer: {
height: 40,
width: 40,
width: 48,
},
fb80: {
flexBasis: '80%',

View File

@@ -1,19 +1,20 @@
import { StyleSheet, Text, View } from 'react-native'
import React, { memo, useEffect } from 'react'
import { useAppDispatch, useAppSelector } from '../../hooks'
import { useEffect } from 'react';
import { _map } from '../../../RN-UI-LIB/src/utlis/common';
import { syncCaseDetail } from '../../action/dataActions';
import OfflineImageDAO from '../../wmDB/dao/OfflineImageDAO';
import { AnswerType } from '../../components/form/interface';
import { useAppDispatch, useAppSelector } from '../../hooks';
import useIsOnline from '../../hooks/useIsOnline';
import OfflineImageDAO from '../../wmDB/dao/OfflineImageDAO';
const interactionsHandler = () => {
const dispatch = useAppDispatch();
const isOnline = useIsOnline();
const allCasesDetails = useAppSelector(state => state.allCases.caseDetails);
useEffect(() => {
console.log("getting called")
let notSyncedCases: Array<any> = [];
_map(allCasesDetails, (el)=> {
console.log(allCasesDetails[el]?.isSynced === false && allCasesDetails[el].isApiCalled === false)
if(allCasesDetails[el]?.isSynced === false && allCasesDetails[el].isApiCalled === false){
const caseId = allCasesDetails[el].id
const allocationReferenceId = allCasesDetails[el]?.currentAllocationReferenceId
@@ -23,12 +24,14 @@ const interactionsHandler = () => {
(async () => {
for(const caseItem of notSyncedCases) {
const modifiedCaseItem = await getModifiedCaseItem(caseItem);
dispatch(syncCaseDetail(modifiedCaseItem))
if(isOnline){
const modifiedCaseItem = await getModifiedCaseItem(caseItem);
dispatch(syncCaseDetail(modifiedCaseItem))
}
}
})();
}, [allCasesDetails])
}, [allCasesDetails, isOnline])
return null

View File

@@ -1522,6 +1522,11 @@
resolved "https://registry.yarnpkg.com/@react-native-community/eslint-plugin/-/eslint-plugin-1.3.0.tgz#9e558170c106bbafaa1ef502bd8e6d4651012bf9"
integrity sha512-+zDZ20NUnSWghj7Ku5aFphMzuM9JulqCW+aPXT6IfIXFbb8tzYTTOSeRFOtuekJ99ibW2fUCSsjuKNlwDIbHFg==
"@react-native-community/netinfo@9.3.7":
version "9.3.7"
resolved "https://registry.yarnpkg.com/@react-native-community/netinfo/-/netinfo-9.3.7.tgz#92407f679f00bae005c785a9284e61d63e292b34"
integrity sha512-+taWmE5WpBp0uS6kf+bouCx/sn89G9EpR4s2M/ReLvctVIFL2Qh8WnWfBxqK9qwgmFha/uqjSr2Gq03OOtiDcw==
"@react-native-firebase/app@16.4.6":
version "16.4.6"
resolved "https://registry.yarnpkg.com/@react-native-firebase/app/-/app-16.4.6.tgz#929a86894b401352259e21d4cb4dab1d37de2bc7"