From 1ebc7b63f80c7b4aca12e49c8dbf9cb8b01baf71 Mon Sep 17 00:00:00 2001
From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com>
Date: Fri, 27 Jun 2025 14:02:22 +0100
Subject: [PATCH 01/20] wip
---
src/CONST/index.ts | 5 +
src/languages/en.ts | 7 ++
...anyCardStatementCloseDateSelectionList.tsx | 110 ++++++++++++++++++
.../companyCards/addNew/AddNewCardPage.tsx | 3 +
.../addNew/StatementCloseDateStep.tsx | 15 +++
5 files changed, 140 insertions(+)
create mode 100644 src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList.tsx
create mode 100644 src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx
diff --git a/src/CONST/index.ts b/src/CONST/index.ts
index 0fd5c8b7a34..56b4e0c332c 100755
--- a/src/CONST/index.ts
+++ b/src/CONST/index.ts
@@ -3445,6 +3445,11 @@ const CONST = {
RESTRICT: 'corporate',
ALLOW: 'personal',
},
+ STATEMENT_CLOSE_DATE: {
+ LAST_DAY_OF_MONTH: 'lastDayOfMonth',
+ LAST_BUSINESS_DAY_OF_MONTH: 'lastBusinessDayOfMonth',
+ CUSTOM_DAY_OF_MONTH: 'customDayOfMonth',
+ },
CARD_LIST_THRESHOLD: 8,
DEFAULT_EXPORT_TYPE: 'default',
EXPORT_CARD_TYPES: {
diff --git a/src/languages/en.ts b/src/languages/en.ts
index 715e9645ad2..1358c97cbd8 100755
--- a/src/languages/en.ts
+++ b/src/languages/en.ts
@@ -4034,6 +4034,11 @@ const translations = {
pleaseSelectFeedType: 'Please select a feed type before continuing',
},
},
+ statementCloseDate: {
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: 'Last day of the month',
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: 'Last business day of the month',
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: 'Custom day of month',
+ },
assignCard: 'Assign card',
findCard: 'Find card',
cardNumber: 'Card number',
@@ -4295,6 +4300,8 @@ const translations = {
expensifyCardBannerTitle: 'Get the Expensify Card',
expensifyCardBannerSubtitle: 'Enjoy cash back on every US purchase, up to 50% off your Expensify bill, unlimited virtual cards, and so much more.',
expensifyCardBannerLearnMoreButton: 'Learn more',
+ statementCloseDateTitle: 'Statement close date',
+ statementCloseDateDescription: 'Let us know when your card statement closes, and we’ll create a matching statement in Expensify.',
},
workflows: {
title: 'Workflows',
diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList.tsx
new file mode 100644
index 00000000000..36534a238a4
--- /dev/null
+++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList.tsx
@@ -0,0 +1,110 @@
+import React, {useState} from 'react';
+import {View} from 'react-native';
+import FormAlertWithSubmitButton from '@components/FormAlertWithSubmitButton';
+import FormHelpMessage from '@components/FormHelpMessage';
+import HeaderWithBackButton from '@components/HeaderWithBackButton';
+import MenuItem from '@components/MenuItem';
+import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription';
+import ScreenWrapper from '@components/ScreenWrapper';
+import SelectionList from '@components/SelectionList';
+import RadioListItem from '@components/SelectionList/RadioListItem';
+import SingleSelectListItem from '@components/SelectionList/SingleSelectListItem';
+import Text from '@components/Text';
+import useLocalize from '@hooks/useLocalize';
+import usePermissions from '@hooks/usePermissions';
+import useThemeIllustrations from '@hooks/useThemeIllustrations';
+import useThemeStyles from '@hooks/useThemeStyles';
+import {translate} from '@libs/Localize';
+import styles from '@styles/index';
+import CONST from '@src/CONST';
+
+function WorkspaceCompanyCardStatementCloseDateSelectionList() {
+ const {translate} = useLocalize();
+ const styles = useThemeStyles();
+
+ const [selectedOption, setSelectedOption] = useState(undefined);
+ const [customCloseDate, setCustomCloseDate] = useState(undefined);
+
+ const isCustomCloseDate = selectedOption === CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH;
+ const closeDate = isCustomCloseDate ? customCloseDate : selectedOption;
+
+ // s77rt handle error and brick road indicator (on both options selection and custom day selection)
+ // s77rt fix size (and add compact option)
+
+ return (
+
+ {}} // s77rt
+ />
+
+
+ {translate('workspace.moreFeatures.companyCards.statementCloseDateDescription')}
+
+
+ {Object.values(CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE)?.map((option) => (
+ setSelectedOption(option)}
+ />
+ ))}
+ {isCustomCloseDate && (
+
+ )}
+
+
+
+ {}} // s77rt
+ enabledWhenOffline
+ />
+
+ {/*
+ {}} // s77rt
+ sections={[{data}]}
+ shouldSingleExecuteRowSelect
+ initiallyFocusedOptionKey={addNewCard?.data.selectedBank}
+ shouldUpdateFocusedIndex
+ showConfirmButton
+ confirmButtonText={translate('common.next')}
+ onConfirm={() => {}} // s77rt
+ confirmButtonStyles={!hasError && styles.mt5}
+ addBottomSafeAreaPadding
+ >
+ {hasError && (
+
+
+
+ )}
+
+ */}
+
+ );
+}
+
+WorkspaceCompanyCardStatementCloseDateSelectionList.displayName = 'WorkspaceCompanyCardStatementCloseDateSelectionList';
+
+export default WorkspaceCompanyCardStatementCloseDateSelectionList;
diff --git a/src/pages/workspace/companyCards/addNew/AddNewCardPage.tsx b/src/pages/workspace/companyCards/addNew/AddNewCardPage.tsx
index 1d40658064b..40704af8a40 100644
--- a/src/pages/workspace/companyCards/addNew/AddNewCardPage.tsx
+++ b/src/pages/workspace/companyCards/addNew/AddNewCardPage.tsx
@@ -21,6 +21,7 @@ import PlaidConnectionStep from './PlaidConnectionStep';
import SelectBankStep from './SelectBankStep';
import SelectCountryStep from './SelectCountryStep';
import SelectFeedType from './SelectFeedType';
+import StatementCloseDateStep from './StatementCloseDateStep';
function AddNewCardPage({policy}: WithPolicyAndFullscreenLoadingProps) {
const policyID = policy?.id;
@@ -84,6 +85,8 @@ function AddNewCardPage({policy}: WithPolicyAndFullscreenLoadingProps) {
case CONST.COMPANY_CARDS.STEP.PLAID_CONNECTION:
return ;
default:
+ // s77rt test
+ return ;
return isBetaEnabled(CONST.BETAS.PLAID_COMPANY_CARDS) ? : ;
}
}
diff --git a/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx b/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx
new file mode 100644
index 00000000000..379b7ba0e67
--- /dev/null
+++ b/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx
@@ -0,0 +1,15 @@
+import React from 'react';
+import WorkspaceCompanyCardStatementCloseDateSelectionList from '../WorkspaceCompanyCardStatementCloseDateSelectionList';
+
+type StatementCloseDateStepProps = {
+ /** ID of the current policy */
+ policyID: string | undefined;
+};
+
+function StatementCloseDateStep({policyID}: StatementCloseDateStepProps) {
+ return ;
+}
+
+StatementCloseDateStep.displayName = 'StatementCloseDateStep';
+
+export default StatementCloseDateStep;
From 831ba3e39a01964c738425bbaa07a22301d35a10 Mon Sep 17 00:00:00 2001
From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com>
Date: Fri, 27 Jun 2025 23:42:31 +0100
Subject: [PATCH 02/20] update
WorkspaceCompanyCardStatementCloseDateSelectionList
---
src/languages/en.ts | 2 +
...anyCardStatementCloseDateSelectionList.tsx | 110 --------------
.../CustomCloseDateSelectionList.tsx | 97 +++++++++++++
.../index.tsx | 136 ++++++++++++++++++
src/types/onyx/CardFeeds.ts | 4 +
5 files changed, 239 insertions(+), 110 deletions(-)
delete mode 100644 src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList.tsx
create mode 100644 src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/CustomCloseDateSelectionList.tsx
create mode 100644 src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx
diff --git a/src/languages/en.ts b/src/languages/en.ts
index 1358c97cbd8..08119d323e4 100755
--- a/src/languages/en.ts
+++ b/src/languages/en.ts
@@ -4055,6 +4055,7 @@ const translations = {
startDateDescription: "We'll import all transaction from this date onwards. If no date is specified, we’ll go as far back as your bank allows.",
fromTheBeginning: 'From the beginning',
customStartDate: 'Custom start date',
+ customCloseDate: 'Custom close date',
letsDoubleCheck: 'Let’s double check that everything looks right.',
confirmationDescription: 'We’ll begin importing transactions immediately.',
cardholder: 'Cardholder',
@@ -4276,6 +4277,7 @@ const translations = {
removeCardFeedDescription: 'Are you sure you want to remove this card feed? This will unassign all cards.',
error: {
feedNameRequired: 'Card feed name is required',
+ statementCloseDateRequired: 'Please select a statement close date.',
},
corporate: 'Restrict deleting transactions',
personal: 'Allow deleting transactions',
diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList.tsx
deleted file mode 100644
index 36534a238a4..00000000000
--- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList.tsx
+++ /dev/null
@@ -1,110 +0,0 @@
-import React, {useState} from 'react';
-import {View} from 'react-native';
-import FormAlertWithSubmitButton from '@components/FormAlertWithSubmitButton';
-import FormHelpMessage from '@components/FormHelpMessage';
-import HeaderWithBackButton from '@components/HeaderWithBackButton';
-import MenuItem from '@components/MenuItem';
-import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription';
-import ScreenWrapper from '@components/ScreenWrapper';
-import SelectionList from '@components/SelectionList';
-import RadioListItem from '@components/SelectionList/RadioListItem';
-import SingleSelectListItem from '@components/SelectionList/SingleSelectListItem';
-import Text from '@components/Text';
-import useLocalize from '@hooks/useLocalize';
-import usePermissions from '@hooks/usePermissions';
-import useThemeIllustrations from '@hooks/useThemeIllustrations';
-import useThemeStyles from '@hooks/useThemeStyles';
-import {translate} from '@libs/Localize';
-import styles from '@styles/index';
-import CONST from '@src/CONST';
-
-function WorkspaceCompanyCardStatementCloseDateSelectionList() {
- const {translate} = useLocalize();
- const styles = useThemeStyles();
-
- const [selectedOption, setSelectedOption] = useState(undefined);
- const [customCloseDate, setCustomCloseDate] = useState(undefined);
-
- const isCustomCloseDate = selectedOption === CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH;
- const closeDate = isCustomCloseDate ? customCloseDate : selectedOption;
-
- // s77rt handle error and brick road indicator (on both options selection and custom day selection)
- // s77rt fix size (and add compact option)
-
- return (
-
- {}} // s77rt
- />
-
-
- {translate('workspace.moreFeatures.companyCards.statementCloseDateDescription')}
-
-
- {Object.values(CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE)?.map((option) => (
- setSelectedOption(option)}
- />
- ))}
- {isCustomCloseDate && (
-
- )}
-
-
-
- {}} // s77rt
- enabledWhenOffline
- />
-
- {/*
- {}} // s77rt
- sections={[{data}]}
- shouldSingleExecuteRowSelect
- initiallyFocusedOptionKey={addNewCard?.data.selectedBank}
- shouldUpdateFocusedIndex
- showConfirmButton
- confirmButtonText={translate('common.next')}
- onConfirm={() => {}} // s77rt
- confirmButtonStyles={!hasError && styles.mt5}
- addBottomSafeAreaPadding
- >
- {hasError && (
-
-
-
- )}
-
- */}
-
- );
-}
-
-WorkspaceCompanyCardStatementCloseDateSelectionList.displayName = 'WorkspaceCompanyCardStatementCloseDateSelectionList';
-
-export default WorkspaceCompanyCardStatementCloseDateSelectionList;
diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/CustomCloseDateSelectionList.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/CustomCloseDateSelectionList.tsx
new file mode 100644
index 00000000000..f62d16d3f7f
--- /dev/null
+++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/CustomCloseDateSelectionList.tsx
@@ -0,0 +1,97 @@
+import React, {useCallback, useMemo, useState} from 'react';
+import FormHelpMessage from '@components/FormHelpMessage';
+import SelectionList from '@components/SelectionList';
+import SingleSelectListItem from '@components/SelectionList/SingleSelectListItem';
+import {ListItem} from '@components/SelectionList/types';
+import useDebouncedState from '@hooks/useDebouncedState';
+import useLocalize from '@hooks/useLocalize';
+import useThemeStyles from '@hooks/useThemeStyles';
+
+type CustomCloseDateListItem = ListItem & {
+ value: number;
+};
+
+type CustomCloseDateSelectionListProps = {
+ initiallySelectedDay: number | undefined;
+ onConfirmSelectedDay: (day: number) => void;
+};
+
+function CustomCloseDateSelectionList({initiallySelectedDay, onConfirmSelectedDay}: CustomCloseDateSelectionListProps) {
+ const {translate} = useLocalize();
+ const styles = useThemeStyles();
+
+ const [selectedDay, setSelectedDay] = useState(initiallySelectedDay);
+ const [searchValue, debouncedSearchValue, setSearchValue] = useDebouncedState('');
+ const [error, setError] = useState(undefined);
+
+ const sections = useMemo(() => {
+ const data = [...Array(28).keys()].reduce((days, key) => {
+ const dayValue = key + 1;
+ const day = {
+ value: dayValue,
+ text: dayValue.toString(),
+ keyForList: dayValue.toString(),
+ isSelected: dayValue === selectedDay,
+ };
+
+ if (debouncedSearchValue) {
+ if (day.text.includes(debouncedSearchValue)) {
+ days.push(day);
+ }
+ } else {
+ days.push(day);
+ }
+
+ return days;
+ }, []);
+
+ return [{data, indexOffset: 0}];
+ }, [selectedDay, debouncedSearchValue]);
+
+ const selectDayAndClearError = useCallback((item: CustomCloseDateListItem) => {
+ setSelectedDay(item.value);
+ setError(undefined);
+ }, []);
+
+ const confirmSelectedDay = useCallback(() => {
+ if (!selectedDay) {
+ setError(translate('workspace.moreFeatures.companyCards.error.statementCloseDateRequired'));
+ return;
+ }
+
+ onConfirmSelectedDay(selectedDay);
+ }, [selectedDay, onConfirmSelectedDay]);
+
+ return (
+
+ {!!error && (
+
+ )}
+
+ );
+}
+
+CustomCloseDateSelectionList.displayName = 'CustomCloseDateSelectionList';
+
+export default CustomCloseDateSelectionList;
diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx
new file mode 100644
index 00000000000..a11e08afbf7
--- /dev/null
+++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx
@@ -0,0 +1,136 @@
+import React, {useCallback, useMemo, useState} from 'react';
+import {View} from 'react-native';
+import FormAlertWithSubmitButton from '@components/FormAlertWithSubmitButton';
+import FormHelpMessage from '@components/FormHelpMessage';
+import HeaderWithBackButton from '@components/HeaderWithBackButton';
+import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription';
+import ScreenWrapper from '@components/ScreenWrapper';
+import SingleSelectListItem from '@components/SelectionList/SingleSelectListItem';
+import {ListItem} from '@components/SelectionList/types';
+import Text from '@components/Text';
+import useLocalize from '@hooks/useLocalize';
+import useThemeStyles from '@hooks/useThemeStyles';
+import Navigation from '@libs/Navigation/Navigation';
+import CONST from '@src/CONST';
+import type {CompanyCardStatementCloseDate} from '@src/types/onyx/CardFeeds';
+import CustomCloseDateSelectionList from './CustomCloseDateSelectionList';
+
+type StatementCloseDateListItem = ListItem & {
+ value: CompanyCardStatementCloseDate;
+};
+
+function WorkspaceCompanyCardStatementCloseDateSelectionList() {
+ const {translate} = useLocalize();
+ const styles = useThemeStyles();
+
+ const [selectedDate, setSelectedDate] = useState(undefined);
+ const [selectedCustomDate, setSelectedCustomDate] = useState(undefined);
+ const [error, setError] = useState(undefined);
+
+ const [isChoosingCustomDate, setIsChoosingCustomDate] = useState(false);
+
+ const title = useMemo(
+ () => (isChoosingCustomDate ? translate('workspace.companyCards.customCloseDate') : translate('workspace.moreFeatures.companyCards.statementCloseDateTitle')),
+ [translate, isChoosingCustomDate],
+ );
+
+ const goBack = useCallback(() => {
+ if (isChoosingCustomDate) {
+ setIsChoosingCustomDate(false);
+ return;
+ }
+
+ Navigation.goBack();
+ }, [isChoosingCustomDate]);
+
+ 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)) {
+ setError(translate('workspace.moreFeatures.companyCards.error.statementCloseDateRequired'));
+ return;
+ }
+
+ // s77rt do something with selectedDate / selectedCustomDate
+ }, [selectedDate, selectedCustomDate]);
+
+ // s77rt fix size (and add compact option)
+
+ return (
+
+
+ {isChoosingCustomDate ? (
+
+ ) : (
+ <>
+
+ {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 && (
+ setIsChoosingCustomDate(true)}
+ />
+ )}
+
+
+
+ {!!error && (
+
+ )}
+
+
+ >
+ )}
+
+ );
+}
+
+WorkspaceCompanyCardStatementCloseDateSelectionList.displayName = 'WorkspaceCompanyCardStatementCloseDateSelectionList';
+
+export default WorkspaceCompanyCardStatementCloseDateSelectionList;
diff --git a/src/types/onyx/CardFeeds.ts b/src/types/onyx/CardFeeds.ts
index 7941e8fd1cc..f2650bbab51 100644
--- a/src/types/onyx/CardFeeds.ts
+++ b/src/types/onyx/CardFeeds.ts
@@ -4,6 +4,9 @@ import type {ValueOf} from 'type-fest';
import type CONST from '@src/CONST';
import type * as OnyxCommon from './OnyxCommon';
+/** Card statement close date */
+type CompanyCardStatementCloseDate = ValueOf;
+
/** Card feed */
type CompanyCardFeed = ValueOf;
@@ -165,4 +168,5 @@ export type {
CompanyCardNicknames,
CompanyCardFeedWithNumber,
FundID,
+ CompanyCardStatementCloseDate,
};
From 0bf1e6480a42025c316af9b6e026e1dd5d1682d3 Mon Sep 17 00:00:00 2001
From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com>
Date: Fri, 27 Jun 2025 23:53:29 +0100
Subject: [PATCH 03/20] use compact mode in custom close date menu item
---
.../index.tsx | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx
index a11e08afbf7..5d94a2c3257 100644
--- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx
+++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx
@@ -108,6 +108,7 @@ function WorkspaceCompanyCardStatementCloseDateSelectionList() {
title={selectedCustomDate?.toString()}
description={translate('workspace.companyCards.customCloseDate')}
onPress={() => setIsChoosingCustomDate(true)}
+ viewMode={CONST.OPTION_MODE.COMPACT}
/>
)}
From 28ce0e4234fc9a016e445ce101db11b263b08d38 Mon Sep 17 00:00:00 2001
From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com>
Date: Sat, 28 Jun 2025 00:56:31 +0100
Subject: [PATCH 04/20] WorkspaceCompanyCardStatementCloseDateSelectionList:
added onSubmit callback
---
.../index.tsx | 15 +++++---
.../addNew/StatementCloseDateStep.tsx | 38 ++++++++++++++++++-
src/types/onyx/CardFeeds.ts | 3 ++
3 files changed, 48 insertions(+), 8 deletions(-)
diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx
index 5d94a2c3257..17e74fc917f 100644
--- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx
+++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx
@@ -19,7 +19,12 @@ type StatementCloseDateListItem = ListItem & {
value: CompanyCardStatementCloseDate;
};
-function WorkspaceCompanyCardStatementCloseDateSelectionList() {
+type WorkspaceCompanyCardStatementCloseDateSelectionListProps = {
+ confirmText: string;
+ onSubmit: (statementCloseDate: CompanyCardStatementCloseDate, statementCustomCloseDate: number | undefined) => void;
+};
+
+function WorkspaceCompanyCardStatementCloseDateSelectionList({confirmText, onSubmit}: WorkspaceCompanyCardStatementCloseDateSelectionListProps) {
const {translate} = useLocalize();
const styles = useThemeStyles();
@@ -63,10 +68,8 @@ function WorkspaceCompanyCardStatementCloseDateSelectionList() {
return;
}
- // s77rt do something with selectedDate / selectedCustomDate
- }, [selectedDate, selectedCustomDate]);
-
- // s77rt fix size (and add compact option)
+ onSubmit(selectedDate, selectedDate === CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH ? selectedCustomDate : undefined);
+ }, [selectedDate, selectedCustomDate, onSubmit]);
return (
)}
diff --git a/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx b/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx
index 379b7ba0e67..908708243c8 100644
--- a/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx
+++ b/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx
@@ -1,4 +1,12 @@
-import React from 'react';
+import React, {useCallback} from 'react';
+import useOnyx from 'react-native-onyx/dist/useOnyx';
+import useCardFeeds from '@hooks/useCardFeeds';
+import useLocalize from '@hooks/useLocalize';
+import {addNewCompanyCardsFeed} from '@libs/actions/CompanyCards';
+import Navigation from '@libs/Navigation/Navigation';
+import ONYXKEYS from '@src/ONYXKEYS';
+import ROUTES from '@src/ROUTES';
+import {CompanyCardStatementCloseDate} from '@src/types/onyx/CardFeeds';
import WorkspaceCompanyCardStatementCloseDateSelectionList from '../WorkspaceCompanyCardStatementCloseDateSelectionList';
type StatementCloseDateStepProps = {
@@ -7,7 +15,33 @@ type StatementCloseDateStepProps = {
};
function StatementCloseDateStep({policyID}: StatementCloseDateStepProps) {
- return ;
+ const {translate} = useLocalize();
+
+ 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 submit = useCallback(
+ // s77rt make use of statementCloseDate / statementCustomCloseDate and remove disable lint rule
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ (statementCloseDate: CompanyCardStatementCloseDate, statementCustomCloseDate: number | undefined) => {
+ if (!addNewCard?.data) {
+ return;
+ }
+
+ addNewCompanyCardsFeed(policyID, addNewCard.data.feedType, addNewCard.data.feedDetails, cardFeeds, lastSelectedFeed);
+ Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(policyID));
+ },
+ [policyID, addNewCard, cardFeeds, lastSelectedFeed],
+ );
+
+ return (
+
+ );
}
StatementCloseDateStep.displayName = 'StatementCloseDateStep';
diff --git a/src/types/onyx/CardFeeds.ts b/src/types/onyx/CardFeeds.ts
index f2650bbab51..ea55d5044e5 100644
--- a/src/types/onyx/CardFeeds.ts
+++ b/src/types/onyx/CardFeeds.ts
@@ -106,6 +106,9 @@ type AddNewCardFeedData = {
/** Card feed provider */
feedType: CardFeedProvider;
+ /** Stringified card feed details */
+ feedDetails: string;
+
/** Name of the card */
cardTitle: string;
From 9e50cc1aa4941c00130adf18a1ec1b52251422a9 Mon Sep 17 00:00:00 2001
From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com>
Date: Sat, 28 Jun 2025 01:13:57 +0100
Subject: [PATCH 05/20] add statement close date step
---
src/CONST/index.ts | 1 +
.../index.tsx | 8 ++++----
.../workspace/companyCards/addNew/AddNewCardPage.tsx | 4 ++--
.../workspace/companyCards/addNew/DetailsStep.tsx | 12 +++++++++++-
.../companyCards/addNew/StatementCloseDateStep.tsx | 8 +++++++-
5 files changed, 25 insertions(+), 8 deletions(-)
diff --git a/src/CONST/index.ts b/src/CONST/index.ts
index 56b4e0c332c..0b59dcdd15e 100755
--- a/src/CONST/index.ts
+++ b/src/CONST/index.ts
@@ -3404,6 +3404,7 @@ const CONST = {
AMEX_CUSTOM_FEED: 'AmexCustomFeed',
SELECT_COUNTRY: 'SelectCountry',
PLAID_CONNECTION: 'PlaidConnection',
+ SELECT_STATEMENT_CLOSE_DATE: 'SelectStatementCloseDate',
},
CARD_TYPE: {
AMEX: 'amex',
diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx
index 17e74fc917f..79f4ac1e8f9 100644
--- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx
+++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx
@@ -10,7 +10,6 @@ import {ListItem} from '@components/SelectionList/types';
import Text from '@components/Text';
import useLocalize from '@hooks/useLocalize';
import useThemeStyles from '@hooks/useThemeStyles';
-import Navigation from '@libs/Navigation/Navigation';
import CONST from '@src/CONST';
import type {CompanyCardStatementCloseDate} from '@src/types/onyx/CardFeeds';
import CustomCloseDateSelectionList from './CustomCloseDateSelectionList';
@@ -22,9 +21,10 @@ type StatementCloseDateListItem = ListItem & {
type WorkspaceCompanyCardStatementCloseDateSelectionListProps = {
confirmText: string;
onSubmit: (statementCloseDate: CompanyCardStatementCloseDate, statementCustomCloseDate: number | undefined) => void;
+ onBackButtonPress: () => void;
};
-function WorkspaceCompanyCardStatementCloseDateSelectionList({confirmText, onSubmit}: WorkspaceCompanyCardStatementCloseDateSelectionListProps) {
+function WorkspaceCompanyCardStatementCloseDateSelectionList({confirmText, onSubmit, onBackButtonPress}: WorkspaceCompanyCardStatementCloseDateSelectionListProps) {
const {translate} = useLocalize();
const styles = useThemeStyles();
@@ -45,8 +45,8 @@ function WorkspaceCompanyCardStatementCloseDateSelectionList({confirmText, onSub
return;
}
- Navigation.goBack();
- }, [isChoosingCustomDate]);
+ onBackButtonPress();
+ }, [isChoosingCustomDate, onBackButtonPress]);
const selectDateAndClearError = useCallback((item: StatementCloseDateListItem) => {
setSelectedDate(item.value);
diff --git a/src/pages/workspace/companyCards/addNew/AddNewCardPage.tsx b/src/pages/workspace/companyCards/addNew/AddNewCardPage.tsx
index 40704af8a40..eb460cdc82e 100644
--- a/src/pages/workspace/companyCards/addNew/AddNewCardPage.tsx
+++ b/src/pages/workspace/companyCards/addNew/AddNewCardPage.tsx
@@ -84,9 +84,9 @@ function AddNewCardPage({policy}: WithPolicyAndFullscreenLoadingProps) {
return ;
case CONST.COMPANY_CARDS.STEP.PLAID_CONNECTION:
return ;
- default:
- // s77rt test
+ case CONST.COMPANY_CARDS.STEP.SELECT_STATEMENT_CLOSE_DATE:
return ;
+ default:
return isBetaEnabled(CONST.BETAS.PLAID_COMPANY_CARDS) ? : ;
}
}
diff --git a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx
index a9e036894ea..257d1919a22 100644
--- a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx
+++ b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx
@@ -13,6 +13,7 @@ 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 useTheme from '@hooks/useTheme';
import useThemeStyles from '@hooks/useThemeStyles';
@@ -35,6 +36,7 @@ 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});
@@ -46,6 +48,9 @@ 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;
@@ -58,6 +63,11 @@ function DetailsStep({policyID}: DetailsStepProps) {
.map(([key, value]) => `${key}: ${value}`)
.join(', ');
+ 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));
};
@@ -198,7 +208,7 @@ function DetailsStep({policyID}: DetailsStepProps) {
/>
{
+ setAddNewCompanyCardStepAndData({step: CONST.COMPANY_CARDS.STEP.CARD_DETAILS});
+ }, []);
+
return (
);
}
From 3c9ea3c3dce0ae6f1a09fde07b2ac3763e38378a Mon Sep 17 00:00:00 2001
From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com>
Date: Sat, 28 Jun 2025 01:40:23 +0100
Subject: [PATCH 06/20] store feeddetails in onyx as an object
---
src/libs/actions/CompanyCards.ts | 8 +++--
.../companyCards/addNew/DetailsStep.tsx | 6 ++--
src/types/onyx/CardFeeds.ts | 29 +++++++++++++++++--
3 files changed, 34 insertions(+), 9 deletions(-)
diff --git a/src/libs/actions/CompanyCards.ts b/src/libs/actions/CompanyCards.ts
index 785d921583f..7409a4ee8e7 100644
--- a/src/libs/actions/CompanyCards.ts
+++ b/src/libs/actions/CompanyCards.ts
@@ -21,7 +21,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, CompanyCardFeed} from '@src/types/onyx/CardFeeds';
+import type {AddNewCardFeedData, AddNewCardFeedStep, CardFeedDetails, CompanyCardFeed} from '@src/types/onyx/CardFeeds';
import type {OnyxData} from '@src/types/onyx/Request';
type AddNewCompanyCardFlowData = {
@@ -58,7 +58,7 @@ function clearAddNewCardFlow() {
});
}
-function addNewCompanyCardsFeed(policyID: string | undefined, cardFeed: CompanyCardFeed, feedDetails: string, cardFeeds: OnyxEntry, lastSelectedFeed?: CompanyCardFeed) {
+function addNewCompanyCardsFeed(policyID: string | undefined, cardFeed: CompanyCardFeed, feedDetails: CardFeedDetails, cardFeeds: OnyxEntry, lastSelectedFeed?: CompanyCardFeed) {
const authToken = NetworkStore.getAuthToken();
const workspaceAccountID = PolicyUtils.getWorkspaceAccountID(policyID);
@@ -131,7 +131,9 @@ function addNewCompanyCardsFeed(policyID: string | undefined, cardFeed: CompanyC
policyID,
authToken,
feedType,
- feedDetails,
+ feedDetails: Object.entries(feedDetails)
+ .map(([key, value]) => `${key}: ${value}`)
+ .join(', '),
};
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 257d1919a22..c90537a586c 100644
--- a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx
+++ b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx
@@ -56,12 +56,10 @@ function DetailsStep({policyID}: DetailsStepProps) {
return;
}
- const feedDetails = Object.entries({
+ const feedDetails = {
...values,
bankName: addNewCard.data.bankName ?? 'Amex',
- })
- .map(([key, value]) => `${key}: ${value}`)
- .join(', ');
+ };
if (shouldSelectStatementCloseDate) {
setAddNewCompanyCardStepAndData({step: CONST.COMPANY_CARDS.STEP.SELECT_STATEMENT_CLOSE_DATE, data: {feedDetails}});
diff --git a/src/types/onyx/CardFeeds.ts b/src/types/onyx/CardFeeds.ts
index ea55d5044e5..59163e5af1b 100644
--- a/src/types/onyx/CardFeeds.ts
+++ b/src/types/onyx/CardFeeds.ts
@@ -20,6 +20,30 @@ type CardFeedProvider =
| typeof CONST.COMPANY_CARD.FEED_BANK_NAME.AMEX
| typeof CONST.COMPANY_CARD.FEED_BANK_NAME.STRIPE;
+/** Card feed details */
+type CardFeedDetails = {
+ /** Card title */
+ cardTitle?: string;
+
+ /** Processor ID */
+ processorID?: string;
+
+ /** Financial institution (bank) ID */
+ bankID?: string;
+
+ /** Financial institution (bank) name */
+ bankName?: string;
+
+ /** Company ID */
+ companyID?: string;
+
+ /** Distribution ID */
+ distributionID?: string;
+
+ /** Delivery file name */
+ deliveryFileName: string;
+};
+
/** Custom card feed data */
type CustomCardFeedData = OnyxCommon.OnyxValueWithOfflineFeedback<{
/** Whether any actions are pending */
@@ -106,8 +130,8 @@ type AddNewCardFeedData = {
/** Card feed provider */
feedType: CardFeedProvider;
- /** Stringified card feed details */
- feedDetails: string;
+ /** Card feed details */
+ feedDetails: CardFeedDetails;
/** Name of the card */
cardTitle: string;
@@ -164,6 +188,7 @@ export type {
AddNewCompanyCardFeed,
AddNewCardFeedData,
CompanyCardFeed,
+ CardFeedDetails,
DirectCardFeedData,
CardFeedProvider,
CardFeedData,
From 9085f8be6ffb22bc8dbe98f05323ad645e67f322 Mon Sep 17 00:00:00 2001
From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com>
Date: Sat, 28 Jun 2025 01:49:15 +0100
Subject: [PATCH 07/20] added default values to details step
---
src/pages/workspace/companyCards/addNew/DetailsStep.tsx | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx
index c90537a586c..624936908e2 100644
--- a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx
+++ b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx
@@ -149,6 +149,7 @@ function DetailsStep({policyID}: DetailsStepProps) {
role={CONST.ROLE.PRESENTATION}
containerStyles={[styles.mb6]}
ref={inputCallbackRef}
+ defaultValue={addNewCard?.data.feedDetails.processorID}
/>
>
);
@@ -175,6 +178,7 @@ function DetailsStep({policyID}: DetailsStepProps) {
role={CONST.ROLE.PRESENTATION}
containerStyles={[styles.mb6]}
ref={inputCallbackRef}
+ defaultValue={addNewCard?.data.feedDetails.distributionID}
/>
);
case CONST.COMPANY_CARD.FEED_BANK_NAME.AMEX:
@@ -186,6 +190,7 @@ function DetailsStep({policyID}: DetailsStepProps) {
role={CONST.ROLE.PRESENTATION}
containerStyles={[styles.mb6]}
ref={inputCallbackRef}
+ defaultValue={addNewCard?.data.feedDetails.deliveryFileName}
/>
);
default:
From 298246f0659cb73d33db61efce9e094f09e9d3a0 Mon Sep 17 00:00:00 2001
From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com>
Date: Sat, 28 Jun 2025 01:58:08 +0100
Subject: [PATCH 08/20] update CardFeedDetails type
---
.../workspace/companyCards/addNew/DetailsStep.tsx | 10 +++++-----
src/types/onyx/CardFeeds.ts | 5 +----
2 files changed, 6 insertions(+), 9 deletions(-)
diff --git a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx
index 624936908e2..e1879c6ef9e 100644
--- a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx
+++ b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx
@@ -149,7 +149,7 @@ function DetailsStep({policyID}: DetailsStepProps) {
role={CONST.ROLE.PRESENTATION}
containerStyles={[styles.mb6]}
ref={inputCallbackRef}
- defaultValue={addNewCard?.data.feedDetails.processorID}
+ defaultValue={addNewCard?.data.feedDetails?.processorID}
/>
>
);
@@ -178,7 +178,7 @@ function DetailsStep({policyID}: DetailsStepProps) {
role={CONST.ROLE.PRESENTATION}
containerStyles={[styles.mb6]}
ref={inputCallbackRef}
- defaultValue={addNewCard?.data.feedDetails.distributionID}
+ defaultValue={addNewCard?.data.feedDetails?.distributionID}
/>
);
case CONST.COMPANY_CARD.FEED_BANK_NAME.AMEX:
@@ -190,7 +190,7 @@ function DetailsStep({policyID}: DetailsStepProps) {
role={CONST.ROLE.PRESENTATION}
containerStyles={[styles.mb6]}
ref={inputCallbackRef}
- defaultValue={addNewCard?.data.feedDetails.deliveryFileName}
+ defaultValue={addNewCard?.data.feedDetails?.deliveryFileName}
/>
);
default:
diff --git a/src/types/onyx/CardFeeds.ts b/src/types/onyx/CardFeeds.ts
index 59163e5af1b..6aca9f322b1 100644
--- a/src/types/onyx/CardFeeds.ts
+++ b/src/types/onyx/CardFeeds.ts
@@ -22,9 +22,6 @@ type CardFeedProvider =
/** Card feed details */
type CardFeedDetails = {
- /** Card title */
- cardTitle?: string;
-
/** Processor ID */
processorID?: string;
@@ -131,7 +128,7 @@ type AddNewCardFeedData = {
feedType: CardFeedProvider;
/** Card feed details */
- feedDetails: CardFeedDetails;
+ feedDetails?: CardFeedDetails;
/** Name of the card */
cardTitle: string;
From 66a37c7534f5c1e006d12d44883c09df8411ffe7 Mon Sep 17 00:00:00 2001
From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com>
Date: Sat, 28 Jun 2025 02:06:54 +0100
Subject: [PATCH 09/20] lint
---
.../CustomCloseDateSelectionList.tsx | 4 ++--
.../index.tsx | 4 ++--
.../companyCards/addNew/StatementCloseDateStep.tsx | 6 +++---
3 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/CustomCloseDateSelectionList.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/CustomCloseDateSelectionList.tsx
index f62d16d3f7f..96f0f315767 100644
--- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/CustomCloseDateSelectionList.tsx
+++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/CustomCloseDateSelectionList.tsx
@@ -2,7 +2,7 @@ import React, {useCallback, useMemo, useState} from 'react';
import FormHelpMessage from '@components/FormHelpMessage';
import SelectionList from '@components/SelectionList';
import SingleSelectListItem from '@components/SelectionList/SingleSelectListItem';
-import {ListItem} from '@components/SelectionList/types';
+import type {ListItem} from '@components/SelectionList/types';
import useDebouncedState from '@hooks/useDebouncedState';
import useLocalize from '@hooks/useLocalize';
import useThemeStyles from '@hooks/useThemeStyles';
@@ -60,7 +60,7 @@ function CustomCloseDateSelectionList({initiallySelectedDay, onConfirmSelectedDa
}
onConfirmSelectedDay(selectedDay);
- }, [selectedDay, onConfirmSelectedDay]);
+ }, [selectedDay, onConfirmSelectedDay, translate]);
return (
{
- if (!addNewCard?.data) {
+ if (!addNewCard?.data.feedDetails) {
return;
}
From 0fb57f3a85ed24f2fa95b0b73a8ee5cd628e8a62 Mon Sep 17 00:00:00 2001
From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com>
Date: Sat, 28 Jun 2025 02:26:02 +0100
Subject: [PATCH 10/20] disable details and statement close date steps when
offline
---
.../index.tsx | 5 +++--
src/pages/workspace/companyCards/addNew/DetailsStep.tsx | 1 -
.../workspace/companyCards/addNew/StatementCloseDateStep.tsx | 1 +
3 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx
index 52dcaf0a7f7..f4ff3bafdaf 100644
--- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx
+++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx
@@ -22,9 +22,10 @@ type WorkspaceCompanyCardStatementCloseDateSelectionListProps = {
confirmText: string;
onSubmit: (statementCloseDate: CompanyCardStatementCloseDate, statementCustomCloseDate: number | undefined) => void;
onBackButtonPress: () => void;
+ enabledWhenOffline: boolean;
};
-function WorkspaceCompanyCardStatementCloseDateSelectionList({confirmText, onSubmit, onBackButtonPress}: WorkspaceCompanyCardStatementCloseDateSelectionListProps) {
+function WorkspaceCompanyCardStatementCloseDateSelectionList({confirmText, onSubmit, onBackButtonPress, enabledWhenOffline}: WorkspaceCompanyCardStatementCloseDateSelectionListProps) {
const {translate} = useLocalize();
const styles = useThemeStyles();
@@ -126,7 +127,7 @@ function WorkspaceCompanyCardStatementCloseDateSelectionList({confirmText, onSub
>
diff --git a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx
index e1879c6ef9e..ec2bb409665 100644
--- a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx
+++ b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx
@@ -215,7 +215,6 @@ function DetailsStep({policyID}: DetailsStepProps) {
onSubmit={submit}
validate={validate}
style={[styles.mh5, styles.flexGrow1]}
- enabledWhenOffline
shouldHideFixErrorsAlert={feedProvider !== CONST.COMPANY_CARD.FEED_BANK_NAME.VISA}
addBottomSafeAreaPadding
>
diff --git a/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx b/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx
index eb93ecbdf86..5894815168b 100644
--- a/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx
+++ b/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx
@@ -46,6 +46,7 @@ function StatementCloseDateStep({policyID}: StatementCloseDateStepProps) {
confirmText={translate('common.submit')}
onSubmit={submit}
onBackButtonPress={goBack}
+ enabledWhenOffline={false}
/>
);
}
From 978709b331bde259d85da4c66a8f14c2f322d838 Mon Sep 17 00:00:00 2001
From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com>
Date: Sat, 28 Jun 2025 14:24:32 +0100
Subject: [PATCH 11/20] translate
---
src/languages/de.ts | 9 +++++++++
src/languages/es.ts | 9 +++++++++
src/languages/fr.ts | 9 +++++++++
src/languages/it.ts | 9 +++++++++
src/languages/ja.ts | 9 +++++++++
src/languages/nl.ts | 9 +++++++++
src/languages/pl.ts | 9 +++++++++
src/languages/pt-BR.ts | 9 +++++++++
src/languages/zh-hans.ts | 9 +++++++++
9 files changed, 81 insertions(+)
diff --git a/src/languages/de.ts b/src/languages/de.ts
index 69071e9d644..7f69b6a6c04 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -4085,6 +4085,11 @@ const translations = {
pleaseSelectFeedType: 'Bitte wählen Sie einen Feed-Typ aus, bevor Sie fortfahren.',
},
},
+ statementCloseDate: {
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: 'Letzter Tag des Monats',
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: 'Letzter Geschäftstag des Monats',
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: 'Individueller Tag des Monats',
+ },
assignCard: 'Karte zuweisen',
findCard: 'Karte finden',
cardNumber: 'Kartennummer',
@@ -4101,6 +4106,7 @@ const translations = {
startDateDescription: 'Wir werden alle Transaktionen ab diesem Datum importieren. Wenn kein Datum angegeben ist, gehen wir so weit zurück, wie es Ihre Bank erlaubt.',
fromTheBeginning: 'Von Anfang an',
customStartDate: 'Benutzerdefiniertes Startdatum',
+ customCloseDate: 'Benutzerdefiniertes Abschlussdatum',
letsDoubleCheck: 'Lassen Sie uns noch einmal überprüfen, ob alles richtig aussieht.',
confirmationDescription: 'Wir werden sofort mit dem Import von Transaktionen beginnen.',
cardholder: 'Karteninhaber',
@@ -4325,6 +4331,7 @@ const translations = {
removeCardFeedDescription: 'Möchten Sie diesen Karten-Feed wirklich entfernen? Dadurch werden alle Karten zugewiesen.',
error: {
feedNameRequired: 'Der Name des Karten-Feeds ist erforderlich',
+ statementCloseDateRequired: 'Bitte wählen Sie ein Abschlussdatum für den Kontoauszug aus.',
},
corporate: 'Löschen von Transaktionen einschränken',
personal: 'Löschen von Transaktionen erlauben',
@@ -4351,6 +4358,8 @@ const translations = {
expensifyCardBannerSubtitle:
'Genießen Sie Cashback bei jedem Einkauf in den USA, bis zu 50 % Rabatt auf Ihre Expensify-Rechnung, unbegrenzte virtuelle Karten und vieles mehr.',
expensifyCardBannerLearnMoreButton: 'Erfahren Sie mehr',
+ statementCloseDateTitle: 'Datum des Rechnungsabschlusses',
+ statementCloseDateDescription: 'Teilen Sie uns mit, wann Ihre Kartenabrechnung geschlossen wird, und wir erstellen eine passende Abrechnung in Expensify.',
},
workflows: {
title: 'Workflows',
diff --git a/src/languages/es.ts b/src/languages/es.ts
index 8f9e8e77ca1..d3968d7f736 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -4073,6 +4073,11 @@ const translations = {
pleaseSelectFeedType: 'Seleccione un tipo de pienso antes de continuar',
},
},
+ statementCloseDate: {
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: 'Último día del mes',
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: 'Último día hábil del mes',
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: 'Día personalizado del mes',
+ },
assignCard: 'Asignar tarjeta',
findCard: 'Encontrar tarjeta',
cardNumber: 'Número de la tarjeta',
@@ -4089,6 +4094,7 @@ const translations = {
startDateDescription: 'Importaremos todas las transacciones desde esta fecha en adelante. Si no se especifica una fecha, iremos tan atrás como lo permita tu banco.',
fromTheBeginning: 'Desde el principio',
customStartDate: 'Fecha de inicio personalizada',
+ customCloseDate: 'Fecha de cierre personalizada',
letsDoubleCheck: 'Verifiquemos que todo esté bien.',
confirmationDescription: 'Comenzaremos a importar transacciones inmediatamente.',
cardholder: 'Titular de la tarjeta',
@@ -4314,6 +4320,7 @@ const translations = {
removeCardFeedDescription: '¿Estás seguro de que deseas eliminar esta fuente de tarjetas? Esto anulará la asignación de todas las tarjetas.',
error: {
feedNameRequired: 'Se requiere el nombre de la fuente de la tarjeta',
+ statementCloseDateRequired: 'Por favor, selecciona una fecha de cierre del estado de cuenta.',
},
corporate: 'Restringir eliminación de transacciones',
personal: 'Permitir eliminación de transacciones',
@@ -4340,6 +4347,8 @@ const translations = {
expensifyCardBannerSubtitle:
'Disfruta de una devolución en cada compra en Estados Unidos, hasta un 50% de descuento en tu factura de Expensify, tarjetas virtuales ilimitadas y mucho más.',
expensifyCardBannerLearnMoreButton: 'Más información',
+ statementCloseDateTitle: 'Fecha de cierre del estado de cuenta',
+ statementCloseDateDescription: 'Indícanos cuándo cierra el estado de cuenta de tu tarjeta y crearemos uno correspondiente en Expensify.',
},
workflows: {
title: 'Flujos de trabajo',
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index 14ae499d4fe..8f3662cfab5 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -4094,6 +4094,11 @@ const translations = {
pleaseSelectFeedType: 'Veuillez sélectionner un type de flux avant de continuer',
},
},
+ statementCloseDate: {
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: 'Dernier jour du mois',
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: 'Dernier jour ouvrable du mois',
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: 'Jour personnalisé du mois',
+ },
assignCard: 'Attribuer la carte',
findCard: 'Trouver la carte',
cardNumber: 'Numéro de carte',
@@ -4110,6 +4115,7 @@ const translations = {
startDateDescription: "Nous importerons toutes les transactions à partir de cette date. Si aucune date n'est spécifiée, nous remonterons aussi loin que votre banque le permet.",
fromTheBeginning: 'Depuis le début',
customStartDate: 'Date de début personnalisé',
+ customCloseDate: 'Date de clôture personnalisée',
letsDoubleCheck: 'Vérifions que tout est correct.',
confirmationDescription: 'Nous commencerons à importer les transactions immédiatement.',
cardholder: 'Titulaire de carte',
@@ -4337,6 +4343,7 @@ const translations = {
removeCardFeedDescription: 'Êtes-vous sûr de vouloir supprimer ce flux de cartes ? Cela désassignera toutes les cartes.',
error: {
feedNameRequired: 'Le nom du flux de carte est requis',
+ statementCloseDateRequired: 'Veuillez sélectionner une date de clôture du relevé',
},
corporate: 'Restreindre la suppression des transactions',
personal: 'Autoriser la suppression des transactions',
@@ -4364,6 +4371,8 @@ const translations = {
expensifyCardBannerSubtitle:
"Profitez de remises en argent sur chaque achat aux États-Unis, jusqu'à 50 % de réduction sur votre facture Expensify, des cartes virtuelles illimitées, et bien plus encore.",
expensifyCardBannerLearnMoreButton: 'En savoir plus',
+ statementCloseDateTitle: 'Date de clôture du relevé',
+ statementCloseDateDescription: 'Indiquez-nous la date de clôture de votre relevé de carte et nous créerons un relevé correspondant dans Expensify',
},
workflows: {
title: 'Workflows',
diff --git a/src/languages/it.ts b/src/languages/it.ts
index acfe0ae636f..be686d412fa 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -4071,6 +4071,11 @@ const translations = {
pleaseSelectFeedType: 'Si prega di selezionare un tipo di feed prima di continuare',
},
},
+ statementCloseDate: {
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: 'Ultimo giorno del mese',
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: 'Ultimo giorno lavorativo del mese',
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: 'Giorno del mese personalizzato',
+ },
assignCard: 'Assegna carta',
findCard: 'Trova carta',
cardNumber: 'Numero di carta',
@@ -4088,6 +4093,7 @@ const translations = {
'Importeremo tutte le transazioni da questa data in poi. Se non viene specificata alcuna data, risaliremo indietro fino a quanto consentito dalla tua banca.',
fromTheBeginning: "Dall'inizio",
customStartDate: 'Data di inizio personalizzata',
+ customCloseDate: 'Data di chiusura personalizzata',
letsDoubleCheck: 'Verifichiamo che tutto sia corretto.',
confirmationDescription: 'Inizieremo immediatamente a importare le transazioni.',
cardholder: 'Titolare della carta',
@@ -4311,6 +4317,7 @@ const translations = {
removeCardFeedDescription: 'Sei sicuro di voler rimuovere questo feed di carte? Questo disassegnerà tutte le carte.',
error: {
feedNameRequired: 'Il nome del feed della carta è obbligatorio',
+ statementCloseDateRequired: "Selezionare una data di chiusura dell'estratto conto",
},
corporate: "Limita l'eliminazione delle transazioni",
personal: "Consenti l'eliminazione delle transazioni",
@@ -4337,6 +4344,8 @@ const translations = {
expensifyCardBannerSubtitle:
'Goditi il cashback su ogni acquisto negli Stati Uniti, fino al 50% di sconto sulla tua fattura Expensify, carte virtuali illimitate e molto altro ancora.',
expensifyCardBannerLearnMoreButton: 'Scopri di più',
+ statementCloseDateTitle: "Data di chiusura dell'estratto conto",
+ statementCloseDateDescription: "Comunicateci la data di chiusura dell'estratto conto della vostra carta e creeremo un estratto conto corrispondente in Expensify",
},
workflows: {
title: 'Flussi di lavoro',
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index 99c18f17a39..ca8d1dec0b1 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -4040,6 +4040,11 @@ const translations = {
pleaseSelectFeedType: '続行する前にフィードタイプを選択してください',
},
},
+ statementCloseDate: {
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: '月の最終日',
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: '月の最終営業日',
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: 'カスタム月日',
+ },
assignCard: 'カードを割り当てる',
findCard: 'カードを探す',
cardNumber: 'カード番号',
@@ -4056,6 +4061,7 @@ const translations = {
startDateDescription: 'この日付以降のすべての取引をインポートします。日付が指定されていない場合は、銀行が許可する限り遡ります。',
fromTheBeginning: '最初から',
customStartDate: 'カスタム開始日',
+ customCloseDate: 'カスタムクローズ日',
letsDoubleCheck: 'すべてが正しいかどうかをもう一度確認しましょう。',
confirmationDescription: 'すぐに取引のインポートを開始します。',
cardholder: 'カードホルダー',
@@ -4278,6 +4284,7 @@ const translations = {
removeCardFeedDescription: 'このカードフィードを削除してもよろしいですか?これにより、すべてのカードの割り当てが解除されます。',
error: {
feedNameRequired: 'カードフィード名は必須です',
+ statementCloseDateRequired: '明細書の締め日を選択してください。',
},
corporate: '取引の削除を制限する',
personal: '取引の削除を許可',
@@ -4302,6 +4309,8 @@ const translations = {
expensifyCardBannerTitle: 'Expensifyカードを取得する',
expensifyCardBannerSubtitle: 'すべての米国での購入でキャッシュバックを楽しみ、Expensifyの請求書が最大50%オフ、無制限のバーチャルカードなど、さらに多くの特典があります。',
expensifyCardBannerLearnMoreButton: '詳細を確認',
+ statementCloseDateTitle: '利用明細書の締め日',
+ statementCloseDateDescription: 'カード利用明細書の締め日をお知らせいただければ、Expensifyで一致する明細書を作成します。',
},
workflows: {
title: 'ワークフロー',
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index 4d8a7d7e8af..fddeb41ac9d 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -4070,6 +4070,11 @@ const translations = {
pleaseSelectFeedType: 'Selecteer een feedtype voordat u doorgaat.',
},
},
+ statementCloseDate: {
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: 'Laatste dag van de maand',
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: 'Laatste werkdag van de maand',
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: 'Aangepaste dag van de maand',
+ },
assignCard: 'Kaart toewijzen',
findCard: 'Kaart vinden',
cardNumber: 'Kaartnummer',
@@ -4086,6 +4091,7 @@ const translations = {
startDateDescription: 'We importeren alle transacties vanaf deze datum. Als er geen datum is opgegeven, gaan we zo ver terug als uw bank toestaat.',
fromTheBeginning: 'Vanaf het begin',
customStartDate: 'Aangepaste startdatum',
+ customCloseDate: 'Aangepaste sluitingsdatum',
letsDoubleCheck: 'Laten we dubbel controleren of alles er goed uitziet.',
confirmationDescription: 'We beginnen onmiddellijk met het importeren van transacties.',
cardholder: 'Kaart houder',
@@ -4310,6 +4316,7 @@ const translations = {
removeCardFeedDescription: 'Weet je zeker dat je deze kaartfeed wilt verwijderen? Dit zal alle kaarten deactiveren.',
error: {
feedNameRequired: 'Naam van de kaartfeed is vereist',
+ statementCloseDateRequired: 'Selecteer een datum waarop het afschrift moet worden gesloten.',
},
corporate: 'Beperk het verwijderen van transacties',
personal: 'Verwijderen van transacties toestaan',
@@ -4334,6 +4341,8 @@ const translations = {
expensifyCardBannerTitle: 'Verkrijg de Expensify Card',
expensifyCardBannerSubtitle: 'Geniet van cashback op elke aankoop in de VS, tot 50% korting op je Expensify-rekening, onbeperkte virtuele kaarten en nog veel meer.',
expensifyCardBannerLearnMoreButton: 'Meer informatie',
+ statementCloseDateTitle: 'Datum waarop rekeningafschrift wordt gesloten',
+ statementCloseDateDescription: 'Laat ons weten wanneer je rekeningafschrift wordt gesloten, dan maken we een bijpassend rekeningafschrift in Expensify.',
},
workflows: {
title: 'Workflows',
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index ad173df056a..cdb55cc0ada 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -4057,6 +4057,11 @@ const translations = {
pleaseSelectFeedType: 'Proszę wybrać typ kanału przed kontynuowaniem.',
},
},
+ statementCloseDate: {
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: 'Último dia do mês',
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: 'Último dia útil do mês',
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: 'Dia personalizado do mês',
+ },
assignCard: 'Przypisz kartę',
findCard: 'Znajdź kartę',
cardNumber: 'Numer karty',
@@ -4073,6 +4078,7 @@ const translations = {
startDateDescription: 'Zaimportujemy wszystkie transakcje od tej daty. Jeśli nie określono daty, sięgniemy tak daleko wstecz, jak pozwala na to Twój bank.',
fromTheBeginning: 'Od początku',
customStartDate: 'Niestandardowa data rozpoczęcia',
+ customCloseDate: 'Data de fecho personalizada',
letsDoubleCheck: 'Sprawdźmy jeszcze raz, czy wszystko wygląda dobrze.',
confirmationDescription: 'Natychmiast rozpoczniemy importowanie transakcji.',
cardholder: 'Posiadacz karty',
@@ -4296,6 +4302,7 @@ const translations = {
removeCardFeedDescription: 'Czy na pewno chcesz usunąć ten kanał kart? Spowoduje to odłączenie wszystkich kart.',
error: {
feedNameRequired: 'Nazwa kanału karty jest wymagana',
+ statementCloseDateRequired: 'Por favor, selecione uma data de fecho do extrato',
},
corporate: 'Ogranicz usuwanie transakcji',
personal: 'Zezwól na usuwanie transakcji',
@@ -4322,6 +4329,8 @@ const translations = {
expensifyCardBannerSubtitle:
'Ciesz się zwrotem gotówki przy każdym zakupie w USA, do 50% zniżki na rachunek Expensify, nielimitowanymi kartami wirtualnymi i wieloma innymi korzyściami.',
expensifyCardBannerLearnMoreButton: 'Dowiedz się więcej',
+ statementCloseDateTitle: 'Data de fecho do extrato',
+ statementCloseDateDescription: 'Informe-nos quando o extrato do seu cartão fecha e criaremos um extrato correspondente na Expensify',
},
workflows: {
title: 'Przepływy pracy',
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index b01ff678c71..6bc8eadbd8b 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -4063,6 +4063,11 @@ const translations = {
pleaseSelectFeedType: 'Por favor, selecione um tipo de feed antes de continuar.',
},
},
+ statementCloseDate: {
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: 'Último dia do mês',
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: 'Último dia útil do mês',
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: 'Dia personalizado do mês',
+ },
assignCard: 'Atribuir cartão',
findCard: 'Encontrar cartão',
cardNumber: 'Número do cartão',
@@ -4079,6 +4084,7 @@ const translations = {
startDateDescription: 'Importaremos todas as transações a partir desta data. Se nenhuma data for especificada, iremos o mais longe possível conforme permitido pelo seu banco.',
fromTheBeginning: 'Desde o início',
customStartDate: 'Data de início personalizada',
+ customCloseDate: 'Data de fechamento personalizada',
letsDoubleCheck: 'Vamos verificar se tudo está correto.',
confirmationDescription: 'Começaremos a importar transações imediatamente.',
cardholder: 'Titular do cartão',
@@ -4302,6 +4308,7 @@ const translations = {
removeCardFeedDescription: 'Tem certeza de que deseja remover este feed de cartão? Isso desatribuirá todos os cartões.',
error: {
feedNameRequired: 'O nome do feed do cartão é obrigatório',
+ statementCloseDateRequired: 'Favor selecionar uma data de fechamento do extrato',
},
corporate: 'Restringir a exclusão de transações',
personal: 'Permitir excluir transações',
@@ -4327,6 +4334,8 @@ const translations = {
expensifyCardBannerTitle: 'Obtenha o Cartão Expensify',
expensifyCardBannerSubtitle: 'Aproveite o cashback em todas as compras nos EUA, até 50% de desconto na sua fatura do Expensify, cartões virtuais ilimitados e muito mais.',
expensifyCardBannerLearnMoreButton: 'Saiba mais',
+ statementCloseDateTitle: 'Statement close date',
+ statementCloseDateDescription: 'Informe-nos quando o extrato do seu cartão for encerrado e criaremos um extrato correspondente na Expensify',
},
workflows: {
title: 'Fluxos de Trabalho',
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index 29579790c59..02fadfa5ae7 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -3998,6 +3998,11 @@ const translations = {
pleaseSelectFeedType: '请在继续之前选择一个订阅类型',
},
},
+ statementCloseDate: {
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: '本月最后一天',
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: '本月最后一个工作日',
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: '本月自定义日期',
+ },
assignCard: '分配卡片',
findCard: '查找卡片',
cardNumber: '卡号',
@@ -4014,6 +4019,7 @@ const translations = {
startDateDescription: '我们将从此日期开始导入所有交易。如果未指定日期,我们将根据您的银行允许的最早日期进行导入。',
fromTheBeginning: '从头开始',
customStartDate: '自定义开始日期',
+ customCloseDate: '自定义关闭日期',
letsDoubleCheck: '让我们仔细检查一下,确保一切正常。',
confirmationDescription: '我们将立即开始导入交易。',
cardholder: '持卡人',
@@ -4231,6 +4237,7 @@ const translations = {
removeCardFeedDescription: '您确定要移除此卡片源吗?这将取消分配所有卡片。',
error: {
feedNameRequired: '卡片摘要名称是必需的',
+ statementCloseDateRequired: '请选择报表关闭日期',
},
corporate: '限制删除交易',
personal: '允许删除交易',
@@ -4255,6 +4262,8 @@ const translations = {
expensifyCardBannerTitle: '获取Expensify卡',
expensifyCardBannerSubtitle: '享受每笔美国消费的现金返还,Expensify账单最高可享50%折扣,无限虚拟卡等更多优惠。',
expensifyCardBannerLearnMoreButton: '了解更多',
+ statementCloseDateTitle: '对账单关闭日期',
+ statementCloseDateDescription: '让我们知道您的银行卡对账单何时关闭,我们将在 Expensify 中创建匹配的对账单',
},
workflows: {
title: '工作流程',
From acf1b34240ab38c4708eb5727abff5eaefc366a8 Mon Sep 17 00:00:00 2001
From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com>
Date: Sat, 28 Jun 2025 20:49:58 +0100
Subject: [PATCH 12/20] fix options display on native
---
.../index.tsx | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx
index f4ff3bafdaf..e4d3e49cca6 100644
--- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx
+++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx
@@ -95,6 +95,7 @@ function WorkspaceCompanyCardStatementCloseDateSelectionList({confirmText, onSub
{Object.values(CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE)?.map((option) => (
Date: Sun, 29 Jun 2025 01:36:47 +0100
Subject: [PATCH 13/20] fixed submit button position
---
.../index.tsx | 27 ++++++++++---------
1 file changed, 15 insertions(+), 12 deletions(-)
diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx
index e4d3e49cca6..d2f2ab214c0 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 FixedFooter from '@components/FixedFooter';
import FormAlertWithSubmitButton from '@components/FormAlertWithSubmitButton';
import FormHelpMessage from '@components/FormHelpMessage';
import HeaderWithBackButton from '@components/HeaderWithBackButton';
@@ -118,19 +119,21 @@ function WorkspaceCompanyCardStatementCloseDateSelectionList({confirmText, onSub
)}
-
- {!!error && (
-
+
+ {!!error && (
+
+ )}
+
- )}
-
-
+
+
>
)}
From 708fd955ff819d3eea5a72c1d7468ed15a578b42 Mon Sep 17 00:00:00 2001
From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com>
Date: Sun, 29 Jun 2025 01:39:17 +0100
Subject: [PATCH 14/20] use ScrollView
---
.../index.tsx | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx
index d2f2ab214c0..9e3e1cf0294 100644
--- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx
+++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx
@@ -6,6 +6,7 @@ import FormHelpMessage from '@components/FormHelpMessage';
import HeaderWithBackButton from '@components/HeaderWithBackButton';
import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription';
import ScreenWrapper from '@components/ScreenWrapper';
+import ScrollView from '@components/ScrollView';
import SingleSelectListItem from '@components/SelectionList/SingleSelectListItem';
import type {ListItem} from '@components/SelectionList/types';
import Text from '@components/Text';
@@ -91,7 +92,7 @@ function WorkspaceCompanyCardStatementCloseDateSelectionList({confirmText, onSub
/>
) : (
<>
-
+
{translate('workspace.moreFeatures.companyCards.statementCloseDateDescription')}
{Object.values(CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE)?.map((option) => (
@@ -118,7 +119,7 @@ function WorkspaceCompanyCardStatementCloseDateSelectionList({confirmText, onSub
/>
)}
-
+
{!!error && (
From 4bf28d7855ad4761aae5b8cf0ec59e5632a61193 Mon Sep 17 00:00:00 2001
From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com>
Date: Sun, 29 Jun 2025 01:41:32 +0100
Subject: [PATCH 15/20] remove unnecessary View
---
.../index.tsx | 27 ++++++++++---------
1 file changed, 14 insertions(+), 13 deletions(-)
diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx
index 9e3e1cf0294..b0391051ea6 100644
--- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx
+++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx
@@ -120,20 +120,21 @@ function WorkspaceCompanyCardStatementCloseDateSelectionList({confirmText, onSub
)}
-
-
- {!!error && (
-
- )}
-
+ {!!error && (
+
-
+ )}
+
>
)}
From aa3d8f39b8e3da48ff0d468f4d690b36e5cb2fed Mon Sep 17 00:00:00 2001
From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com>
Date: Sun, 29 Jun 2025 02:00:43 +0100
Subject: [PATCH 16/20] make deliveryFileName optional
---
src/types/onyx/CardFeeds.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/types/onyx/CardFeeds.ts b/src/types/onyx/CardFeeds.ts
index 6aca9f322b1..48191bfabd7 100644
--- a/src/types/onyx/CardFeeds.ts
+++ b/src/types/onyx/CardFeeds.ts
@@ -38,7 +38,7 @@ type CardFeedDetails = {
distributionID?: string;
/** Delivery file name */
- deliveryFileName: string;
+ deliveryFileName?: string;
};
/** Custom card feed data */
From e2da6cb36b4706da06ddb308188e754e767760c3 Mon Sep 17 00:00:00 2001
From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com>
Date: Sun, 29 Jun 2025 02:30:30 +0100
Subject: [PATCH 17/20] move month days array to CONST
---
src/CONST/index.ts | 3 +++
.../CustomCloseDateSelectionList.tsx | 4 ++--
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/src/CONST/index.ts b/src/CONST/index.ts
index 0b59dcdd15e..3df4c0f743c 100755
--- a/src/CONST/index.ts
+++ b/src/CONST/index.ts
@@ -20,6 +20,8 @@ import {LOCALES} from './LOCALES';
const EMPTY_ARRAY = Object.freeze([]);
const EMPTY_OBJECT = Object.freeze({});
+const MONTH_DAYS = Object.freeze([...Array(28).keys()].map((i) => i + 1));
+
const DEFAULT_NUMBER_ID = 0;
const CLOUDFRONT_DOMAIN = 'cloudfront.net';
const CLOUDFRONT_URL = `https://d2k5nsl2zxldvw.${CLOUDFRONT_DOMAIN}`;
@@ -651,6 +653,7 @@ const CONST = {
ORDINAL_DAY_OF_MONTH: 'do',
MONTH_DAY_YEAR_ORDINAL_FORMAT: 'MMMM do, yyyy',
SECONDS_PER_DAY: 24 * 60 * 60,
+ MONTH_DAYS,
},
SMS: {
DOMAIN: '@expensify.sms',
diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/CustomCloseDateSelectionList.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/CustomCloseDateSelectionList.tsx
index 96f0f315767..f8380d423d5 100644
--- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/CustomCloseDateSelectionList.tsx
+++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/CustomCloseDateSelectionList.tsx
@@ -6,6 +6,7 @@ import type {ListItem} from '@components/SelectionList/types';
import useDebouncedState from '@hooks/useDebouncedState';
import useLocalize from '@hooks/useLocalize';
import useThemeStyles from '@hooks/useThemeStyles';
+import CONST from '@src/CONST';
type CustomCloseDateListItem = ListItem & {
value: number;
@@ -25,8 +26,7 @@ function CustomCloseDateSelectionList({initiallySelectedDay, onConfirmSelectedDa
const [error, setError] = useState(undefined);
const sections = useMemo(() => {
- const data = [...Array(28).keys()].reduce((days, key) => {
- const dayValue = key + 1;
+ const data = CONST.DATE.MONTH_DAYS.reduce((days, dayValue) => {
const day = {
value: dayValue,
text: dayValue.toString(),
From a949dc8f36f451d3f47d6dcaba98674a4cbf7f7e Mon Sep 17 00:00:00 2001
From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com>
Date: Sun, 29 Jun 2025 14:56:26 +0100
Subject: [PATCH 18/20] fix Polish translation
---
src/languages/pl.ts | 30 +++++++++++++++---------------
1 file changed, 15 insertions(+), 15 deletions(-)
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index cdb55cc0ada..564967ca1c6 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -4058,9 +4058,9 @@ const translations = {
},
},
statementCloseDate: {
- [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: 'Último dia do mês',
- [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: 'Último dia útil do mês',
- [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: 'Dia personalizado do mês',
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: 'Ostatni dzień miesiąca',
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: 'Ostatni dzień roboczy miesiąca',
+ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: 'Niestandardowy dzień miesiąca',
},
assignCard: 'Przypisz kartę',
findCard: 'Znajdź kartę',
@@ -4078,7 +4078,7 @@ const translations = {
startDateDescription: 'Zaimportujemy wszystkie transakcje od tej daty. Jeśli nie określono daty, sięgniemy tak daleko wstecz, jak pozwala na to Twój bank.',
fromTheBeginning: 'Od początku',
customStartDate: 'Niestandardowa data rozpoczęcia',
- customCloseDate: 'Data de fecho personalizada',
+ customCloseDate: 'Niestandardowa data zamknięcia',
letsDoubleCheck: 'Sprawdźmy jeszcze raz, czy wszystko wygląda dobrze.',
confirmationDescription: 'Natychmiast rozpoczniemy importowanie transakcji.',
cardholder: 'Posiadacz karty',
@@ -4302,7 +4302,7 @@ const translations = {
removeCardFeedDescription: 'Czy na pewno chcesz usunąć ten kanał kart? Spowoduje to odłączenie wszystkich kart.',
error: {
feedNameRequired: 'Nazwa kanału karty jest wymagana',
- statementCloseDateRequired: 'Por favor, selecione uma data de fecho do extrato',
+ statementCloseDateRequired: 'Wybierz datę zamknięcia wyciągu.',
},
corporate: 'Ogranicz usuwanie transakcji',
personal: 'Zezwól na usuwanie transakcji',
@@ -4329,8 +4329,8 @@ const translations = {
expensifyCardBannerSubtitle:
'Ciesz się zwrotem gotówki przy każdym zakupie w USA, do 50% zniżki na rachunek Expensify, nielimitowanymi kartami wirtualnymi i wieloma innymi korzyściami.',
expensifyCardBannerLearnMoreButton: 'Dowiedz się więcej',
- statementCloseDateTitle: 'Data de fecho do extrato',
- statementCloseDateDescription: 'Informe-nos quando o extrato do seu cartão fecha e criaremos um extrato correspondente na Expensify',
+ statementCloseDateTitle: 'Data zamknięcia oświadczenia',
+ statementCloseDateDescription: 'Poinformuj nas o zamknięciu wyciągu z karty, a my utworzymy pasujący wyciąg w Expensify.',
},
workflows: {
title: 'Przepływy pracy',
@@ -5675,9 +5675,9 @@ const translations = {
subtitle: 'Zero wydatków. Maksymalny relaks. Dobra robota!',
},
},
- unapproved: 'Não aprovado',
- unapprovedCash: 'Dinheiro não aprovado',
- unapprovedCompanyCards: 'Cartões de empresa não aprovados',
+ unapproved: 'Niezatwierdzony',
+ unapprovedCash: 'Niezatwierdzone środki pieniężne',
+ unapprovedCompanyCards: 'Niezatwierdzone karty firmowe',
saveSearch: 'Zapisz wyszukiwanie',
deleteSavedSearch: 'Usuń zapisaną wyszukiwarkę',
deleteSavedSearchConfirm: 'Czy na pewno chcesz usunąć to wyszukiwanie?',
@@ -5699,8 +5699,8 @@ const translations = {
after: ({date}: OptionalParam = {}) => `After ${date ?? ''}`,
on: ({date}: OptionalParam = {}) => `On ${date ?? ''}`,
presets: {
- [CONST.SEARCH.DATE_PRESETS.NEVER]: 'Nunca',
- [CONST.SEARCH.DATE_PRESETS.LAST_MONTH]: 'No mês passado',
+ [CONST.SEARCH.DATE_PRESETS.NEVER]: 'Nigdy',
+ [CONST.SEARCH.DATE_PRESETS.LAST_MONTH]: 'Ostatni miesiąc',
},
},
status: 'Status',
@@ -5735,12 +5735,12 @@ const translations = {
billable: 'Podlegające fakturowaniu',
reimbursable: 'Podlegające zwrotowi',
groupBy: {
- reports: 'Relatório',
- members: 'Membro',
+ reports: 'Raport',
+ members: 'Członek',
cards: 'Karta',
},
},
- groupBy: 'Agrupar por',
+ groupBy: 'Grupa według',
moneyRequestReport: {
emptyStateTitle: 'Ten raport nie zawiera wydatków.',
emptyStateSubtitle: 'Możesz dodać wydatki do tego raportu, używając przycisku powyżej.',
From a16733eadccfc702b9cc84c706adff4775c56d85 Mon Sep 17 00:00:00 2001
From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com>
Date: Sun, 29 Jun 2025 15:00:58 +0100
Subject: [PATCH 19/20] add missing period at end of sentences
---
src/languages/fr.ts | 4 ++--
src/languages/it.ts | 4 ++--
src/languages/pt-BR.ts | 4 ++--
src/languages/zh-hans.ts | 4 ++--
4 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index 8f3662cfab5..f077431745c 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -4343,7 +4343,7 @@ const translations = {
removeCardFeedDescription: 'Êtes-vous sûr de vouloir supprimer ce flux de cartes ? Cela désassignera toutes les cartes.',
error: {
feedNameRequired: 'Le nom du flux de carte est requis',
- statementCloseDateRequired: 'Veuillez sélectionner une date de clôture du relevé',
+ statementCloseDateRequired: 'Veuillez sélectionner une date de clôture du relevé.',
},
corporate: 'Restreindre la suppression des transactions',
personal: 'Autoriser la suppression des transactions',
@@ -4372,7 +4372,7 @@ const translations = {
"Profitez de remises en argent sur chaque achat aux États-Unis, jusqu'à 50 % de réduction sur votre facture Expensify, des cartes virtuelles illimitées, et bien plus encore.",
expensifyCardBannerLearnMoreButton: 'En savoir plus',
statementCloseDateTitle: 'Date de clôture du relevé',
- statementCloseDateDescription: 'Indiquez-nous la date de clôture de votre relevé de carte et nous créerons un relevé correspondant dans Expensify',
+ statementCloseDateDescription: 'Indiquez-nous la date de clôture de votre relevé de carte et nous créerons un relevé correspondant dans Expensify.',
},
workflows: {
title: 'Workflows',
diff --git a/src/languages/it.ts b/src/languages/it.ts
index be686d412fa..21b6b498c72 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -4317,7 +4317,7 @@ const translations = {
removeCardFeedDescription: 'Sei sicuro di voler rimuovere questo feed di carte? Questo disassegnerà tutte le carte.',
error: {
feedNameRequired: 'Il nome del feed della carta è obbligatorio',
- statementCloseDateRequired: "Selezionare una data di chiusura dell'estratto conto",
+ statementCloseDateRequired: "Selezionare una data di chiusura dell'estratto conto.",
},
corporate: "Limita l'eliminazione delle transazioni",
personal: "Consenti l'eliminazione delle transazioni",
@@ -4345,7 +4345,7 @@ const translations = {
'Goditi il cashback su ogni acquisto negli Stati Uniti, fino al 50% di sconto sulla tua fattura Expensify, carte virtuali illimitate e molto altro ancora.',
expensifyCardBannerLearnMoreButton: 'Scopri di più',
statementCloseDateTitle: "Data di chiusura dell'estratto conto",
- statementCloseDateDescription: "Comunicateci la data di chiusura dell'estratto conto della vostra carta e creeremo un estratto conto corrispondente in Expensify",
+ statementCloseDateDescription: "Comunicateci la data di chiusura dell'estratto conto della vostra carta e creeremo un estratto conto corrispondente in Expensify.",
},
workflows: {
title: 'Flussi di lavoro',
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index 6bc8eadbd8b..5436316e5f8 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -4308,7 +4308,7 @@ const translations = {
removeCardFeedDescription: 'Tem certeza de que deseja remover este feed de cartão? Isso desatribuirá todos os cartões.',
error: {
feedNameRequired: 'O nome do feed do cartão é obrigatório',
- statementCloseDateRequired: 'Favor selecionar uma data de fechamento do extrato',
+ statementCloseDateRequired: 'Favor selecionar uma data de fechamento do extrato.',
},
corporate: 'Restringir a exclusão de transações',
personal: 'Permitir excluir transações',
@@ -4335,7 +4335,7 @@ const translations = {
expensifyCardBannerSubtitle: 'Aproveite o cashback em todas as compras nos EUA, até 50% de desconto na sua fatura do Expensify, cartões virtuais ilimitados e muito mais.',
expensifyCardBannerLearnMoreButton: 'Saiba mais',
statementCloseDateTitle: 'Statement close date',
- statementCloseDateDescription: 'Informe-nos quando o extrato do seu cartão for encerrado e criaremos um extrato correspondente na Expensify',
+ statementCloseDateDescription: 'Informe-nos quando o extrato do seu cartão for encerrado e criaremos um extrato correspondente na Expensify.',
},
workflows: {
title: 'Fluxos de Trabalho',
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index 02fadfa5ae7..4a14d8cd9a1 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -4237,7 +4237,7 @@ const translations = {
removeCardFeedDescription: '您确定要移除此卡片源吗?这将取消分配所有卡片。',
error: {
feedNameRequired: '卡片摘要名称是必需的',
- statementCloseDateRequired: '请选择报表关闭日期',
+ statementCloseDateRequired: '请选择报表关闭日期。',
},
corporate: '限制删除交易',
personal: '允许删除交易',
@@ -4263,7 +4263,7 @@ const translations = {
expensifyCardBannerSubtitle: '享受每笔美国消费的现金返还,Expensify账单最高可享50%折扣,无限虚拟卡等更多优惠。',
expensifyCardBannerLearnMoreButton: '了解更多',
statementCloseDateTitle: '对账单关闭日期',
- statementCloseDateDescription: '让我们知道您的银行卡对账单何时关闭,我们将在 Expensify 中创建匹配的对账单',
+ statementCloseDateDescription: '让我们知道您的银行卡对账单何时关闭,我们将在 Expensify 中创建匹配的对账单。',
},
workflows: {
title: '工作流程',
From e89b522685af388ae13bccf004cb6af6dc7c49d5 Mon Sep 17 00:00:00 2001
From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com>
Date: Tue, 1 Jul 2025 14:08:26 +0100
Subject: [PATCH 20/20] add comment
---
src/CONST/index.ts | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/CONST/index.ts b/src/CONST/index.ts
index 3df4c0f743c..5f2b8e321ec 100755
--- a/src/CONST/index.ts
+++ b/src/CONST/index.ts
@@ -20,6 +20,7 @@ import {LOCALES} from './LOCALES';
const EMPTY_ARRAY = Object.freeze([]);
const EMPTY_OBJECT = Object.freeze({});
+// Using 28 days to align with OldDot and because all months are guaranteed to be at least 28 days.
const MONTH_DAYS = Object.freeze([...Array(28).keys()].map((i) => i + 1));
const DEFAULT_NUMBER_ID = 0;