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
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import React from 'react';
import {View} from 'react-native';
import useDefaultFundID from '@hooks/useDefaultFundID';
import useExpensifyCardUkEuSupported from '@hooks/useExpensifyCardUkEuSupported';
import useOnyx from '@hooks/useOnyx';
import useResponsiveLayout from '@hooks/useResponsiveLayout';
import useThemeStyles from '@hooks/useThemeStyles';
import useWorkspaceAccountID from '@hooks/useWorkspaceAccountID';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import type {ExpensifyCardSettings} from '@src/types/onyx';
Expand All @@ -23,9 +23,9 @@ function WorkspaceCardListLabels({policyID, cardSettings}: WorkspaceCardListLabe
const {isMediumScreenWidth, isSmallScreenWidth} = useResponsiveLayout();
const styles = useThemeStyles();
const isUkEuCurrencySupported = useExpensifyCardUkEuSupported(policyID);
const workspaceAccountID = useWorkspaceAccountID(policyID);
const defaultFundID = useDefaultFundID(policyID);

const [cardManualBilling] = useOnyx(`${ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_MANUAL_BILLING}${workspaceAccountID}`, {canBeMissing: true});
const [cardManualBilling] = useOnyx(`${ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_MANUAL_BILLING}${defaultFundID}`, {canBeMissing: true});
const shouldShowSettlementButtonOrDate = !!cardSettings?.isMonthlySettlementAllowed || cardManualBilling;

const isLessThanMediumScreen = isMediumScreenWidth || isSmallScreenWidth;
Expand Down
11 changes: 5 additions & 6 deletions src/pages/workspace/expensifyCard/WorkspaceCardsListLabel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ import Popover from '@components/Popover';
import {PressableWithFeedback} from '@components/Pressable';
import Text from '@components/Text';
import useCurrencyForExpensifyCard from '@hooks/useCurrencyForExpensifyCard';
import useDefaultFundID from '@hooks/useDefaultFundID';
import useLocalize from '@hooks/useLocalize';
import useOnyx from '@hooks/useOnyx';
import usePolicy from '@hooks/usePolicy';
import useResponsiveLayout from '@hooks/useResponsiveLayout';
import useTheme from '@hooks/useTheme';
import useThemeStyles from '@hooks/useThemeStyles';
Expand Down Expand Up @@ -44,7 +44,6 @@ type WorkspaceCardsListLabelProps = {
function WorkspaceCardsListLabel({type, value, style}: WorkspaceCardsListLabelProps) {
const route = useRoute<PlatformStackRouteProp<WorkspaceSplitNavigatorParamList, typeof SCREENS.WORKSPACE.EXPENSIFY_CARD>>();
const policyID = route.params.policyID;
const policy = usePolicy(policyID);
const styles = useThemeStyles();
const {windowWidth} = useWindowDimensions();
const {shouldUseNarrowLayout, isMediumScreenWidth} = useResponsiveLayout();
Expand All @@ -55,11 +54,11 @@ function WorkspaceCardsListLabel({type, value, style}: WorkspaceCardsListLabelPr
const [anchorPosition, setAnchorPosition] = useState({top: 0, left: 0});
const anchorRef = useRef(null);

const workspaceAccountID = policy?.workspaceAccountID ?? CONST.DEFAULT_NUMBER_ID;
const defaultFundID = useDefaultFundID(policyID);

const settlementCurrency = useCurrencyForExpensifyCard({policyID});
const [cardSettings] = useOnyx(`${ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS}${workspaceAccountID}`, {canBeMissing: true});
const [cardManualBilling] = useOnyx(`${ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_MANUAL_BILLING}${workspaceAccountID}`, {canBeMissing: true});
const [cardSettings] = useOnyx(`${ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS}${defaultFundID}`, {canBeMissing: true});
const [cardManualBilling] = useOnyx(`${ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_MANUAL_BILLING}${defaultFundID}`, {canBeMissing: true});
const paymentBankAccountID = cardSettings?.paymentBankAccountID;

const isLessThanMediumScreen = isMediumScreenWidth || shouldUseNarrowLayout;
Expand Down Expand Up @@ -99,7 +98,7 @@ function WorkspaceCardsListLabel({type, value, style}: WorkspaceCardsListLabelPr
const settlementDate = isSettleDateTextDisplayed ? format(addDays(new Date(), 1), CONST.DATE.FNS_FORMAT_STRING) : '';

const handleSettleBalanceButtonClick = () => {
queueExpensifyCardForBilling(CONST.COUNTRY.US, workspaceAccountID);
queueExpensifyCardForBilling(CONST.COUNTRY.US, defaultFundID);
};

return (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ import HeaderWithBackButton from '@components/HeaderWithBackButton';
import ScreenWrapper from '@components/ScreenWrapper';
import useAutoFocusInput from '@hooks/useAutoFocusInput';
import useCurrencyForExpensifyCard from '@hooks/useCurrencyForExpensifyCard';
import useDefaultFundID from '@hooks/useDefaultFundID';
import useLocalize from '@hooks/useLocalize';
import useOnyx from '@hooks/useOnyx';
import useThemeStyles from '@hooks/useThemeStyles';
import useWorkspaceAccountID from '@hooks/useWorkspaceAccountID';
import {updateExpensifyCardLimit} from '@libs/actions/Card';
import {filterInactiveCards} from '@libs/CardUtils';
import {convertToDisplayString, convertToFrontendAmountAsString} from '@libs/CurrencyUtils';
Expand Down Expand Up @@ -39,11 +39,11 @@ function WorkspaceEditCardLimitPage({route}: WorkspaceEditCardLimitPageProps) {
const {inputCallbackRef} = useAutoFocusInput();
const styles = useThemeStyles();
const [isConfirmModalVisible, setIsConfirmModalVisible] = useState(false);
const workspaceAccountID = useWorkspaceAccountID(policyID);
const defaultFundID = useDefaultFundID(policyID);

const currency = useCurrencyForExpensifyCard({policyID});

const [cardsList] = useOnyx(`${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${workspaceAccountID}_${CONST.EXPENSIFY_CARD.BANK}`, {selector: filterInactiveCards, canBeMissing: true});
const [cardsList] = useOnyx(`${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${defaultFundID}_${CONST.EXPENSIFY_CARD.BANK}`, {selector: filterInactiveCards, canBeMissing: true});
const card = cardsList?.[cardID];

const getPromptTextKey = useMemo((): ConfirmationWarningTranslationPaths => {
Expand Down Expand Up @@ -82,7 +82,7 @@ function WorkspaceEditCardLimitPage({route}: WorkspaceEditCardLimitPageProps) {
setIsConfirmModalVisible(false);

updateExpensifyCardLimit(
workspaceAccountID,
defaultFundID,
Number(cardID),
newLimit,
newAvailableSpend,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import ScreenWrapper from '@components/ScreenWrapper';
import SelectionList from '@components/SelectionList';
import RadioListItem from '@components/SelectionList/RadioListItem';
import useCurrencyForExpensifyCard from '@hooks/useCurrencyForExpensifyCard';
import useDefaultFundID from '@hooks/useDefaultFundID';
import useLocalize from '@hooks/useLocalize';
import useOnyx from '@hooks/useOnyx';
import usePolicy from '@hooks/usePolicy';
Expand Down Expand Up @@ -38,8 +39,8 @@ function WorkspaceEditCardLimitTypePage({route}: WorkspaceEditCardLimitTypePageP
const styles = useThemeStyles();

const policy = usePolicy(policyID);
const workspaceAccountID = policy?.workspaceAccountID ?? CONST.DEFAULT_NUMBER_ID;
const [cardsList] = useOnyx(`${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${workspaceAccountID}_${CONST.EXPENSIFY_CARD.BANK}`, {selector: filterInactiveCards, canBeMissing: true});
const defaultFundID = useDefaultFundID(policyID);
const [cardsList] = useOnyx(`${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${defaultFundID}_${CONST.EXPENSIFY_CARD.BANK}`, {selector: filterInactiveCards, canBeMissing: true});

const card = cardsList?.[cardID];
const areApprovalsConfigured = getApprovalWorkflow(policy) !== CONST.POLICY.APPROVAL_MODE.OPTIONAL;
Expand Down Expand Up @@ -73,7 +74,7 @@ function WorkspaceEditCardLimitTypePage({route}: WorkspaceEditCardLimitTypePageP
const updateCardLimitType = () => {
setIsConfirmModalVisible(false);

updateExpensifyCardLimitType(workspaceAccountID, Number(cardID), typeSelected, card?.nameValuePairs?.limitType);
updateExpensifyCardLimitType(defaultFundID, Number(cardID), typeSelected, card?.nameValuePairs?.limitType);

goBack();
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ import HeaderWithBackButton from '@components/HeaderWithBackButton';
import ScreenWrapper from '@components/ScreenWrapper';
import TextInput from '@components/TextInput';
import useAutoFocusInput from '@hooks/useAutoFocusInput';
import useDefaultFundID from '@hooks/useDefaultFundID';
import useLocalize from '@hooks/useLocalize';
import useOnyx from '@hooks/useOnyx';
import useThemeStyles from '@hooks/useThemeStyles';
import useWorkspaceAccountID from '@hooks/useWorkspaceAccountID';
import {updateExpensifyCardTitle} from '@libs/actions/Card';
import {filterInactiveCards} from '@libs/CardUtils';
import {addErrorMessage} from '@libs/ErrorUtils';
Expand All @@ -28,13 +28,13 @@ type WorkspaceEditCardNamePageProps = PlatformStackScreenProps<SettingsNavigator

function WorkspaceEditCardNamePage({route}: WorkspaceEditCardNamePageProps) {
const {policyID, cardID, backTo} = route.params;
const workspaceAccountID = useWorkspaceAccountID(policyID);
const defaultFundID = useDefaultFundID(policyID);

const {translate} = useLocalize();
const {inputCallbackRef} = useAutoFocusInput();
const styles = useThemeStyles();

const [cardsList] = useOnyx(`${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${workspaceAccountID}_${CONST.EXPENSIFY_CARD.BANK}`, {selector: filterInactiveCards});
const [cardsList] = useOnyx(`${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${defaultFundID}_${CONST.EXPENSIFY_CARD.BANK}`, {selector: filterInactiveCards, canBeMissing: true});
const card = cardsList?.[cardID];

const isWorkspaceRhp = route.name === SCREENS.WORKSPACE.EXPENSIFY_CARD_NAME;
Expand All @@ -48,7 +48,7 @@ function WorkspaceEditCardNamePage({route}: WorkspaceEditCardNamePageProps) {
}, [backTo, isWorkspaceRhp, policyID, cardID]);

const submit = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.EDIT_EXPENSIFY_CARD_NAME_FORM>) => {
updateExpensifyCardTitle(workspaceAccountID, Number(cardID), values[INPUT_IDS.NAME], card?.nameValuePairs?.cardTitle);
updateExpensifyCardTitle(defaultFundID, Number(cardID), values[INPUT_IDS.NAME], card?.nameValuePairs?.cardTitle);
goBack();
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@ import MenuItem from '@components/MenuItem';
import ScreenWrapper from '@components/ScreenWrapper';
import Text from '@components/Text';
import useBottomSafeSafeAreaPaddingStyle from '@hooks/useBottomSafeSafeAreaPaddingStyle';
import useDefaultFundID from '@hooks/useDefaultFundID';
import useExpensifyCardUkEuSupported from '@hooks/useExpensifyCardUkEuSupported';
import useLocalize from '@hooks/useLocalize';
import useOnyx from '@hooks/useOnyx';
import usePolicy from '@hooks/usePolicy';
import useThemeStyles from '@hooks/useThemeStyles';
import useWorkspaceAccountID from '@hooks/useWorkspaceAccountID';
import {getLastFourDigits} from '@libs/BankAccountUtils';
import {getEligibleBankAccountsForCard, getEligibleBankAccountsForUkEuCard} from '@libs/CardUtils';
import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
Expand Down Expand Up @@ -47,9 +47,9 @@ function WorkspaceExpensifyCardBankAccounts({route}: WorkspaceExpensifyCardBankA

const isUkEuCurrencySupported = useExpensifyCardUkEuSupported(policyID);

const workspaceAccountID = useWorkspaceAccountID(policyID);
const defaultFundID = useDefaultFundID(policyID);

const [cardBankAccountMetadata] = useOnyx(`${ONYXKEYS.COLLECTION.EXPENSIFY_CARD_BANK_ACCOUNT_METADATA}${workspaceAccountID}`, {canBeMissing: true});
const [cardBankAccountMetadata] = useOnyx(`${ONYXKEYS.COLLECTION.EXPENSIFY_CARD_BANK_ACCOUNT_METADATA}${defaultFundID}`, {canBeMissing: true});
const [cardOnWaitlist] = useOnyx(`${ONYXKEYS.COLLECTION.NVP_EXPENSIFY_ON_CARD_WAITLIST}${policyID}`, {canBeMissing: true});

const getVerificationState = () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ import useNetwork from '@hooks/useNetwork';
import useOnyx from '@hooks/useOnyx';
import useResponsiveLayout from '@hooks/useResponsiveLayout';
import useThemeStyles from '@hooks/useThemeStyles';
import useWorkspaceAccountID from '@hooks/useWorkspaceAccountID';
import {getAllCardsForWorkspace, getTranslationKeyForLimitType, maskCard} from '@libs/CardUtils';
import {convertToDisplayString} from '@libs/CurrencyUtils';
import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
Expand All @@ -48,7 +47,6 @@ type WorkspaceExpensifyCardDetailsPageProps = PlatformStackScreenProps<
function WorkspaceExpensifyCardDetailsPage({route}: WorkspaceExpensifyCardDetailsPageProps) {
const {policyID, cardID, backTo} = route.params;
const defaultFundID = useDefaultFundID(policyID);
const workspaceAccountID = useWorkspaceAccountID(policyID);

const [isDeactivateModalVisible, setIsDeactivateModalVisible] = useState(false);
const [isOfflineModalVisible, setIsOfflineModalVisible] = useState(false);
Expand All @@ -63,7 +61,7 @@ function WorkspaceExpensifyCardDetailsPage({route}: WorkspaceExpensifyCardDetail
const [cardFeeds] = useCardFeeds(policyID);
const expensifyCardSettings = useExpensifyCardFeeds(policyID);
const [allFeedsCards, allFeedsCardsResult] = useOnyx(ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST, {canBeMissing: true});
const workspaceCards = getAllCardsForWorkspace(workspaceAccountID ?? CONST.DEFAULT_NUMBER_ID, allFeedsCards, cardFeeds, expensifyCardSettings);
const workspaceCards = getAllCardsForWorkspace(defaultFundID, allFeedsCards, cardFeeds, expensifyCardSettings);

const isWorkspaceCardRhp = route.name === SCREENS.WORKSPACE.EXPENSIFY_CARD_DETAILS;
const card = workspaceCards?.[cardID];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import ScrollView from '@components/ScrollView';
import SearchBar from '@components/SearchBar';
import Text from '@components/Text';
import useCurrencyForExpensifyCard from '@hooks/useCurrencyForExpensifyCard';
import useDefaultFundID from '@hooks/useDefaultFundID';
import useEmptyViewHeaderHeight from '@hooks/useEmptyViewHeaderHeight';
import useExpensifyCardFeeds from '@hooks/useExpensifyCardFeeds';
import useExpensifyCardUkEuSupported from '@hooks/useExpensifyCardUkEuSupported';
Expand Down Expand Up @@ -65,7 +66,7 @@ function WorkspaceExpensifyCardListPage({route, cardsList, fundID}: WorkspaceExp

const policyID = route.params.policyID;
const policy = usePolicy(policyID);
const workspaceAccountID = policy?.workspaceAccountID ?? CONST.DEFAULT_NUMBER_ID;
const defaultFundID = useDefaultFundID(policyID);
const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {canBeMissing: false});
const [cardOnWaitlist] = useOnyx(`${ONYXKEYS.COLLECTION.NVP_EXPENSIFY_ON_CARD_WAITLIST}${policyID}`, {canBeMissing: true});
const [cardSettings] = useOnyx(`${ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS}${fundID}`, {canBeMissing: false});
Expand Down Expand Up @@ -150,7 +151,7 @@ function WorkspaceExpensifyCardListPage({route, cardsList, fundID}: WorkspaceExp
pendingAction={item.pendingAction}
errorRowStyles={styles.ph5}
errors={item.errors}
onClose={() => clearDeletePaymentMethodError(`${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${workspaceAccountID}_${CONST.EXPENSIFY_CARD.BANK}`, item.cardID)}
onClose={() => clearDeletePaymentMethodError(`${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${defaultFundID}_${CONST.EXPENSIFY_CARD.BANK}`, item.cardID)}
>
<PressableWithFeedback
role={CONST.ROLE.BUTTON}
Expand All @@ -170,7 +171,7 @@ function WorkspaceExpensifyCardListPage({route, cardsList, fundID}: WorkspaceExp
</PressableWithFeedback>
</OfflineWithFeedback>
),
[personalDetails, settlementCurrency, policyID, workspaceAccountID, styles],
[personalDetails, settlementCurrency, policyID, defaultFundID, styles],
);

const isSearchEmpty = filteredSortedCards.length === 0 && inputValue.length > 0;
Expand Down
67 changes: 67 additions & 0 deletions tests/unit/PolicyUtilsTest.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
/* eslint-disable @typescript-eslint/naming-convention */
import {renderHook} from '@testing-library/react-native';
import Onyx from 'react-native-onyx';
import type {OnyxEntry} from 'react-native-onyx';
import useDefaultFundID from '@hooks/useDefaultFundID';
import DateUtils from '@libs/DateUtils';
import {
getActivePolicies,
Expand Down Expand Up @@ -193,6 +195,71 @@ const policyTags = {
};

describe('PolicyUtils', () => {
describe('useDefaultFundID', () => {
beforeEach(() => {
wrapOnyxWithWaitForBatchedUpdates(Onyx);
Onyx.set(ONYXKEYS.PERSONAL_DETAILS_LIST, personalDetails);
});
afterEach(async () => {
await Onyx.clear();
await waitForBatchedUpdatesWithAct();
});
it('should return domainID for given policyID when workspaceID is not set', async () => {
const policy: Policy = {
...createRandomPolicy(2, CONST.POLICY.TYPE.TEAM),
workspaceAccountID: 0,
};
await Onyx.set(`${ONYXKEYS.COLLECTION.POLICY}2`, policy);
await Onyx.set(`${ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS}`, {
[`${ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS}18441278`]: {
currentBalance: 0,
domainName: 'expensify-policy8fe6324c4897.exfy',
earnedCashback: 0,
isLoading: false,
isMonthlySettlementAllowed: false,
limit: 0,
marqetaBusinessToken: 18441278,
ownerEmail: 'user@gmail.com',
paymentBankAccountAddressName: 'Alberta Bobbeth Charleson',
paymentBankAccountID: 3288123,
paymentBankAccountNumber: 'XXXXXXXXXXXX1111',
preferredPolicy: '2',
remainingLimit: 0,
},
});
const {result} = renderHook(() => useDefaultFundID(policy.id));

expect(result?.current).toBe(18441278);
});

it('should return lastSelectedExpensifyCardFeed for given policyID when lastSelectedExpensifyCardFeed is set', async () => {
const policy: Policy = {
...createRandomPolicy(2, CONST.POLICY.TYPE.TEAM),
workspaceAccountID: 0,
};
const lastSelectedExpensifyCardFeed = 11111;
await Onyx.set(`${ONYXKEYS.COLLECTION.POLICY}2`, policy);
await Onyx.set(`${ONYXKEYS.COLLECTION.LAST_SELECTED_EXPENSIFY_CARD_FEED}2`, lastSelectedExpensifyCardFeed);
await Onyx.set(`${ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS}${lastSelectedExpensifyCardFeed}`, {
paymentBankAccountID: 1234,
});
const {result} = renderHook(() => useDefaultFundID(policy.id));

expect(result?.current).toBe(lastSelectedExpensifyCardFeed);
});

it('should return workspaceAccountID for given policyID', async () => {
Comment thread
narefyev91 marked this conversation as resolved.
const policy: Policy = {
...createRandomPolicy(1, CONST.POLICY.TYPE.TEAM),
workspaceAccountID: 123234,
};
await Onyx.set(`${ONYXKEYS.COLLECTION.POLICY}1`, policy);
const {result} = renderHook(() => useDefaultFundID(policy.id));

expect(result?.current).toBe(123234);
});
});

describe('getActivePolicies', () => {
it("getActivePolicies should filter out policies that the current user doesn't belong to", () => {
const policies = createCollection<Policy>(
Expand Down
Loading