Skip to content

Commit 106bca8

Browse files
authored
Merge pull request Expensify#80734 from margelo/@chrispader/company-card-feeds-backend-error-ui-fix-after-revert
feat: Add frontend error for card feed backend load issue (AFTER REVERT)
2 parents bbd6aa3 + dc8b58c commit 106bca8

30 files changed

Lines changed: 375 additions & 54 deletions

File tree

Lines changed: 1 addition & 1 deletion
Loading

src/CONST/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3590,6 +3590,8 @@ const CONST = {
35903590
COMPANY_CARDS: {
35913591
BROKEN_CONNECTION_IGNORED_STATUSES: brokenConnectionScrapeStatuses,
35923592
CONNECTION_ERROR: 'connectionError',
3593+
WORKSPACE_FEEDS_LOAD_ERROR: 'workspaceFeedsLoadError',
3594+
FEED_LOAD_ERROR: 'feedLoadError',
35933595
STEP: {
35943596
SELECT_BANK: 'SelectBank',
35953597
SELECT_FEED_TYPE: 'SelectFeedType',

src/components/BlockingViews/BlockingView.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ function BlockingView({
152152
/>
153153
)}
154154
<View>
155-
<Text style={[titleStyles, styles.notFoundTextHeader]}>{title}</Text>
155+
<Text style={[styles.notFoundTextHeader, titleStyles]}>{title}</Text>
156156

157157
{CustomSubtitle}
158158
{!CustomSubtitle && (

src/components/BlockingViews/FullPageErrorView.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React from 'react';
22
import {View} from 'react-native';
3-
import type {StyleProp, TextStyle} from 'react-native';
3+
import type {StyleProp, TextStyle, ViewStyle} from 'react-native';
44
import {useMemoizedLazyIllustrations} from '@hooks/useLazyAsset';
55
import useThemeStyles from '@hooks/useThemeStyles';
66
import variables from '@styles/variables';
@@ -28,18 +28,20 @@ type FullPageErrorViewProps = {
2828

2929
/** The style of the subtitle message */
3030
subtitleStyle?: StyleProp<TextStyle>;
31+
32+
containerStyle?: StyleProp<ViewStyle>;
3133
};
3234

3335
// eslint-disable-next-line rulesdir/no-negated-variables
34-
function FullPageErrorView({testID, children = null, shouldShow = false, title = '', subtitle = '', shouldForceFullScreen = false, subtitleStyle}: FullPageErrorViewProps) {
36+
function FullPageErrorView({testID, children = null, shouldShow = false, title = '', subtitle = '', shouldForceFullScreen = false, subtitleStyle, containerStyle}: FullPageErrorViewProps) {
3537
const styles = useThemeStyles();
3638
const illustrations = useMemoizedLazyIllustrations(['BrokenMagnifyingGlass']);
3739

3840
if (shouldShow) {
3941
return (
4042
<ForceFullScreenView shouldForceFullScreen={shouldForceFullScreen}>
4143
<View
42-
style={[styles.flex1, styles.blockingErrorViewContainer]}
44+
style={[styles.flex1, styles.searchBlockingErrorViewContainer]}
4345
testID={testID}
4446
>
4547
<BlockingView
@@ -49,6 +51,7 @@ function FullPageErrorView({testID, children = null, shouldShow = false, title =
4951
title={title}
5052
subtitle={subtitle}
5153
subtitleStyle={subtitleStyle}
54+
containerStyle={containerStyle}
5255
/>
5356
</View>
5457
</ForceFullScreenView>

src/components/Search/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1174,6 +1174,7 @@ function Search({
11741174
<View style={[shouldUseNarrowLayout ? styles.searchListContentContainerStyles : styles.mt3, styles.flex1]}>
11751175
<FullPageErrorView
11761176
shouldShow
1177+
containerStyle={styles.searchBlockingErrorViewContainer}
11771178
subtitleStyle={styles.textSupporting}
11781179
title={translate('errorPage.title', {isBreakLine: shouldUseNarrowLayout})}
11791180
subtitle={translate(isInvalidQuery ? 'errorPage.wrongTypeSubtitle' : 'errorPage.subtitle')}

src/hooks/useAssignCard.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import useCardFeeds from './useCardFeeds';
2525
import type {CombinedCardFeed} from './useCardFeeds';
2626
import useCurrencyList from './useCurrencyList';
2727
import useIsAllowedToIssueCompanyCard from './useIsAllowedToIssueCompanyCard';
28+
import useLocalize from './useLocalize';
2829
import useNetwork from './useNetwork';
2930
import useOnyx from './useOnyx';
3031
import usePolicy from './usePolicy';
@@ -44,6 +45,7 @@ function useAssignCard({feedName, policyID, setShouldShowOfflineModal}: UseAssig
4445
const [cardFeeds] = useCardFeeds(policyID);
4546
const companyFeeds = getCompanyFeeds(cardFeeds);
4647
const currentFeedData = feedName ? companyFeeds?.[feedName] : ({} as CombinedCardFeed);
48+
const {translate} = useLocalize();
4749

4850
const policy = usePolicy(policyID);
4951
const workspaceAccountID = policy?.workspaceAccountID ?? CONST.DEFAULT_NUMBER_ID;
@@ -53,7 +55,7 @@ function useAssignCard({feedName, policyID, setShouldShowOfflineModal}: UseAssig
5355
const domainOrWorkspaceAccountID = getDomainOrWorkspaceAccountID(workspaceAccountID, selectedFeedData);
5456

5557
const fetchCompanyCards = () => {
56-
openPolicyCompanyCardsPage(policyID, domainOrWorkspaceAccountID);
58+
openPolicyCompanyCardsPage(policyID, domainOrWorkspaceAccountID, translate);
5759
};
5860

5961
const {isOffline} = useNetwork({onReconnect: fetchCompanyCards});

src/hooks/useCardFeedErrors.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const DEFAULT_CARD_FEED_ERROR_STATE: CardFeedErrorState = {
66
shouldShowRBR: false,
77
isFeedConnectionBroken: false,
88
hasFeedErrors: false,
9-
// hasWorkspaceErrors: false,
9+
hasWorkspaceErrors: false,
1010
hasFailedCardAssignments: false,
1111
};
1212

src/hooks/useCardFeeds.tsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type {OnyxCollection, ResultMetadata} from 'react-native-onyx';
2-
import {getCombinedCardFeedsFromAllFeeds} from '@libs/CardFeedUtils';
2+
import {getCombinedCardFeedsFromAllFeeds, getWorkspaceCardFeedsStatus} from '@libs/CardFeedUtils';
33
import ONYXKEYS from '@src/ONYXKEYS';
4-
import type {CardFeeds, CombinedCardFeed, CombinedCardFeeds, CompanyCardFeedWithDomainID} from '@src/types/onyx';
4+
import type {CardFeeds, CardFeedsStatusByDomainID, CombinedCardFeed, CombinedCardFeeds, CompanyCardFeedWithDomainID} from '@src/types/onyx';
55
import useOnyx from './useOnyx';
66
import useWorkspaceAccountID from './useWorkspaceAccountID';
77

@@ -19,7 +19,7 @@ import useWorkspaceAccountID from './useWorkspaceAccountID';
1919
* 2. The result metadata from the Onyx collection fetch.
2020
* 3. Card feeds specific to the given policyID (or `undefined` if unavailable).
2121
*/
22-
const useCardFeeds = (policyID: string | undefined): [CombinedCardFeeds | undefined, ResultMetadata<OnyxCollection<CardFeeds>>, CardFeeds | undefined] => {
22+
const useCardFeeds = (policyID: string | undefined): [CombinedCardFeeds | undefined, ResultMetadata<OnyxCollection<CardFeeds>>, CardFeeds | undefined, CardFeedsStatusByDomainID] => {
2323
const workspaceAccountID = useWorkspaceAccountID(policyID);
2424
const [allFeeds, allFeedsResult] = useOnyx(ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER, {canBeMissing: true});
2525
const defaultFeed = allFeeds?.[`${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${workspaceAccountID}`];
@@ -31,7 +31,9 @@ const useCardFeeds = (policyID: string | undefined): [CombinedCardFeeds | undefi
3131
workspaceFeeds = getCombinedCardFeedsFromAllFeeds(allFeeds, shouldIncludeFeedPredicate);
3232
}
3333

34-
return [workspaceFeeds, allFeedsResult, defaultFeed];
34+
const workspaceCardFeedsStatus = getWorkspaceCardFeedsStatus(allFeeds);
35+
36+
return [workspaceFeeds, allFeedsResult, defaultFeed, workspaceCardFeedsStatus];
3537
};
3638

3739
export default useCardFeeds;

src/hooks/useCompanyCards.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import CONST from '@src/CONST';
55
import ONYXKEYS from '@src/ONYXKEYS';
66
import type {CardFeeds, CardList} from '@src/types/onyx';
77
import type {AssignableCardsList, WorkspaceCardsList} from '@src/types/onyx/Card';
8-
import type {CombinedCardFeeds, CompanyCardFeed, CompanyCardFeedWithDomainID, CompanyFeeds} from '@src/types/onyx/CardFeeds';
8+
import type {CardFeedsStatusByDomainID, CombinedCardFeeds, CompanyCardFeed, CompanyCardFeedWithDomainID, CompanyFeeds} from '@src/types/onyx/CardFeeds';
99
import isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue';
1010
import useCardFeeds from './useCardFeeds';
1111
import type {CombinedCardFeed} from './useCardFeeds';
@@ -25,6 +25,7 @@ type UseCompanyCardsResult = Partial<{
2525
feedName: CompanyCardFeedWithDomainID;
2626
cardList: AssignableCardsList;
2727
assignedCards: CardList;
28+
workspaceCardFeedsStatus: CardFeedsStatusByDomainID;
2829
cardNames: string[];
2930
allCardFeeds: CombinedCardFeeds;
3031
companyCardFeeds: CompanyFeeds;
@@ -48,7 +49,7 @@ function useCompanyCards({policyID, feedName: feedNameProp}: UseCompanyCardsProp
4849
const policyIDKey = policyID || CONST.DEFAULT_MISSING_ID;
4950

5051
const [lastSelectedFeed, lastSelectedFeedMetadata] = useOnyx(`${ONYXKEYS.COLLECTION.LAST_SELECTED_FEED}${policyIDKey}`, {canBeMissing: true});
51-
const [allCardFeeds, allCardFeedsMetadata] = useCardFeeds(policyID);
52+
const [allCardFeeds, allCardFeedsMetadata, , workspaceCardFeedsStatus] = useCardFeeds(policyID);
5253

5354
const feedName = feedNameProp ?? getSelectedFeed(lastSelectedFeed, allCardFeeds);
5455
const bankName = feedName ? getCompanyCardFeed(feedName) : undefined;
@@ -90,6 +91,7 @@ function useCompanyCards({policyID, feedName: feedNameProp}: UseCompanyCardsProp
9091
companyCardFeeds,
9192
cardList,
9293
assignedCards,
94+
workspaceCardFeedsStatus,
9395
cardNames,
9496
selectedFeed,
9597
bankName,

src/languages/de.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4952,6 +4952,14 @@ _Für ausführlichere Anweisungen [besuchen Sie unsere Hilfeseite](${CONST.NETSU
49524952
editStartDateDescription:
49534953
'Wählen Sie ein neues Startdatum für Transaktionen. Wir synchronisieren alle Transaktionen ab diesem Datum, ausgenommen diejenigen, die wir bereits importiert haben.',
49544954
unassignCardFailedError: 'Aufhebung der Kartenzuweisung fehlgeschlagen.',
4955+
error: {
4956+
workspaceFeedsCouldNotBeLoadedTitle: 'Kartenfeeds konnten nicht geladen werden',
4957+
workspaceFeedsCouldNotBeLoadedMessage:
4958+
'Beim Laden der Workspace-Kartenfeeds ist ein Fehler aufgetreten. Bitte versuche es erneut oder wende dich an deine Administratorin bzw. deinen Administrator.',
4959+
feedCouldNotBeLoadedTitle: 'Dieser Feed konnte nicht geladen werden',
4960+
feedCouldNotBeLoadedMessage: 'Beim Laden dieses Feeds ist ein Fehler aufgetreten. Bitte versuche es erneut oder kontaktiere deine Administratorin/deinen Administrator.',
4961+
tryAgain: 'Erneut versuchen',
4962+
},
49554963
},
49564964
expensifyCard: {
49574965
issueAndManageCards: 'Expensify Cards ausstellen und verwalten',

0 commit comments

Comments
 (0)