Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2226,13 +2226,14 @@ const ROUTES = {
WORKSPACE_COMPANY_CARD_DETAILS: {
route: 'workspaces/:policyID/company-cards/:feed/:cardID',

getRoute: (policyID: string, cardID: string, feed: CompanyCardFeedWithDomainID, backTo?: string) =>
getRoute: (policyID: string, feed: CompanyCardFeedWithDomainID, cardID: string, backTo?: string) =>
// eslint-disable-next-line no-restricted-syntax -- Legacy route generation
getUrlWithBackToParam(`workspaces/${policyID}/company-cards/${encodeURIComponent(feed)}/${encodeURIComponent(cardID)}`, backTo),
},
WORKSPACE_COMPANY_CARD_NAME: {
route: 'workspaces/:policyID/company-cards/:bank/:cardID/edit/name',
getRoute: (policyID: string, cardID: string, bank: string) => `workspaces/${policyID}/company-cards/${bank}/${cardID}/edit/name` as const,
WORKSPACE_COMPANY_CARD_EDIT_CARD_NAME: {
route: 'workspaces/:policyID/company-cards/:feed/:cardID/edit/name',
getRoute: (policyID: string, cardID: string, feed: CompanyCardFeedWithDomainID) =>
`workspaces/${policyID}/company-cards/${encodeURIComponent(feed)}/${encodeURIComponent(cardID)}/edit/name` as const,
},
WORKSPACE_COMPANY_CARD_EXPORT: {
route: 'workspaces/:policyID/company-cards/:bank/:cardID/edit/export',
Expand Down
2 changes: 1 addition & 1 deletion src/SCREENS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -598,7 +598,7 @@ const SCREENS = {
COMPANY_CARDS_SETTINGS_FEED_NAME: 'Workspace_CompanyCards_Settings_Feed_Name',
COMPANY_CARDS_SETTINGS_STATEMENT_CLOSE_DATE: 'Workspace_CompanyCards_Settings_Statement_Close_Date',
COMPANY_CARD_DETAILS: 'Workspace_CompanyCard_Details',
COMPANY_CARD_NAME: 'Workspace_CompanyCard_Name',
COMPANY_CARD_EDIT_CARD_NAME: 'Workspace_CompanyCard_Edit_Card_Name',
COMPANY_CARD_EXPORT: 'Workspace_CompanyCard_Export',
EXPENSIFY_CARD: 'Workspace_ExpensifyCard',
EXPENSIFY_CARD_DETAILS: 'Workspace_ExpensifyCard_Details',
Expand Down
10 changes: 6 additions & 4 deletions src/hooks/useCompanyCards.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type {OnyxCollection, ResultMetadata} from 'react-native-onyx';
import type {OnyxCollection, OnyxEntry, ResultMetadata} from 'react-native-onyx';
import type {ValueOf} from 'type-fest';
import {getCompanyCardFeed, getCompanyFeeds, getPlaidInstitutionId} from '@libs/CardUtils';
import {getCompanyCardFeed, getCompanyFeeds, getPlaidInstitutionId, getSelectedFeed} from '@libs/CardUtils';
import type CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import type {CardFeeds, CardList} from '@src/types/onyx';
Expand All @@ -27,14 +27,15 @@ type UsCompanyCardsResult = Partial<{
onyxMetadata: {
cardListMetadata: ResultMetadata<WorkspaceCardsList>;
allCardFeedsMetadata: ResultMetadata<OnyxCollection<CardFeeds>>;
lastSelectedFeedMetadata: ResultMetadata<OnyxEntry<CompanyCardFeedWithDomainID>>;
};
};

function useCompanyCards(policyID?: string): UsCompanyCardsResult {
const [lastSelectedFeed] = useOnyx(`${ONYXKEYS.COLLECTION.LAST_SELECTED_FEED}${policyID}`, {canBeMissing: true});
const [lastSelectedFeed, lastSelectedFeedMetadata] = useOnyx(`${ONYXKEYS.COLLECTION.LAST_SELECTED_FEED}${policyID}`, {canBeMissing: true});
const [allCardFeeds, allCardFeedsMetadata] = useCardFeeds(policyID);

const feedName = lastSelectedFeed;
const feedName = getSelectedFeed(lastSelectedFeed, allCardFeeds);
const bankName = feedName ? getCompanyCardFeed(feedName) : undefined;

const [cardsList, cardListMetadata] = useCardsList(feedName);
Expand All @@ -54,6 +55,7 @@ function useCompanyCards(policyID?: string): UsCompanyCardsResult {
const onyxMetadata = {
cardListMetadata,
allCardFeedsMetadata,
lastSelectedFeedMetadata,
};

if (!policyID) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -708,7 +708,7 @@ const SettingsModalStackNavigator = createModalStackNavigator<SettingsNavigatorP
[SCREENS.WORKSPACE.COMPANY_CARDS_BANK_CONNECTION]: () => require<ReactComponentModule>('../../../../pages/workspace/companyCards/BankConnection').default,
[SCREENS.WORKSPACE.COMPANY_CARDS_ADD_NEW]: () => require<ReactComponentModule>('../../../../pages/workspace/companyCards/addNew/AddNewCardPage').default,
[SCREENS.WORKSPACE.COMPANY_CARD_DETAILS]: () => require<ReactComponentModule>('../../../../pages/workspace/companyCards/WorkspaceCompanyCardDetailsPage').default,
[SCREENS.WORKSPACE.COMPANY_CARD_NAME]: () => require<ReactComponentModule>('../../../../pages/workspace/companyCards/WorkspaceCompanyCardEditCardNamePage').default,
[SCREENS.WORKSPACE.COMPANY_CARD_EDIT_CARD_NAME]: () => require<ReactComponentModule>('../../../../pages/workspace/companyCards/WorkspaceCompanyCardEditCardNamePage').default,
[SCREENS.WORKSPACE.COMPANY_CARD_EXPORT]: () => require<ReactComponentModule>('../../../../pages/workspace/companyCards/WorkspaceCompanyCardAccountSelectCardPage').default,
[SCREENS.WORKSPACE.EXPENSIFY_CARD_ISSUE_NEW]: () => require<ReactComponentModule>('../../../../pages/workspace/expensifyCard/issueNew/IssueNewCardPage').default,
[SCREENS.WORKSPACE.EXPENSIFY_CARD_ISSUE_NEW_CONFIRM_MAGIC_CODE]: () =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,7 @@ const WORKSPACE_TO_RHP: Partial<Record<keyof WorkspaceSplitNavigatorParamList, s
SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD_CONFIRMATION,
SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD_INVITE_NEW_MEMBER,
SCREENS.WORKSPACE.COMPANY_CARD_DETAILS,
SCREENS.WORKSPACE.COMPANY_CARD_NAME,
SCREENS.WORKSPACE.COMPANY_CARD_EDIT_CARD_NAME,
SCREENS.WORKSPACE.COMPANY_CARD_EXPORT,
],
[SCREENS.WORKSPACE.EXPENSIFY_CARD]: [
Expand Down
4 changes: 2 additions & 2 deletions src/libs/Navigation/linkingConfig/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -710,8 +710,8 @@ const config: LinkingOptions<RootNavigatorParamList>['config'] = {
[SCREENS.WORKSPACE.COMPANY_CARD_DETAILS]: {
path: ROUTES.WORKSPACE_COMPANY_CARD_DETAILS.route,
},
[SCREENS.WORKSPACE.COMPANY_CARD_NAME]: {
path: ROUTES.WORKSPACE_COMPANY_CARD_NAME.route,
[SCREENS.WORKSPACE.COMPANY_CARD_EDIT_CARD_NAME]: {
path: ROUTES.WORKSPACE_COMPANY_CARD_EDIT_CARD_NAME.route,
},
[SCREENS.WORKSPACE.COMPANY_CARD_EXPORT]: {
path: ROUTES.WORKSPACE_COMPANY_CARD_EXPORT.route,
Expand Down
4 changes: 2 additions & 2 deletions src/libs/Navigation/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1152,10 +1152,10 @@ type SettingsNavigatorParamList = {
// eslint-disable-next-line no-restricted-syntax -- `backTo` usages in this file are legacy. Do not add new `backTo` params to screens. See contributingGuides/NAVIGATION.md
backTo?: Routes;
};
[SCREENS.WORKSPACE.COMPANY_CARD_NAME]: {
[SCREENS.WORKSPACE.COMPANY_CARD_EDIT_CARD_NAME]: {
policyID: string;
cardID: string;
feed: CompanyCardFeedWithDomainID;
cardID: string;
};
[SCREENS.WORKSPACE.COMPANY_CARD_EXPORT]: {
policyID: string;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ function WorkspaceCompanyCardAccountSelectCardPage({route}: WorkspaceCompanyCard
const exportValue = isDefaultCardSelected ? CONST.COMPANY_CARDS.DEFAULT_EXPORT_TYPE : value;
setCompanyCardExportAccount(policyID, domainOrWorkspaceAccountID, cardID, exportMenuItem.exportType, exportValue, getCompanyCardFeed(feed));

Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARD_DETAILS.getRoute(policyID, cardID, feed));
Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARD_DETAILS.getRoute(policyID, feed, cardID));
},
[exportMenuItem?.exportType, domainOrWorkspaceAccountID, cardID, policyID, feed, defaultCard],
);
Expand Down Expand Up @@ -117,7 +117,7 @@ function WorkspaceCompanyCardAccountSelectCardPage({route}: WorkspaceCompanyCard
onChangeText={setSearchText}
onSelectRow={updateExportAccount}
initiallyFocusedOptionKey={exportMenuItem?.data?.find((mode) => mode.isSelected)?.keyForList}
onBackButtonPress={() => Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARD_DETAILS.getRoute(policyID, cardID, feed, backTo), {compareParams: false})}
onBackButtonPress={() => Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARD_DETAILS.getRoute(policyID, feed, cardID, backTo), {compareParams: false})}
headerTitleAlreadyTranslated={exportMenuItem?.description}
listEmptyContent={listEmptyContent}
connectionName={connectedIntegration}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@ type WorkspaceCompanyCardDetailsPageProps = PlatformStackScreenProps<SettingsNav

function WorkspaceCompanyCardDetailsPage({route}: WorkspaceCompanyCardDetailsPageProps) {
const {policyID, cardID, backTo} = route.params;
const bank = decodeURIComponent(route.params.feed) as CompanyCardFeedWithDomainID;
const feed = getCompanyCardFeed(bank);
const feedName = decodeURIComponent(route.params.feed) as CompanyCardFeedWithDomainID;
const bank = getCompanyCardFeed(feedName);
const [connectionSyncProgress] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CONNECTION_SYNC_PROGRESS}${policyID}`, {canBeMissing: true});
const [customCardNames] = useOnyx(ONYXKEYS.NVP_EXPENSIFY_COMPANY_CARDS_CUSTOM_NAMES, {canBeMissing: true});
const policy = usePolicy(policyID);
Expand All @@ -68,7 +68,7 @@ function WorkspaceCompanyCardDetailsPage({route}: WorkspaceCompanyCardDetailsPag
const connectedIntegration = getConnectedIntegration(policy, accountingIntegrations) ?? connectionSyncProgress?.connectionName;

const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {canBeMissing: false});
const [allBankCards, allBankCardsMetadata] = useCardsList(bank);
const [allBankCards, allBankCardsMetadata] = useCardsList(feedName);
const card = allBankCards?.[cardID];

const cardBank = card?.bank ?? '';
Expand All @@ -78,19 +78,19 @@ function WorkspaceCompanyCardDetailsPage({route}: WorkspaceCompanyCardDetailsPag

const [cardFeeds] = useCardFeeds(policyID);
const companyFeeds = getCompanyFeeds(cardFeeds);
const domainOrWorkspaceAccountID = getDomainOrWorkspaceAccountID(workspaceAccountID, companyFeeds[bank]);
const plaidUrl = getPlaidInstitutionIconUrl(bank);
const domainOrWorkspaceAccountID = getDomainOrWorkspaceAccountID(workspaceAccountID, companyFeeds[feedName]);
const plaidUrl = getPlaidInstitutionIconUrl(feedName);

const unassignCard = () => {
setIsUnassignModalVisible(false);
if (card) {
unassignWorkspaceCompanyCard(domainOrWorkspaceAccountID, feed, card);
unassignWorkspaceCompanyCard(domainOrWorkspaceAccountID, bank, card);
}
Navigation.goBack();
};

const updateCard = () => {
updateWorkspaceCompanyCard(domainOrWorkspaceAccountID, cardID, feed, card?.lastScrapeResult);
updateWorkspaceCompanyCard(domainOrWorkspaceAccountID, cardID, bank, card?.lastScrapeResult);
};

const lastScrape = useMemo(() => {
Expand Down Expand Up @@ -158,22 +158,22 @@ function WorkspaceCompanyCardDetailsPage({route}: WorkspaceCompanyCardDetailsPag
<MenuItemWithTopDescription
numberOfLinesTitle={3}
description={translate('workspace.moreFeatures.companyCards.cardNumber')}
title={maskCardNumber(card?.cardName ?? '', feed, true)}
title={maskCardNumber(card?.cardName ?? '', bank, true)}
interactive={false}
titleStyle={styles.walletCardNumber}
/>
<OfflineWithFeedback
pendingAction={card?.nameValuePairs?.pendingFields?.cardTitle}
errorRowStyles={[styles.ph5, styles.mb3]}
errors={getLatestErrorField(card?.nameValuePairs ?? {}, 'cardTitle')}
onClose={() => clearCompanyCardErrorField(domainOrWorkspaceAccountID, cardID, feed, 'cardTitle')}
onClose={() => clearCompanyCardErrorField(domainOrWorkspaceAccountID, cardID, bank, 'cardTitle')}
>
<MenuItemWithTopDescription
description={translate('workspace.moreFeatures.companyCards.cardName')}
title={customCardNames?.[cardID] ?? getDefaultCardName(cardholder?.firstName)}
shouldShowRightIcon
brickRoadIndicator={card?.nameValuePairs?.errorFields?.cardTitle ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined}
onPress={() => Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARD_NAME.getRoute(policyID, cardID, bank))}
onPress={() => Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARD_EDIT_CARD_NAME.getRoute(policyID, cardID, feedName))}
/>
</OfflineWithFeedback>
{exportMenuItem?.shouldShowMenuItem ? (
Expand All @@ -185,14 +185,14 @@ function WorkspaceCompanyCardDetailsPage({route}: WorkspaceCompanyCardDetailsPag
if (!exportMenuItem.exportType) {
return;
}
clearCompanyCardErrorField(domainOrWorkspaceAccountID, cardID, feed, exportMenuItem.exportType);
clearCompanyCardErrorField(domainOrWorkspaceAccountID, cardID, bank, exportMenuItem.exportType);
}}
>
<MenuItemWithTopDescription
description={exportMenuItem.description}
title={exportMenuItem.title}
shouldShowRightIcon
onPress={() => Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARD_EXPORT.getRoute(policyID, cardID, bank, backTo))}
onPress={() => Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARD_EXPORT.getRoute(policyID, cardID, feedName, backTo))}
/>
</OfflineWithFeedback>
) : null}
Expand Down Expand Up @@ -224,7 +224,7 @@ function WorkspaceCompanyCardDetailsPage({route}: WorkspaceCompanyCardDetailsPag
pendingAction={card?.pendingFields?.lastScrape}
errorRowStyles={[styles.ph5, styles.mb3]}
errors={getLatestErrorField(card ?? {}, 'lastScrape')}
onClose={() => clearCompanyCardErrorField(domainOrWorkspaceAccountID, cardID, feed, 'lastScrape', true)}
onClose={() => clearCompanyCardErrorField(domainOrWorkspaceAccountID, cardID, bank, 'lastScrape', true)}
>
<MenuItem
icon={expensifyIcons.Sync}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,11 @@ import type SCREENS from '@src/SCREENS';
import INPUT_IDS from '@src/types/form/EditExpensifyCardNameForm';
import isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue';

type WorkspaceCompanyCardEditCardNamePageProps = PlatformStackScreenProps<SettingsNavigatorParamList, typeof SCREENS.WORKSPACE.COMPANY_CARD_NAME>;
type WorkspaceCompanyCardEditCardNamePageProps = PlatformStackScreenProps<SettingsNavigatorParamList, typeof SCREENS.WORKSPACE.COMPANY_CARD_EDIT_CARD_NAME>;

function WorkspaceCompanyCardEditCardNamePage({route}: WorkspaceCompanyCardEditCardNamePageProps) {
const {policyID, cardID} = route.params;
const {policyID, cardID, feed} = route.params;
const workspaceAccountID = useWorkspaceAccountID(policyID);
const feed = route.params.feed;
const [customCardNames, customCardNamesMetadata] = useOnyx(ONYXKEYS.NVP_EXPENSIFY_COMPANY_CARDS_CUSTOM_NAMES, {canBeMissing: true});
const defaultValue = customCardNames?.[cardID];

Expand All @@ -46,7 +45,7 @@ function WorkspaceCompanyCardEditCardNamePage({route}: WorkspaceCompanyCardEditC

const submit = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.EDIT_WORKSPACE_COMPANY_CARD_NAME_FORM>) => {
updateCompanyCardName(domainOrWorkspaceAccountID, cardID, values[INPUT_IDS.NAME], getCompanyCardFeed(feed), defaultValue);
Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARD_DETAILS.getRoute(policyID, cardID, feed), {compareParams: false});
Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARD_DETAILS.getRoute(policyID, feed, cardID), {compareParams: false});
};

const validate = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.EDIT_WORKSPACE_COMPANY_CARD_NAME_FORM>): FormInputErrors<typeof ONYXKEYS.FORMS.EDIT_WORKSPACE_COMPANY_CARD_NAME_FORM> => {
Expand Down Expand Up @@ -81,7 +80,7 @@ function WorkspaceCompanyCardEditCardNamePage({route}: WorkspaceCompanyCardEditC
>
<HeaderWithBackButton
title={translate('workspace.moreFeatures.companyCards.cardName')}
onBackButtonPress={() => Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARD_DETAILS.getRoute(policyID, cardID, feed), {compareParams: false})}
onBackButtonPress={() => Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARD_DETAILS.getRoute(policyID, feed, cardID), {compareParams: false})}
/>
<Text style={[styles.mh5, styles.mt3, styles.mb5]}>{translate('workspace.moreFeatures.companyCards.giveItNameInstruction')}</Text>
<FormProvider
Expand Down
11 changes: 8 additions & 3 deletions src/pages/workspace/companyCards/WorkspaceCompanyCardsPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ import WorkspacePageWithSections from '@pages/workspace/WorkspacePageWithSection
import {openPolicyCompanyCardsFeed, openPolicyCompanyCardsPage} from '@userActions/CompanyCards';
import CONST from '@src/CONST';
import type SCREENS from '@src/SCREENS';
import {isEmptyObject} from '@src/types/utils/EmptyObject';
import isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue';
import WorkspaceCompanyCardsTable from './WorkspaceCompanyCardsTable';

Expand All @@ -34,10 +33,16 @@ function WorkspaceCompanyCardsPage({route}: WorkspaceCompanyCardsPageProps) {
const policy = usePolicy(policyID);
const workspaceAccountID = policy?.workspaceAccountID ?? CONST.DEFAULT_NUMBER_ID;

const {allCardFeeds, feedName, selectedFeed, bankName} = useCompanyCards(policyID);
const {
allCardFeeds,
feedName,
selectedFeed,
bankName,
onyxMetadata: {allCardFeedsMetadata},
} = useCompanyCards(policyID);
const [, cardsListMetadata] = useCardsList(feedName);

const isInitiallyLoadingFeeds = isEmptyObject(allCardFeeds);
const isInitiallyLoadingFeeds = isLoadingOnyxValue(allCardFeedsMetadata);
const isNoFeed = !selectedFeed && !isInitiallyLoadingFeeds;
const isFeedPending = !!selectedFeed?.pending;
const isFeedAdded = !isInitiallyLoadingFeeds && !isFeedPending && !isNoFeed;
Expand Down
Loading
Loading