From 0fadbc11ed130c75ed12c8ef354c32620b20a371 Mon Sep 17 00:00:00 2001 From: Aman Chaturvedi Date: Thu, 31 Aug 2023 23:39:24 +0530 Subject: [PATCH 01/22] TP-34788 | refactor --- src/screens/allCases/CaseListHeader.tsx | 22 +++++++++++++++------- src/screens/allCases/CasesList.tsx | 19 +++++++++---------- src/screens/allCases/HeaderLabel.tsx | 23 +++++++++++++++++++++++ 3 files changed, 47 insertions(+), 17 deletions(-) create mode 100644 src/screens/allCases/HeaderLabel.tsx diff --git a/src/screens/allCases/CaseListHeader.tsx b/src/screens/allCases/CaseListHeader.tsx index af0041ce..f59d4263 100644 --- a/src/screens/allCases/CaseListHeader.tsx +++ b/src/screens/allCases/CaseListHeader.tsx @@ -5,28 +5,38 @@ import { COLORS } from '../../../RN-UI-LIB/src/styles/colors'; import { GenericStyles } from '../../../RN-UI-LIB/src/styles'; import Filters from './Filters'; import NotificationMenu from '../../components/notificationMenu'; +import { useAppSelector } from '../../hooks'; +import { RootState } from '../../store/store'; +import { VisitPlanStatus } from '../../reducer/userSlice'; +import HeaderLabel from './HeaderLabel'; interface ICaseListHeader { - filterCount: number; searchQuery: string; handleSearchChange: (val: string) => void; toggleFilterModal: () => void; headerHeight: Animated.AnimatedInterpolation; - headerLabel: string; showFilters: boolean; isVisitPlan?: boolean; } const CaseListHeader: React.FC = ({ searchQuery, - filterCount, handleSearchChange, toggleFilterModal, headerHeight, - headerLabel, showFilters, isVisitPlan, }) => { + const { filterCount } = useAppSelector((state: RootState) => ({ + filters: state.filters.filters, + filterCount: isVisitPlan ? state.filters.filterCountVisitPlan : state.filters.filterCount, + selectedFilters: isVisitPlan + ? state.filters.selectedFiltersVisitPlan + : state.filters.selectedFilters, + quickFiltersPresent: state?.filters?.quickFilters?.length > 0, + isLockedVisitPlanStatus: state.user?.lock?.visitPlanStatus === VisitPlanStatus.LOCKED, + })); + return ( = ({ GenericStyles.pv10, ]} > - - {headerLabel} - + {showFilters && ( diff --git a/src/screens/allCases/CasesList.tsx b/src/screens/allCases/CasesList.tsx index 734350c2..6e3649b3 100644 --- a/src/screens/allCases/CasesList.tsx +++ b/src/screens/allCases/CasesList.tsx @@ -270,6 +270,7 @@ const CasesList: React.FC = ({ casesList = [], isVisitPlan }) => { } setShowFilterModal(!showFilterModal); }; + const getHeaderLabel = () => { if (isVisitPlan) { if (isLockedVisitPlanStatus) { @@ -298,25 +299,23 @@ const CasesList: React.FC = ({ casesList = [], isVisitPlan }) => { } } + const headerHeightValue = quickFiltersPresent ? headerHeightQuickFilters : headerHeight; + const showFilters = isVisitPlan && isLockedVisitPlanStatus ? false : !!casesList.length; + return ( {visitPlansUpdating ? ( - + ) : null} {filteredCasesListWithCTA.length ? ( diff --git a/src/screens/allCases/HeaderLabel.tsx b/src/screens/allCases/HeaderLabel.tsx new file mode 100644 index 00000000..b8d7d58d --- /dev/null +++ b/src/screens/allCases/HeaderLabel.tsx @@ -0,0 +1,23 @@ +import { StyleSheet, View } from 'react-native'; +import React from 'react'; +import Text from '../../../RN-UI-LIB/src/components/Text'; +import Heading from '../../../RN-UI-LIB/src/components/Heading'; +import { COLORS } from '../../../RN-UI-LIB/src/styles/colors'; + +const HeaderLabel = () => { + return ( + + + {/* {headerLabel} */} + + + ); +}; + +export default HeaderLabel; + +const styles = StyleSheet.create({ + headerLabel: { + color: COLORS.BACKGROUND.PRIMARY, + }, +}); From 5d0ff2f40b10c87c3d4b0a6e9778015b92d785e4 Mon Sep 17 00:00:00 2001 From: yashmantri Date: Mon, 4 Sep 2023 13:07:32 +0530 Subject: [PATCH 02/22] TP-34788 | Select Agent view and bottom screen view --- src/assets/icons/ArrowDownOutlineIcon.tsx | 42 +++++++++++ src/screens/allCases/CaseListHeader.tsx | 13 +--- src/screens/allCases/CasesList.tsx | 87 +++++++++++++++++++++-- src/screens/allCases/CompletedCase.tsx | 5 +- src/screens/allCases/EmptyList.tsx | 44 ++++-------- src/screens/allCases/Filters.tsx | 23 +++--- src/screens/allCases/constants.ts | 2 + 7 files changed, 155 insertions(+), 61 deletions(-) create mode 100644 src/assets/icons/ArrowDownOutlineIcon.tsx diff --git a/src/assets/icons/ArrowDownOutlineIcon.tsx b/src/assets/icons/ArrowDownOutlineIcon.tsx new file mode 100644 index 00000000..faac3ec4 --- /dev/null +++ b/src/assets/icons/ArrowDownOutlineIcon.tsx @@ -0,0 +1,42 @@ +import React from 'react'; +import { View } from 'react-native'; +import Svg, { Path, Mask, G, Rect } from 'react-native-svg'; +import { COLORS } from '../../../RN-UI-LIB/src/styles/colors'; + +interface IArrowRightOutlineIcon { + width?: number; + height?: number; + fillColor?: string; +} + +const ArrowDownOutlineIcon: React.FC = ({ + width = 24, + height = 24, + fillColor = COLORS.TEXT.WHITE, +}) => { + return ( + + + + + + + + + + + ); +}; + +export default ArrowDownOutlineIcon; diff --git a/src/screens/allCases/CaseListHeader.tsx b/src/screens/allCases/CaseListHeader.tsx index af0041ce..3d0397eb 100644 --- a/src/screens/allCases/CaseListHeader.tsx +++ b/src/screens/allCases/CaseListHeader.tsx @@ -1,25 +1,22 @@ import { Animated, StyleSheet, View } from 'react-native'; import React from 'react'; -import Heading from '../../../RN-UI-LIB/src/components/Heading'; import { COLORS } from '../../../RN-UI-LIB/src/styles/colors'; import { GenericStyles } from '../../../RN-UI-LIB/src/styles'; import Filters from './Filters'; import NotificationMenu from '../../components/notificationMenu'; interface ICaseListHeader { - filterCount: number; searchQuery: string; handleSearchChange: (val: string) => void; toggleFilterModal: () => void; headerHeight: Animated.AnimatedInterpolation; - headerLabel: string; + headerLabel: React.ReactNode; showFilters: boolean; isVisitPlan?: boolean; } const CaseListHeader: React.FC = ({ searchQuery, - filterCount, handleSearchChange, toggleFilterModal, headerHeight, @@ -40,15 +37,12 @@ const CaseListHeader: React.FC = ({ GenericStyles.pv10, ]} > - - {headerLabel} - + {headerLabel} {showFilters && ( , index: number) => item[index]; export const ESTIMATED_ITEM_SIZE = 250; // Average height of List item @@ -74,7 +82,9 @@ const CasesList: React.FC = ({ casesList = [], isVisitPlan }) => { })); const [showFilterModal, setShowFilterModal] = React.useState(false); + const [showAgentSelectionBottomSheet, setShowAgentSelectionBottomSheet] = useState(false); const flashListRef = useRef(null); + const isAgentTLOrAM = true; const scrollAnimation = useRef(new Animated.Value(0)).current; @@ -159,6 +169,11 @@ const CasesList: React.FC = ({ casesList = [], isVisitPlan }) => { if (isVisitPlan) { return EmptyListMessages.NO_VISIT_PLANS; } + + if (isAgentTLOrAM) { + return EmptyListMessages.NO_ACTIVE_ALLOCATIONS; + } + return EmptyListMessages.NO_PENDING_CASES; }; @@ -169,21 +184,71 @@ const CasesList: React.FC = ({ casesList = [], isVisitPlan }) => { if (isFilterApplied) { return EmptyListMessages.NO_CASES_FOUND_SUB; } + if (isAgentTLOrAM) { + return EmptyListMessages.SELECT_AGENT; + } + }; + + const getBtnDetails = () => { + if (isVisitPlan && !isFilterApplied && !isLockedVisitPlanStatus) { + return { + btnHandler: () => navigateToScreen('Cases'), + btnText: 'Create a visit plan', + }; + } + + if (isAgentTLOrAM) { + return { + btnHandler: () => setShowAgentSelectionBottomSheet(true), + btnText: 'Select Agent', + }; + } + }; + + const renderIcon = () => { + if (isLockedVisitPlanStatus && isVisitPlan) { + return ; + } + if (isFilterApplied || !isVisitPlan) { + return ; + } + return ; }; const listEmptyComponent = ( ); return { filteredCasesList: filteredListAfterQuery, listEmptyComponent }; }, [casesList, caseDetails, filters, selectedFilters, searchQuery, isLockedVisitPlanStatus]); + const renderHeaderLabel = () => { + if (isAgentTLOrAM && !isVisitPlan) { + return ( + setShowAgentSelectionBottomSheet(true)} + > + + {getHeaderLabel()} + + + + ); + } + + return ( + + {getHeaderLabel()} + + ); + }; + useEffect(() => { if (flashListRef?.current) { // @ts-expect-error @@ -301,12 +366,11 @@ const CasesList: React.FC = ({ casesList = [], isVisitPlan }) => { return ( @@ -351,6 +415,14 @@ const CasesList: React.FC = ({ casesList = [], isVisitPlan }) => { isVisitPlan={isVisitPlan} /> + Select Agent} + heightPercentage={100} + visible={showAgentSelectionBottomSheet} + setVisible={() => setShowAgentSelectionBottomSheet(!showAgentSelectionBottomSheet)} + > + + ); }; @@ -394,6 +466,9 @@ const styles = StyleSheet.create({ paddingTop: VISIT_PLAN_HEADER_HEIGHT_MAX_WITH_QUICK_FILTERS, paddingBottom: 10, }, + headerLabel: { + color: COLORS.BACKGROUND.PRIMARY, + }, }); export default CasesList; diff --git a/src/screens/allCases/CompletedCase.tsx b/src/screens/allCases/CompletedCase.tsx index 6d2e5727..1c4f091c 100644 --- a/src/screens/allCases/CompletedCase.tsx +++ b/src/screens/allCases/CompletedCase.tsx @@ -10,6 +10,7 @@ import { goBack } from '../../components/utlis/navigationUtlis'; import { useAppSelector } from '../../hooks'; import CaseItem from './CaseItem'; import { CaseDetail } from '../caseDetails/interface'; +import EmptyPageCheckIcon from '../../assets/icons/EmptyPageCheckIcon'; const getItem = (item: Array, index: number) => item[index]; @@ -41,7 +42,9 @@ const CompletedCase: React.FC = () => { keyExtractor={(item) => item.caseReferenceId} getItemCount={(item) => item.length} getItem={getItem} - ListEmptyComponent={} + ListEmptyComponent={ + } /> + } /> ); diff --git a/src/screens/allCases/EmptyList.tsx b/src/screens/allCases/EmptyList.tsx index b753032a..94346a22 100644 --- a/src/screens/allCases/EmptyList.tsx +++ b/src/screens/allCases/EmptyList.tsx @@ -2,46 +2,26 @@ import { StyleSheet, View } from 'react-native'; import React from 'react'; import { GenericStyles } from '../../../RN-UI-LIB/src/styles'; import Heading from '../../../RN-UI-LIB/src/components/Heading'; -import EmptyPageCheckIcon from '../../assets/icons/EmptyPageCheckIcon'; import Button from '../../../RN-UI-LIB/src/components/Button'; -import { navigateToScreen } from '../../components/utlis/navigationUtlis'; -import NoCasesFoundIcon from '../../assets/icons/NoCasesFoundIcon'; import Text from '../../../RN-UI-LIB/src/components/Text'; -import GeneratingVisitPlan from '../../assets/icons/GeneratingVisitPlanIcon'; + +interface BtnDetails { + btnHandler: () => void; + btnText: string; +} interface IEmptyList { message: string; + icon: React.ReactNode; subMessage?: string; - isVisitPlan?: boolean; - isFilterApplied?: boolean; - isLockedVisitPlanStatus?: boolean; + btnDetails?: BtnDetails; } -const EmptyList: React.FC = ({ - message, - isVisitPlan, - isFilterApplied, - subMessage, - isLockedVisitPlanStatus, -}) => { - const handleCreateVisitPlan = () => { - navigateToScreen('Cases'); - }; - - const renderIcon = () => { - if (isLockedVisitPlanStatus && isVisitPlan) { - return ; - } - if (isFilterApplied || !isVisitPlan) { - return ; - } - return ; - }; - +const EmptyList: React.FC = ({ message, subMessage, icon, btnDetails }) => { return ( - {renderIcon()} + {icon} = ({ {subMessage} ) : null} - {isVisitPlan && !isFilterApplied && !isLockedVisitPlanStatus ? ( + {btnDetails ? (