Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
af89dea
Refactor Policy Tag Management Functions
Tony-MK Nov 16, 2025
6e58a09
refactor: lint
Tony-MK Nov 16, 2025
c1d32ef
refactor: update PolicyData type to use OnyxEntry for categories
Tony-MK Nov 16, 2025
a869d59
refactor: update policyData to use tagLists instead of tags across ta…
Tony-MK Nov 16, 2025
ac6f27f
refactor: simplify category and tag list updates in pushTransactionVi…
Tony-MK Nov 16, 2025
b52525b
Merge branch 'createPolicyTag' of https://github.com/Tony-MK/Expensif…
Tony-MK Nov 16, 2025
0a71554
Merge branch 'main' of https://github.com/Expensify/App into createPo…
Tony-MK Nov 17, 2025
ecda7d0
refactor: deleteTask function to remove unused ancestors parameter an…
Tony-MK Nov 17, 2025
1a4f6b6
refactor: handle optional chaining for policy categories and update r…
Tony-MK Nov 17, 2025
7f6ae21
Merge branch 'main' of https://github.com/Expensify/App into createPo…
Tony-MK Nov 18, 2025
f8a8b16
fix: removing violations when policy category is created
Tony-MK Nov 18, 2025
3fe7a56
refactor: update policyTags reference in usePolicyData and related co…
Tony-MK Nov 18, 2025
27a6099
Merge branch 'main' of https://github.com/Expensify/App into createPo…
Tony-MK Nov 18, 2025
9449a83
refactor
Tony-MK Nov 19, 2025
cb9cedd
fixing tests..
Tony-MK Nov 19, 2025
45a1a71
Change reports expectation from undefined to empty array
Tony-MK Nov 19, 2025
e2c0a58
Merge branch 'Expensify:main' into createPolicyCategory
Tony-MK Nov 21, 2025
5263b7d
Merge branch 'Expensify:main' into createPolicyCategory
Tony-MK Nov 22, 2025
f659549
refactor: clean up test files for policy and tag actions
Tony-MK Nov 22, 2025
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
19 changes: 10 additions & 9 deletions src/hooks/usePolicyData/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,16 @@ import {useAllReportsTransactionsAndViolations} from '@components/OnyxListItemPr
import useOnyx from '@hooks/useOnyx';
import usePolicy from '@hooks/usePolicy';
import ONYXKEYS from '@src/ONYXKEYS';
import type {Policy, Report} from '@src/types/onyx';
import type {Report} from '@src/types/onyx';
import type {ReportTransactionsAndViolationsDerivedValue} from '@src/types/onyx/DerivedValues';
import type {OnyxValueWithOfflineFeedback} from '@src/types/onyx/OnyxCommon';
import type PolicyData from './types';

/**
* Retrieves policy tags, categories, reports and their associated transactions and violations.
* @param policyID The ID of the policy to retrieve data for.
* @returns An object containing policy data
*/
function usePolicyData(policyID?: string): PolicyData {
const policy = usePolicy(policyID);
function usePolicyData(policyID: string): PolicyData {
const allReportsTransactionsAndViolations = useAllReportsTransactionsAndViolations();

// Stable selector for useOnyx to avoid defining the selector inline
Expand All @@ -37,26 +35,29 @@ function usePolicyData(policyID?: string): PolicyData {
[policyID, allReportsTransactionsAndViolations],
);

const policy = usePolicy(policyID);
const [tags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`, {canBeMissing: true}, [policyID]);
const [categories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${policyID}`, {canBeMissing: true}, [policyID]);
const [reports] = useOnyx(ONYXKEYS.COLLECTION.REPORT, {canBeMissing: true, selector: reportsSelectorCallback}, [policyID, allReportsTransactionsAndViolations]);
const transactionsAndViolations = useMemo(() => {
if (!reports || !allReportsTransactionsAndViolations) {
return {};
}
return Object.keys(reports).reduce<ReportTransactionsAndViolationsDerivedValue>((acc, reportID) => {
if (allReportsTransactionsAndViolations[reportID]) {
return Object.entries(reports).reduce<ReportTransactionsAndViolationsDerivedValue>((acc, [reportID]) => {
if (Object.keys(allReportsTransactionsAndViolations[reportID].transactions).length > 0) {
acc[reportID] = allReportsTransactionsAndViolations[reportID];
}
return acc;
}, {});
}, [reports, allReportsTransactionsAndViolations]);

return {
transactionsAndViolations,
tags: tags ?? {},
categories: categories ?? {},
policy: policy as OnyxValueWithOfflineFeedback<Policy>,
reports: Object.values(reports ?? {}) as Array<OnyxValueWithOfflineFeedback<Report>>,
categories,
policyID,
policy,
reports: Object.values(reports ?? {}),
};
}

Expand Down
9 changes: 5 additions & 4 deletions src/hooks/usePolicyData/types.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import type {OnyxEntry} from 'react-native-onyx';
import type {Policy, PolicyCategories, PolicyTagLists, Report} from '@src/types/onyx';
import type {ReportTransactionsAndViolationsDerivedValue} from '@src/types/onyx/DerivedValues';
import type {OnyxValueWithOfflineFeedback} from '@src/types/onyx/OnyxCommon';

type PolicyData = {
policy: OnyxValueWithOfflineFeedback<Policy>;
policyID: string;
policy: OnyxEntry<Policy>;
tags: PolicyTagLists;
categories: PolicyCategories;
reports: Array<OnyxValueWithOfflineFeedback<Report>>;
categories: OnyxEntry<PolicyCategories>;
reports: Array<OnyxEntry<Report>>;
transactionsAndViolations: ReportTransactionsAndViolationsDerivedValue;
};

Expand Down
57 changes: 40 additions & 17 deletions src/libs/ReportUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -960,7 +960,7 @@
const parsedReportActionMessageCache: Record<string, string> = {};

let conciergeReportID: OnyxEntry<string>;
Onyx.connect({

Check warning on line 963 in src/libs/ReportUtils.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.CONCIERGE_REPORT_ID,
callback: (value) => {
conciergeReportID = value;
Expand All @@ -968,7 +968,7 @@
});

const defaultAvatarBuildingIconTestID = 'SvgDefaultAvatarBuilding Icon';
Onyx.connect({

Check warning on line 971 in src/libs/ReportUtils.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.SESSION,
callback: (value) => {
// When signed out, val is undefined
Expand All @@ -986,7 +986,7 @@
let allPersonalDetails: OnyxEntry<PersonalDetailsList>;
let allPersonalDetailLogins: string[];
let currentUserPersonalDetails: OnyxEntry<PersonalDetails>;
Onyx.connect({

Check warning on line 989 in src/libs/ReportUtils.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.PERSONAL_DETAILS_LIST,
callback: (value) => {
if (currentUserAccountID) {
Expand All @@ -998,14 +998,14 @@
});

let allReportsDraft: OnyxCollection<Report>;
Onyx.connect({

Check warning on line 1001 in src/libs/ReportUtils.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.COLLECTION.REPORT_DRAFT,
waitForCollectionCallback: true,
callback: (value) => (allReportsDraft = value),
});

let allPolicies: OnyxCollection<Policy>;
Onyx.connect({

Check warning on line 1008 in src/libs/ReportUtils.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.COLLECTION.POLICY,
waitForCollectionCallback: true,
callback: (value) => (allPolicies = value),
Expand All @@ -1020,7 +1020,7 @@

let allReports: OnyxCollection<Report>;
let reportsByPolicyID: ReportByPolicyMap;
Onyx.connect({

Check warning on line 1023 in src/libs/ReportUtils.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.COLLECTION.REPORT,
waitForCollectionCallback: true,
callback: (value) => {
Expand Down Expand Up @@ -1058,14 +1058,14 @@
});

let allBetas: OnyxEntry<Beta[]>;
Onyx.connect({

Check warning on line 1061 in src/libs/ReportUtils.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.BETAS,
callback: (value) => (allBetas = value),
});

let allTransactions: OnyxCollection<Transaction> = {};
let reportsTransactions: Record<string, Transaction[]> = {};
Onyx.connect({

Check warning on line 1068 in src/libs/ReportUtils.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.COLLECTION.TRANSACTION,
waitForCollectionCallback: true,
callback: (value) => {
Expand All @@ -1091,7 +1091,7 @@
});

let allReportActions: OnyxCollection<ReportActions>;
Onyx.connect({

Check warning on line 1094 in src/libs/ReportUtils.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.COLLECTION.REPORT_ACTIONS,
waitForCollectionCallback: true,
callback: (actions) => {
Expand All @@ -1104,7 +1104,7 @@

let allReportMetadata: OnyxCollection<ReportMetadata>;
const allReportMetadataKeyValue: Record<string, ReportMetadata> = {};
Onyx.connect({

Check warning on line 1107 in src/libs/ReportUtils.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.COLLECTION.REPORT_METADATA,
waitForCollectionCallback: true,
callback: (value) => {
Expand Down Expand Up @@ -1987,9 +1987,13 @@
categoriesUpdate: Record<string, Partial<PolicyCategory>> = {},
tagListsUpdate: Record<string, Partial<PolicyTagList>> = {},
) {
const {policy, tags: tagLists, categories} = policyData;
if (policy === undefined) {
return;
}
const nonInvoiceReportTransactionsAndViolations = policyData.reports.reduce<ReportTransactionsAndViolations[]>((acc, report) => {
// Skipping invoice reports since they should not have any category or tag violations
if (isInvoiceReport(report)) {
if (report === undefined || isInvoiceReport(report)) {
return acc;
}
const reportTransactionsAndViolations = policyData.transactionsAndViolations[report.reportID];
Expand All @@ -2015,53 +2019,72 @@
}

// Merge the existing policy with the optimistic updates
const optimisticPolicy = isPolicyUpdateEmpty ? policyData.policy : {...policyData.policy, ...policyUpdate};
const optimisticPolicy = isPolicyUpdateEmpty ? policy : {...policy, ...policyUpdate};

// Merge the existing categories with the optimistic updates
const optimisticCategories = isCategoriesUpdateEmpty
? policyData.categories
? (categories ?? {})
: {
...Object.fromEntries(Object.entries(policyData.categories).filter(([categoryName]) => !(categoryName in categoriesUpdate) || !!categoriesUpdate[categoryName])),
...Object.fromEntries(Object.entries(categories ?? {}).filter(([categoryName]) => !(categoryName in categoriesUpdate) || !!categoriesUpdate[categoryName])),
...Object.entries(categoriesUpdate).reduce<PolicyCategories>((acc, [categoryName, categoryUpdate]) => {
if (!categoryUpdate) {
return acc;
}
const category = categories?.[categoryName];
if (category === undefined) {
acc[categoryName] = categoryUpdate as PolicyCategory;
return acc;
}

acc[categoryName] = {
...(policyData.categories?.[categoryName] ?? {}),
...category,
...categoryUpdate,
};
} as PolicyCategory;
return acc;
}, {}),
};

// Merge the existing tag lists with the optimistic updates
const optimisticTagLists = isTagListsUpdateEmpty
? policyData.tags
? (tagLists ?? {})
: {
...Object.fromEntries(Object.entries(policyData.tags ?? {}).filter(([tagListName]) => !(tagListName in tagListsUpdate) || !!tagListsUpdate[tagListName])),
...Object.fromEntries(Object.entries(tagLists ?? {}).filter(([tagListName]) => !(tagListName in tagListsUpdate) || !!tagListsUpdate[tagListName])),
...Object.entries(tagListsUpdate).reduce<PolicyTagLists>((acc, [tagListName, tagListUpdate]) => {
if (!tagListUpdate) {
if (!tagListName || !tagListUpdate) {
return acc;
}

const tagList = policyData.tags?.[tagListName];
const tags = tagList.tags ?? {};
const tagList = tagLists?.[tagListName];
if (!tagList) {
acc[tagListName] = tagListUpdate as PolicyTagList;
return acc;
}
const tags = tagList?.tags;
if (!tags) {
acc[tagListName] = {...tagList, ...tagListUpdate} as PolicyTagList;
return acc;
}
const tagsUpdate = tagListUpdate?.tags ?? {};

acc[tagListName] = {
...tagList,
...tagListUpdate,
tags: {
...((): PolicyTags => {
const optimisticTags: PolicyTags = Object.fromEntries(Object.entries(tags).filter(([tagName]) => !(tagName in tagsUpdate) || !!tagsUpdate[tagName]));
const optimisticTags: PolicyTags = Object.fromEntries(
Object.entries(tags ?? {}).filter(([tagName, tag]) => !tag || !(tagName in tagsUpdate) || !!tagsUpdate[tagName]),
);
for (const [tagName, tagUpdate] of Object.entries(tagsUpdate)) {
if (!tagUpdate) {
continue;
}
optimisticTags[tagName] = {
...(tags[tagName] ?? {}),
...tagUpdate,
};
const tag = tags?.[tagName];
optimisticTags[tagName] =
tag !== undefined
? {
...tag,
...tagUpdate,
}
: tagUpdate;
}
return optimisticTags;
})(),
Expand Down
62 changes: 33 additions & 29 deletions src/libs/actions/Policy/Category.ts
Original file line number Diff line number Diff line change
Expand Up @@ -323,8 +323,12 @@ function setWorkspaceCategoryEnabled(
setupCategoryTaskParentReport: OnyxEntry<Report>,
currentUserAccountID: number,
) {
const policyID = policyData.policy?.id;
const policyCategoriesOptimisticData = {
const {policyID, categories} = policyData;
if (!categories) {
Log.warn('setWorkspaceCategoryEnabled invalid params', {categories});
return;
}
const categoriesOptimisticData = {
...Object.keys(categoriesToUpdate).reduce<PolicyCategories>((acc, key) => {
acc[key] = {
...categoriesToUpdate[key],
Expand All @@ -344,7 +348,7 @@ function setWorkspaceCategoryEnabled(
{
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${policyID}`,
value: policyCategoriesOptimisticData,
value: categoriesOptimisticData,
},
],
successData: [
Expand Down Expand Up @@ -373,7 +377,7 @@ function setWorkspaceCategoryEnabled(
value: {
...Object.keys(categoriesToUpdate).reduce<PolicyCategories>((acc, key) => {
acc[key] = {
...policyData.categories[key],
...categories[key],
errors: ErrorUtils.getMicroSecondOnyxErrorWithTranslationKey('workspace.categories.updateFailureMessage'),
pendingFields: {
enabled: null,
Expand All @@ -388,7 +392,7 @@ function setWorkspaceCategoryEnabled(
],
};

pushTransactionViolationsOnyxData(onyxData, policyData, {}, policyCategoriesOptimisticData);
pushTransactionViolationsOnyxData(onyxData, policyData, {}, categoriesOptimisticData);
appendSetupCategoriesOnboardingData(onyxData, setupCategoryTaskReport, setupCategoryTaskParentReport, isSetupCategoriesTaskParentReportArchived, currentUserAccountID);

const parameters = {
Expand Down Expand Up @@ -469,9 +473,9 @@ function setPolicyCategoryDescriptionRequired(policyID: string, categoryName: st
}

function setPolicyCategoryReceiptsRequired(policyData: PolicyData, categoryName: string, maxAmountNoReceipt: number) {
const policyID = policyData.policy?.id;
const originalMaxAmountNoReceipt = policyData.categories[categoryName]?.maxAmountNoReceipt;
const policyCategoriesOptimisticData = {
const {policyID, categories} = policyData;
const originalMaxAmountNoReceipt = categories?.[categoryName]?.maxAmountNoReceipt;
const categoriesOptimisticData = {
[categoryName]: {
pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE,
pendingFields: {
Expand All @@ -486,7 +490,7 @@ function setPolicyCategoryReceiptsRequired(policyData: PolicyData, categoryName:
{
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${policyID}`,
value: policyCategoriesOptimisticData,
value: categoriesOptimisticData,
},
],
successData: [
Expand Down Expand Up @@ -522,7 +526,7 @@ function setPolicyCategoryReceiptsRequired(policyData: PolicyData, categoryName:
],
};

pushTransactionViolationsOnyxData(onyxData, policyData, {}, policyCategoriesOptimisticData);
pushTransactionViolationsOnyxData(onyxData, policyData, {}, categoriesOptimisticData);

const parameters: SetPolicyCategoryReceiptsRequiredParams = {
policyID,
Expand All @@ -534,9 +538,9 @@ function setPolicyCategoryReceiptsRequired(policyData: PolicyData, categoryName:
}

function removePolicyCategoryReceiptsRequired(policyData: PolicyData, categoryName: string) {
const policyID = policyData.policy?.id;
const originalMaxAmountNoReceipt = policyData.categories[categoryName]?.maxAmountNoReceipt;
const policyCategoriesOptimisticData = {
const {policyID, categories} = policyData;
const originalMaxAmountNoReceipt = categories?.[categoryName]?.maxAmountNoReceipt;
const categoriesOptimisticData = {
[categoryName]: {
pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE,
pendingFields: {
Expand All @@ -551,7 +555,7 @@ function removePolicyCategoryReceiptsRequired(policyData: PolicyData, categoryNa
{
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${policyID}`,
value: policyCategoriesOptimisticData,
value: categoriesOptimisticData,
},
],
successData: [
Expand Down Expand Up @@ -587,7 +591,7 @@ function removePolicyCategoryReceiptsRequired(policyData: PolicyData, categoryNa
],
};

pushTransactionViolationsOnyxData(onyxData, policyData, {}, policyCategoriesOptimisticData);
pushTransactionViolationsOnyxData(onyxData, policyData, {}, categoriesOptimisticData);

const parameters: RemovePolicyCategoryReceiptsRequiredParams = {
policyID,
Expand All @@ -598,17 +602,18 @@ function removePolicyCategoryReceiptsRequired(policyData: PolicyData, categoryNa
}

function createPolicyCategory(
policyID: string,
policyData: PolicyData,
categoryName: string,
isSetupCategoriesTaskParentReportArchived: boolean,
setupCategoryTaskReport: OnyxEntry<Report>,
setupCategoryTaskParentReport: OnyxEntry<Report>,
currentUserAccountID: number,
) {
const onyxData = buildOptimisticPolicyCategories(policyID, [categoryName]);
const onyxData = buildOptimisticPolicyCategories(policyData.policyID, [categoryName]);
appendSetupCategoriesOnboardingData(onyxData, setupCategoryTaskReport, setupCategoryTaskParentReport, isSetupCategoriesTaskParentReportArchived, currentUserAccountID);

const parameters = {
policyID,
policyID: policyData.policyID,
categories: JSON.stringify([{name: categoryName}]),
};

Expand Down Expand Up @@ -636,9 +641,8 @@ function importPolicyCategories(policyID: string, categories: PolicyCategory[])
}

function renamePolicyCategory(policyData: PolicyData, policyCategory: {oldName: string; newName: string}) {
const policy = policyData.policy;
const policyID = policy.id;
const policyCategoryToUpdate = policyData.categories?.[policyCategory.oldName];
const {policyID, policy, categories} = policyData;
const policyCategoryToUpdate = categories?.[policyCategory.oldName];

const policyCategoryApproverRule = CategoryUtils.getCategoryApproverRule(policy?.rules?.approvalRules ?? [], policyCategory.oldName);
const policyCategoryExpenseRule = CategoryUtils.getCategoryExpenseRule(policy?.rules?.expenseRules ?? [], policyCategory.oldName);
Expand Down Expand Up @@ -683,7 +687,7 @@ function renamePolicyCategory(policyData: PolicyData, policyCategory: {oldName:
mccGroup: updatedMccGroup,
};

const policyCategoriesOptimisticData = {
const categoriesOptimisticData = {
[policyCategory.newName]: {
...policyCategoryToUpdate,
errors: null,
Expand All @@ -704,7 +708,7 @@ function renamePolicyCategory(policyData: PolicyData, policyCategory: {oldName:
key: `${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${policyID}`,
value: {
[policyCategory.oldName]: null,
...policyCategoriesOptimisticData,
...categoriesOptimisticData,
},
},
{
Expand Down Expand Up @@ -767,7 +771,7 @@ function renamePolicyCategory(policyData: PolicyData, policyCategory: {oldName:
return acc;
}, {});

pushTransactionViolationsOnyxData(onyxData, {...policyData, categories: policyCategories}, policyOptimisticData, policyCategoriesOptimisticData);
pushTransactionViolationsOnyxData(onyxData, {...policyData, categories: policyCategories}, policyOptimisticData, categoriesOptimisticData);

const parameters = {
policyID,
Expand Down Expand Up @@ -914,7 +918,7 @@ function setPolicyCategoryGLCode(policyID: string, categoryName: string, glCode:
}

function setWorkspaceRequiresCategory(policyData: PolicyData, requiresCategory: boolean) {
const policyID = policyData.policy?.id;
const {policyID} = policyData;
const policyOptimisticData: Partial<Policy> = {
requiresCategory,
errors: {
Expand Down Expand Up @@ -1001,14 +1005,14 @@ function deleteWorkspaceCategories(
setupCategoryTaskParentReport: OnyxEntry<Report>,
currentUserAccountID: number,
) {
const policyID = policyData.policy?.id;
const {policyID, categories} = policyData;
const optimisticPolicyCategoriesData = categoryNamesToDelete.reduce<Record<string, Partial<PolicyCategory>>>((acc, categoryName) => {
acc[categoryName] = {pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE, enabled: false};
return acc;
}, {});

const shouldDisableRequiresCategory = !hasEnabledOptions(
Object.values(policyData.categories).filter((category) => !categoryNamesToDelete.includes(category.name) && category.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE),
Object.values(categories ?? {}).filter((category) => !categoryNamesToDelete.includes(category.name) && category.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE),
);
const optimisticPolicyData: Partial<Policy> = shouldDisableRequiresCategory
? {
Expand Down Expand Up @@ -1062,7 +1066,7 @@ function deleteWorkspaceCategories(
}

function enablePolicyCategories(policyData: PolicyData, enabled: boolean, shouldGoBack = true) {
const policyID = policyData.policy?.id;
const {policyID, categories} = policyData;
const policyUpdate: Partial<Policy> = {
areCategoriesEnabled: enabled,
pendingFields: {
Expand Down Expand Up @@ -1106,7 +1110,7 @@ function enablePolicyCategories(policyData: PolicyData, enabled: boolean, should

if (!enabled) {
policyCategoriesUpdate = Object.fromEntries(
Object.entries(policyData.categories).map(([categoryName]) => [
Object.entries(categories ?? {}).map(([categoryName]) => [
categoryName,
{
enabled: false,
Expand Down
2 changes: 1 addition & 1 deletion src/pages/iou/request/step/IOURequestStepCategory.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ function IOURequestStepCategory({

const report = reportReal ?? reportDraft;
const policyCategories = policyCategoriesReal ?? policyCategoriesDraft;
const policyData = usePolicyData(policy?.id);
const policyData = usePolicyData(policyID ?? CONST.DEFAULT_NUMBER_ID.toString());
const {currentSearchHash} = useSearchContext();
const isEditing = action === CONST.IOU.ACTION.EDIT;
const isEditingSplit = (iouType === CONST.IOU.TYPE.SPLIT || iouType === CONST.IOU.TYPE.SPLIT_EXPENSE) && isEditing;
Expand Down
Loading
Loading