From 46c1509db43b0b40baa956f87445d1061d6d65cb Mon Sep 17 00:00:00 2001 From: VickyStash Date: Wed, 28 Aug 2024 09:35:16 +0200 Subject: [PATCH 01/10] Implement UI elements for company cards list --- .../WorkspaceCompanyCardsList.tsx | 96 +++++++++++++++++++ ...WorkspaceCompanyCardsListHeaderButtons.tsx | 45 +++++++++ .../WorkspaceCompanyCardsListRow.tsx | 62 ++++++++++++ .../WorkspaceCompanyCardsPage.tsx | 34 +++++-- src/types/onyx/Card.ts | 3 + 5 files changed, 232 insertions(+), 8 deletions(-) create mode 100644 src/pages/workspace/companyCards/WorkspaceCompanyCardsList.tsx create mode 100644 src/pages/workspace/companyCards/WorkspaceCompanyCardsListHeaderButtons.tsx create mode 100644 src/pages/workspace/companyCards/WorkspaceCompanyCardsListRow.tsx diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardsList.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardsList.tsx new file mode 100644 index 000000000000..ae9ccca3db9f --- /dev/null +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardsList.tsx @@ -0,0 +1,96 @@ +import React, {useCallback, useMemo} from 'react'; +import type {ListRenderItemInfo} from 'react-native'; +import {FlatList, View} from 'react-native'; +import {useOnyx} from 'react-native-onyx'; +import type {OnyxEntry} from 'react-native-onyx'; +import OfflineWithFeedback from '@components/OfflineWithFeedback'; +import {PressableWithFeedback} from '@components/Pressable'; +import ScreenWrapper from '@components/ScreenWrapper'; +import Text from '@components/Text'; +import useThemeStyles from '@hooks/useThemeStyles'; +import * as CardUtils from '@libs/CardUtils'; +import CONST from '@src/CONST'; +import ONYXKEYS from '@src/ONYXKEYS'; +import type {Card, WorkspaceCardsList} from '@src/types/onyx'; +import WorkspaceCompanyCardsListHeaderButtons from './WorkspaceCompanyCardsListHeaderButtons'; +import WorkspaceCompanyCardsListRow from './WorkspaceCompanyCardsListRow'; + +type WorkspaceCompanyCardsListProps = { + /** The current policyID */ + policyID: string; + + /** List of company cards */ + cardsList: OnyxEntry; +}; + +function WorkspaceCompanyCardsList({policyID, cardsList}: WorkspaceCompanyCardsListProps) { + const styles = useThemeStyles(); + const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST); + + const sortedCards = useMemo(() => CardUtils.sortCardsByCardholderName(cardsList, personalDetails), [cardsList, personalDetails]); + + const renderItem = useCallback( + ({item, index}: ListRenderItemInfo) => ( + + {}} + > + + + + ), + [personalDetails, styles], + ); + + const renderListHeader = useCallback( + () => ( + + + Name + + + Card number + + + ), + [styles], + ); + + return ( + + + + + ); +} + +WorkspaceCompanyCardsList.displayName = 'WorkspaceCompanyCardsList'; + +export default WorkspaceCompanyCardsList; diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardsListHeaderButtons.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardsListHeaderButtons.tsx new file mode 100644 index 000000000000..be87c97ffa20 --- /dev/null +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardsListHeaderButtons.tsx @@ -0,0 +1,45 @@ +import React from 'react'; +import {View} from 'react-native'; +import Button from '@components/Button'; +import * as Expensicons from '@components/Icon/Expensicons'; +import useLocalize from '@hooks/useLocalize'; +import useResponsiveLayout from '@hooks/useResponsiveLayout'; +import useThemeStyles from '@hooks/useThemeStyles'; +import Navigation from '@navigation/Navigation'; +import ROUTES from '@src/ROUTES'; + +type WorkspaceCompanyCardsListHeaderButtonsProps = { + policyID: string; +}; + +function WorkspaceCompanyCardsListHeaderButtons({policyID}: WorkspaceCompanyCardsListHeaderButtonsProps) { + const styles = useThemeStyles(); + const {translate} = useLocalize(); + const {shouldUseNarrowLayout} = useResponsiveLayout(); + + return ( + + +