From fca6165d29584d2664388ac03dff2d7f74017d2f Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Fri, 18 Jul 2025 18:59:56 +0100 Subject: [PATCH 01/49] add setFeedStatementPeriodEndDate (wip) --- .../SetFeedStatementPeriodEndDate.ts | 9 ++++++ src/libs/API/parameters/index.ts | 1 + src/libs/API/types.ts | 2 ++ src/libs/actions/CompanyCards.ts | 32 +++++++++++++++++++ .../WorkspaceCompanyCardsSettingsPage.tsx | 23 +++++-------- 5 files changed, 52 insertions(+), 15 deletions(-) create mode 100644 src/libs/API/parameters/SetFeedStatementPeriodEndDate.ts diff --git a/src/libs/API/parameters/SetFeedStatementPeriodEndDate.ts b/src/libs/API/parameters/SetFeedStatementPeriodEndDate.ts new file mode 100644 index 000000000000..81100d7568f0 --- /dev/null +++ b/src/libs/API/parameters/SetFeedStatementPeriodEndDate.ts @@ -0,0 +1,9 @@ +type SetFeedStatementPeriodEndDate = { + authToken: string | null | undefined; + policyID: string; + bankName: string; + domainAccountID: number; + statementPeriodEndDate: string; +}; + +export default SetFeedStatementPeriodEndDate; diff --git a/src/libs/API/parameters/index.ts b/src/libs/API/parameters/index.ts index 1627158a2f6b..96310830a1ed 100644 --- a/src/libs/API/parameters/index.ts +++ b/src/libs/API/parameters/index.ts @@ -351,6 +351,7 @@ export type {default as DeleteCompanyCardFeed} from './DeleteCompanyCardFeed'; export type {default as SetCompanyCardTransactionLiability} from './SetCompanyCardTransactionLiability'; export type {default as OpenPolicyCompanyCardsFeedParams} from './OpenPolicyCompanyCardsFeedParams'; export type {default as OpenPolicyAddCardFeedPageParams} from './OpenPolicyAddCardFeedPageParams'; +export type {default as SetFeedStatementPeriodEndDate} from './SetFeedStatementPeriodEndDate'; export type {default as AssignCompanyCardParams} from './AssignCompanyCardParams'; export type {default as UnassignCompanyCard} from './UnassignCompanyCard'; export type {default as UpdateCompanyCard} from './UpdateCompanyCard'; diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts index b301b67ada43..4be6992ec184 100644 --- a/src/libs/API/types.ts +++ b/src/libs/API/types.ts @@ -455,6 +455,7 @@ const WRITE_COMMANDS = { DELETE_COMPANY_CARD_FEED: 'RemoveFeed', SET_COMPANY_CARD_TRANSACTION_LIABILITY: 'SetFeedTransactionLiability', OPEN_POLICY_ADD_CARD_FEED_PAGE: 'OpenPolicyAddCardFeedPage', + SET_FEED_STATEMENT_PERIOD_END_DATE: 'SetFeedStatementPeriodEndDate', ASSIGN_COMPANY_CARD: 'AssignCard', UNASSIGN_COMPANY_CARD: 'UnassignCard', UPDATE_COMPANY_CARD: 'SyncCard', @@ -561,6 +562,7 @@ type WriteCommandParameters = { [WRITE_COMMANDS.SET_CARD_EXPORT_ACCOUNT]: Parameters.SetCompanyCardExportAccountParams; [WRITE_COMMANDS.SET_COMPANY_CARD_TRANSACTION_LIABILITY]: Parameters.SetCompanyCardTransactionLiability; [WRITE_COMMANDS.OPEN_POLICY_ADD_CARD_FEED_PAGE]: Parameters.OpenPolicyAddCardFeedPageParams; + [WRITE_COMMANDS.SET_FEED_STATEMENT_PERIOD_END_DATE]: Parameters.SetFeedStatementPeriodEndDate; [WRITE_COMMANDS.VERIFY_IDENTITY]: Parameters.VerifyIdentityParams; [WRITE_COMMANDS.ACCEPT_WALLET_TERMS]: Parameters.AcceptWalletTermsParams; [WRITE_COMMANDS.ANSWER_QUESTIONS_FOR_WALLET]: Parameters.AnswerQuestionsForWalletParams; diff --git a/src/libs/actions/CompanyCards.ts b/src/libs/actions/CompanyCards.ts index 7409a4ee8e72..9fac9f80cc70 100644 --- a/src/libs/actions/CompanyCards.ts +++ b/src/libs/actions/CompanyCards.ts @@ -8,6 +8,7 @@ import type { OpenPolicyExpensifyCardsPageParams, RequestFeedSetupParams, SetCompanyCardExportAccountParams, + SetFeedStatementPeriodEndDate, UpdateCompanyCardNameParams, } from '@libs/API/parameters'; import {READ_COMMANDS, WRITE_COMMANDS} from '@libs/API/types'; @@ -811,6 +812,36 @@ function openPolicyAddCardFeedPage(policyID: string | undefined) { API.write(WRITE_COMMANDS.OPEN_POLICY_ADD_CARD_FEED_PAGE, parameters); } +function setFeedStatementPeriodEndDate(policyID: string, bankName: string, domainAccountID: number, newStatementPeriodEndDate: string, oldStatementPeriodEndDate: string) { + const authToken = NetworkStore.getAuthToken(); + + const optimisticData: OnyxUpdate[] = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${domainAccountID}`, + value: { + settings: { + companyCards: { + [bankName]: { + statementPeriodEndDay: newStatementPeriodEndDate, + }, + }, + }, + }, + }, + ]; + + const parameters: SetFeedStatementPeriodEndDate = { + authToken, + policyID, + bankName, + domainAccountID, + statementPeriodEndDate: newStatementPeriodEndDate, + }; + + API.write(WRITE_COMMANDS.SET_FEED_STATEMENT_PERIOD_END_DATE, parameters); +} + export { setWorkspaceCompanyCardFeedName, deleteWorkspaceCompanyCardFeed, @@ -831,4 +862,5 @@ export { openAssignFeedCardPage, openPolicyAddCardFeedPage, setTransactionStartDate, + setFeedStatementPeriodEndDate, }; diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx index 2e987a860ca3..85cc144e483d 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx @@ -10,7 +10,6 @@ import ScrollView from '@components/ScrollView'; import Text from '@components/Text'; import useCardFeeds from '@hooks/useCardFeeds'; import useCardsList from '@hooks/useCardsList'; -import useEnvironment from '@hooks/useEnvironment'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import usePolicy from '@hooks/usePolicy'; @@ -35,7 +34,6 @@ function WorkspaceCompanyCardsSettingsPage({ params: {policyID}, }, }: WorkspaceCompanyCardsSettingsPageProps) { - const {isDevelopment} = useEnvironment(); const styles = useThemeStyles(); const {translate} = useLocalize(); const policy = usePolicy(policyID); @@ -56,9 +54,6 @@ function WorkspaceCompanyCardsSettingsPage({ const domainOrWorkspaceAccountID = getDomainOrWorkspaceAccountID(workspaceAccountID, selectedFeedData); const statementPeriodEndDay = selectedFeedData?.statementPeriodEndDay; - // s77rt remove DEV lock - const shouldShowStatementCloseDate = isDevelopment; - const navigateToChangeFeedName = () => { Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS_SETTINGS_FEED_NAME.getRoute(policyID)); }; @@ -118,16 +113,14 @@ function WorkspaceCompanyCardsSettingsPage({ titleStyle={styles.flex1} onPress={navigateToChangeFeedName} /> - {shouldShowStatementCloseDate && ( - - )} + Date: Fri, 18 Jul 2025 22:27:38 +0100 Subject: [PATCH 02/49] simplify WorkspaceCompanyCardStatementCloseDateSelectionList state --- ...spaceCompanyCardStatementCloseDatePage.tsx | 4 +- .../index.tsx | 90 +++++++++++-------- .../addNew/StatementCloseDateStep.tsx | 4 +- src/types/onyx/CardFeeds.ts | 2 +- 4 files changed, 57 insertions(+), 43 deletions(-) diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx index 5d5ff1b8f0f5..17dd17a305df 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx @@ -29,9 +29,9 @@ function WorkspaceCompanyCardStatementCloseDatePage({ const selectedFeed = getSelectedFeed(lastSelectedFeed, cardFeeds); const submit = useCallback( - // s77rt make use of statementCloseDate / statementCustomCloseDate and remove disable lint rule + // s77rt make use of statementCloseDate and remove disable lint rule // eslint-disable-next-line @typescript-eslint/no-unused-vars - (statementCloseDate: CompanyCardStatementCloseDate, statementCustomCloseDate: number | undefined) => { + (statementCloseDate: CompanyCardStatementCloseDate) => { if (selectedFeed) { // s77rt call API command } diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx index 7d56439f97e2..0352a3998385 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx @@ -22,7 +22,7 @@ type StatementCloseDateListItem = ListItem & { type WorkspaceCompanyCardStatementCloseDateSelectionListProps = { confirmText: string; - onSubmit: (statementCloseDate: CompanyCardStatementCloseDate, statementCustomCloseDate: number | undefined) => void; + onSubmit: (statementCloseDate: CompanyCardStatementCloseDate) => void; onBackButtonPress: () => void; enabledWhenOffline: boolean; defaultDate?: CompanyCardStatementCloseDate; @@ -39,10 +39,8 @@ function WorkspaceCompanyCardStatementCloseDateSelectionList({ const styles = useThemeStyles(); const [selectedDate, setSelectedDate] = useState(defaultDate); - const [selectedCustomDate, setSelectedCustomDate] = useState(undefined); - const [error, setError] = useState(undefined); - const [isChoosingCustomDate, setIsChoosingCustomDate] = useState(false); + const [error, setError] = useState(undefined); const title = useMemo( () => (isChoosingCustomDate ? translate('workspace.companyCards.customCloseDate') : translate('workspace.moreFeatures.companyCards.statementCloseDateTitle')), @@ -58,28 +56,52 @@ function WorkspaceCompanyCardStatementCloseDateSelectionList({ onBackButtonPress(); }, [isChoosingCustomDate, onBackButtonPress]); - const selectDateAndClearError = useCallback((item: StatementCloseDateListItem) => { - setSelectedDate(item.value); - setError(undefined); - }, []); - - const selectCustomDateAndClearError = useCallback( - (day: number) => { - setSelectedCustomDate(day); - setError(undefined); - goBack(); - }, - [goBack], - ); - const submit = useCallback(() => { - if (!selectedDate || (selectedDate === CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH && !selectedCustomDate)) { + if (!selectedDate) { setError(translate('workspace.moreFeatures.companyCards.error.statementCloseDateRequired')); return; } - onSubmit(selectedDate, selectedDate === CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH ? selectedCustomDate : undefined); - }, [selectedDate, selectedCustomDate, onSubmit, translate]); + onSubmit(selectedDate); + }, [selectedDate, onSubmit, translate]); + + const options = useMemo(() => { + return Object.values(CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE)?.map((option) => { + let value: CompanyCardStatementCloseDate; + let isSelected: boolean; + + if (option === CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH) { + if (typeof selectedDate === 'number') { + value = selectedDate; + } else if (typeof defaultDate === 'number') { + value = defaultDate; + } else { + value = NaN; + } + isSelected = typeof selectedDate === 'number'; + } else { + value = option; + isSelected = selectedDate === option; + } + + return ( + { + setSelectedDate(item.value); + setError(undefined); + }} + /> + ); + }); + }, [translate, defaultDate, selectedDate]); return ( {isChoosingCustomDate ? ( { + setSelectedDate(day); + setError(undefined); + goBack(); + }} /> ) : ( <> {translate('workspace.moreFeatures.companyCards.statementCloseDateDescription')} - {Object.values(CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE)?.map((option) => ( - - ))} - {selectedDate === CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH && ( + {options} + {typeof selectedDate === 'number' && ( setIsChoosingCustomDate(true)} viewMode={CONST.OPTION_MODE.COMPACT} diff --git a/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx b/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx index c4d041af0884..c0ddb4fcdf4b 100644 --- a/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx +++ b/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx @@ -26,9 +26,9 @@ function StatementCloseDateStep({policyID}: StatementCloseDateStepProps) { const isPlaid = isBetaEnabled(CONST.BETAS.PLAID_COMPANY_CARDS) && !!addNewCard?.data?.publicToken; const submit = useCallback( - // s77rt make use of statementCloseDate / statementCustomCloseDate and remove disable lint rule + // s77rt make use of statementCloseDate and remove disable lint rule // eslint-disable-next-line @typescript-eslint/no-unused-vars - (statementCloseDate: CompanyCardStatementCloseDate, statementCustomCloseDate: number | undefined) => { + (statementCloseDate: CompanyCardStatementCloseDate) => { if (isPlaid) { setAddNewCompanyCardStepAndData({ step: CONST.COMPANY_CARDS.STEP.BANK_CONNECTION, diff --git a/src/types/onyx/CardFeeds.ts b/src/types/onyx/CardFeeds.ts index 88ecfb9093c3..758447c734e5 100644 --- a/src/types/onyx/CardFeeds.ts +++ b/src/types/onyx/CardFeeds.ts @@ -5,7 +5,7 @@ import type CONST from '@src/CONST'; import type * as OnyxCommon from './OnyxCommon'; /** Card statement close date */ -type CompanyCardStatementCloseDate = ValueOf; +type CompanyCardStatementCloseDate = Exclude, typeof CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH> | number; /** Card feed */ type CompanyCardFeed = ValueOf; From 2091cf53ba92792b0133bfb4fc85a0b45c2e6f1a Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Fri, 18 Jul 2025 22:31:25 +0100 Subject: [PATCH 03/49] rename SetFeedStatementPeriodEndDate to SetFeedStatementEndDay --- ...ementPeriodEndDate.ts => SetFeedStatementEndDay.ts} | 4 ++-- src/libs/API/parameters/index.ts | 2 +- src/libs/API/types.ts | 4 ++-- src/libs/actions/CompanyCards.ts | 10 +++++----- 4 files changed, 10 insertions(+), 10 deletions(-) rename src/libs/API/parameters/{SetFeedStatementPeriodEndDate.ts => SetFeedStatementEndDay.ts} (64%) diff --git a/src/libs/API/parameters/SetFeedStatementPeriodEndDate.ts b/src/libs/API/parameters/SetFeedStatementEndDay.ts similarity index 64% rename from src/libs/API/parameters/SetFeedStatementPeriodEndDate.ts rename to src/libs/API/parameters/SetFeedStatementEndDay.ts index 81100d7568f0..1206538520d7 100644 --- a/src/libs/API/parameters/SetFeedStatementPeriodEndDate.ts +++ b/src/libs/API/parameters/SetFeedStatementEndDay.ts @@ -1,4 +1,4 @@ -type SetFeedStatementPeriodEndDate = { +type SetFeedStatementEndDay = { authToken: string | null | undefined; policyID: string; bankName: string; @@ -6,4 +6,4 @@ type SetFeedStatementPeriodEndDate = { statementPeriodEndDate: string; }; -export default SetFeedStatementPeriodEndDate; +export default SetFeedStatementEndDay; diff --git a/src/libs/API/parameters/index.ts b/src/libs/API/parameters/index.ts index 96310830a1ed..61eb7debb218 100644 --- a/src/libs/API/parameters/index.ts +++ b/src/libs/API/parameters/index.ts @@ -351,7 +351,7 @@ export type {default as DeleteCompanyCardFeed} from './DeleteCompanyCardFeed'; export type {default as SetCompanyCardTransactionLiability} from './SetCompanyCardTransactionLiability'; export type {default as OpenPolicyCompanyCardsFeedParams} from './OpenPolicyCompanyCardsFeedParams'; export type {default as OpenPolicyAddCardFeedPageParams} from './OpenPolicyAddCardFeedPageParams'; -export type {default as SetFeedStatementPeriodEndDate} from './SetFeedStatementPeriodEndDate'; +export type {default as SetFeedStatementEndDay} from './SetFeedStatementEndDay'; export type {default as AssignCompanyCardParams} from './AssignCompanyCardParams'; export type {default as UnassignCompanyCard} from './UnassignCompanyCard'; export type {default as UpdateCompanyCard} from './UpdateCompanyCard'; diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts index 4be6992ec184..05415b9187dc 100644 --- a/src/libs/API/types.ts +++ b/src/libs/API/types.ts @@ -455,7 +455,7 @@ const WRITE_COMMANDS = { DELETE_COMPANY_CARD_FEED: 'RemoveFeed', SET_COMPANY_CARD_TRANSACTION_LIABILITY: 'SetFeedTransactionLiability', OPEN_POLICY_ADD_CARD_FEED_PAGE: 'OpenPolicyAddCardFeedPage', - SET_FEED_STATEMENT_PERIOD_END_DATE: 'SetFeedStatementPeriodEndDate', + SET_FEED_STATEMENT_END_DAY: 'SetFeedStatementEndDay', ASSIGN_COMPANY_CARD: 'AssignCard', UNASSIGN_COMPANY_CARD: 'UnassignCard', UPDATE_COMPANY_CARD: 'SyncCard', @@ -562,7 +562,7 @@ type WriteCommandParameters = { [WRITE_COMMANDS.SET_CARD_EXPORT_ACCOUNT]: Parameters.SetCompanyCardExportAccountParams; [WRITE_COMMANDS.SET_COMPANY_CARD_TRANSACTION_LIABILITY]: Parameters.SetCompanyCardTransactionLiability; [WRITE_COMMANDS.OPEN_POLICY_ADD_CARD_FEED_PAGE]: Parameters.OpenPolicyAddCardFeedPageParams; - [WRITE_COMMANDS.SET_FEED_STATEMENT_PERIOD_END_DATE]: Parameters.SetFeedStatementPeriodEndDate; + [WRITE_COMMANDS.SET_FEED_STATEMENT_END_DAY]: Parameters.SetFeedStatementEndDay; [WRITE_COMMANDS.VERIFY_IDENTITY]: Parameters.VerifyIdentityParams; [WRITE_COMMANDS.ACCEPT_WALLET_TERMS]: Parameters.AcceptWalletTermsParams; [WRITE_COMMANDS.ANSWER_QUESTIONS_FOR_WALLET]: Parameters.AnswerQuestionsForWalletParams; diff --git a/src/libs/actions/CompanyCards.ts b/src/libs/actions/CompanyCards.ts index 9fac9f80cc70..1b9e59de3db4 100644 --- a/src/libs/actions/CompanyCards.ts +++ b/src/libs/actions/CompanyCards.ts @@ -8,7 +8,7 @@ import type { OpenPolicyExpensifyCardsPageParams, RequestFeedSetupParams, SetCompanyCardExportAccountParams, - SetFeedStatementPeriodEndDate, + SetFeedStatementEndDay, UpdateCompanyCardNameParams, } from '@libs/API/parameters'; import {READ_COMMANDS, WRITE_COMMANDS} from '@libs/API/types'; @@ -812,7 +812,7 @@ function openPolicyAddCardFeedPage(policyID: string | undefined) { API.write(WRITE_COMMANDS.OPEN_POLICY_ADD_CARD_FEED_PAGE, parameters); } -function setFeedStatementPeriodEndDate(policyID: string, bankName: string, domainAccountID: number, newStatementPeriodEndDate: string, oldStatementPeriodEndDate: string) { +function setFeedStatementEndDay(policyID: string, bankName: string, domainAccountID: number, newStatementPeriodEndDate: string, oldStatementPeriodEndDate: string) { const authToken = NetworkStore.getAuthToken(); const optimisticData: OnyxUpdate[] = [ @@ -831,7 +831,7 @@ function setFeedStatementPeriodEndDate(policyID: string, bankName: string, domai }, ]; - const parameters: SetFeedStatementPeriodEndDate = { + const parameters: SetFeedStatementEndDay = { authToken, policyID, bankName, @@ -839,7 +839,7 @@ function setFeedStatementPeriodEndDate(policyID: string, bankName: string, domai statementPeriodEndDate: newStatementPeriodEndDate, }; - API.write(WRITE_COMMANDS.SET_FEED_STATEMENT_PERIOD_END_DATE, parameters); + API.write(WRITE_COMMANDS.SET_FEED_STATEMENT_END_DAY, parameters); } export { @@ -862,5 +862,5 @@ export { openAssignFeedCardPage, openPolicyAddCardFeedPage, setTransactionStartDate, - setFeedStatementPeriodEndDate, + setFeedStatementEndDay, }; From 3879318ce70cf97bb0bc0fcf6d11a9b84a0c33bb Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Fri, 18 Jul 2025 22:51:45 +0100 Subject: [PATCH 04/49] lint --- .../index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx index 0352a3998385..dd94b1f526fa 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx @@ -101,7 +101,7 @@ function WorkspaceCompanyCardStatementCloseDateSelectionList({ /> ); }); - }, [translate, defaultDate, selectedDate]); + }, [translate, defaultDate, selectedDate, styles.flexReset]); return ( Date: Fri, 18 Jul 2025 22:51:59 +0100 Subject: [PATCH 05/49] update type --- src/libs/API/parameters/SetFeedStatementEndDay.ts | 4 +++- src/libs/actions/CompanyCards.ts | 12 +++++++++--- .../WorkspaceCompanyCardsSettingsPage.tsx | 12 +++++++++++- src/types/onyx/CardFeeds.ts | 10 ++++++++-- 4 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/libs/API/parameters/SetFeedStatementEndDay.ts b/src/libs/API/parameters/SetFeedStatementEndDay.ts index 1206538520d7..e97861213792 100644 --- a/src/libs/API/parameters/SetFeedStatementEndDay.ts +++ b/src/libs/API/parameters/SetFeedStatementEndDay.ts @@ -1,9 +1,11 @@ +import type {CompanyCardStatementCloseDate} from '@src/types/onyx/CardFeeds'; + type SetFeedStatementEndDay = { authToken: string | null | undefined; policyID: string; bankName: string; domainAccountID: number; - statementPeriodEndDate: string; + statementPeriodEndDate: CompanyCardStatementCloseDate; }; export default SetFeedStatementEndDay; diff --git a/src/libs/actions/CompanyCards.ts b/src/libs/actions/CompanyCards.ts index 1b9e59de3db4..5e8fa9ed1bc5 100644 --- a/src/libs/actions/CompanyCards.ts +++ b/src/libs/actions/CompanyCards.ts @@ -22,7 +22,7 @@ import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import type {Card, CardFeeds} from '@src/types/onyx'; import type {AssignCard, AssignCardData} from '@src/types/onyx/AssignCard'; -import type {AddNewCardFeedData, AddNewCardFeedStep, CardFeedDetails, CompanyCardFeed} from '@src/types/onyx/CardFeeds'; +import type {AddNewCardFeedData, AddNewCardFeedStep, CardFeedDetails, CompanyCardFeed, CompanyCardStatementCloseDate} from '@src/types/onyx/CardFeeds'; import type {OnyxData} from '@src/types/onyx/Request'; type AddNewCompanyCardFlowData = { @@ -812,7 +812,13 @@ function openPolicyAddCardFeedPage(policyID: string | undefined) { API.write(WRITE_COMMANDS.OPEN_POLICY_ADD_CARD_FEED_PAGE, parameters); } -function setFeedStatementEndDay(policyID: string, bankName: string, domainAccountID: number, newStatementPeriodEndDate: string, oldStatementPeriodEndDate: string) { +function setFeedStatementEndDay( + policyID: string, + bankName: string, + domainAccountID: number, + newStatementPeriodEndDate: CompanyCardStatementCloseDate, + oldStatementPeriodEndDate: CompanyCardStatementCloseDate, +) { const authToken = NetworkStore.getAuthToken(); const optimisticData: OnyxUpdate[] = [ @@ -839,7 +845,7 @@ function setFeedStatementEndDay(policyID: string, bankName: string, domainAccoun statementPeriodEndDate: newStatementPeriodEndDate, }; - API.write(WRITE_COMMANDS.SET_FEED_STATEMENT_END_DAY, parameters); + API.write(WRITE_COMMANDS.SET_FEED_STATEMENT_END_DAY, parameters, {optimisticData}); } export { diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx index 85cc144e483d..06d2519a842b 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx @@ -52,7 +52,17 @@ function WorkspaceCompanyCardsSettingsPage({ const liabilityType = selectedFeedData?.liabilityType; const isPersonal = liabilityType === CONST.COMPANY_CARDS.DELETE_TRANSACTIONS.ALLOW; const domainOrWorkspaceAccountID = getDomainOrWorkspaceAccountID(workspaceAccountID, selectedFeedData); - const statementPeriodEndDay = selectedFeedData?.statementPeriodEndDay; + const statementPeriodEndDay = useMemo(() => { + if (!selectedFeedData?.statementPeriodEndDay) { + return; + } + + if (typeof selectedFeedData.statementPeriodEndDay === 'number') { + return selectedFeedData.statementPeriodEndDay; + } + + return translate(`workspace.companyCards.statementCloseDate.${selectedFeedData.statementPeriodEndDay}`); + }, [selectedFeedData?.statementPeriodEndDay]); const navigateToChangeFeedName = () => { Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS_SETTINGS_FEED_NAME.getRoute(policyID)); diff --git a/src/types/onyx/CardFeeds.ts b/src/types/onyx/CardFeeds.ts index 758447c734e5..431c3c6fe834 100644 --- a/src/types/onyx/CardFeeds.ts +++ b/src/types/onyx/CardFeeds.ts @@ -65,10 +65,13 @@ type CustomCardFeedData = OnyxCommon.OnyxValueWithOfflineFeedback<{ reportTitleFormat?: string; /** Indicates the day when the statement period for this card ends */ - statementPeriodEndDay?: string; + statementPeriodEndDay?: CompanyCardStatementCloseDate; /** Plaid access token */ plaidAccessToken?: string; + + /** Field-specific error messages */ + errorFields?: OnyxCommon.ErrorFields; }>; /** Direct card feed data */ @@ -92,10 +95,13 @@ type DirectCardFeedData = OnyxCommon.OnyxValueWithOfflineFeedback<{ pending?: boolean; /** Indicates the day when the statement period for this card ends */ - statementPeriodEndDay?: string; + statementPeriodEndDay?: CompanyCardStatementCloseDate; /** Plaid access token */ plaidAccessToken?: string; + + /** Field-specific error messages */ + errorFields?: OnyxCommon.ErrorFields; }>; /** Card feed data */ From 2e84c3abc428bfd83e6781b83225d4fe747b355b Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Fri, 18 Jul 2025 22:52:40 +0100 Subject: [PATCH 06/49] ts --- .../companyCards/WorkspaceCompanyCardsSettingsPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx index 06d2519a842b..1c715e74274d 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx @@ -125,7 +125,7 @@ function WorkspaceCompanyCardsSettingsPage({ /> Date: Fri, 18 Jul 2025 22:59:21 +0100 Subject: [PATCH 07/49] update setFeedStatementEndDay --- src/libs/actions/CompanyCards.ts | 48 ++++++++++++++++++- .../WorkspaceCompanyCardsSettingsPage.tsx | 2 +- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/src/libs/actions/CompanyCards.ts b/src/libs/actions/CompanyCards.ts index 5e8fa9ed1bc5..796e7d43ad72 100644 --- a/src/libs/actions/CompanyCards.ts +++ b/src/libs/actions/CompanyCards.ts @@ -830,6 +830,52 @@ function setFeedStatementEndDay( companyCards: { [bankName]: { statementPeriodEndDay: newStatementPeriodEndDate, + pendingFields: { + statementPeriodEndDay: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, + }, + errorFields: { + statementPeriodEndDay: null, + }, + }, + }, + }, + }, + }, + ]; + + const successData: OnyxUpdate[] = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${domainAccountID}`, + value: { + settings: { + companyCards: { + [bankName]: { + pendingFields: { + statementPeriodEndDay: null, + }, + }, + }, + }, + }, + }, + ]; + + const failureData: OnyxUpdate[] = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${domainAccountID}`, + value: { + settings: { + companyCards: { + [bankName]: { + statementPeriodEndDay: oldStatementPeriodEndDate, + pendingFields: { + statementPeriodEndDay: null, + }, + errorFields: { + statementPeriodEndDay: ErrorUtils.getMicroSecondOnyxErrorWithTranslationKey('common.genericErrorMessage'), + }, }, }, }, @@ -845,7 +891,7 @@ function setFeedStatementEndDay( statementPeriodEndDate: newStatementPeriodEndDate, }; - API.write(WRITE_COMMANDS.SET_FEED_STATEMENT_END_DAY, parameters, {optimisticData}); + API.write(WRITE_COMMANDS.SET_FEED_STATEMENT_END_DAY, parameters, {optimisticData, successData, failureData}); } export { diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx index 1c715e74274d..6647de190c06 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx @@ -62,7 +62,7 @@ function WorkspaceCompanyCardsSettingsPage({ } return translate(`workspace.companyCards.statementCloseDate.${selectedFeedData.statementPeriodEndDay}`); - }, [selectedFeedData?.statementPeriodEndDay]); + }, [translate, selectedFeedData?.statementPeriodEndDay]); const navigateToChangeFeedName = () => { Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS_SETTINGS_FEED_NAME.getRoute(policyID)); From 4399910fa0f3508d52256d6d5bb50b3aca212e98 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Fri, 18 Jul 2025 23:09:31 +0100 Subject: [PATCH 08/49] call SetFeedStatementEndDay --- src/libs/actions/CompanyCards.ts | 2 +- .../WorkspaceCompanyCardStatementCloseDatePage.tsx | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/libs/actions/CompanyCards.ts b/src/libs/actions/CompanyCards.ts index 796e7d43ad72..84aa5d9fa885 100644 --- a/src/libs/actions/CompanyCards.ts +++ b/src/libs/actions/CompanyCards.ts @@ -817,7 +817,7 @@ function setFeedStatementEndDay( bankName: string, domainAccountID: number, newStatementPeriodEndDate: CompanyCardStatementCloseDate, - oldStatementPeriodEndDate: CompanyCardStatementCloseDate, + oldStatementPeriodEndDate: CompanyCardStatementCloseDate | null, ) { const authToken = NetworkStore.getAuthToken(); diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx index 17dd17a305df..80aa15a63b2b 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx @@ -3,7 +3,9 @@ import FullScreenLoadingIndicator from '@components/FullscreenLoadingIndicator'; import useCardFeeds from '@hooks/useCardFeeds'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; -import {getSelectedFeed} from '@libs/CardUtils'; +import useWorkspaceAccountID from '@hooks/useWorkspaceAccountID'; +import {setFeedStatementEndDay} from '@libs/actions/CompanyCards'; +import {getCompanyFeeds, getDomainOrWorkspaceAccountID, getSelectedFeed} from '@libs/CardUtils'; import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {SettingsNavigatorParamList} from '@libs/Navigation/types'; @@ -27,18 +29,20 @@ function WorkspaceCompanyCardStatementCloseDatePage({ const [lastSelectedFeed, lastSelectedFeedResult] = useOnyx(`${ONYXKEYS.COLLECTION.LAST_SELECTED_FEED}${policyID}`, {canBeMissing: true}); const [cardFeeds, cardFeedsResult] = useCardFeeds(policyID); const selectedFeed = getSelectedFeed(lastSelectedFeed, cardFeeds); + const workspaceAccountID = useWorkspaceAccountID(policyID); + const companyFeeds = getCompanyFeeds(cardFeeds); + const selectedFeedData = selectedFeed ? companyFeeds[selectedFeed] : undefined; + const domainOrWorkspaceAccountID = getDomainOrWorkspaceAccountID(workspaceAccountID, selectedFeedData); const submit = useCallback( - // s77rt make use of statementCloseDate and remove disable lint rule - // eslint-disable-next-line @typescript-eslint/no-unused-vars (statementCloseDate: CompanyCardStatementCloseDate) => { if (selectedFeed) { - // s77rt call API command + setFeedStatementEndDay(policyID, selectedFeed, domainOrWorkspaceAccountID, statementCloseDate, selectedFeedData?.statementPeriodEndDay ?? null); } Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARDS_SETTINGS.getRoute(policyID)); }, - [policyID, selectedFeed], + [policyID, selectedFeed, selectedFeedData, domainOrWorkspaceAccountID], ); const goBack = useCallback(() => { From 13e04ab751bbde52a1cc23e99f0072cce6babe58 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Fri, 18 Jul 2025 23:12:25 +0100 Subject: [PATCH 09/49] pass default statement date --- .../WorkspaceCompanyCardStatementCloseDatePage.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx index 80aa15a63b2b..3e4f4c5ae3df 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx @@ -33,16 +33,17 @@ function WorkspaceCompanyCardStatementCloseDatePage({ const companyFeeds = getCompanyFeeds(cardFeeds); const selectedFeedData = selectedFeed ? companyFeeds[selectedFeed] : undefined; const domainOrWorkspaceAccountID = getDomainOrWorkspaceAccountID(workspaceAccountID, selectedFeedData); + const statementPeriodEndDay = selectedFeedData?.statementPeriodEndDay; const submit = useCallback( - (statementCloseDate: CompanyCardStatementCloseDate) => { + (newStatementPeriodEndDate: CompanyCardStatementCloseDate) => { if (selectedFeed) { - setFeedStatementEndDay(policyID, selectedFeed, domainOrWorkspaceAccountID, statementCloseDate, selectedFeedData?.statementPeriodEndDay ?? null); + setFeedStatementEndDay(policyID, selectedFeed, domainOrWorkspaceAccountID, newStatementPeriodEndDate, statementPeriodEndDay ?? null); } Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARDS_SETTINGS.getRoute(policyID)); }, - [policyID, selectedFeed, selectedFeedData, domainOrWorkspaceAccountID], + [policyID, selectedFeed, statementPeriodEndDay, domainOrWorkspaceAccountID], ); const goBack = useCallback(() => { @@ -64,6 +65,7 @@ function WorkspaceCompanyCardStatementCloseDatePage({ onSubmit={submit} onBackButtonPress={goBack} enabledWhenOffline + defaultDate={statementPeriodEndDay} /> ); From c649b21d215c048bd0ac77847c703d30f66c2828 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Sat, 19 Jul 2025 00:11:08 +0100 Subject: [PATCH 10/49] added offline and error feedback --- .../WorkspaceCompanyCardsSettingsPage.tsx | 20 +++++++++++-------- src/types/onyx/CardFeeds.ts | 4 ++-- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx index 6647de190c06..9031ca14aa11 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx @@ -5,6 +5,7 @@ import HeaderWithBackButton from '@components/HeaderWithBackButton'; import * as Expensicons from '@components/Icon/Expensicons'; import MenuItem from '@components/MenuItem'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; +import OfflineWithFeedback from '@components/OfflineWithFeedback'; import ScreenWrapper from '@components/ScreenWrapper'; import ScrollView from '@components/ScrollView'; import Text from '@components/Text'; @@ -123,14 +124,17 @@ function WorkspaceCompanyCardsSettingsPage({ titleStyle={styles.flex1} onPress={navigateToChangeFeedName} /> - + + + ; }>; /** Direct card feed data */ @@ -101,7 +101,7 @@ type DirectCardFeedData = OnyxCommon.OnyxValueWithOfflineFeedback<{ plaidAccessToken?: string; /** Field-specific error messages */ - errorFields?: OnyxCommon.ErrorFields; + errorFields?: OnyxCommon.ErrorFields<'statementPeriodEndDay'>; }>; /** Card feed data */ From 5f1ba06b076a8545456d6b018f7830cfa3810359 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Sat, 19 Jul 2025 00:54:33 +0100 Subject: [PATCH 11/49] add offline and error feedback to WorkspaceCompanyCardStatementCloseDatePage --- src/libs/actions/CompanyCards.ts | 17 +++++++- ...spaceCompanyCardStatementCloseDatePage.tsx | 13 +++++- .../index.tsx | 42 +++++++++++++------ 3 files changed, 57 insertions(+), 15 deletions(-) diff --git a/src/libs/actions/CompanyCards.ts b/src/libs/actions/CompanyCards.ts index 84aa5d9fa885..a98591fcb0f3 100644 --- a/src/libs/actions/CompanyCards.ts +++ b/src/libs/actions/CompanyCards.ts @@ -22,7 +22,7 @@ import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import type {Card, CardFeeds} from '@src/types/onyx'; import type {AssignCard, AssignCardData} from '@src/types/onyx/AssignCard'; -import type {AddNewCardFeedData, AddNewCardFeedStep, CardFeedDetails, CompanyCardFeed, CompanyCardStatementCloseDate} from '@src/types/onyx/CardFeeds'; +import type {AddNewCardFeedData, AddNewCardFeedStep, CardFeedData, CardFeedDetails, CompanyCardFeed, CompanyCardStatementCloseDate} from '@src/types/onyx/CardFeeds'; import type {OnyxData} from '@src/types/onyx/Request'; type AddNewCompanyCardFlowData = { @@ -894,6 +894,20 @@ function setFeedStatementEndDay( API.write(WRITE_COMMANDS.SET_FEED_STATEMENT_END_DAY, parameters, {optimisticData, successData, failureData}); } +function clearErrorField(bankName: string, domainAccountID: number, fieldName: keyof CardFeedData) { + Onyx.merge(`${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${domainAccountID}`, { + settings: { + companyCards: { + [bankName]: { + errorFields: { + [fieldName]: null, + }, + }, + }, + }, + }); +} + export { setWorkspaceCompanyCardFeedName, deleteWorkspaceCompanyCardFeed, @@ -915,4 +929,5 @@ export { openPolicyAddCardFeedPage, setTransactionStartDate, setFeedStatementEndDay, + clearErrorField, }; diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx index 3e4f4c5ae3df..b91e8d71f923 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx @@ -4,7 +4,7 @@ import useCardFeeds from '@hooks/useCardFeeds'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import useWorkspaceAccountID from '@hooks/useWorkspaceAccountID'; -import {setFeedStatementEndDay} from '@libs/actions/CompanyCards'; +import {clearErrorField, setFeedStatementEndDay} from '@libs/actions/CompanyCards'; import {getCompanyFeeds, getDomainOrWorkspaceAccountID, getSelectedFeed} from '@libs/CardUtils'; import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; @@ -50,6 +50,14 @@ function WorkspaceCompanyCardStatementCloseDatePage({ Navigation.goBack(); }, []); + const clearError = useCallback(() => { + if (!selectedFeed) { + return; + } + + clearErrorField(selectedFeed, domainOrWorkspaceAccountID, 'statementPeriodEndDay'); + }, [selectedFeed, domainOrWorkspaceAccountID]); + if (isLoadingOnyxValue(cardFeedsResult) || isLoadingOnyxValue(lastSelectedFeedResult)) { return ; } @@ -66,6 +74,9 @@ function WorkspaceCompanyCardStatementCloseDatePage({ onBackButtonPress={goBack} enabledWhenOffline defaultDate={statementPeriodEndDay} + pendingAction={selectedFeedData?.pendingFields?.statementPeriodEndDay} + errors={selectedFeedData?.errorFields?.statementPeriodEndDay} + onCloseError={clearError} /> ); diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx index dd94b1f526fa..f3e1f0b06d01 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx @@ -5,6 +5,7 @@ import FormAlertWithSubmitButton from '@components/FormAlertWithSubmitButton'; import FormHelpMessage from '@components/FormHelpMessage'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; +import OfflineWithFeedback from '@components/OfflineWithFeedback'; import ScreenWrapper from '@components/ScreenWrapper'; import ScrollView from '@components/ScrollView'; import SingleSelectListItem from '@components/SelectionList/SingleSelectListItem'; @@ -14,6 +15,7 @@ import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; import CONST from '@src/CONST'; import type {CompanyCardStatementCloseDate} from '@src/types/onyx/CardFeeds'; +import {Errors, PendingAction} from '@src/types/onyx/OnyxCommon'; import CustomCloseDateSelectionList from './CustomCloseDateSelectionList'; type StatementCloseDateListItem = ListItem & { @@ -26,6 +28,9 @@ type WorkspaceCompanyCardStatementCloseDateSelectionListProps = { onBackButtonPress: () => void; enabledWhenOffline: boolean; defaultDate?: CompanyCardStatementCloseDate; + pendingAction?: PendingAction; + errors?: Errors | null; + onCloseError?: () => void; }; function WorkspaceCompanyCardStatementCloseDateSelectionList({ @@ -34,6 +39,9 @@ function WorkspaceCompanyCardStatementCloseDateSelectionList({ onBackButtonPress, enabledWhenOffline, defaultDate, + pendingAction, + errors, + onCloseError, }: WorkspaceCompanyCardStatementCloseDateSelectionListProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); @@ -127,19 +135,27 @@ function WorkspaceCompanyCardStatementCloseDateSelectionList({ <> {translate('workspace.moreFeatures.companyCards.statementCloseDateDescription')} - - {options} - {typeof selectedDate === 'number' && ( - setIsChoosingCustomDate(true)} - viewMode={CONST.OPTION_MODE.COMPACT} - /> - )} - + + + {options} + {typeof selectedDate === 'number' && ( + setIsChoosingCustomDate(true)} + viewMode={CONST.OPTION_MODE.COMPACT} + /> + )} + + Date: Sat, 19 Jul 2025 00:57:23 +0100 Subject: [PATCH 12/49] lint --- .../index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx index f3e1f0b06d01..4ef9aace2451 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx @@ -15,7 +15,7 @@ import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; import CONST from '@src/CONST'; import type {CompanyCardStatementCloseDate} from '@src/types/onyx/CardFeeds'; -import {Errors, PendingAction} from '@src/types/onyx/OnyxCommon'; +import type {Errors, PendingAction} from '@src/types/onyx/OnyxCommon'; import CustomCloseDateSelectionList from './CustomCloseDateSelectionList'; type StatementCloseDateListItem = ListItem & { From 9066c8fff54c6e382aa80c0c62882e1b5c471756 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Sat, 19 Jul 2025 01:16:27 +0100 Subject: [PATCH 13/49] rename api param to statementEndDay --- src/libs/API/parameters/SetFeedStatementEndDay.ts | 2 +- src/libs/actions/CompanyCards.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/API/parameters/SetFeedStatementEndDay.ts b/src/libs/API/parameters/SetFeedStatementEndDay.ts index e97861213792..8abe15c5c172 100644 --- a/src/libs/API/parameters/SetFeedStatementEndDay.ts +++ b/src/libs/API/parameters/SetFeedStatementEndDay.ts @@ -5,7 +5,7 @@ type SetFeedStatementEndDay = { policyID: string; bankName: string; domainAccountID: number; - statementPeriodEndDate: CompanyCardStatementCloseDate; + statementEndDay: CompanyCardStatementCloseDate; }; export default SetFeedStatementEndDay; diff --git a/src/libs/actions/CompanyCards.ts b/src/libs/actions/CompanyCards.ts index a98591fcb0f3..41d9877f592d 100644 --- a/src/libs/actions/CompanyCards.ts +++ b/src/libs/actions/CompanyCards.ts @@ -888,7 +888,7 @@ function setFeedStatementEndDay( policyID, bankName, domainAccountID, - statementPeriodEndDate: newStatementPeriodEndDate, + statementEndDay: newStatementPeriodEndDate, }; API.write(WRITE_COMMANDS.SET_FEED_STATEMENT_END_DAY, parameters, {optimisticData, successData, failureData}); From 0bea3bf64a539515bb4c927108facde817c366ba Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Mon, 21 Jul 2025 12:46:38 +0100 Subject: [PATCH 14/49] rename to SetFeedStatementPeriodEndDay --- ...Day.ts => SetFeedStatementPeriodEndDay.ts} | 6 +++--- src/libs/API/parameters/index.ts | 2 +- src/libs/API/types.ts | 4 ++-- src/libs/actions/CompanyCards.ts | 20 +++++++++---------- ...spaceCompanyCardStatementCloseDatePage.tsx | 4 ++-- 5 files changed, 18 insertions(+), 18 deletions(-) rename src/libs/API/parameters/{SetFeedStatementEndDay.ts => SetFeedStatementPeriodEndDay.ts} (58%) diff --git a/src/libs/API/parameters/SetFeedStatementEndDay.ts b/src/libs/API/parameters/SetFeedStatementPeriodEndDay.ts similarity index 58% rename from src/libs/API/parameters/SetFeedStatementEndDay.ts rename to src/libs/API/parameters/SetFeedStatementPeriodEndDay.ts index 8abe15c5c172..f0a41f8998b4 100644 --- a/src/libs/API/parameters/SetFeedStatementEndDay.ts +++ b/src/libs/API/parameters/SetFeedStatementPeriodEndDay.ts @@ -1,11 +1,11 @@ import type {CompanyCardStatementCloseDate} from '@src/types/onyx/CardFeeds'; -type SetFeedStatementEndDay = { +type SetFeedStatementPeriodEndDay = { authToken: string | null | undefined; policyID: string; bankName: string; domainAccountID: number; - statementEndDay: CompanyCardStatementCloseDate; + statementPeriodEndDay: CompanyCardStatementCloseDate; }; -export default SetFeedStatementEndDay; +export default SetFeedStatementPeriodEndDay; diff --git a/src/libs/API/parameters/index.ts b/src/libs/API/parameters/index.ts index 61eb7debb218..33b8bf27b42c 100644 --- a/src/libs/API/parameters/index.ts +++ b/src/libs/API/parameters/index.ts @@ -351,7 +351,7 @@ export type {default as DeleteCompanyCardFeed} from './DeleteCompanyCardFeed'; export type {default as SetCompanyCardTransactionLiability} from './SetCompanyCardTransactionLiability'; export type {default as OpenPolicyCompanyCardsFeedParams} from './OpenPolicyCompanyCardsFeedParams'; export type {default as OpenPolicyAddCardFeedPageParams} from './OpenPolicyAddCardFeedPageParams'; -export type {default as SetFeedStatementEndDay} from './SetFeedStatementEndDay'; +export type {default as SetFeedStatementPeriodEndDay} from './SetFeedStatementPeriodEndDay'; export type {default as AssignCompanyCardParams} from './AssignCompanyCardParams'; export type {default as UnassignCompanyCard} from './UnassignCompanyCard'; export type {default as UpdateCompanyCard} from './UpdateCompanyCard'; diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts index 05415b9187dc..3fd091f00259 100644 --- a/src/libs/API/types.ts +++ b/src/libs/API/types.ts @@ -455,7 +455,7 @@ const WRITE_COMMANDS = { DELETE_COMPANY_CARD_FEED: 'RemoveFeed', SET_COMPANY_CARD_TRANSACTION_LIABILITY: 'SetFeedTransactionLiability', OPEN_POLICY_ADD_CARD_FEED_PAGE: 'OpenPolicyAddCardFeedPage', - SET_FEED_STATEMENT_END_DAY: 'SetFeedStatementEndDay', + SET_FEED_STATEMENT_PERIOD_END_DAY: 'SetFeedStatementPeriodEndDay', ASSIGN_COMPANY_CARD: 'AssignCard', UNASSIGN_COMPANY_CARD: 'UnassignCard', UPDATE_COMPANY_CARD: 'SyncCard', @@ -562,7 +562,7 @@ type WriteCommandParameters = { [WRITE_COMMANDS.SET_CARD_EXPORT_ACCOUNT]: Parameters.SetCompanyCardExportAccountParams; [WRITE_COMMANDS.SET_COMPANY_CARD_TRANSACTION_LIABILITY]: Parameters.SetCompanyCardTransactionLiability; [WRITE_COMMANDS.OPEN_POLICY_ADD_CARD_FEED_PAGE]: Parameters.OpenPolicyAddCardFeedPageParams; - [WRITE_COMMANDS.SET_FEED_STATEMENT_END_DAY]: Parameters.SetFeedStatementEndDay; + [WRITE_COMMANDS.SET_FEED_STATEMENT_PERIOD_END_DAY]: Parameters.SetFeedStatementPeriodEndDay; [WRITE_COMMANDS.VERIFY_IDENTITY]: Parameters.VerifyIdentityParams; [WRITE_COMMANDS.ACCEPT_WALLET_TERMS]: Parameters.AcceptWalletTermsParams; [WRITE_COMMANDS.ANSWER_QUESTIONS_FOR_WALLET]: Parameters.AnswerQuestionsForWalletParams; diff --git a/src/libs/actions/CompanyCards.ts b/src/libs/actions/CompanyCards.ts index 41d9877f592d..a73d5703df75 100644 --- a/src/libs/actions/CompanyCards.ts +++ b/src/libs/actions/CompanyCards.ts @@ -8,7 +8,7 @@ import type { OpenPolicyExpensifyCardsPageParams, RequestFeedSetupParams, SetCompanyCardExportAccountParams, - SetFeedStatementEndDay, + SetFeedStatementPeriodEndDay, UpdateCompanyCardNameParams, } from '@libs/API/parameters'; import {READ_COMMANDS, WRITE_COMMANDS} from '@libs/API/types'; @@ -812,12 +812,12 @@ function openPolicyAddCardFeedPage(policyID: string | undefined) { API.write(WRITE_COMMANDS.OPEN_POLICY_ADD_CARD_FEED_PAGE, parameters); } -function setFeedStatementEndDay( +function setFeedStatementPeriodEndDay( policyID: string, bankName: string, domainAccountID: number, - newStatementPeriodEndDate: CompanyCardStatementCloseDate, - oldStatementPeriodEndDate: CompanyCardStatementCloseDate | null, + newStatementPeriodEndDay: CompanyCardStatementCloseDate, + oldStatementPeriodEndDay: CompanyCardStatementCloseDate | null, ) { const authToken = NetworkStore.getAuthToken(); @@ -829,7 +829,7 @@ function setFeedStatementEndDay( settings: { companyCards: { [bankName]: { - statementPeriodEndDay: newStatementPeriodEndDate, + statementPeriodEndDay: newStatementPeriodEndDay, pendingFields: { statementPeriodEndDay: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, }, @@ -869,7 +869,7 @@ function setFeedStatementEndDay( settings: { companyCards: { [bankName]: { - statementPeriodEndDay: oldStatementPeriodEndDate, + statementPeriodEndDay: oldStatementPeriodEndDay, pendingFields: { statementPeriodEndDay: null, }, @@ -883,15 +883,15 @@ function setFeedStatementEndDay( }, ]; - const parameters: SetFeedStatementEndDay = { + const parameters: SetFeedStatementPeriodEndDay = { authToken, policyID, bankName, domainAccountID, - statementEndDay: newStatementPeriodEndDate, + statementPeriodEndDay: newStatementPeriodEndDay, }; - API.write(WRITE_COMMANDS.SET_FEED_STATEMENT_END_DAY, parameters, {optimisticData, successData, failureData}); + API.write(WRITE_COMMANDS.SET_FEED_STATEMENT_PERIOD_END_DAY, parameters, {optimisticData, successData, failureData}); } function clearErrorField(bankName: string, domainAccountID: number, fieldName: keyof CardFeedData) { @@ -928,6 +928,6 @@ export { openAssignFeedCardPage, openPolicyAddCardFeedPage, setTransactionStartDate, - setFeedStatementEndDay, + setFeedStatementPeriodEndDay, clearErrorField, }; diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx index b91e8d71f923..a426ec3793a0 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx @@ -4,7 +4,7 @@ import useCardFeeds from '@hooks/useCardFeeds'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import useWorkspaceAccountID from '@hooks/useWorkspaceAccountID'; -import {clearErrorField, setFeedStatementEndDay} from '@libs/actions/CompanyCards'; +import {clearErrorField, setFeedStatementPeriodEndDay} from '@libs/actions/CompanyCards'; import {getCompanyFeeds, getDomainOrWorkspaceAccountID, getSelectedFeed} from '@libs/CardUtils'; import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; @@ -38,7 +38,7 @@ function WorkspaceCompanyCardStatementCloseDatePage({ const submit = useCallback( (newStatementPeriodEndDate: CompanyCardStatementCloseDate) => { if (selectedFeed) { - setFeedStatementEndDay(policyID, selectedFeed, domainOrWorkspaceAccountID, newStatementPeriodEndDate, statementPeriodEndDay ?? null); + setFeedStatementPeriodEndDay(policyID, selectedFeed, domainOrWorkspaceAccountID, newStatementPeriodEndDate, statementPeriodEndDay ?? null); } Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARDS_SETTINGS.getRoute(policyID)); From d9dedf2d4d4e7b6ef4f0cf1a0156b9ca5ed401bc Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Mon, 21 Jul 2025 13:00:52 +0100 Subject: [PATCH 15/49] rename param --- .../WorkspaceCompanyCardStatementCloseDatePage.tsx | 4 ++-- .../workspace/companyCards/addNew/StatementCloseDateStep.tsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx index a426ec3793a0..eaf13bd5fef4 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx @@ -36,9 +36,9 @@ function WorkspaceCompanyCardStatementCloseDatePage({ const statementPeriodEndDay = selectedFeedData?.statementPeriodEndDay; const submit = useCallback( - (newStatementPeriodEndDate: CompanyCardStatementCloseDate) => { + (newStatementPeriodEndDay: CompanyCardStatementCloseDate) => { if (selectedFeed) { - setFeedStatementPeriodEndDay(policyID, selectedFeed, domainOrWorkspaceAccountID, newStatementPeriodEndDate, statementPeriodEndDay ?? null); + setFeedStatementPeriodEndDay(policyID, selectedFeed, domainOrWorkspaceAccountID, newStatementPeriodEndDay, statementPeriodEndDay ?? null); } Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARDS_SETTINGS.getRoute(policyID)); diff --git a/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx b/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx index c0ddb4fcdf4b..b469248afcd9 100644 --- a/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx +++ b/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx @@ -26,9 +26,9 @@ function StatementCloseDateStep({policyID}: StatementCloseDateStepProps) { const isPlaid = isBetaEnabled(CONST.BETAS.PLAID_COMPANY_CARDS) && !!addNewCard?.data?.publicToken; const submit = useCallback( - // s77rt make use of statementCloseDate and remove disable lint rule + // s77rt make use of statementPeriodEndDay and remove disable lint rule // eslint-disable-next-line @typescript-eslint/no-unused-vars - (statementCloseDate: CompanyCardStatementCloseDate) => { + (statementPeriodEndDay: CompanyCardStatementCloseDate) => { if (isPlaid) { setAddNewCompanyCardStepAndData({ step: CONST.COMPANY_CARDS.STEP.BANK_CONNECTION, From d8be3a382bfe72195f2fca73c350df506c4757b0 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Mon, 21 Jul 2025 13:03:47 +0100 Subject: [PATCH 16/49] change error position --- .../index.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx index 4ef9aace2451..decd5fcc7569 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx @@ -137,10 +137,9 @@ function WorkspaceCompanyCardStatementCloseDateSelectionList({ {translate('workspace.moreFeatures.companyCards.statementCloseDateDescription')} {options} From bfb3328c5b438f9a969097831002e568f9c77157 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Mon, 21 Jul 2025 14:15:57 +0100 Subject: [PATCH 17/49] pass statementPeriodEndDay to ImportPlaidAccounts --- src/hooks/useImportPlaidAccounts.ts | 5 +++-- src/libs/API/parameters/ImportPlaidAccountsParams.ts | 3 +++ src/libs/actions/Plaid.ts | 12 +++++++++++- .../companyCards/addNew/PlaidConnectionStep.tsx | 1 + .../companyCards/addNew/StatementCloseDateStep.tsx | 3 +-- src/types/onyx/CardFeeds.ts | 3 +++ 6 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/hooks/useImportPlaidAccounts.ts b/src/hooks/useImportPlaidAccounts.ts index f0dc26d4b7fc..dd4b2da8d1a7 100644 --- a/src/hooks/useImportPlaidAccounts.ts +++ b/src/hooks/useImportPlaidAccounts.ts @@ -13,11 +13,12 @@ export default function useImportPlaidAccounts(policyID?: string) { const plaidFeedName = addNewCard?.data?.plaidConnectedFeedName ?? assignCard?.data?.plaidConnectedFeedName; const plaidAccounts = addNewCard?.data?.plaidAccounts ?? assignCard?.data?.plaidAccounts; const country = addNewCard?.data?.selectedCountry; + const statementPeriodEndDay = addNewCard?.data?.statementPeriodEndDay; return useCallback(() => { if (!policyID || !plaidToken || !plaidFeed || !plaidFeedName || !country || !plaidAccounts?.length) { return; } - importPlaidAccounts(plaidToken, plaidFeed, plaidFeedName, country, getDomainNameForPolicy(policyID), JSON.stringify(plaidAccounts)); - }, [country, plaidAccounts, plaidFeed, plaidFeedName, plaidToken, policyID]); + importPlaidAccounts(plaidToken, plaidFeed, plaidFeedName, country, getDomainNameForPolicy(policyID), JSON.stringify(plaidAccounts), statementPeriodEndDay); + }, [statementPeriodEndDay, country, plaidAccounts, plaidFeed, plaidFeedName, plaidToken, policyID]); } diff --git a/src/libs/API/parameters/ImportPlaidAccountsParams.ts b/src/libs/API/parameters/ImportPlaidAccountsParams.ts index 7fa34843dcf5..e9af4d78830c 100644 --- a/src/libs/API/parameters/ImportPlaidAccountsParams.ts +++ b/src/libs/API/parameters/ImportPlaidAccountsParams.ts @@ -1,3 +1,5 @@ +import type {CompanyCardStatementCloseDate} from '@src/types/onyx/CardFeeds'; + type ImportPlaidAccountsParams = { publicToken: string; feed: string; @@ -5,6 +7,7 @@ type ImportPlaidAccountsParams = { country: string; domainName: string; plaidAccounts: string; + statementPeriodEndDay?: CompanyCardStatementCloseDate; }; export default ImportPlaidAccountsParams; diff --git a/src/libs/actions/Plaid.ts b/src/libs/actions/Plaid.ts index 8190a1fcf9af..59f25b35a750 100644 --- a/src/libs/actions/Plaid.ts +++ b/src/libs/actions/Plaid.ts @@ -6,6 +6,7 @@ import {READ_COMMANDS, WRITE_COMMANDS} from '@libs/API/types'; import getPlaidLinkTokenParameters from '@libs/getPlaidLinkTokenParameters'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; +import type {CompanyCardStatementCloseDate} from '@src/types/onyx/CardFeeds'; /** * Gets the Plaid Link token used to initialize the Plaid SDK @@ -116,7 +117,15 @@ function openPlaidBankAccountSelector(publicToken: string, bankName: string, all }); } -function importPlaidAccounts(publicToken: string, feed: string, feedName: string, country: string, domainName: string, plaidAccounts: string) { +function importPlaidAccounts( + publicToken: string, + feed: string, + feedName: string, + country: string, + domainName: string, + plaidAccounts: string, + statementPeriodEndDay: CompanyCardStatementCloseDate | undefined, +) { const parameters: ImportPlaidAccountsParams = { publicToken, feed, @@ -124,6 +133,7 @@ function importPlaidAccounts(publicToken: string, feed: string, feedName: string country, domainName, plaidAccounts, + statementPeriodEndDay, }; API.write(WRITE_COMMANDS.IMPORT_PLAID_ACCOUNTS, parameters); diff --git a/src/pages/workspace/companyCards/addNew/PlaidConnectionStep.tsx b/src/pages/workspace/companyCards/addNew/PlaidConnectionStep.tsx index 68e1cb1950b0..105d946d0697 100644 --- a/src/pages/workspace/companyCards/addNew/PlaidConnectionStep.tsx +++ b/src/pages/workspace/companyCards/addNew/PlaidConnectionStep.tsx @@ -134,6 +134,7 @@ function PlaidConnectionStep({feed, policyID}: {feed?: CompanyCardFeed; policyID addNewCard.data.selectedCountry, getDomainNameForPolicy(policyID), JSON.stringify(metadata?.accounts), + addNewCard.data.statementPeriodEndDay, ); InteractionManager.runAfterInteractions(() => { setAssignCardStepAndData({ diff --git a/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx b/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx index b469248afcd9..9a5d53c8192b 100644 --- a/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx +++ b/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx @@ -26,12 +26,11 @@ function StatementCloseDateStep({policyID}: StatementCloseDateStepProps) { const isPlaid = isBetaEnabled(CONST.BETAS.PLAID_COMPANY_CARDS) && !!addNewCard?.data?.publicToken; const submit = useCallback( - // s77rt make use of statementPeriodEndDay and remove disable lint rule - // eslint-disable-next-line @typescript-eslint/no-unused-vars (statementPeriodEndDay: CompanyCardStatementCloseDate) => { if (isPlaid) { setAddNewCompanyCardStepAndData({ step: CONST.COMPANY_CARDS.STEP.BANK_CONNECTION, + data: {statementPeriodEndDay}, }); return; } diff --git a/src/types/onyx/CardFeeds.ts b/src/types/onyx/CardFeeds.ts index fcb19061e1b6..0f979db0860c 100644 --- a/src/types/onyx/CardFeeds.ts +++ b/src/types/onyx/CardFeeds.ts @@ -142,6 +142,9 @@ type AddNewCardFeedData = { /** Name of the card */ cardTitle: string; + /** The day when the statement period for this feed ends */ + statementPeriodEndDay?: CompanyCardStatementCloseDate; + /** Selected bank */ selectedBank: ValueOf | null; From afc5e09ac1b6c79473031cd824d8662518903cd1 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Mon, 21 Jul 2025 14:19:22 +0100 Subject: [PATCH 18/49] remove dev lock in plaid step and always redirect to statement step --- .../workspace/companyCards/addNew/PlaidConnectionStep.tsx | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/pages/workspace/companyCards/addNew/PlaidConnectionStep.tsx b/src/pages/workspace/companyCards/addNew/PlaidConnectionStep.tsx index 105d946d0697..fe0366c5b372 100644 --- a/src/pages/workspace/companyCards/addNew/PlaidConnectionStep.tsx +++ b/src/pages/workspace/companyCards/addNew/PlaidConnectionStep.tsx @@ -7,7 +7,6 @@ import HeaderWithBackButton from '@components/HeaderWithBackButton'; import PlaidLink from '@components/PlaidLink'; import ScreenWrapper from '@components/ScreenWrapper'; import Text from '@components/Text'; -import useEnvironment from '@hooks/useEnvironment'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import useOnyx from '@hooks/useOnyx'; @@ -27,7 +26,6 @@ import type {CompanyCardFeed} from '@src/types/onyx'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; function PlaidConnectionStep({feed, policyID}: {feed?: CompanyCardFeed; policyID?: string}) { - const {isDevelopment} = useEnvironment(); const {translate} = useLocalize(); const styles = useThemeStyles(); const theme = useTheme(); @@ -44,9 +42,6 @@ function PlaidConnectionStep({feed, policyID}: {feed?: CompanyCardFeed; policyID const {isOffline} = useNetwork(); const domain = getDomainNameForPolicy(policyID); - // s77rt remove DEV lock - const shouldSelectStatementCloseDate = isDevelopment; - const isAuthenticatedWithPlaid = useCallback(() => !!plaidData?.bankAccounts?.length || !isEmptyObject(plaidData?.errors), [plaidData]); /** @@ -162,7 +157,7 @@ function PlaidConnectionStep({feed, policyID}: {feed?: CompanyCardFeed; policyID } setAddNewCompanyCardStepAndData({ - step: shouldSelectStatementCloseDate ? CONST.COMPANY_CARDS.STEP.SELECT_STATEMENT_CLOSE_DATE : CONST.COMPANY_CARDS.STEP.BANK_CONNECTION, + step: CONST.COMPANY_CARDS.STEP.SELECT_STATEMENT_CLOSE_DATE, data: { publicToken, plaidConnectedFeed, From 89898d5ef90470e1089750e35bfc7308f80fd155 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Mon, 21 Jul 2025 14:35:18 +0100 Subject: [PATCH 19/49] Pass statementPeriodEndDay to RequestFeedSetup --- src/libs/API/parameters/RequestFeedSetupParams.ts | 3 +++ src/libs/actions/CompanyCards.ts | 10 +++++++++- .../workspace/companyCards/addNew/DetailsStep.tsx | 15 ++------------- .../addNew/StatementCloseDateStep.tsx | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/libs/API/parameters/RequestFeedSetupParams.ts b/src/libs/API/parameters/RequestFeedSetupParams.ts index 98e22c611efd..8065bb769ebb 100644 --- a/src/libs/API/parameters/RequestFeedSetupParams.ts +++ b/src/libs/API/parameters/RequestFeedSetupParams.ts @@ -1,8 +1,11 @@ +import type {CompanyCardStatementCloseDate} from '@src/types/onyx/CardFeeds'; + type RequestFeedSetupParams = { authToken: string; policyID: string; feedDetails: string; feedType: string; + statementPeriodEndDay: CompanyCardStatementCloseDate; }; export default RequestFeedSetupParams; diff --git a/src/libs/actions/CompanyCards.ts b/src/libs/actions/CompanyCards.ts index a73d5703df75..4605b5270e28 100644 --- a/src/libs/actions/CompanyCards.ts +++ b/src/libs/actions/CompanyCards.ts @@ -59,7 +59,14 @@ function clearAddNewCardFlow() { }); } -function addNewCompanyCardsFeed(policyID: string | undefined, cardFeed: CompanyCardFeed, feedDetails: CardFeedDetails, cardFeeds: OnyxEntry, lastSelectedFeed?: CompanyCardFeed) { +function addNewCompanyCardsFeed( + policyID: string | undefined, + cardFeed: CompanyCardFeed, + feedDetails: CardFeedDetails, + cardFeeds: OnyxEntry, + statementPeriodEndDay: CompanyCardStatementCloseDate, + lastSelectedFeed?: CompanyCardFeed, +) { const authToken = NetworkStore.getAuthToken(); const workspaceAccountID = PolicyUtils.getWorkspaceAccountID(policyID); @@ -135,6 +142,7 @@ function addNewCompanyCardsFeed(policyID: string | undefined, cardFeed: CompanyC feedDetails: Object.entries(feedDetails) .map(([key, value]) => `${key}: ${value}`) .join(', '), + statementPeriodEndDay, }; API.write(WRITE_COMMANDS.REQUEST_FEED_SETUP, parameters, {optimisticData, failureData, successData, finallyData}); diff --git a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx index 9d98f557ddf3..26832ea621a2 100644 --- a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx +++ b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx @@ -12,7 +12,6 @@ import TextInput from '@components/TextInput'; import TextLink from '@components/TextLink'; import useAutoFocusInput from '@hooks/useAutoFocusInput'; import useCardFeeds from '@hooks/useCardFeeds'; -import useEnvironment from '@hooks/useEnvironment'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import useTheme from '@hooks/useTheme'; @@ -36,7 +35,6 @@ function DetailsStep({policyID}: DetailsStepProps) { const theme = useTheme(); const styles = useThemeStyles(); const {inputCallbackRef} = useAutoFocusInput(); - const {isDevelopment} = useEnvironment(); const [addNewCard] = useOnyx(ONYXKEYS.ADD_NEW_COMPANY_CARD, {canBeMissing: false}); const [lastSelectedFeed] = useOnyx(`${ONYXKEYS.COLLECTION.LAST_SELECTED_FEED}${policyID}`, {canBeMissing: true}); @@ -48,9 +46,6 @@ function DetailsStep({policyID}: DetailsStepProps) { const bank = addNewCard?.data?.selectedBank; const isOtherBankSelected = bank === CONST.COMPANY_CARDS.BANKS.OTHER; - // s77rt remove DEV lock - const shouldSelectStatementCloseDate = isDevelopment; - const submit = (values: FormOnyxValues) => { if (!addNewCard?.data) { return; @@ -61,13 +56,7 @@ function DetailsStep({policyID}: DetailsStepProps) { bankName: addNewCard.data.bankName ?? 'Amex', }; - if (shouldSelectStatementCloseDate) { - setAddNewCompanyCardStepAndData({step: CONST.COMPANY_CARDS.STEP.SELECT_STATEMENT_CLOSE_DATE, data: {feedDetails}}); - return; - } - - addNewCompanyCardsFeed(policyID, addNewCard.data.feedType, feedDetails, cardFeeds, lastSelectedFeed); - Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(policyID)); + setAddNewCompanyCardStepAndData({step: CONST.COMPANY_CARDS.STEP.SELECT_STATEMENT_CLOSE_DATE, data: {feedDetails}}); }; const handleBackButtonPress = () => { @@ -211,7 +200,7 @@ function DetailsStep({policyID}: DetailsStepProps) { /> Date: Mon, 21 Jul 2025 14:44:44 +0100 Subject: [PATCH 20/49] optimistically set statementPeriodEndDay --- src/libs/actions/CompanyCards.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libs/actions/CompanyCards.ts b/src/libs/actions/CompanyCards.ts index 4605b5270e28..47c2a7d4e299 100644 --- a/src/libs/actions/CompanyCards.ts +++ b/src/libs/actions/CompanyCards.ts @@ -90,6 +90,7 @@ function addNewCompanyCardsFeed( settings: { companyCards: { [feedType]: { + statementPeriodEndDay, errors: null, }, }, From 629dc2f1bc7432b00dcbc46659b819d76fe1ffda Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Mon, 21 Jul 2025 14:46:12 +0100 Subject: [PATCH 21/49] lint --- src/pages/workspace/companyCards/addNew/DetailsStep.tsx | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx index 26832ea621a2..c8811629dba7 100644 --- a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx +++ b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx @@ -11,18 +11,15 @@ import Text from '@components/Text'; import TextInput from '@components/TextInput'; import TextLink from '@components/TextLink'; import useAutoFocusInput from '@hooks/useAutoFocusInput'; -import useCardFeeds from '@hooks/useCardFeeds'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import {getFieldRequiredErrors} from '@libs/ValidationUtils'; -import Navigation from '@navigation/Navigation'; import variables from '@styles/variables'; -import {addNewCompanyCardsFeed, setAddNewCompanyCardStepAndData} from '@userActions/CompanyCards'; +import {setAddNewCompanyCardStepAndData} from '@userActions/CompanyCards'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import ROUTES from '@src/ROUTES'; import INPUT_IDS from '@src/types/form/AddNewCardFeedForm'; type DetailsStepProps = { @@ -37,9 +34,6 @@ function DetailsStep({policyID}: DetailsStepProps) { const {inputCallbackRef} = useAutoFocusInput(); const [addNewCard] = useOnyx(ONYXKEYS.ADD_NEW_COMPANY_CARD, {canBeMissing: false}); - const [lastSelectedFeed] = useOnyx(`${ONYXKEYS.COLLECTION.LAST_SELECTED_FEED}${policyID}`, {canBeMissing: true}); - - const [cardFeeds] = useCardFeeds(policyID); const feedProvider = addNewCard?.data?.feedType; const isStripeFeedProvider = feedProvider === CONST.COMPANY_CARD.FEED_BANK_NAME.STRIPE; From e9b964bcf20b870cdeb82e62120615b16c3d3f8b Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Mon, 21 Jul 2025 14:51:38 +0100 Subject: [PATCH 22/49] remove unnecessary param --- src/pages/workspace/companyCards/addNew/AddNewCardPage.tsx | 2 +- src/pages/workspace/companyCards/addNew/DetailsStep.tsx | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/pages/workspace/companyCards/addNew/AddNewCardPage.tsx b/src/pages/workspace/companyCards/addNew/AddNewCardPage.tsx index 0f7f31b20a3e..4781bcb9d674 100644 --- a/src/pages/workspace/companyCards/addNew/AddNewCardPage.tsx +++ b/src/pages/workspace/companyCards/addNew/AddNewCardPage.tsx @@ -79,7 +79,7 @@ function AddNewCardPage({policy}: WithPolicyAndFullscreenLoadingProps) { case CONST.COMPANY_CARDS.STEP.CARD_NAME: return ; case CONST.COMPANY_CARDS.STEP.CARD_DETAILS: - return ; + return ; case CONST.COMPANY_CARDS.STEP.AMEX_CUSTOM_FEED: return ; case CONST.COMPANY_CARDS.STEP.PLAID_CONNECTION: diff --git a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx index c8811629dba7..67b55602d284 100644 --- a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx +++ b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx @@ -22,12 +22,7 @@ import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import INPUT_IDS from '@src/types/form/AddNewCardFeedForm'; -type DetailsStepProps = { - /** ID of the current policy */ - policyID: string | undefined; -}; - -function DetailsStep({policyID}: DetailsStepProps) { +function DetailsStep() { const {translate} = useLocalize(); const theme = useTheme(); const styles = useThemeStyles(); From 57fe52ef5060832649572b678515bbd6149e963b Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Mon, 21 Jul 2025 19:05:07 +0100 Subject: [PATCH 23/49] add statement dev lock for existing card feeds --- .../WorkspaceCompanyCardsSettingsPage.tsx | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx index 9031ca14aa11..12b9976ff7ba 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx @@ -11,6 +11,7 @@ import ScrollView from '@components/ScrollView'; import Text from '@components/Text'; import useCardFeeds from '@hooks/useCardFeeds'; import useCardsList from '@hooks/useCardsList'; +import useEnvironment from '@hooks/useEnvironment'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import usePolicy from '@hooks/usePolicy'; @@ -35,6 +36,7 @@ function WorkspaceCompanyCardsSettingsPage({ params: {policyID}, }, }: WorkspaceCompanyCardsSettingsPageProps) { + const {isDevelopment} = useEnvironment(); const styles = useThemeStyles(); const {translate} = useLocalize(); const policy = usePolicy(policyID); @@ -65,6 +67,9 @@ function WorkspaceCompanyCardsSettingsPage({ return translate(`workspace.companyCards.statementCloseDate.${selectedFeedData.statementPeriodEndDay}`); }, [translate, selectedFeedData?.statementPeriodEndDay]); + // s77rt remove DEV lock + const shouldShowStatementCloseDate = isDevelopment; + const navigateToChangeFeedName = () => { Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS_SETTINGS_FEED_NAME.getRoute(policyID)); }; @@ -124,17 +129,19 @@ function WorkspaceCompanyCardsSettingsPage({ titleStyle={styles.flex1} onPress={navigateToChangeFeedName} /> - - - + {shouldShowStatementCloseDate && ( + + + + )} Date: Mon, 21 Jul 2025 19:07:45 +0100 Subject: [PATCH 24/49] add statement dev lock for new direct-with-plaid card feeds --- .../workspace/companyCards/addNew/PlaidConnectionStep.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/pages/workspace/companyCards/addNew/PlaidConnectionStep.tsx b/src/pages/workspace/companyCards/addNew/PlaidConnectionStep.tsx index fe0366c5b372..105d946d0697 100644 --- a/src/pages/workspace/companyCards/addNew/PlaidConnectionStep.tsx +++ b/src/pages/workspace/companyCards/addNew/PlaidConnectionStep.tsx @@ -7,6 +7,7 @@ import HeaderWithBackButton from '@components/HeaderWithBackButton'; import PlaidLink from '@components/PlaidLink'; import ScreenWrapper from '@components/ScreenWrapper'; import Text from '@components/Text'; +import useEnvironment from '@hooks/useEnvironment'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import useOnyx from '@hooks/useOnyx'; @@ -26,6 +27,7 @@ import type {CompanyCardFeed} from '@src/types/onyx'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; function PlaidConnectionStep({feed, policyID}: {feed?: CompanyCardFeed; policyID?: string}) { + const {isDevelopment} = useEnvironment(); const {translate} = useLocalize(); const styles = useThemeStyles(); const theme = useTheme(); @@ -42,6 +44,9 @@ function PlaidConnectionStep({feed, policyID}: {feed?: CompanyCardFeed; policyID const {isOffline} = useNetwork(); const domain = getDomainNameForPolicy(policyID); + // s77rt remove DEV lock + const shouldSelectStatementCloseDate = isDevelopment; + const isAuthenticatedWithPlaid = useCallback(() => !!plaidData?.bankAccounts?.length || !isEmptyObject(plaidData?.errors), [plaidData]); /** @@ -157,7 +162,7 @@ function PlaidConnectionStep({feed, policyID}: {feed?: CompanyCardFeed; policyID } setAddNewCompanyCardStepAndData({ - step: CONST.COMPANY_CARDS.STEP.SELECT_STATEMENT_CLOSE_DATE, + step: shouldSelectStatementCloseDate ? CONST.COMPANY_CARDS.STEP.SELECT_STATEMENT_CLOSE_DATE : CONST.COMPANY_CARDS.STEP.BANK_CONNECTION, data: { publicToken, plaidConnectedFeed, From de7d6f8971ec4f0d627163d97a51486e2f86ac0d Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Mon, 21 Jul 2025 19:16:52 +0100 Subject: [PATCH 25/49] add statement dev lock for new commercial card feeds --- .../API/parameters/RequestFeedSetupParams.ts | 2 +- src/libs/actions/CompanyCards.ts | 2 +- .../companyCards/addNew/AddNewCardPage.tsx | 2 +- .../companyCards/addNew/DetailsStep.tsx | 28 ++++++++++++++++--- 4 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/libs/API/parameters/RequestFeedSetupParams.ts b/src/libs/API/parameters/RequestFeedSetupParams.ts index 8065bb769ebb..3b6d397e7a35 100644 --- a/src/libs/API/parameters/RequestFeedSetupParams.ts +++ b/src/libs/API/parameters/RequestFeedSetupParams.ts @@ -5,7 +5,7 @@ type RequestFeedSetupParams = { policyID: string; feedDetails: string; feedType: string; - statementPeriodEndDay: CompanyCardStatementCloseDate; + statementPeriodEndDay?: CompanyCardStatementCloseDate; }; export default RequestFeedSetupParams; diff --git a/src/libs/actions/CompanyCards.ts b/src/libs/actions/CompanyCards.ts index 47c2a7d4e299..ecf9f1d0947d 100644 --- a/src/libs/actions/CompanyCards.ts +++ b/src/libs/actions/CompanyCards.ts @@ -64,7 +64,7 @@ function addNewCompanyCardsFeed( cardFeed: CompanyCardFeed, feedDetails: CardFeedDetails, cardFeeds: OnyxEntry, - statementPeriodEndDay: CompanyCardStatementCloseDate, + statementPeriodEndDay: CompanyCardStatementCloseDate | undefined, lastSelectedFeed?: CompanyCardFeed, ) { const authToken = NetworkStore.getAuthToken(); diff --git a/src/pages/workspace/companyCards/addNew/AddNewCardPage.tsx b/src/pages/workspace/companyCards/addNew/AddNewCardPage.tsx index 4781bcb9d674..0f7f31b20a3e 100644 --- a/src/pages/workspace/companyCards/addNew/AddNewCardPage.tsx +++ b/src/pages/workspace/companyCards/addNew/AddNewCardPage.tsx @@ -79,7 +79,7 @@ function AddNewCardPage({policy}: WithPolicyAndFullscreenLoadingProps) { case CONST.COMPANY_CARDS.STEP.CARD_NAME: return ; case CONST.COMPANY_CARDS.STEP.CARD_DETAILS: - return ; + return ; case CONST.COMPANY_CARDS.STEP.AMEX_CUSTOM_FEED: return ; case CONST.COMPANY_CARDS.STEP.PLAID_CONNECTION: diff --git a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx index 67b55602d284..ba0b293421fa 100644 --- a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx +++ b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx @@ -11,30 +11,44 @@ import Text from '@components/Text'; import TextInput from '@components/TextInput'; import TextLink from '@components/TextLink'; import useAutoFocusInput from '@hooks/useAutoFocusInput'; +import useCardFeeds from '@hooks/useCardFeeds'; +import useEnvironment from '@hooks/useEnvironment'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import {getFieldRequiredErrors} from '@libs/ValidationUtils'; +import Navigation from '@navigation/Navigation'; import variables from '@styles/variables'; -import {setAddNewCompanyCardStepAndData} from '@userActions/CompanyCards'; +import {addNewCompanyCardsFeed, setAddNewCompanyCardStepAndData} from '@userActions/CompanyCards'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; +import ROUTES from '@src/ROUTES'; import INPUT_IDS from '@src/types/form/AddNewCardFeedForm'; -function DetailsStep() { +type DetailsStepProps = { + /** ID of the current policy */ + policyID: string | undefined; +}; +function DetailsStep({policyID}: DetailsStepProps) { const {translate} = useLocalize(); const theme = useTheme(); const styles = useThemeStyles(); const {inputCallbackRef} = useAutoFocusInput(); + const {isDevelopment} = useEnvironment(); const [addNewCard] = useOnyx(ONYXKEYS.ADD_NEW_COMPANY_CARD, {canBeMissing: false}); + const [lastSelectedFeed] = useOnyx(`${ONYXKEYS.COLLECTION.LAST_SELECTED_FEED}${policyID}`, {canBeMissing: true}); + const [cardFeeds] = useCardFeeds(policyID); const feedProvider = addNewCard?.data?.feedType; const isStripeFeedProvider = feedProvider === CONST.COMPANY_CARD.FEED_BANK_NAME.STRIPE; const bank = addNewCard?.data?.selectedBank; const isOtherBankSelected = bank === CONST.COMPANY_CARDS.BANKS.OTHER; + // s77rt remove DEV lock + const shouldSelectStatementCloseDate = isDevelopment; + const submit = (values: FormOnyxValues) => { if (!addNewCard?.data) { return; @@ -45,7 +59,13 @@ function DetailsStep() { bankName: addNewCard.data.bankName ?? 'Amex', }; - setAddNewCompanyCardStepAndData({step: CONST.COMPANY_CARDS.STEP.SELECT_STATEMENT_CLOSE_DATE, data: {feedDetails}}); + if (shouldSelectStatementCloseDate) { + setAddNewCompanyCardStepAndData({step: CONST.COMPANY_CARDS.STEP.SELECT_STATEMENT_CLOSE_DATE, data: {feedDetails}}); + return; + } + + addNewCompanyCardsFeed(policyID, addNewCard.data.feedType, feedDetails, cardFeeds, undefined, lastSelectedFeed); + Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(policyID)); }; const handleBackButtonPress = () => { @@ -189,7 +209,7 @@ function DetailsStep() { /> Date: Mon, 21 Jul 2025 19:20:41 +0100 Subject: [PATCH 26/49] empty lines for readability --- src/pages/workspace/companyCards/addNew/DetailsStep.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx index ba0b293421fa..19bfa7966c19 100644 --- a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx +++ b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx @@ -30,6 +30,7 @@ type DetailsStepProps = { /** ID of the current policy */ policyID: string | undefined; }; + function DetailsStep({policyID}: DetailsStepProps) { const {translate} = useLocalize(); const theme = useTheme(); @@ -41,6 +42,7 @@ function DetailsStep({policyID}: DetailsStepProps) { const [lastSelectedFeed] = useOnyx(`${ONYXKEYS.COLLECTION.LAST_SELECTED_FEED}${policyID}`, {canBeMissing: true}); const [cardFeeds] = useCardFeeds(policyID); + const feedProvider = addNewCard?.data?.feedType; const isStripeFeedProvider = feedProvider === CONST.COMPANY_CARD.FEED_BANK_NAME.STRIPE; const bank = addNewCard?.data?.selectedBank; From ab6c63fd5f4d22dfde99116f7c8c4043025e355e Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Thu, 24 Jul 2025 01:36:43 +0100 Subject: [PATCH 27/49] revert the one-state usage and use two states again in CompanyCardStatementCloseDate --- .../index.tsx | 109 +++++++++--------- src/types/onyx/CardFeeds.ts | 37 ++++-- 2 files changed, 82 insertions(+), 64 deletions(-) diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx index decd5fcc7569..331d31868111 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx @@ -1,5 +1,6 @@ import React, {useCallback, useMemo, useState} from 'react'; import {View} from 'react-native'; +import {ValueOf} from 'type-fest'; import FixedFooter from '@components/FixedFooter'; import FormAlertWithSubmitButton from '@components/FormAlertWithSubmitButton'; import FormHelpMessage from '@components/FormHelpMessage'; @@ -14,20 +15,23 @@ import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; import CONST from '@src/CONST'; -import type {CompanyCardStatementCloseDate} from '@src/types/onyx/CardFeeds'; +import type {StatementPeriodEnd, StatementPeriodEndDay} from '@src/types/onyx/CardFeeds'; import type {Errors, PendingAction} from '@src/types/onyx/OnyxCommon'; import CustomCloseDateSelectionList from './CustomCloseDateSelectionList'; +type CompanyCardStatementCloseDate = ValueOf; + type StatementCloseDateListItem = ListItem & { value: CompanyCardStatementCloseDate; }; type WorkspaceCompanyCardStatementCloseDateSelectionListProps = { confirmText: string; - onSubmit: (statementCloseDate: CompanyCardStatementCloseDate) => void; + onSubmit: (statementPeriodEnd: StatementPeriodEnd | undefined, statementPeriodEndDay: StatementPeriodEndDay | undefined) => void; onBackButtonPress: () => void; enabledWhenOffline: boolean; - defaultDate?: CompanyCardStatementCloseDate; + defaultStatementPeriodEnd?: StatementPeriodEnd; + defaultStatementPeriodEndDay?: StatementPeriodEndDay; pendingAction?: PendingAction; errors?: Errors | null; onCloseError?: () => void; @@ -38,7 +42,8 @@ function WorkspaceCompanyCardStatementCloseDateSelectionList({ onSubmit, onBackButtonPress, enabledWhenOffline, - defaultDate, + defaultStatementPeriodEnd, + defaultStatementPeriodEndDay, pendingAction, errors, onCloseError, @@ -46,7 +51,13 @@ function WorkspaceCompanyCardStatementCloseDateSelectionList({ const {translate} = useLocalize(); const styles = useThemeStyles(); - const [selectedDate, setSelectedDate] = useState(defaultDate); + const [selectedDate, setSelectedDate] = useState(() => { + if (defaultStatementPeriodEndDay) { + return CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH; + } + return defaultStatementPeriodEnd; + }); + const [selectedCustomDate, setSelectedCustomDate] = useState(defaultStatementPeriodEndDay); const [isChoosingCustomDate, setIsChoosingCustomDate] = useState(false); const [error, setError] = useState(undefined); @@ -64,52 +75,38 @@ function WorkspaceCompanyCardStatementCloseDateSelectionList({ onBackButtonPress(); }, [isChoosingCustomDate, onBackButtonPress]); + const selectDateAndClearError = useCallback((item: StatementCloseDateListItem) => { + setSelectedDate(item.value); + setError(undefined); + }, []); + + const selectCustomDateAndClearError = useCallback( + (day: number) => { + setSelectedCustomDate(day); + setError(undefined); + goBack(); + }, + [goBack], + ); + const submit = useCallback(() => { if (!selectedDate) { setError(translate('workspace.moreFeatures.companyCards.error.statementCloseDateRequired')); return; } - onSubmit(selectedDate); - }, [selectedDate, onSubmit, translate]); - - const options = useMemo(() => { - return Object.values(CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE)?.map((option) => { - let value: CompanyCardStatementCloseDate; - let isSelected: boolean; - - if (option === CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH) { - if (typeof selectedDate === 'number') { - value = selectedDate; - } else if (typeof defaultDate === 'number') { - value = defaultDate; - } else { - value = NaN; - } - isSelected = typeof selectedDate === 'number'; - } else { - value = option; - isSelected = selectedDate === option; + if (selectedDate === CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH) { + if (!selectedCustomDate) { + setError(translate('workspace.moreFeatures.companyCards.error.statementCloseDateRequired')); + return; } - return ( - { - setSelectedDate(item.value); - setError(undefined); - }} - /> - ); - }); - }, [translate, defaultDate, selectedDate, styles.flexReset]); + onSubmit(undefined, selectedCustomDate); + return; + } + + onSubmit(selectedDate, undefined); + }, [selectedDate, selectedCustomDate, onSubmit, translate]); return ( {isChoosingCustomDate ? ( { - setSelectedDate(day); - setError(undefined); - goBack(); - }} + initiallySelectedDay={selectedCustomDate} + onConfirmSelectedDay={selectCustomDateAndClearError} /> ) : ( <> @@ -142,12 +135,24 @@ function WorkspaceCompanyCardStatementCloseDateSelectionList({ pendingAction={pendingAction} > - {options} - {typeof selectedDate === 'number' && ( + {Object.values(CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE)?.map((option) => ( + + ))} + {selectedDate === CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH && ( setIsChoosingCustomDate(true)} viewMode={CONST.OPTION_MODE.COMPACT} diff --git a/src/types/onyx/CardFeeds.ts b/src/types/onyx/CardFeeds.ts index 0f979db0860c..1a561d5488d2 100644 --- a/src/types/onyx/CardFeeds.ts +++ b/src/types/onyx/CardFeeds.ts @@ -4,15 +4,18 @@ import type {ValueOf} from 'type-fest'; import type CONST from '@src/CONST'; import type * as OnyxCommon from './OnyxCommon'; -/** Card statement close date */ -type CompanyCardStatementCloseDate = Exclude, typeof CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH> | number; - /** Card feed */ type CompanyCardFeed = ValueOf; /** Custom card feed with a number */ type CompanyCardFeedWithNumber = CompanyCardFeed | `${CompanyCardFeed}${number}`; +/** Statement period end */ +type StatementPeriodEnd = Exclude, typeof CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH>; + +/** Statement period end day */ +type StatementPeriodEndDay = number; + /** Card feed provider */ type CardFeedProvider = | typeof CONST.COMPANY_CARD.FEED_BANK_NAME.MASTER_CARD @@ -64,14 +67,17 @@ type CustomCardFeedData = OnyxCommon.OnyxValueWithOfflineFeedback<{ /** Specifies the format for the report title related to this card */ reportTitleFormat?: string; - /** Indicates the day when the statement period for this card ends */ - statementPeriodEndDay?: CompanyCardStatementCloseDate; + /** Indicates the day (preset value) when the statement period for this card ends */ + statementPeriodEnd?: StatementPeriodEnd; + + /** Indicates the day (custom day) when the statement period for this card ends */ + statementPeriodEndDay?: StatementPeriodEndDay; /** Plaid access token */ plaidAccessToken?: string; /** Field-specific error messages */ - errorFields?: OnyxCommon.ErrorFields<'statementPeriodEndDay'>; + errorFields?: OnyxCommon.ErrorFields<'statementPeriodEnd' | 'statementPeriodEndDay'>; }>; /** Direct card feed data */ @@ -94,14 +100,17 @@ type DirectCardFeedData = OnyxCommon.OnyxValueWithOfflineFeedback<{ /** Whether any actions are pending */ pending?: boolean; - /** Indicates the day when the statement period for this card ends */ - statementPeriodEndDay?: CompanyCardStatementCloseDate; + /** Indicates the day (preset value) when the statement period for this card ends */ + statementPeriodEnd?: StatementPeriodEnd; + + /** Indicates the day (custom day) when the statement period for this card ends */ + statementPeriodEndDay?: StatementPeriodEndDay; /** Plaid access token */ plaidAccessToken?: string; /** Field-specific error messages */ - errorFields?: OnyxCommon.ErrorFields<'statementPeriodEndDay'>; + errorFields?: OnyxCommon.ErrorFields<'statementPeriodEnd' | 'statementPeriodEndDay'>; }>; /** Card feed data */ @@ -142,8 +151,11 @@ type AddNewCardFeedData = { /** Name of the card */ cardTitle: string; - /** The day when the statement period for this feed ends */ - statementPeriodEndDay?: CompanyCardStatementCloseDate; + /** Indicates the day (preset value) when the statement period for this card ends */ + statementPeriodEnd?: StatementPeriodEnd; + + /** Indicates the day (custom day) when the statement period for this card ends */ + statementPeriodEndDay?: StatementPeriodEndDay; /** Selected bank */ selectedBank: ValueOf | null; @@ -205,5 +217,6 @@ export type { CompanyCardNicknames, CompanyCardFeedWithNumber, FundID, - CompanyCardStatementCloseDate, + StatementPeriodEnd, + StatementPeriodEndDay, }; From 453e2bea0cadeb3ea9e86b3ad2edab99532caf30 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Thu, 24 Jul 2025 01:43:29 +0100 Subject: [PATCH 28/49] correct param file name --- ...tPeriodEndDay.ts => SetFeedStatementPeriodEndDayParams.ts} | 4 ++-- src/libs/API/parameters/index.ts | 2 +- src/libs/API/types.ts | 2 +- src/libs/actions/CompanyCards.ts | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) rename src/libs/API/parameters/{SetFeedStatementPeriodEndDay.ts => SetFeedStatementPeriodEndDayParams.ts} (72%) diff --git a/src/libs/API/parameters/SetFeedStatementPeriodEndDay.ts b/src/libs/API/parameters/SetFeedStatementPeriodEndDayParams.ts similarity index 72% rename from src/libs/API/parameters/SetFeedStatementPeriodEndDay.ts rename to src/libs/API/parameters/SetFeedStatementPeriodEndDayParams.ts index f0a41f8998b4..82ea78bc6a92 100644 --- a/src/libs/API/parameters/SetFeedStatementPeriodEndDay.ts +++ b/src/libs/API/parameters/SetFeedStatementPeriodEndDayParams.ts @@ -1,6 +1,6 @@ import type {CompanyCardStatementCloseDate} from '@src/types/onyx/CardFeeds'; -type SetFeedStatementPeriodEndDay = { +type SetFeedStatementPeriodEndDayParams = { authToken: string | null | undefined; policyID: string; bankName: string; @@ -8,4 +8,4 @@ type SetFeedStatementPeriodEndDay = { statementPeriodEndDay: CompanyCardStatementCloseDate; }; -export default SetFeedStatementPeriodEndDay; +export default SetFeedStatementPeriodEndDayParams; diff --git a/src/libs/API/parameters/index.ts b/src/libs/API/parameters/index.ts index 33b8bf27b42c..44010770404f 100644 --- a/src/libs/API/parameters/index.ts +++ b/src/libs/API/parameters/index.ts @@ -351,7 +351,7 @@ export type {default as DeleteCompanyCardFeed} from './DeleteCompanyCardFeed'; export type {default as SetCompanyCardTransactionLiability} from './SetCompanyCardTransactionLiability'; export type {default as OpenPolicyCompanyCardsFeedParams} from './OpenPolicyCompanyCardsFeedParams'; export type {default as OpenPolicyAddCardFeedPageParams} from './OpenPolicyAddCardFeedPageParams'; -export type {default as SetFeedStatementPeriodEndDay} from './SetFeedStatementPeriodEndDay'; +export type {default as SetFeedStatementPeriodEndDayParams} from './SetFeedStatementPeriodEndDayParams'; export type {default as AssignCompanyCardParams} from './AssignCompanyCardParams'; export type {default as UnassignCompanyCard} from './UnassignCompanyCard'; export type {default as UpdateCompanyCard} from './UpdateCompanyCard'; diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts index 6f09965002d1..d6d1a68cc7c6 100644 --- a/src/libs/API/types.ts +++ b/src/libs/API/types.ts @@ -562,7 +562,7 @@ type WriteCommandParameters = { [WRITE_COMMANDS.SET_CARD_EXPORT_ACCOUNT]: Parameters.SetCompanyCardExportAccountParams; [WRITE_COMMANDS.SET_COMPANY_CARD_TRANSACTION_LIABILITY]: Parameters.SetCompanyCardTransactionLiability; [WRITE_COMMANDS.OPEN_POLICY_ADD_CARD_FEED_PAGE]: Parameters.OpenPolicyAddCardFeedPageParams; - [WRITE_COMMANDS.SET_FEED_STATEMENT_PERIOD_END_DAY]: Parameters.SetFeedStatementPeriodEndDay; + [WRITE_COMMANDS.SET_FEED_STATEMENT_PERIOD_END_DAY]: Parameters.SetFeedStatementPeriodEndDayParams; [WRITE_COMMANDS.VERIFY_IDENTITY]: Parameters.VerifyIdentityParams; [WRITE_COMMANDS.ACCEPT_WALLET_TERMS]: Parameters.AcceptWalletTermsParams; [WRITE_COMMANDS.ANSWER_QUESTIONS_FOR_WALLET]: Parameters.AnswerQuestionsForWalletParams; diff --git a/src/libs/actions/CompanyCards.ts b/src/libs/actions/CompanyCards.ts index ecf9f1d0947d..1f7f63faa3cc 100644 --- a/src/libs/actions/CompanyCards.ts +++ b/src/libs/actions/CompanyCards.ts @@ -8,7 +8,7 @@ import type { OpenPolicyExpensifyCardsPageParams, RequestFeedSetupParams, SetCompanyCardExportAccountParams, - SetFeedStatementPeriodEndDay, + SetFeedStatementPeriodEndDayParams, UpdateCompanyCardNameParams, } from '@libs/API/parameters'; import {READ_COMMANDS, WRITE_COMMANDS} from '@libs/API/types'; @@ -892,7 +892,7 @@ function setFeedStatementPeriodEndDay( }, ]; - const parameters: SetFeedStatementPeriodEndDay = { + const parameters: SetFeedStatementPeriodEndDayParams = { authToken, policyID, bankName, From 766a76156f1d44d5355986649dccfe40c79786e4 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Thu, 24 Jul 2025 14:01:34 +0100 Subject: [PATCH 29/49] update API params --- .../parameters/ImportPlaidAccountsParams.ts | 5 +++-- .../API/parameters/RequestFeedSetupParams.ts | 5 +++-- .../SetFeedStatementPeriodEndDayParams.ts | 5 +++-- src/libs/actions/CompanyCards.ts | 21 +++++++++++++++---- src/libs/actions/Plaid.ts | 6 ++++-- 5 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/libs/API/parameters/ImportPlaidAccountsParams.ts b/src/libs/API/parameters/ImportPlaidAccountsParams.ts index e9af4d78830c..a03a1cc541f5 100644 --- a/src/libs/API/parameters/ImportPlaidAccountsParams.ts +++ b/src/libs/API/parameters/ImportPlaidAccountsParams.ts @@ -1,4 +1,4 @@ -import type {CompanyCardStatementCloseDate} from '@src/types/onyx/CardFeeds'; +import type {StatementPeriodEnd, StatementPeriodEndDay} from '@src/types/onyx/CardFeeds'; type ImportPlaidAccountsParams = { publicToken: string; @@ -7,7 +7,8 @@ type ImportPlaidAccountsParams = { country: string; domainName: string; plaidAccounts: string; - statementPeriodEndDay?: CompanyCardStatementCloseDate; + statementPeriodEnd?: StatementPeriodEnd; + statementPeriodEndDay?: StatementPeriodEndDay; }; export default ImportPlaidAccountsParams; diff --git a/src/libs/API/parameters/RequestFeedSetupParams.ts b/src/libs/API/parameters/RequestFeedSetupParams.ts index 3b6d397e7a35..3474e7b89dd9 100644 --- a/src/libs/API/parameters/RequestFeedSetupParams.ts +++ b/src/libs/API/parameters/RequestFeedSetupParams.ts @@ -1,11 +1,12 @@ -import type {CompanyCardStatementCloseDate} from '@src/types/onyx/CardFeeds'; +import type {StatementPeriodEnd, StatementPeriodEndDay} from '@src/types/onyx/CardFeeds'; type RequestFeedSetupParams = { authToken: string; policyID: string; feedDetails: string; feedType: string; - statementPeriodEndDay?: CompanyCardStatementCloseDate; + statementPeriodEnd?: StatementPeriodEnd; + statementPeriodEndDay?: StatementPeriodEndDay; }; export default RequestFeedSetupParams; diff --git a/src/libs/API/parameters/SetFeedStatementPeriodEndDayParams.ts b/src/libs/API/parameters/SetFeedStatementPeriodEndDayParams.ts index 82ea78bc6a92..90af69922877 100644 --- a/src/libs/API/parameters/SetFeedStatementPeriodEndDayParams.ts +++ b/src/libs/API/parameters/SetFeedStatementPeriodEndDayParams.ts @@ -1,11 +1,12 @@ -import type {CompanyCardStatementCloseDate} from '@src/types/onyx/CardFeeds'; +import type {StatementPeriodEnd, StatementPeriodEndDay} from '@src/types/onyx/CardFeeds'; type SetFeedStatementPeriodEndDayParams = { authToken: string | null | undefined; policyID: string; bankName: string; domainAccountID: number; - statementPeriodEndDay: CompanyCardStatementCloseDate; + statementPeriodEnd: StatementPeriodEnd | undefined; + statementPeriodEndDay: StatementPeriodEndDay | undefined; }; export default SetFeedStatementPeriodEndDayParams; diff --git a/src/libs/actions/CompanyCards.ts b/src/libs/actions/CompanyCards.ts index 1f7f63faa3cc..7fbdb1e816aa 100644 --- a/src/libs/actions/CompanyCards.ts +++ b/src/libs/actions/CompanyCards.ts @@ -22,7 +22,7 @@ import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import type {Card, CardFeeds} from '@src/types/onyx'; import type {AssignCard, AssignCardData} from '@src/types/onyx/AssignCard'; -import type {AddNewCardFeedData, AddNewCardFeedStep, CardFeedData, CardFeedDetails, CompanyCardFeed, CompanyCardStatementCloseDate} from '@src/types/onyx/CardFeeds'; +import type {AddNewCardFeedData, AddNewCardFeedStep, CardFeedData, CardFeedDetails, CompanyCardFeed, StatementPeriodEnd, StatementPeriodEndDay} from '@src/types/onyx/CardFeeds'; import type {OnyxData} from '@src/types/onyx/Request'; type AddNewCompanyCardFlowData = { @@ -64,7 +64,8 @@ function addNewCompanyCardsFeed( cardFeed: CompanyCardFeed, feedDetails: CardFeedDetails, cardFeeds: OnyxEntry, - statementPeriodEndDay: CompanyCardStatementCloseDate | undefined, + statementPeriodEnd: StatementPeriodEnd | undefined, + statementPeriodEndDay: StatementPeriodEndDay | undefined, lastSelectedFeed?: CompanyCardFeed, ) { const authToken = NetworkStore.getAuthToken(); @@ -90,6 +91,7 @@ function addNewCompanyCardsFeed( settings: { companyCards: { [feedType]: { + statementPeriodEnd, statementPeriodEndDay, errors: null, }, @@ -143,6 +145,7 @@ function addNewCompanyCardsFeed( feedDetails: Object.entries(feedDetails) .map(([key, value]) => `${key}: ${value}`) .join(', '), + statementPeriodEnd, statementPeriodEndDay, }; @@ -825,8 +828,10 @@ function setFeedStatementPeriodEndDay( policyID: string, bankName: string, domainAccountID: number, - newStatementPeriodEndDay: CompanyCardStatementCloseDate, - oldStatementPeriodEndDay: CompanyCardStatementCloseDate | null, + newStatementPeriodEnd: StatementPeriodEnd, + oldStatementPeriodEnd: StatementPeriodEnd | null, + newStatementPeriodEndDay: StatementPeriodEndDay, + oldStatementPeriodEndDay: StatementPeriodEndDay | null, ) { const authToken = NetworkStore.getAuthToken(); @@ -838,11 +843,14 @@ function setFeedStatementPeriodEndDay( settings: { companyCards: { [bankName]: { + statementPeriodEnd: newStatementPeriodEnd, statementPeriodEndDay: newStatementPeriodEndDay, pendingFields: { + statementPeriodEnd: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, statementPeriodEndDay: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, }, errorFields: { + statementPeriodEnd: null, statementPeriodEndDay: null, }, }, @@ -861,6 +869,7 @@ function setFeedStatementPeriodEndDay( companyCards: { [bankName]: { pendingFields: { + statementPeriodEnd: null, statementPeriodEndDay: null, }, }, @@ -878,11 +887,14 @@ function setFeedStatementPeriodEndDay( settings: { companyCards: { [bankName]: { + statementPeriodEnd: oldStatementPeriodEnd, statementPeriodEndDay: oldStatementPeriodEndDay, pendingFields: { + statementPeriodEnd: null, statementPeriodEndDay: null, }, errorFields: { + statementPeriodEnd: ErrorUtils.getMicroSecondOnyxErrorWithTranslationKey('common.genericErrorMessage'), statementPeriodEndDay: ErrorUtils.getMicroSecondOnyxErrorWithTranslationKey('common.genericErrorMessage'), }, }, @@ -897,6 +909,7 @@ function setFeedStatementPeriodEndDay( policyID, bankName, domainAccountID, + statementPeriodEnd: newStatementPeriodEnd, statementPeriodEndDay: newStatementPeriodEndDay, }; diff --git a/src/libs/actions/Plaid.ts b/src/libs/actions/Plaid.ts index 59f25b35a750..b9dd3df186db 100644 --- a/src/libs/actions/Plaid.ts +++ b/src/libs/actions/Plaid.ts @@ -6,7 +6,7 @@ import {READ_COMMANDS, WRITE_COMMANDS} from '@libs/API/types'; import getPlaidLinkTokenParameters from '@libs/getPlaidLinkTokenParameters'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import type {CompanyCardStatementCloseDate} from '@src/types/onyx/CardFeeds'; +import type {StatementPeriodEnd, StatementPeriodEndDay} from '@src/types/onyx/CardFeeds'; /** * Gets the Plaid Link token used to initialize the Plaid SDK @@ -124,7 +124,8 @@ function importPlaidAccounts( country: string, domainName: string, plaidAccounts: string, - statementPeriodEndDay: CompanyCardStatementCloseDate | undefined, + statementPeriodEnd: StatementPeriodEnd | undefined, + statementPeriodEndDay: StatementPeriodEndDay | undefined, ) { const parameters: ImportPlaidAccountsParams = { publicToken, @@ -133,6 +134,7 @@ function importPlaidAccounts( country, domainName, plaidAccounts, + statementPeriodEnd, statementPeriodEndDay, }; From 9acb5e4f685a53995e937d50d0ac73421f8377bb Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Thu, 24 Jul 2025 14:17:33 +0100 Subject: [PATCH 30/49] update addNewCompanyCardsFeed calls --- src/libs/actions/CompanyCards.ts | 4 ++-- .../workspace/companyCards/addNew/DetailsStep.tsx | 2 +- .../companyCards/addNew/StatementCloseDateStep.tsx | 11 ++++++----- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/libs/actions/CompanyCards.ts b/src/libs/actions/CompanyCards.ts index 7fbdb1e816aa..9b6826c1daab 100644 --- a/src/libs/actions/CompanyCards.ts +++ b/src/libs/actions/CompanyCards.ts @@ -1,4 +1,4 @@ -import type {OnyxEntry, OnyxUpdate} from 'react-native-onyx'; +import type {NullishDeep, OnyxEntry, OnyxUpdate} from 'react-native-onyx'; import Onyx from 'react-native-onyx'; import * as API from '@libs/API'; import type { @@ -48,7 +48,7 @@ function clearAssignCardStepAndData() { Onyx.set(ONYXKEYS.ASSIGN_CARD, {}); } -function setAddNewCompanyCardStepAndData({data, isEditing, step}: AddNewCompanyCardFlowData) { +function setAddNewCompanyCardStepAndData({data, isEditing, step}: NullishDeep) { Onyx.merge(ONYXKEYS.ADD_NEW_COMPANY_CARD, {data, isEditing, currentStep: step}); } diff --git a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx index 19bfa7966c19..dfc5f91b73d3 100644 --- a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx +++ b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx @@ -66,7 +66,7 @@ function DetailsStep({policyID}: DetailsStepProps) { return; } - addNewCompanyCardsFeed(policyID, addNewCard.data.feedType, feedDetails, cardFeeds, undefined, lastSelectedFeed); + addNewCompanyCardsFeed(policyID, addNewCard.data.feedType, feedDetails, cardFeeds, undefined, undefined, lastSelectedFeed); Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(policyID)); }; diff --git a/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx b/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx index 8c54d433992a..045b784c01d5 100644 --- a/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx +++ b/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx @@ -9,7 +9,7 @@ import WorkspaceCompanyCardStatementCloseDateSelectionList from '@pages/workspac import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; -import type {CompanyCardStatementCloseDate} from '@src/types/onyx/CardFeeds'; +import type {StatementPeriodEnd, StatementPeriodEndDay} from '@src/types/onyx/CardFeeds'; type StatementCloseDateStepProps = { /** ID of the current policy */ @@ -26,17 +26,18 @@ function StatementCloseDateStep({policyID}: StatementCloseDateStepProps) { const isPlaid = isBetaEnabled(CONST.BETAS.PLAID_COMPANY_CARDS) && !!addNewCard?.data?.publicToken; const submit = useCallback( - (statementPeriodEndDay: CompanyCardStatementCloseDate) => { + (statementPeriodEnd: StatementPeriodEnd | undefined, statementPeriodEndDay: StatementPeriodEndDay | undefined) => { if (isPlaid) { setAddNewCompanyCardStepAndData({ step: CONST.COMPANY_CARDS.STEP.BANK_CONNECTION, - data: {statementPeriodEndDay}, + // Fallback to null to clear old value (if any) because `undefined` is a no-op in Onyx.merge + data: {statementPeriodEnd: statementPeriodEnd ?? null, statementPeriodEndDay: statementPeriodEndDay ?? null}, }); return; } if (addNewCard?.data.feedDetails) { - addNewCompanyCardsFeed(policyID, addNewCard.data.feedType, addNewCard.data.feedDetails, cardFeeds, statementPeriodEndDay, lastSelectedFeed); + addNewCompanyCardsFeed(policyID, addNewCard.data.feedType, addNewCard.data.feedDetails, cardFeeds, statementPeriodEnd, statementPeriodEndDay, lastSelectedFeed); Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(policyID)); } }, @@ -53,7 +54,7 @@ function StatementCloseDateStep({policyID}: StatementCloseDateStepProps) { onSubmit={submit} onBackButtonPress={goBack} enabledWhenOffline={false} - defaultDate={CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH} + defaultStatementPeriodEnd={CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH} /> ); } From a6f8dd7d9a59ac1abd4412ede80ce98f80ea5348 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Thu, 24 Jul 2025 14:20:21 +0100 Subject: [PATCH 31/49] update importPlaidAccounts calls --- src/hooks/useImportPlaidAccounts.ts | 5 +++-- .../workspace/companyCards/addNew/PlaidConnectionStep.tsx | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/hooks/useImportPlaidAccounts.ts b/src/hooks/useImportPlaidAccounts.ts index dd4b2da8d1a7..4a4de355374a 100644 --- a/src/hooks/useImportPlaidAccounts.ts +++ b/src/hooks/useImportPlaidAccounts.ts @@ -13,12 +13,13 @@ export default function useImportPlaidAccounts(policyID?: string) { const plaidFeedName = addNewCard?.data?.plaidConnectedFeedName ?? assignCard?.data?.plaidConnectedFeedName; const plaidAccounts = addNewCard?.data?.plaidAccounts ?? assignCard?.data?.plaidAccounts; const country = addNewCard?.data?.selectedCountry; + const statementPeriodEnd = addNewCard?.data?.statementPeriodEnd; const statementPeriodEndDay = addNewCard?.data?.statementPeriodEndDay; return useCallback(() => { if (!policyID || !plaidToken || !plaidFeed || !plaidFeedName || !country || !plaidAccounts?.length) { return; } - importPlaidAccounts(plaidToken, plaidFeed, plaidFeedName, country, getDomainNameForPolicy(policyID), JSON.stringify(plaidAccounts), statementPeriodEndDay); - }, [statementPeriodEndDay, country, plaidAccounts, plaidFeed, plaidFeedName, plaidToken, policyID]); + importPlaidAccounts(plaidToken, plaidFeed, plaidFeedName, country, getDomainNameForPolicy(policyID), JSON.stringify(plaidAccounts), statementPeriodEnd, statementPeriodEndDay); + }, [statementPeriodEnd, statementPeriodEndDay, country, plaidAccounts, plaidFeed, plaidFeedName, plaidToken, policyID]); } diff --git a/src/pages/workspace/companyCards/addNew/PlaidConnectionStep.tsx b/src/pages/workspace/companyCards/addNew/PlaidConnectionStep.tsx index 105d946d0697..43a3c3121203 100644 --- a/src/pages/workspace/companyCards/addNew/PlaidConnectionStep.tsx +++ b/src/pages/workspace/companyCards/addNew/PlaidConnectionStep.tsx @@ -134,6 +134,7 @@ function PlaidConnectionStep({feed, policyID}: {feed?: CompanyCardFeed; policyID addNewCard.data.selectedCountry, getDomainNameForPolicy(policyID), JSON.stringify(metadata?.accounts), + addNewCard.data.statementPeriodEnd, addNewCard.data.statementPeriodEndDay, ); InteractionManager.runAfterInteractions(() => { From 02f28f3628ba86fdd520882f73028f31b4f4dc41 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Thu, 24 Jul 2025 14:34:24 +0100 Subject: [PATCH 32/49] update setFeedStatementPeriodEndDay calls --- src/libs/actions/CompanyCards.ts | 20 +++++++++---------- ...spaceCompanyCardStatementCloseDatePage.tsx | 12 ++++++----- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/libs/actions/CompanyCards.ts b/src/libs/actions/CompanyCards.ts index 9b6826c1daab..6232a1e03c5e 100644 --- a/src/libs/actions/CompanyCards.ts +++ b/src/libs/actions/CompanyCards.ts @@ -91,8 +91,8 @@ function addNewCompanyCardsFeed( settings: { companyCards: { [feedType]: { - statementPeriodEnd, - statementPeriodEndDay, + statementPeriodEnd: statementPeriodEnd ?? null, + statementPeriodEndDay: statementPeriodEndDay ?? null, errors: null, }, }, @@ -828,10 +828,10 @@ function setFeedStatementPeriodEndDay( policyID: string, bankName: string, domainAccountID: number, - newStatementPeriodEnd: StatementPeriodEnd, - oldStatementPeriodEnd: StatementPeriodEnd | null, - newStatementPeriodEndDay: StatementPeriodEndDay, - oldStatementPeriodEndDay: StatementPeriodEndDay | null, + newStatementPeriodEnd: StatementPeriodEnd | undefined, + oldStatementPeriodEnd: StatementPeriodEnd | undefined, + newStatementPeriodEndDay: StatementPeriodEndDay | undefined, + oldStatementPeriodEndDay: StatementPeriodEndDay | undefined, ) { const authToken = NetworkStore.getAuthToken(); @@ -843,8 +843,8 @@ function setFeedStatementPeriodEndDay( settings: { companyCards: { [bankName]: { - statementPeriodEnd: newStatementPeriodEnd, - statementPeriodEndDay: newStatementPeriodEndDay, + statementPeriodEnd: newStatementPeriodEnd ?? null, + statementPeriodEndDay: newStatementPeriodEndDay ?? null, pendingFields: { statementPeriodEnd: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, statementPeriodEndDay: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, @@ -887,8 +887,8 @@ function setFeedStatementPeriodEndDay( settings: { companyCards: { [bankName]: { - statementPeriodEnd: oldStatementPeriodEnd, - statementPeriodEndDay: oldStatementPeriodEndDay, + statementPeriodEnd: oldStatementPeriodEnd ?? null, + statementPeriodEndDay: oldStatementPeriodEndDay ?? null, pendingFields: { statementPeriodEnd: null, statementPeriodEndDay: null, diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx index eaf13bd5fef4..ca93dd055ee1 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx @@ -14,7 +14,7 @@ import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import type SCREENS from '@src/SCREENS'; -import type {CompanyCardStatementCloseDate} from '@src/types/onyx/CardFeeds'; +import type {StatementPeriodEnd, StatementPeriodEndDay} from '@src/types/onyx/CardFeeds'; import isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue'; import WorkspaceCompanyCardStatementCloseDateSelectionList from './WorkspaceCompanyCardStatementCloseDateSelectionList'; @@ -33,17 +33,18 @@ function WorkspaceCompanyCardStatementCloseDatePage({ const companyFeeds = getCompanyFeeds(cardFeeds); const selectedFeedData = selectedFeed ? companyFeeds[selectedFeed] : undefined; const domainOrWorkspaceAccountID = getDomainOrWorkspaceAccountID(workspaceAccountID, selectedFeedData); + const statementPeriodEnd = selectedFeedData?.statementPeriodEnd; const statementPeriodEndDay = selectedFeedData?.statementPeriodEndDay; const submit = useCallback( - (newStatementPeriodEndDay: CompanyCardStatementCloseDate) => { + (newStatementPeriodEnd: StatementPeriodEnd | undefined, newStatementPeriodEndDay: StatementPeriodEndDay | undefined) => { if (selectedFeed) { - setFeedStatementPeriodEndDay(policyID, selectedFeed, domainOrWorkspaceAccountID, newStatementPeriodEndDay, statementPeriodEndDay ?? null); + setFeedStatementPeriodEndDay(policyID, selectedFeed, domainOrWorkspaceAccountID, newStatementPeriodEnd, statementPeriodEnd, newStatementPeriodEndDay, statementPeriodEndDay); } Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARDS_SETTINGS.getRoute(policyID)); }, - [policyID, selectedFeed, statementPeriodEndDay, domainOrWorkspaceAccountID], + [policyID, selectedFeed, statementPeriodEnd, statementPeriodEndDay, domainOrWorkspaceAccountID], ); const goBack = useCallback(() => { @@ -73,7 +74,8 @@ function WorkspaceCompanyCardStatementCloseDatePage({ onSubmit={submit} onBackButtonPress={goBack} enabledWhenOffline - defaultDate={statementPeriodEndDay} + defaultStatementPeriodEnd={statementPeriodEnd} + defaultStatementPeriodEndDay={statementPeriodEndDay} pendingAction={selectedFeedData?.pendingFields?.statementPeriodEndDay} errors={selectedFeedData?.errorFields?.statementPeriodEndDay} onCloseError={clearError} From c4a5d1c7d906f1b840c7eaeb6d3ee92722b553c0 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Thu, 24 Jul 2025 14:39:36 +0100 Subject: [PATCH 33/49] update statement display value --- .../WorkspaceCompanyCardsSettingsPage.tsx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx index 12b9976ff7ba..4f94d0b93628 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx @@ -55,17 +55,17 @@ function WorkspaceCompanyCardsSettingsPage({ const liabilityType = selectedFeedData?.liabilityType; const isPersonal = liabilityType === CONST.COMPANY_CARDS.DELETE_TRANSACTIONS.ALLOW; const domainOrWorkspaceAccountID = getDomainOrWorkspaceAccountID(workspaceAccountID, selectedFeedData); - const statementPeriodEndDay = useMemo(() => { - if (!selectedFeedData?.statementPeriodEndDay) { - return; + const statementCloseDate = useMemo(() => { + if (selectedFeedData?.statementPeriodEndDay) { + return selectedFeedData.statementPeriodEndDay; } - if (typeof selectedFeedData.statementPeriodEndDay === 'number') { - return selectedFeedData.statementPeriodEndDay; + if (selectedFeedData?.statementPeriodEnd) { + return translate(`workspace.companyCards.statementCloseDate.${selectedFeedData.statementPeriodEnd}`); } - return translate(`workspace.companyCards.statementCloseDate.${selectedFeedData.statementPeriodEndDay}`); - }, [translate, selectedFeedData?.statementPeriodEndDay]); + return undefined; + }, [translate, selectedFeedData?.statementPeriodEnd, selectedFeedData?.statementPeriodEndDay]); // s77rt remove DEV lock const shouldShowStatementCloseDate = isDevelopment; @@ -133,7 +133,7 @@ function WorkspaceCompanyCardsSettingsPage({ Date: Thu, 24 Jul 2025 14:42:09 +0100 Subject: [PATCH 34/49] update error and pending fields values --- .../WorkspaceCompanyCardStatementCloseDatePage.tsx | 4 ++-- .../companyCards/WorkspaceCompanyCardsSettingsPage.tsx | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx index ca93dd055ee1..a42302c0bb36 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx @@ -76,8 +76,8 @@ function WorkspaceCompanyCardStatementCloseDatePage({ enabledWhenOffline defaultStatementPeriodEnd={statementPeriodEnd} defaultStatementPeriodEndDay={statementPeriodEndDay} - pendingAction={selectedFeedData?.pendingFields?.statementPeriodEndDay} - errors={selectedFeedData?.errorFields?.statementPeriodEndDay} + pendingAction={selectedFeedData?.pendingFields?.statementPeriodEndDay ?? selectedFeedData?.pendingFields?.statementPeriodEnd} + errors={selectedFeedData?.errorFields?.statementPeriodEndDay ?? selectedFeedData?.errorFields?.statementPeriodEnd} onCloseError={clearError} /> diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx index 4f94d0b93628..ee0b89221fbe 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx @@ -130,7 +130,7 @@ function WorkspaceCompanyCardsSettingsPage({ onPress={navigateToChangeFeedName} /> {shouldShowStatementCloseDate && ( - + )} From f7d7dd4c03e4624a9f54a2aa8e6b18756bf99e87 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Thu, 24 Jul 2025 14:50:19 +0100 Subject: [PATCH 35/49] update statementPeriodEnd values --- src/CONST/index.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/CONST/index.ts b/src/CONST/index.ts index 877ab223ab73..440e98fe6765 100755 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -3246,9 +3246,9 @@ const CONST = { ALLOW: 'personal', }, STATEMENT_CLOSE_DATE: { - LAST_DAY_OF_MONTH: 'lastDayOfMonth', - LAST_BUSINESS_DAY_OF_MONTH: 'lastBusinessDayOfMonth', - CUSTOM_DAY_OF_MONTH: 'customDayOfMonth', + LAST_DAY_OF_MONTH: 'LAST_DAY_OF_MONTH', + LAST_BUSINESS_DAY_OF_MONTH: 'LAST_BUSINESS_DAY_OF_MONTH', + CUSTOM_DAY_OF_MONTH: 'CUSTOM_DAY_OF_MONTH', }, CARD_LIST_THRESHOLD: 8, DEFAULT_EXPORT_TYPE: 'default', From ac6eabab9d3eeb2de007ca62928c2708fe09b742 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Thu, 24 Jul 2025 15:02:27 +0100 Subject: [PATCH 36/49] fix clear error fields --- src/libs/actions/CompanyCards.ts | 10 +++++----- .../WorkspaceCompanyCardStatementCloseDatePage.tsx | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/libs/actions/CompanyCards.ts b/src/libs/actions/CompanyCards.ts index 6232a1e03c5e..864e1c1f9fd6 100644 --- a/src/libs/actions/CompanyCards.ts +++ b/src/libs/actions/CompanyCards.ts @@ -916,14 +916,14 @@ function setFeedStatementPeriodEndDay( API.write(WRITE_COMMANDS.SET_FEED_STATEMENT_PERIOD_END_DAY, parameters, {optimisticData, successData, failureData}); } -function clearErrorField(bankName: string, domainAccountID: number, fieldName: keyof CardFeedData) { +function clearErrorFields(bankName: string, domainAccountID: number, fieldNames: Array) { + const errorFields = Object.fromEntries(fieldNames.map((fieldName) => [fieldName, null])); + Onyx.merge(`${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${domainAccountID}`, { settings: { companyCards: { [bankName]: { - errorFields: { - [fieldName]: null, - }, + errorFields, }, }, }, @@ -951,5 +951,5 @@ export { openPolicyAddCardFeedPage, setTransactionStartDate, setFeedStatementPeriodEndDay, - clearErrorField, + clearErrorFields, }; diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx index a42302c0bb36..98616b139090 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx @@ -4,7 +4,7 @@ import useCardFeeds from '@hooks/useCardFeeds'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import useWorkspaceAccountID from '@hooks/useWorkspaceAccountID'; -import {clearErrorField, setFeedStatementPeriodEndDay} from '@libs/actions/CompanyCards'; +import {clearErrorFields, setFeedStatementPeriodEndDay} from '@libs/actions/CompanyCards'; import {getCompanyFeeds, getDomainOrWorkspaceAccountID, getSelectedFeed} from '@libs/CardUtils'; import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; @@ -56,7 +56,7 @@ function WorkspaceCompanyCardStatementCloseDatePage({ return; } - clearErrorField(selectedFeed, domainOrWorkspaceAccountID, 'statementPeriodEndDay'); + clearErrorFields(selectedFeed, domainOrWorkspaceAccountID, ['statementPeriodEnd', 'statementPeriodEndDay']); }, [selectedFeed, domainOrWorkspaceAccountID]); if (isLoadingOnyxValue(cardFeedsResult) || isLoadingOnyxValue(lastSelectedFeedResult)) { From a7a1761cee69f86a2c839e5c963c0cfeb2697687 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Thu, 24 Jul 2025 15:02:58 +0100 Subject: [PATCH 37/49] lint --- .../index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx index 331d31868111..c47c410ddb63 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx @@ -1,6 +1,6 @@ import React, {useCallback, useMemo, useState} from 'react'; import {View} from 'react-native'; -import {ValueOf} from 'type-fest'; +import type {ValueOf} from 'type-fest'; import FixedFooter from '@components/FixedFooter'; import FormAlertWithSubmitButton from '@components/FormAlertWithSubmitButton'; import FormHelpMessage from '@components/FormHelpMessage'; From 5e312a6a20d8f427331ef1c3c81d49368220a2a2 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Thu, 24 Jul 2025 20:05:58 +0100 Subject: [PATCH 38/49] remove statementPeriodEnd from card feed data --- src/libs/actions/CompanyCards.ts | 10 ++++----- ...spaceCompanyCardStatementCloseDatePage.tsx | 4 ++-- src/types/onyx/CardFeeds.ts | 22 +++++++++---------- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/src/libs/actions/CompanyCards.ts b/src/libs/actions/CompanyCards.ts index 864e1c1f9fd6..6232a1e03c5e 100644 --- a/src/libs/actions/CompanyCards.ts +++ b/src/libs/actions/CompanyCards.ts @@ -916,14 +916,14 @@ function setFeedStatementPeriodEndDay( API.write(WRITE_COMMANDS.SET_FEED_STATEMENT_PERIOD_END_DAY, parameters, {optimisticData, successData, failureData}); } -function clearErrorFields(bankName: string, domainAccountID: number, fieldNames: Array) { - const errorFields = Object.fromEntries(fieldNames.map((fieldName) => [fieldName, null])); - +function clearErrorField(bankName: string, domainAccountID: number, fieldName: keyof CardFeedData) { Onyx.merge(`${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${domainAccountID}`, { settings: { companyCards: { [bankName]: { - errorFields, + errorFields: { + [fieldName]: null, + }, }, }, }, @@ -951,5 +951,5 @@ export { openPolicyAddCardFeedPage, setTransactionStartDate, setFeedStatementPeriodEndDay, - clearErrorFields, + clearErrorField, }; diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx index 98616b139090..a42302c0bb36 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx @@ -4,7 +4,7 @@ import useCardFeeds from '@hooks/useCardFeeds'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import useWorkspaceAccountID from '@hooks/useWorkspaceAccountID'; -import {clearErrorFields, setFeedStatementPeriodEndDay} from '@libs/actions/CompanyCards'; +import {clearErrorField, setFeedStatementPeriodEndDay} from '@libs/actions/CompanyCards'; import {getCompanyFeeds, getDomainOrWorkspaceAccountID, getSelectedFeed} from '@libs/CardUtils'; import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; @@ -56,7 +56,7 @@ function WorkspaceCompanyCardStatementCloseDatePage({ return; } - clearErrorFields(selectedFeed, domainOrWorkspaceAccountID, ['statementPeriodEnd', 'statementPeriodEndDay']); + clearErrorField(selectedFeed, domainOrWorkspaceAccountID, 'statementPeriodEndDay'); }, [selectedFeed, domainOrWorkspaceAccountID]); if (isLoadingOnyxValue(cardFeedsResult) || isLoadingOnyxValue(lastSelectedFeedResult)) { diff --git a/src/types/onyx/CardFeeds.ts b/src/types/onyx/CardFeeds.ts index 1a561d5488d2..7f184d3049a1 100644 --- a/src/types/onyx/CardFeeds.ts +++ b/src/types/onyx/CardFeeds.ts @@ -67,17 +67,16 @@ type CustomCardFeedData = OnyxCommon.OnyxValueWithOfflineFeedback<{ /** Specifies the format for the report title related to this card */ reportTitleFormat?: string; - /** Indicates the day (preset value) when the statement period for this card ends */ - statementPeriodEnd?: StatementPeriodEnd; - - /** Indicates the day (custom day) when the statement period for this card ends */ - statementPeriodEndDay?: StatementPeriodEndDay; + /** Indicates the day when the statement period for this card ends. + * The BE returns a unified key which may hold either a preset value (string) or a custom day (integer) + */ + statementPeriodEndDay?: StatementPeriodEnd | StatementPeriodEndDay; /** Plaid access token */ plaidAccessToken?: string; /** Field-specific error messages */ - errorFields?: OnyxCommon.ErrorFields<'statementPeriodEnd' | 'statementPeriodEndDay'>; + errorFields?: OnyxCommon.ErrorFields<'statementPeriodEnd'>; }>; /** Direct card feed data */ @@ -100,17 +99,16 @@ type DirectCardFeedData = OnyxCommon.OnyxValueWithOfflineFeedback<{ /** Whether any actions are pending */ pending?: boolean; - /** Indicates the day (preset value) when the statement period for this card ends */ - statementPeriodEnd?: StatementPeriodEnd; - - /** Indicates the day (custom day) when the statement period for this card ends */ - statementPeriodEndDay?: StatementPeriodEndDay; + /** Indicates the day when the statement period for this card ends. + * The BE returns a unified key which may hold either a preset value (string) or a custom day (integer) + */ + statementPeriodEndDay?: StatementPeriodEnd | StatementPeriodEndDay; /** Plaid access token */ plaidAccessToken?: string; /** Field-specific error messages */ - errorFields?: OnyxCommon.ErrorFields<'statementPeriodEnd' | 'statementPeriodEndDay'>; + errorFields?: OnyxCommon.ErrorFields<'statementPeriodEnd'>; }>; /** Card feed data */ From 70d95c99bb13f8682efd8cea6b192a33a2645592 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Thu, 24 Jul 2025 20:17:43 +0100 Subject: [PATCH 39/49] update api commands to use only statementPeriodEndDay in onyx updates --- src/libs/actions/CompanyCards.ts | 15 +++------------ ...WorkspaceCompanyCardStatementCloseDatePage.tsx | 5 ++--- 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/src/libs/actions/CompanyCards.ts b/src/libs/actions/CompanyCards.ts index 6232a1e03c5e..e478265339f5 100644 --- a/src/libs/actions/CompanyCards.ts +++ b/src/libs/actions/CompanyCards.ts @@ -91,8 +91,7 @@ function addNewCompanyCardsFeed( settings: { companyCards: { [feedType]: { - statementPeriodEnd: statementPeriodEnd ?? null, - statementPeriodEndDay: statementPeriodEndDay ?? null, + statementPeriodEndDay: statementPeriodEndDay ?? statementPeriodEnd ?? null, errors: null, }, }, @@ -829,9 +828,8 @@ function setFeedStatementPeriodEndDay( bankName: string, domainAccountID: number, newStatementPeriodEnd: StatementPeriodEnd | undefined, - oldStatementPeriodEnd: StatementPeriodEnd | undefined, newStatementPeriodEndDay: StatementPeriodEndDay | undefined, - oldStatementPeriodEndDay: StatementPeriodEndDay | undefined, + oldStatementPeriodEndDay: StatementPeriodEnd | StatementPeriodEndDay | undefined, ) { const authToken = NetworkStore.getAuthToken(); @@ -843,14 +841,11 @@ function setFeedStatementPeriodEndDay( settings: { companyCards: { [bankName]: { - statementPeriodEnd: newStatementPeriodEnd ?? null, - statementPeriodEndDay: newStatementPeriodEndDay ?? null, + statementPeriodEndDay: newStatementPeriodEndDay ?? newStatementPeriodEnd ?? null, pendingFields: { - statementPeriodEnd: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, statementPeriodEndDay: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, }, errorFields: { - statementPeriodEnd: null, statementPeriodEndDay: null, }, }, @@ -869,7 +864,6 @@ function setFeedStatementPeriodEndDay( companyCards: { [bankName]: { pendingFields: { - statementPeriodEnd: null, statementPeriodEndDay: null, }, }, @@ -887,14 +881,11 @@ function setFeedStatementPeriodEndDay( settings: { companyCards: { [bankName]: { - statementPeriodEnd: oldStatementPeriodEnd ?? null, statementPeriodEndDay: oldStatementPeriodEndDay ?? null, pendingFields: { - statementPeriodEnd: null, statementPeriodEndDay: null, }, errorFields: { - statementPeriodEnd: ErrorUtils.getMicroSecondOnyxErrorWithTranslationKey('common.genericErrorMessage'), statementPeriodEndDay: ErrorUtils.getMicroSecondOnyxErrorWithTranslationKey('common.genericErrorMessage'), }, }, diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx index a42302c0bb36..6875b3951c16 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx @@ -33,18 +33,17 @@ function WorkspaceCompanyCardStatementCloseDatePage({ const companyFeeds = getCompanyFeeds(cardFeeds); const selectedFeedData = selectedFeed ? companyFeeds[selectedFeed] : undefined; const domainOrWorkspaceAccountID = getDomainOrWorkspaceAccountID(workspaceAccountID, selectedFeedData); - const statementPeriodEnd = selectedFeedData?.statementPeriodEnd; const statementPeriodEndDay = selectedFeedData?.statementPeriodEndDay; const submit = useCallback( (newStatementPeriodEnd: StatementPeriodEnd | undefined, newStatementPeriodEndDay: StatementPeriodEndDay | undefined) => { if (selectedFeed) { - setFeedStatementPeriodEndDay(policyID, selectedFeed, domainOrWorkspaceAccountID, newStatementPeriodEnd, statementPeriodEnd, newStatementPeriodEndDay, statementPeriodEndDay); + setFeedStatementPeriodEndDay(policyID, selectedFeed, domainOrWorkspaceAccountID, newStatementPeriodEnd, newStatementPeriodEndDay, statementPeriodEndDay); } Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARDS_SETTINGS.getRoute(policyID)); }, - [policyID, selectedFeed, statementPeriodEnd, statementPeriodEndDay, domainOrWorkspaceAccountID], + [policyID, selectedFeed, statementPeriodEndDay, domainOrWorkspaceAccountID], ); const goBack = useCallback(() => { From 207d5ad22b547b0837b5601005cddafe654f8ebd Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Thu, 24 Jul 2025 20:19:52 +0100 Subject: [PATCH 40/49] update error and pending fields --- .../WorkspaceCompanyCardStatementCloseDatePage.tsx | 4 ++-- .../companyCards/WorkspaceCompanyCardsSettingsPage.tsx | 8 ++------ src/types/onyx/CardFeeds.ts | 4 ++-- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx index 6875b3951c16..b27382e1084e 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx @@ -75,8 +75,8 @@ function WorkspaceCompanyCardStatementCloseDatePage({ enabledWhenOffline defaultStatementPeriodEnd={statementPeriodEnd} defaultStatementPeriodEndDay={statementPeriodEndDay} - pendingAction={selectedFeedData?.pendingFields?.statementPeriodEndDay ?? selectedFeedData?.pendingFields?.statementPeriodEnd} - errors={selectedFeedData?.errorFields?.statementPeriodEndDay ?? selectedFeedData?.errorFields?.statementPeriodEnd} + pendingAction={selectedFeedData?.pendingFields?.statementPeriodEndDay} + errors={selectedFeedData?.errorFields?.statementPeriodEndDay} onCloseError={clearError} /> diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx index ee0b89221fbe..4f94d0b93628 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx @@ -130,7 +130,7 @@ function WorkspaceCompanyCardsSettingsPage({ onPress={navigateToChangeFeedName} /> {shouldShowStatementCloseDate && ( - + )} diff --git a/src/types/onyx/CardFeeds.ts b/src/types/onyx/CardFeeds.ts index 7f184d3049a1..e73e95a6ce84 100644 --- a/src/types/onyx/CardFeeds.ts +++ b/src/types/onyx/CardFeeds.ts @@ -76,7 +76,7 @@ type CustomCardFeedData = OnyxCommon.OnyxValueWithOfflineFeedback<{ plaidAccessToken?: string; /** Field-specific error messages */ - errorFields?: OnyxCommon.ErrorFields<'statementPeriodEnd'>; + errorFields?: OnyxCommon.ErrorFields<'statementPeriodEndDay'>; }>; /** Direct card feed data */ @@ -108,7 +108,7 @@ type DirectCardFeedData = OnyxCommon.OnyxValueWithOfflineFeedback<{ plaidAccessToken?: string; /** Field-specific error messages */ - errorFields?: OnyxCommon.ErrorFields<'statementPeriodEnd'>; + errorFields?: OnyxCommon.ErrorFields<'statementPeriodEndDay'>; }>; /** Card feed data */ From 55405d711185a7455d2a0237b2401f16fc2e9bc7 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Thu, 24 Jul 2025 20:36:23 +0100 Subject: [PATCH 41/49] update display value logic --- ...kspaceCompanyCardStatementCloseDatePage.tsx | 18 +++++++++++++++--- .../WorkspaceCompanyCardsSettingsPage.tsx | 12 ++++++------ 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx index b27382e1084e..8d636a589673 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx @@ -1,4 +1,4 @@ -import React, {useCallback} from 'react'; +import React, {useCallback, useMemo} from 'react'; import FullScreenLoadingIndicator from '@components/FullscreenLoadingIndicator'; import useCardFeeds from '@hooks/useCardFeeds'; import useLocalize from '@hooks/useLocalize'; @@ -35,6 +35,18 @@ function WorkspaceCompanyCardStatementCloseDatePage({ const domainOrWorkspaceAccountID = getDomainOrWorkspaceAccountID(workspaceAccountID, selectedFeedData); const statementPeriodEndDay = selectedFeedData?.statementPeriodEndDay; + const [defaultStatementPeriodEnd, defaultStatementPeriodEndDay] = useMemo(() => { + if (!statementPeriodEndDay) { + return [undefined, undefined]; + } + + if (typeof statementPeriodEndDay === 'number') { + return [undefined, statementPeriodEndDay]; + } + + return [statementPeriodEndDay, undefined]; + }, [statementPeriodEndDay]); + const submit = useCallback( (newStatementPeriodEnd: StatementPeriodEnd | undefined, newStatementPeriodEndDay: StatementPeriodEndDay | undefined) => { if (selectedFeed) { @@ -73,8 +85,8 @@ function WorkspaceCompanyCardStatementCloseDatePage({ onSubmit={submit} onBackButtonPress={goBack} enabledWhenOffline - defaultStatementPeriodEnd={statementPeriodEnd} - defaultStatementPeriodEndDay={statementPeriodEndDay} + defaultStatementPeriodEnd={defaultStatementPeriodEnd} + defaultStatementPeriodEndDay={defaultStatementPeriodEndDay} pendingAction={selectedFeedData?.pendingFields?.statementPeriodEndDay} errors={selectedFeedData?.errorFields?.statementPeriodEndDay} onCloseError={clearError} diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx index 4f94d0b93628..a543e6006f52 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx @@ -56,16 +56,16 @@ function WorkspaceCompanyCardsSettingsPage({ const isPersonal = liabilityType === CONST.COMPANY_CARDS.DELETE_TRANSACTIONS.ALLOW; const domainOrWorkspaceAccountID = getDomainOrWorkspaceAccountID(workspaceAccountID, selectedFeedData); const statementCloseDate = useMemo(() => { - if (selectedFeedData?.statementPeriodEndDay) { - return selectedFeedData.statementPeriodEndDay; + if (!selectedFeedData?.statementPeriodEndDay) { + return undefined; } - if (selectedFeedData?.statementPeriodEnd) { - return translate(`workspace.companyCards.statementCloseDate.${selectedFeedData.statementPeriodEnd}`); + if (typeof selectedFeedData?.statementPeriodEndDay === 'number') { + return selectedFeedData.statementPeriodEndDay; } - return undefined; - }, [translate, selectedFeedData?.statementPeriodEnd, selectedFeedData?.statementPeriodEndDay]); + return translate(`workspace.companyCards.statementCloseDate.${selectedFeedData.statementPeriodEndDay}`); + }, [translate, selectedFeedData?.statementPeriodEndDay]); // s77rt remove DEV lock const shouldShowStatementCloseDate = isDevelopment; From cdd04cc8fc250bf37c2e6e4c4cea496b064a022e Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Thu, 24 Jul 2025 20:56:08 +0100 Subject: [PATCH 42/49] don't call api if value didn't change --- .../WorkspaceCompanyCardStatementCloseDatePage.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx index 8d636a589673..d3b793456fc4 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx @@ -49,7 +49,8 @@ function WorkspaceCompanyCardStatementCloseDatePage({ const submit = useCallback( (newStatementPeriodEnd: StatementPeriodEnd | undefined, newStatementPeriodEndDay: StatementPeriodEndDay | undefined) => { - if (selectedFeed) { + const isChangedValue = (newStatementPeriodEndDay ?? newStatementPeriodEnd) !== statementPeriodEndDay; + if (selectedFeed && isChangedValue) { setFeedStatementPeriodEndDay(policyID, selectedFeed, domainOrWorkspaceAccountID, newStatementPeriodEnd, newStatementPeriodEndDay, statementPeriodEndDay); } From e1f9856e7b62a67b34137b5de151bc6f5f0e2f83 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Sun, 27 Jul 2025 13:11:58 +0100 Subject: [PATCH 43/49] wrap submit in useCallback --- .../companyCards/addNew/DetailsStep.tsx | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx index dfc5f91b73d3..203be5eb9d3a 100644 --- a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx +++ b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx @@ -51,24 +51,27 @@ function DetailsStep({policyID}: DetailsStepProps) { // s77rt remove DEV lock const shouldSelectStatementCloseDate = isDevelopment; - const submit = (values: FormOnyxValues) => { - if (!addNewCard?.data) { - return; - } + const submit = useCallback( + (values: FormOnyxValues) => { + if (!addNewCard?.data) { + return; + } - const feedDetails = { - ...values, - bankName: addNewCard.data.bankName ?? 'Amex', - }; + const feedDetails = { + ...values, + bankName: addNewCard.data.bankName ?? 'Amex', + }; - if (shouldSelectStatementCloseDate) { - setAddNewCompanyCardStepAndData({step: CONST.COMPANY_CARDS.STEP.SELECT_STATEMENT_CLOSE_DATE, data: {feedDetails}}); - return; - } + if (shouldSelectStatementCloseDate) { + setAddNewCompanyCardStepAndData({step: CONST.COMPANY_CARDS.STEP.SELECT_STATEMENT_CLOSE_DATE, data: {feedDetails}}); + return; + } - addNewCompanyCardsFeed(policyID, addNewCard.data.feedType, feedDetails, cardFeeds, undefined, undefined, lastSelectedFeed); - Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(policyID)); - }; + addNewCompanyCardsFeed(policyID, addNewCard.data.feedType, feedDetails, cardFeeds, undefined, undefined, lastSelectedFeed); + Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(policyID)); + }, + [addNewCard?.data, policyID, cardFeeds, lastSelectedFeed], + ); const handleBackButtonPress = () => { if (isOtherBankSelected) { From b07f3f340e6dd775107926d488d143c82f6fcb2c Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Wed, 30 Jul 2025 17:16:34 +0100 Subject: [PATCH 44/49] add backTo param to WorkspaceCompanyCardStatementCloseDatePageProps --- src/ROUTES.ts | 2 +- src/libs/Navigation/types.ts | 1 + .../WorkspaceCompanyCardStatementCloseDatePage.tsx | 6 +++--- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/ROUTES.ts b/src/ROUTES.ts index e35fd1f94cd5..be8d31ad3be6 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -1813,7 +1813,7 @@ const ROUTES = { }, WORKSPACE_COMPANY_CARDS_SETTINGS_STATEMENT_CLOSE_DATE: { route: 'workspaces/:policyID/company-cards/settings/statement-close-date', - getRoute: (policyID: string) => `workspaces/${policyID}/company-cards/settings/statement-close-date` as const, + getRoute: (policyID: string, backTo?: string) => getUrlWithBackToParam(`workspaces/${policyID}/company-cards/settings/statement-close-date`, backTo), }, WORKSPACE_RULES: { route: 'workspaces/:policyID/rules', diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index ad8de7729f8a..ffa769cb7eeb 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -1013,6 +1013,7 @@ type SettingsNavigatorParamList = { }; [SCREENS.WORKSPACE.COMPANY_CARDS_SETTINGS_STATEMENT_CLOSE_DATE]: { policyID: string; + backTo?: Routes; }; [SCREENS.WORKSPACE.EXPENSIFY_CARD_DETAILS]: { policyID: string; diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx index d3b793456fc4..376a31edb51d 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx @@ -22,7 +22,7 @@ type WorkspaceCompanyCardStatementCloseDatePageProps = PlatformStackScreenProps< function WorkspaceCompanyCardStatementCloseDatePage({ route: { - params: {policyID}, + params: {policyID, backTo}, }, }: WorkspaceCompanyCardStatementCloseDatePageProps) { const {translate} = useLocalize(); @@ -60,8 +60,8 @@ function WorkspaceCompanyCardStatementCloseDatePage({ ); const goBack = useCallback(() => { - Navigation.goBack(); - }, []); + Navigation.goBack(backTo); + }, [backTo]); const clearError = useCallback(() => { if (!selectedFeed) { From 5a2ab05d776638caac51ae4265d5207f0ad246ed Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Wed, 30 Jul 2025 17:23:30 +0100 Subject: [PATCH 45/49] redirect user to statement period page after a direct feed is added --- .../companyCards/BankConnection/index.native.tsx | 9 ++++++++- .../workspace/companyCards/BankConnection/index.tsx | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/pages/workspace/companyCards/BankConnection/index.native.tsx b/src/pages/workspace/companyCards/BankConnection/index.native.tsx index d8f953ee808f..2a040b358f01 100644 --- a/src/pages/workspace/companyCards/BankConnection/index.native.tsx +++ b/src/pages/workspace/companyCards/BankConnection/index.native.tsx @@ -114,7 +114,14 @@ function BankConnection({policyID: policyIDFromProps, feed, route}: BankConnecti if (newFeed) { updateSelectedFeed(newFeed, policyID); } - Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(policyID)); + + // Direct feeds (except those added via Plaid) are created with default statement period end date. + // Redirect the user to set a custom date. + if (policyID && !isPlaid) { + Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS_SETTINGS_STATEMENT_CLOSE_DATE.getRoute(policyID, ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(policyID))); + } else { + Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(policyID)); + } } if (isPlaid) { onImportPlaidAccounts(); diff --git a/src/pages/workspace/companyCards/BankConnection/index.tsx b/src/pages/workspace/companyCards/BankConnection/index.tsx index 6ae17dd42b04..8a8d92e2a34f 100644 --- a/src/pages/workspace/companyCards/BankConnection/index.tsx +++ b/src/pages/workspace/companyCards/BankConnection/index.tsx @@ -146,7 +146,14 @@ function BankConnection({policyID: policyIDFromProps, feed, route}: BankConnecti updateSelectedFeed(newFeed, policyID); } Navigation.closeRHPFlow(); - Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(policyID), {forceReplace: true}); + + // Direct feeds (except those added via Plaid) are created with default statement period end date. + // Redirect the user to set a custom date. + if (policyID && !isPlaid) { + Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS_SETTINGS_STATEMENT_CLOSE_DATE.getRoute(policyID, ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(policyID))); + } else { + Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(policyID), {forceReplace: true}); + } return; } if (!shouldBlockWindowOpen) { From 87b33111adbcbab80485620fc8119af85dea17d7 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Mon, 4 Aug 2025 21:22:05 +0100 Subject: [PATCH 46/49] lint --- src/pages/workspace/companyCards/addNew/DetailsStep.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx index 203be5eb9d3a..5b977a3a3963 100644 --- a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx +++ b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx @@ -70,7 +70,7 @@ function DetailsStep({policyID}: DetailsStepProps) { addNewCompanyCardsFeed(policyID, addNewCard.data.feedType, feedDetails, cardFeeds, undefined, undefined, lastSelectedFeed); Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(policyID)); }, - [addNewCard?.data, policyID, cardFeeds, lastSelectedFeed], + [addNewCard?.data, policyID, cardFeeds, lastSelectedFeed, shouldSelectStatementCloseDate], ); const handleBackButtonPress = () => { From 409065324e2b40ecd0fc4893163c607e160a3c72 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Tue, 5 Aug 2025 02:10:55 +0100 Subject: [PATCH 47/49] remove backTo param from WorkspaceCompanyCardStatementCloseDatePage --- src/ROUTES.ts | 2 +- src/libs/Navigation/types.ts | 1 - .../workspace/companyCards/BankConnection/index.native.tsx | 2 +- src/pages/workspace/companyCards/BankConnection/index.tsx | 2 +- .../WorkspaceCompanyCardStatementCloseDatePage.tsx | 6 +++--- 5 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/ROUTES.ts b/src/ROUTES.ts index d330107cab25..10659fe33791 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -1795,7 +1795,7 @@ const ROUTES = { }, WORKSPACE_COMPANY_CARDS_SETTINGS_STATEMENT_CLOSE_DATE: { route: 'workspaces/:policyID/company-cards/settings/statement-close-date', - getRoute: (policyID: string, backTo?: string) => getUrlWithBackToParam(`workspaces/${policyID}/company-cards/settings/statement-close-date`, backTo), + getRoute: (policyID: string) => `workspaces/${policyID}/company-cards/settings/statement-close-date` as const, }, WORKSPACE_RULES: { route: 'workspaces/:policyID/rules', diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index e8b9ea0b7b6c..8d9a648d5bb3 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -1018,7 +1018,6 @@ type SettingsNavigatorParamList = { }; [SCREENS.WORKSPACE.COMPANY_CARDS_SETTINGS_STATEMENT_CLOSE_DATE]: { policyID: string; - backTo?: Routes; }; [SCREENS.WORKSPACE.EXPENSIFY_CARD_DETAILS]: { policyID: string; diff --git a/src/pages/workspace/companyCards/BankConnection/index.native.tsx b/src/pages/workspace/companyCards/BankConnection/index.native.tsx index 2a040b358f01..56e267407083 100644 --- a/src/pages/workspace/companyCards/BankConnection/index.native.tsx +++ b/src/pages/workspace/companyCards/BankConnection/index.native.tsx @@ -118,7 +118,7 @@ function BankConnection({policyID: policyIDFromProps, feed, route}: BankConnecti // Direct feeds (except those added via Plaid) are created with default statement period end date. // Redirect the user to set a custom date. if (policyID && !isPlaid) { - Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS_SETTINGS_STATEMENT_CLOSE_DATE.getRoute(policyID, ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(policyID))); + Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS_SETTINGS_STATEMENT_CLOSE_DATE.getRoute(policyID)); } else { Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(policyID)); } diff --git a/src/pages/workspace/companyCards/BankConnection/index.tsx b/src/pages/workspace/companyCards/BankConnection/index.tsx index 8a8d92e2a34f..a790a125e9b3 100644 --- a/src/pages/workspace/companyCards/BankConnection/index.tsx +++ b/src/pages/workspace/companyCards/BankConnection/index.tsx @@ -150,7 +150,7 @@ function BankConnection({policyID: policyIDFromProps, feed, route}: BankConnecti // Direct feeds (except those added via Plaid) are created with default statement period end date. // Redirect the user to set a custom date. if (policyID && !isPlaid) { - Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS_SETTINGS_STATEMENT_CLOSE_DATE.getRoute(policyID, ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(policyID))); + Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS_SETTINGS_STATEMENT_CLOSE_DATE.getRoute(policyID)); } else { Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(policyID), {forceReplace: true}); } diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx index 376a31edb51d..d3b793456fc4 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage.tsx @@ -22,7 +22,7 @@ type WorkspaceCompanyCardStatementCloseDatePageProps = PlatformStackScreenProps< function WorkspaceCompanyCardStatementCloseDatePage({ route: { - params: {policyID, backTo}, + params: {policyID}, }, }: WorkspaceCompanyCardStatementCloseDatePageProps) { const {translate} = useLocalize(); @@ -60,8 +60,8 @@ function WorkspaceCompanyCardStatementCloseDatePage({ ); const goBack = useCallback(() => { - Navigation.goBack(backTo); - }, [backTo]); + Navigation.goBack(); + }, []); const clearError = useCallback(() => { if (!selectedFeed) { From 56fd68c0dc3e0ed0727e2205afa80335eb585210 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Tue, 5 Aug 2025 02:18:00 +0100 Subject: [PATCH 48/49] close RHP before navigating to statement close date page --- .../workspace/companyCards/BankConnection/index.native.tsx | 1 + src/pages/workspace/companyCards/BankConnection/index.tsx | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pages/workspace/companyCards/BankConnection/index.native.tsx b/src/pages/workspace/companyCards/BankConnection/index.native.tsx index 56e267407083..2d0119f01cdd 100644 --- a/src/pages/workspace/companyCards/BankConnection/index.native.tsx +++ b/src/pages/workspace/companyCards/BankConnection/index.native.tsx @@ -118,6 +118,7 @@ function BankConnection({policyID: policyIDFromProps, feed, route}: BankConnecti // Direct feeds (except those added via Plaid) are created with default statement period end date. // Redirect the user to set a custom date. if (policyID && !isPlaid) { + Navigation.closeRHPFlow(); Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS_SETTINGS_STATEMENT_CLOSE_DATE.getRoute(policyID)); } else { Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(policyID)); diff --git a/src/pages/workspace/companyCards/BankConnection/index.tsx b/src/pages/workspace/companyCards/BankConnection/index.tsx index a790a125e9b3..3fbeb4a0b485 100644 --- a/src/pages/workspace/companyCards/BankConnection/index.tsx +++ b/src/pages/workspace/companyCards/BankConnection/index.tsx @@ -145,13 +145,14 @@ function BankConnection({policyID: policyIDFromProps, feed, route}: BankConnecti if (newFeed) { updateSelectedFeed(newFeed, policyID); } - Navigation.closeRHPFlow(); // Direct feeds (except those added via Plaid) are created with default statement period end date. // Redirect the user to set a custom date. if (policyID && !isPlaid) { + Navigation.closeRHPFlow(); Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS_SETTINGS_STATEMENT_CLOSE_DATE.getRoute(policyID)); } else { + Navigation.closeRHPFlow(); Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(policyID), {forceReplace: true}); } return; From 8ba52ad501bedaab33c8e4b631308d636cb8a2e9 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Tue, 5 Aug 2025 03:02:42 +0100 Subject: [PATCH 49/49] remove dev lock of statement close date page --- .../WorkspaceCompanyCardsSettingsPage.tsx | 29 +++++++---------- .../companyCards/addNew/AddNewCardPage.tsx | 2 +- .../companyCards/addNew/DetailsStep.tsx | 32 +++---------------- .../addNew/PlaidConnectionStep.tsx | 7 +--- 4 files changed, 18 insertions(+), 52 deletions(-) diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx index a543e6006f52..c9baa85fb9c9 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx @@ -11,7 +11,6 @@ import ScrollView from '@components/ScrollView'; import Text from '@components/Text'; import useCardFeeds from '@hooks/useCardFeeds'; import useCardsList from '@hooks/useCardsList'; -import useEnvironment from '@hooks/useEnvironment'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import usePolicy from '@hooks/usePolicy'; @@ -36,7 +35,6 @@ function WorkspaceCompanyCardsSettingsPage({ params: {policyID}, }, }: WorkspaceCompanyCardsSettingsPageProps) { - const {isDevelopment} = useEnvironment(); const styles = useThemeStyles(); const {translate} = useLocalize(); const policy = usePolicy(policyID); @@ -67,9 +65,6 @@ function WorkspaceCompanyCardsSettingsPage({ return translate(`workspace.companyCards.statementCloseDate.${selectedFeedData.statementPeriodEndDay}`); }, [translate, selectedFeedData?.statementPeriodEndDay]); - // s77rt remove DEV lock - const shouldShowStatementCloseDate = isDevelopment; - const navigateToChangeFeedName = () => { Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS_SETTINGS_FEED_NAME.getRoute(policyID)); }; @@ -129,19 +124,17 @@ function WorkspaceCompanyCardsSettingsPage({ titleStyle={styles.flex1} onPress={navigateToChangeFeedName} /> - {shouldShowStatementCloseDate && ( - - - - )} + + + ; case CONST.COMPANY_CARDS.STEP.CARD_DETAILS: - return ; + return ; case CONST.COMPANY_CARDS.STEP.AMEX_CUSTOM_FEED: return ; case CONST.COMPANY_CARDS.STEP.PLAID_CONNECTION: diff --git a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx index 5b977a3a3963..beb78e58876f 100644 --- a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx +++ b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx @@ -11,46 +11,30 @@ import Text from '@components/Text'; import TextInput from '@components/TextInput'; import TextLink from '@components/TextLink'; import useAutoFocusInput from '@hooks/useAutoFocusInput'; -import useCardFeeds from '@hooks/useCardFeeds'; -import useEnvironment from '@hooks/useEnvironment'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import {getFieldRequiredErrors} from '@libs/ValidationUtils'; -import Navigation from '@navigation/Navigation'; import variables from '@styles/variables'; -import {addNewCompanyCardsFeed, setAddNewCompanyCardStepAndData} from '@userActions/CompanyCards'; +import {setAddNewCompanyCardStepAndData} from '@userActions/CompanyCards'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import ROUTES from '@src/ROUTES'; import INPUT_IDS from '@src/types/form/AddNewCardFeedForm'; -type DetailsStepProps = { - /** ID of the current policy */ - policyID: string | undefined; -}; - -function DetailsStep({policyID}: DetailsStepProps) { +function DetailsStep() { const {translate} = useLocalize(); const theme = useTheme(); const styles = useThemeStyles(); const {inputCallbackRef} = useAutoFocusInput(); - const {isDevelopment} = useEnvironment(); const [addNewCard] = useOnyx(ONYXKEYS.ADD_NEW_COMPANY_CARD, {canBeMissing: false}); - const [lastSelectedFeed] = useOnyx(`${ONYXKEYS.COLLECTION.LAST_SELECTED_FEED}${policyID}`, {canBeMissing: true}); - - const [cardFeeds] = useCardFeeds(policyID); const feedProvider = addNewCard?.data?.feedType; const isStripeFeedProvider = feedProvider === CONST.COMPANY_CARD.FEED_BANK_NAME.STRIPE; const bank = addNewCard?.data?.selectedBank; const isOtherBankSelected = bank === CONST.COMPANY_CARDS.BANKS.OTHER; - // s77rt remove DEV lock - const shouldSelectStatementCloseDate = isDevelopment; - const submit = useCallback( (values: FormOnyxValues) => { if (!addNewCard?.data) { @@ -62,15 +46,9 @@ function DetailsStep({policyID}: DetailsStepProps) { bankName: addNewCard.data.bankName ?? 'Amex', }; - if (shouldSelectStatementCloseDate) { - setAddNewCompanyCardStepAndData({step: CONST.COMPANY_CARDS.STEP.SELECT_STATEMENT_CLOSE_DATE, data: {feedDetails}}); - return; - } - - addNewCompanyCardsFeed(policyID, addNewCard.data.feedType, feedDetails, cardFeeds, undefined, undefined, lastSelectedFeed); - Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(policyID)); + setAddNewCompanyCardStepAndData({step: CONST.COMPANY_CARDS.STEP.SELECT_STATEMENT_CLOSE_DATE, data: {feedDetails}}); }, - [addNewCard?.data, policyID, cardFeeds, lastSelectedFeed, shouldSelectStatementCloseDate], + [addNewCard?.data], ); const handleBackButtonPress = () => { @@ -214,7 +192,7 @@ function DetailsStep({policyID}: DetailsStepProps) { /> !!plaidData?.bankAccounts?.length || !isEmptyObject(plaidData?.errors), [plaidData]); /** @@ -163,7 +158,7 @@ function PlaidConnectionStep({feed, policyID}: {feed?: CompanyCardFeed; policyID } setAddNewCompanyCardStepAndData({ - step: shouldSelectStatementCloseDate ? CONST.COMPANY_CARDS.STEP.SELECT_STATEMENT_CLOSE_DATE : CONST.COMPANY_CARDS.STEP.BANK_CONNECTION, + step: CONST.COMPANY_CARDS.STEP.SELECT_STATEMENT_CLOSE_DATE, data: { publicToken, plaidConnectedFeed,