Skip to content

Commit c46c093

Browse files
committed
fix: remove linkedPolicyIds
1 parent 0615aa1 commit c46c093

8 files changed

Lines changed: 34 additions & 44 deletions

src/hooks/useDefaultFundID.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import type {OnyxCollection} from 'react-native-onyx';
33
import {
44
getCardSettings,
55
getFundIdFromSettingsKey,
6-
getLinkedPolicyIdsFromExpensifyCardSettings,
6+
getLinkedPolicyIDsFromExpensifyCardSettings,
77
getPreferredPolicyFromExpensifyCardSettings,
88
isPolicyIDInLinkedExpensifyCardPolicyList,
99
} from '@libs/CardUtils';
@@ -33,7 +33,7 @@ function useDefaultFundID(policyID: string | undefined) {
3333
return getFundIdFromSettingsKey(preferredMatch[0]);
3434
}
3535

36-
const linkedMatch = eligibleEntries.find(([, settings]) => isPolicyIDInLinkedExpensifyCardPolicyList(getLinkedPolicyIdsFromExpensifyCardSettings(settings), policyID));
36+
const linkedMatch = eligibleEntries.find(([, settings]) => isPolicyIDInLinkedExpensifyCardPolicyList(getLinkedPolicyIDsFromExpensifyCardSettings(settings), policyID));
3737
if (linkedMatch) {
3838
return getFundIdFromSettingsKey(linkedMatch[0]);
3939
}

src/hooks/useExpensifyCardFeeds.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {useCallback} from 'react';
22
import type {OnyxCollection} from 'react-native-onyx';
3-
import {getLinkedPolicyIdsFromExpensifyCardSettings, getPreferredPolicyFromExpensifyCardSettings, isPolicyIDInLinkedExpensifyCardPolicyList} from '@libs/CardUtils';
3+
import {getLinkedPolicyIDsFromExpensifyCardSettings, getPreferredPolicyFromExpensifyCardSettings, isPolicyIDInLinkedExpensifyCardPolicyList} from '@libs/CardUtils';
44
import ONYXKEYS from '@src/ONYXKEYS';
55
import type {ExpensifyCardSettings} from '@src/types/onyx';
66
import useOnyx from './useOnyx';
@@ -13,7 +13,7 @@ function useExpensifyCardFeeds(policyID: string | undefined) {
1313
(cardSettings: OnyxCollection<ExpensifyCardSettings>) => {
1414
const matchingEntries = Object.entries(cardSettings ?? {}).filter(([key, settings]) => {
1515
const isDomainFeed =
16-
!!(policyID && isPolicyIDInLinkedExpensifyCardPolicyList(getLinkedPolicyIdsFromExpensifyCardSettings(settings), policyID)) ||
16+
!!(policyID && isPolicyIDInLinkedExpensifyCardPolicyList(getLinkedPolicyIDsFromExpensifyCardSettings(settings), policyID)) ||
1717
(!!policyID && getPreferredPolicyFromExpensifyCardSettings(settings)?.toUpperCase() === policyID.toUpperCase());
1818
const isWorkspaceFeed = key.includes(workspaceAccountID.toString()) && settings && Object.keys(settings).length > 1;
1919
return isDomainFeed || isWorkspaceFeed;

src/libs/CardUtils.ts

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1187,7 +1187,7 @@ function getCardSettings(cardSettings: OnyxEntry<ExpensifyCardSettings>, program
11871187
);
11881188
}
11891189

1190-
/** Backend may nest fields like linkedPolicyIds / linkedPolicyIDs under each program block (not only on the settings root). */
1190+
/** Backend may nest linkedPolicyIDs under each program block (not only on the settings root). */
11911191
const NESTED_EXPENSIFY_CARD_PROGRAM_KEYS: readonly CardProgramKey[] = [CONST.COUNTRY.US, CONST.EXPENSIFY_CARD.CARD_PROGRAM.CURRENT, CONST.COUNTRY.GB, CONST.TRAVEL.PROGRAM_TRAVEL_US];
11921192

11931193
function getNestedExpensifyCardProgramSettings(settings: ExpensifyCardSettings, key: CardProgramKey): ExpensifyCardSettingsBase | undefined {
@@ -1198,18 +1198,11 @@ function getNestedExpensifyCardProgramSettings(settings: ExpensifyCardSettings,
11981198
return undefined;
11991199
}
12001200

1201-
function collectLinkedPolicyIdsFromBase(base: ExpensifyCardSettingsBase | undefined): string[] {
1201+
function collectLinkedPolicyIDsFromBase(base: ExpensifyCardSettingsBase | undefined): string[] {
12021202
if (!base) {
12031203
return [];
12041204
}
1205-
const raw: string[] = [];
1206-
if (base.linkedPolicyIds?.length) {
1207-
raw.push(...base.linkedPolicyIds);
1208-
}
1209-
if (base.linkedPolicyIDs?.length) {
1210-
raw.push(...base.linkedPolicyIDs);
1211-
}
1212-
return raw;
1205+
return base.linkedPolicyIDs?.length ? [...base.linkedPolicyIDs] : [];
12131206
}
12141207

12151208
function dedupePolicyIDsCaseInsensitive(ids: string[]): string[] {
@@ -1227,15 +1220,15 @@ function dedupePolicyIDsCaseInsensitive(ids: string[]): string[] {
12271220

12281221
/**
12291222
* Linked workspace IDs from the settings root and US / CURRENT / GB / TRAVEL_US nests.
1230-
* Merges `linkedPolicyIds` and `linkedPolicyIDs` (API spelling). Deduplicates case-insensitively; keeps API casing for Onyx lookups.
1223+
* Deduplicates case-insensitively; keeps API casing for Onyx lookups.
12311224
*/
1232-
function getLinkedPolicyIdsFromExpensifyCardSettings(settings: ExpensifyCardSettings | OnyxEntry<ExpensifyCardSettings>): string[] | undefined {
1225+
function getLinkedPolicyIDsFromExpensifyCardSettings(settings: ExpensifyCardSettings | OnyxEntry<ExpensifyCardSettings>): string[] | undefined {
12331226
if (!settings) {
12341227
return undefined;
12351228
}
1236-
const ids: string[] = [...collectLinkedPolicyIdsFromBase(settings as ExpensifyCardSettingsBase)];
1229+
const ids: string[] = [...collectLinkedPolicyIDsFromBase(settings as ExpensifyCardSettingsBase)];
12371230
for (const key of NESTED_EXPENSIFY_CARD_PROGRAM_KEYS) {
1238-
ids.push(...collectLinkedPolicyIdsFromBase(getNestedExpensifyCardProgramSettings(settings, key)));
1231+
ids.push(...collectLinkedPolicyIDsFromBase(getNestedExpensifyCardProgramSettings(settings, key)));
12391232
}
12401233
if (ids.length === 0) {
12411234
return undefined;
@@ -1244,8 +1237,8 @@ function getLinkedPolicyIdsFromExpensifyCardSettings(settings: ExpensifyCardSett
12441237
}
12451238

12461239
/** True if `policyID` is in the linked list (case-insensitive). */
1247-
function isPolicyIDInLinkedExpensifyCardPolicyList(linkedPolicyIds: string[] | undefined, policyID: string): boolean {
1248-
return !!linkedPolicyIds?.some((id) => id.toUpperCase() === policyID.toUpperCase());
1240+
function isPolicyIDInLinkedExpensifyCardPolicyList(linkedPolicyIDs: string[] | undefined, policyID: string): boolean {
1241+
return !!linkedPolicyIDs?.some((id) => id.toUpperCase() === policyID.toUpperCase());
12491242
}
12501243

12511244
/** Resolves preferredPolicy from the settings root or the first nested program block that defines it. */
@@ -1716,7 +1709,7 @@ export {
17161709
isExpensifyCardFullySetUp,
17171710
getCardSettings,
17181711
getCardProgramKey,
1719-
getLinkedPolicyIdsFromExpensifyCardSettings,
1712+
getLinkedPolicyIDsFromExpensifyCardSettings,
17201713
getPreferredPolicyFromExpensifyCardSettings,
17211714
isPolicyIDInLinkedExpensifyCardPolicyList,
17221715
filterAllInactiveCards,

src/libs/ExpensifyCardFeedSelectorUtils.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type {OnyxCollection} from 'react-native-onyx';
22
import ONYXKEYS from '@src/ONYXKEYS';
33
import type {ExpensifyCardSettings, Policy} from '@src/types/onyx';
4-
import {getFundIdFromSettingsKey, getLinkedPolicyIdsFromExpensifyCardSettings, getPreferredPolicyFromExpensifyCardSettings, isPolicyIDInLinkedExpensifyCardPolicyList} from './CardUtils';
4+
import {getFundIdFromSettingsKey, getLinkedPolicyIDsFromExpensifyCardSettings, getPreferredPolicyFromExpensifyCardSettings, isPolicyIDInLinkedExpensifyCardPolicyList} from './CardUtils';
55
import {isPolicyAdmin} from './PolicyUtils';
66

77
type ExpensifyCardFeedEntry = {
@@ -18,9 +18,9 @@ function isExpensifyCardFeedVisibleToAdmin(settings: ExpensifyCardSettings, poli
1818
if (!hasLoadedExpensifyCardSettings(settings)) {
1919
return false;
2020
}
21-
const linkedPolicyIds = getLinkedPolicyIdsFromExpensifyCardSettings(settings);
22-
if (linkedPolicyIds?.length) {
23-
return linkedPolicyIds.some((linkedPolicyID) => isPolicyAdmin(policies?.[`${ONYXKEYS.COLLECTION.POLICY}${linkedPolicyID.toUpperCase()}`]));
21+
const linkedPolicyIDs = getLinkedPolicyIDsFromExpensifyCardSettings(settings);
22+
if (linkedPolicyIDs?.length) {
23+
return linkedPolicyIDs.some((linkedPolicyID) => isPolicyAdmin(policies?.[`${ONYXKEYS.COLLECTION.POLICY}${linkedPolicyID.toUpperCase()}`]));
2424
}
2525
const preferredPolicy = getPreferredPolicyFromExpensifyCardSettings(settings);
2626
if (!preferredPolicy) {
@@ -31,17 +31,17 @@ function isExpensifyCardFeedVisibleToAdmin(settings: ExpensifyCardSettings, poli
3131
}
3232

3333
function isFeedLinkedToPolicy(entry: ExpensifyCardFeedEntry, policyID: string): boolean {
34-
return isPolicyIDInLinkedExpensifyCardPolicyList(getLinkedPolicyIdsFromExpensifyCardSettings(entry.settings), policyID);
34+
return isPolicyIDInLinkedExpensifyCardPolicyList(getLinkedPolicyIDsFromExpensifyCardSettings(entry.settings), policyID);
3535
}
3636

3737
function isFeedForCurrentWorkspace(entry: ExpensifyCardFeedEntry, policyID: string): boolean {
3838
const preferred = getPreferredPolicyFromExpensifyCardSettings(entry.settings);
3939
return preferred?.toUpperCase() === policyID.toUpperCase();
4040
}
4141

42-
/** Primary vs other: use linkedPolicyIds/linkedPolicyIDs when present; otherwise preferredPolicy (legacy). */
42+
/** Primary vs other: use linkedPolicyIDs when present; otherwise preferredPolicy (legacy). */
4343
function isFeedPrimaryForPolicy(entry: ExpensifyCardFeedEntry, policyID: string): boolean {
44-
const linked = getLinkedPolicyIdsFromExpensifyCardSettings(entry.settings);
44+
const linked = getLinkedPolicyIDsFromExpensifyCardSettings(entry.settings);
4545
if (linked?.length) {
4646
return isFeedLinkedToPolicy(entry, policyID);
4747
}

src/pages/workspace/expensifyCard/WorkspaceExpensifyCardFeedSelectorPage.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import useOnyx from '@hooks/useOnyx';
2121
import usePrimaryContactMethod from '@hooks/usePrimaryContactMethod';
2222
import useThemeStyles from '@hooks/useThemeStyles';
2323
import {clearIssueNewCardFormData, setIssueNewCardStepAndData, updateSelectedExpensifyCardFeed} from '@libs/actions/Card';
24-
import {getLinkedPolicyIdsFromExpensifyCardSettings, getPreferredPolicyFromExpensifyCardSettings} from '@libs/CardUtils';
24+
import {getLinkedPolicyIDsFromExpensifyCardSettings, getPreferredPolicyFromExpensifyCardSettings} from '@libs/CardUtils';
2525
import {getMicroSecondOnyxErrorWithTranslationKey} from '@libs/ErrorUtils';
2626
import type {ExpensifyCardFeedEntry} from '@libs/ExpensifyCardFeedSelectorUtils';
2727
import {isEmailPublicDomain} from '@libs/LoginUtils';
@@ -89,9 +89,9 @@ function WorkspaceExpensifyCardFeedSelectorPage({route}: WorkspaceExpensifyCardF
8989
if (domainName) {
9090
return getDescriptionForPolicyDomainCard(domainName, policies);
9191
}
92-
const linkedPolicyIds = getLinkedPolicyIdsFromExpensifyCardSettings(entry.settings);
92+
const linkedPolicyIDs = getLinkedPolicyIDsFromExpensifyCardSettings(entry.settings);
9393
const preferredPolicyID = getPreferredPolicyFromExpensifyCardSettings(entry.settings);
94-
const policyIDForName = linkedPolicyIds?.length ? linkedPolicyIds.at(0) : preferredPolicyID;
94+
const policyIDForName = linkedPolicyIDs?.length ? linkedPolicyIDs.at(0) : preferredPolicyID;
9595
return (policyIDForName && policies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyIDForName.toUpperCase()}`]?.name) ?? '';
9696
};
9797

src/types/onyx/ExpensifyCardSettings.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,6 @@ type ExpensifyCardSettingsBase = {
4242
preferredPolicy?: string;
4343

4444
/** Policy IDs linked to this Expensify Card feed (when present, drives feed grouping in the admin selector) */
45-
linkedPolicyIds?: string[];
46-
47-
/** Same data as `linkedPolicyIds`; backend uses this spelling (capital `ID`). */
4845
linkedPolicyIDs?: string[];
4946

5047
/** The Marqeta business token */

tests/unit/hooks/useExpensifyCardFeedsForFeedSelector.test.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ describe('useExpensifyCardFeedsForFeedSelector', () => {
6262
});
6363
});
6464

65-
it('partitions by preferredPolicy when no entry has linkedPolicyIds', () => {
65+
it('partitions by preferredPolicy when no entry has linkedPolicyIDs', () => {
6666
mockUseOnyx.mockImplementation((key: string) => {
6767
if (key === ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS) {
6868
return [
@@ -94,20 +94,20 @@ describe('useExpensifyCardFeedsForFeedSelector', () => {
9494
expect(result.current.otherFeeds.at(0)?.fundID).toBe(222);
9595
});
9696

97-
it('partitions by linkedPolicyIds for feeds that define them (per feed, not global)', () => {
97+
it('partitions by linkedPolicyIDs for feeds that define them (per feed, not global)', () => {
9898
mockUseOnyx.mockImplementation((key: string) => {
9999
if (key === ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS) {
100100
return [
101101
{
102102
[cardSettingsKey(10)]: {
103103
preferredPolicy: otherPolicyID,
104104
isEnabled: true,
105-
linkedPolicyIds: [currentPolicyID],
105+
linkedPolicyIDs: [currentPolicyID],
106106
},
107107
[cardSettingsKey(20)]: {
108108
preferredPolicy: currentPolicyID,
109109
isEnabled: true,
110-
linkedPolicyIds: [otherPolicyID],
110+
linkedPolicyIDs: [otherPolicyID],
111111
},
112112
},
113113
{status: 'loaded'},
@@ -128,14 +128,14 @@ describe('useExpensifyCardFeedsForFeedSelector', () => {
128128
expect(result.current.allFeeds).toHaveLength(2);
129129
});
130130

131-
it('resolves linkedPolicyIds nested under US (not only on settings root)', () => {
131+
it('resolves linkedPolicyIDs nested under US (not only on settings root)', () => {
132132
mockUseOnyx.mockImplementation((key: string) => {
133133
if (key === ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS) {
134134
return [
135135
{
136136
[cardSettingsKey(77)]: {
137137
[US_PROGRAM]: {
138-
linkedPolicyIds: [currentPolicyID, otherPolicyID],
138+
linkedPolicyIDs: [currentPolicyID, otherPolicyID],
139139
isEnabled: true,
140140
},
141141
hasOnceLoaded: true,
@@ -188,15 +188,15 @@ describe('useExpensifyCardFeedsForFeedSelector', () => {
188188
expect(result.current.primaryFeeds.at(0)?.fundID).toBe(88);
189189
});
190190

191-
it('includes feeds visible via linkedPolicyIds when preferredPolicy is a different workspace', () => {
191+
it('includes feeds visible via linkedPolicyIDs when preferredPolicy is a different workspace', () => {
192192
mockUseOnyx.mockImplementation((key: string) => {
193193
if (key === ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS) {
194194
return [
195195
{
196196
[cardSettingsKey(7)]: {
197197
preferredPolicy: otherPolicyID,
198198
isEnabled: true,
199-
linkedPolicyIds: [currentPolicyID, otherPolicyID],
199+
linkedPolicyIDs: [currentPolicyID, otherPolicyID],
200200
},
201201
},
202202
{status: 'loaded'},

tests/unit/hooks/useHasAnyAdminExpensifyCardFeed.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,12 +141,12 @@ describe('useHasAnyAdminExpensifyCardFeed', () => {
141141
expect(result.current).toBe(true);
142142
});
143143

144-
it('returns true when feed uses linkedPolicyIds and user is admin of a linked workspace (no preferredPolicy)', () => {
144+
it('returns true when feed uses linkedPolicyIDs and user is admin of a linked workspace (no preferredPolicy)', () => {
145145
mockUseOnyx.mockImplementation((key: string) => {
146146
if (key === ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS) {
147147
return [
148148
{
149-
[cardSettingsKey(42)]: {linkedPolicyIds: [policyID], isEnabled: true},
149+
[cardSettingsKey(42)]: {linkedPolicyIDs: [policyID], isEnabled: true},
150150
},
151151
{status: 'loaded'},
152152
];

0 commit comments

Comments
 (0)