From aa4d70a3c22240d6faad15462f51fe2a991bb274 Mon Sep 17 00:00:00 2001
From: cdOut <88325488+cdOut@users.noreply.github.com>
Date: Fri, 24 Nov 2023 16:15:42 +0100
Subject: [PATCH 1/8] add FormProvider in WorkspaceRateAndUnitPage
---
.../reimburse/WorkspaceRateAndUnitPage.js | 41 ++++++-------------
1 file changed, 12 insertions(+), 29 deletions(-)
diff --git a/src/pages/workspace/reimburse/WorkspaceRateAndUnitPage.js b/src/pages/workspace/reimburse/WorkspaceRateAndUnitPage.js
index 5794575aa600..403f1901a394 100644
--- a/src/pages/workspace/reimburse/WorkspaceRateAndUnitPage.js
+++ b/src/pages/workspace/reimburse/WorkspaceRateAndUnitPage.js
@@ -24,6 +24,8 @@ import * as Policy from '@userActions/Policy';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES from '@src/ROUTES';
+import FormProvider from '@components/Form/FormProvider';
+import InputWrapper from '@components/Form/InputWrapper';
const propTypes = {
/** Bank account attached to free plan */
@@ -44,16 +46,9 @@ class WorkspaceRateAndUnitPage extends React.Component {
super(props);
this.submit = this.submit.bind(this);
this.validate = this.validate.bind(this);
-
- this.state = {
- rate: 0,
- unit: CONST.CUSTOM_UNITS.DISTANCE_UNIT_MILES,
- };
}
componentDidMount() {
- this.resetRateAndUnit();
-
if (lodashGet(this.props, 'policy.customUnits', []).length !== 0) {
return;
}
@@ -69,8 +64,6 @@ class WorkspaceRateAndUnitPage extends React.Component {
if (prevProps.reimbursementAccount.isLoading === this.props.reimbursementAccount.isLoading) {
return;
}
-
- this.resetRateAndUnit();
}
getUnitItems() {
@@ -96,16 +89,6 @@ class WorkspaceRateAndUnitPage extends React.Component {
return numValue.toFixed(3);
}
- resetRateAndUnit() {
- const distanceCustomUnit = _.find(lodashGet(this.props, 'policy.customUnits', {}), (unit) => unit.name === CONST.CUSTOM_UNITS.NAME_DISTANCE);
- const distanceCustomRate = _.find(lodashGet(distanceCustomUnit, 'rates', {}), (rate) => rate.name === CONST.CUSTOM_UNITS.DEFAULT_RATE);
-
- this.setState({
- rate: PolicyUtils.getUnitRateValue(distanceCustomRate, this.props.toLocaleDigit),
- unit: lodashGet(distanceCustomUnit, 'attributes.unit', CONST.CUSTOM_UNITS.DISTANCE_UNIT_MILES),
- });
- }
-
saveUnitAndRate(unit, rate) {
const distanceCustomUnit = _.find(lodashGet(this.props, 'policy.customUnits', {}), (u) => u.name === CONST.CUSTOM_UNITS.NAME_DISTANCE);
if (!distanceCustomUnit) {
@@ -128,8 +111,8 @@ class WorkspaceRateAndUnitPage extends React.Component {
Policy.updateWorkspaceCustomUnitAndRate(this.props.policy.id, distanceCustomUnit, newCustomUnit, this.props.policy.lastModified);
}
- submit() {
- this.saveUnitAndRate(this.state.unit, this.state.rate);
+ submit(values) {
+ this.saveUnitAndRate(values.unit, values.rate);
Keyboard.dismiss();
Navigation.goBack(ROUTES.WORKSPACE_REIMBURSE.getRoute(this.props.policy.id));
}
@@ -160,7 +143,7 @@ class WorkspaceRateAndUnitPage extends React.Component {
backButtonRoute={ROUTES.WORKSPACE_REIMBURSE.getRoute(this.props.policy.id)}
>
{() => (
-
+
)}
);
From a84246218365f38c0a59faf7724f6a2181960104 Mon Sep 17 00:00:00 2001
From: cdOut <88325488+cdOut@users.noreply.github.com>
Date: Fri, 24 Nov 2023 16:24:16 +0100
Subject: [PATCH 2/8] fix prettier
---
src/pages/workspace/reimburse/WorkspaceRateAndUnitPage.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/pages/workspace/reimburse/WorkspaceRateAndUnitPage.js b/src/pages/workspace/reimburse/WorkspaceRateAndUnitPage.js
index 403f1901a394..d6ab531df124 100644
--- a/src/pages/workspace/reimburse/WorkspaceRateAndUnitPage.js
+++ b/src/pages/workspace/reimburse/WorkspaceRateAndUnitPage.js
@@ -4,6 +4,8 @@ import {Keyboard, View} from 'react-native';
import {withOnyx} from 'react-native-onyx';
import _ from 'underscore';
import Form from '@components/Form';
+import FormProvider from '@components/Form/FormProvider';
+import InputWrapper from '@components/Form/InputWrapper';
import OfflineWithFeedback from '@components/OfflineWithFeedback';
import {withNetwork} from '@components/OnyxProvider';
import Picker from '@components/Picker';
@@ -24,8 +26,6 @@ import * as Policy from '@userActions/Policy';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES from '@src/ROUTES';
-import FormProvider from '@components/Form/FormProvider';
-import InputWrapper from '@components/Form/InputWrapper';
const propTypes = {
/** Bank account attached to free plan */
From a340bd9ffe5afac92490a63046b64c490e0253ed Mon Sep 17 00:00:00 2001
From: cdOut <88325488+cdOut@users.noreply.github.com>
Date: Fri, 24 Nov 2023 16:27:11 +0100
Subject: [PATCH 3/8] remove unused imports
---
src/pages/workspace/reimburse/WorkspaceRateAndUnitPage.js | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/pages/workspace/reimburse/WorkspaceRateAndUnitPage.js b/src/pages/workspace/reimburse/WorkspaceRateAndUnitPage.js
index d6ab531df124..5b8ce8f70999 100644
--- a/src/pages/workspace/reimburse/WorkspaceRateAndUnitPage.js
+++ b/src/pages/workspace/reimburse/WorkspaceRateAndUnitPage.js
@@ -3,7 +3,6 @@ import React from 'react';
import {Keyboard, View} from 'react-native';
import {withOnyx} from 'react-native-onyx';
import _ from 'underscore';
-import Form from '@components/Form';
import FormProvider from '@components/Form/FormProvider';
import InputWrapper from '@components/Form/InputWrapper';
import OfflineWithFeedback from '@components/OfflineWithFeedback';
From 712934218eaf70d4395d685d888745d2b79caf98 Mon Sep 17 00:00:00 2001
From: cdOut <88325488+cdOut@users.noreply.github.com>
Date: Wed, 29 Nov 2023 00:44:48 +0100
Subject: [PATCH 4/8] fix lint
---
.../workspace/reimburse/WorkspaceRateAndUnitPage.js | 11 -----------
1 file changed, 11 deletions(-)
diff --git a/src/pages/workspace/reimburse/WorkspaceRateAndUnitPage.js b/src/pages/workspace/reimburse/WorkspaceRateAndUnitPage.js
index 5b8ce8f70999..9c5b731debbe 100644
--- a/src/pages/workspace/reimburse/WorkspaceRateAndUnitPage.js
+++ b/src/pages/workspace/reimburse/WorkspaceRateAndUnitPage.js
@@ -17,7 +17,6 @@ import getPermittedDecimalSeparator from '@libs/getPermittedDecimalSeparator';
import Navigation from '@libs/Navigation/Navigation';
import * as NumberUtils from '@libs/NumberUtils';
import * as PolicyUtils from '@libs/PolicyUtils';
-import * as ReimbursementAccountProps from '@pages/ReimbursementAccount/reimbursementAccountPropTypes';
import withPolicy, {policyDefaultProps, policyPropTypes} from '@pages/workspace/withPolicy';
import WorkspacePageWithSections from '@pages/workspace/WorkspacePageWithSections';
import * as BankAccounts from '@userActions/BankAccounts';
@@ -27,9 +26,6 @@ import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES from '@src/ROUTES';
const propTypes = {
- /** Bank account attached to free plan */
- reimbursementAccount: ReimbursementAccountProps.reimbursementAccountPropTypes,
-
...policyPropTypes,
...withLocalizePropTypes,
...withThemeStylesPropTypes,
@@ -58,13 +54,6 @@ class WorkspaceRateAndUnitPage extends React.Component {
Policy.openWorkspaceReimburseView(this.props.policy.id);
}
- componentDidUpdate(prevProps) {
- // We should update rate input when rate data is fetched
- if (prevProps.reimbursementAccount.isLoading === this.props.reimbursementAccount.isLoading) {
- return;
- }
- }
-
getUnitItems() {
return [
{label: this.props.translate('common.kilometers'), value: CONST.CUSTOM_UNITS.DISTANCE_UNIT_KILOMETERS},
From 3c4b56cb89e996858860ffd8a745d18e64170d0c Mon Sep 17 00:00:00 2001
From: cdOut <88325488+cdOut@users.noreply.github.com>
Date: Thu, 30 Nov 2023 17:48:16 +0100
Subject: [PATCH 5/8] refactor into functional component
---
.../reimburse/WorkspaceRateAndUnitPage.js | 192 ++++++++----------
1 file changed, 85 insertions(+), 107 deletions(-)
diff --git a/src/pages/workspace/reimburse/WorkspaceRateAndUnitPage.js b/src/pages/workspace/reimburse/WorkspaceRateAndUnitPage.js
index 9c5b731debbe..54da830e1f3f 100644
--- a/src/pages/workspace/reimburse/WorkspaceRateAndUnitPage.js
+++ b/src/pages/workspace/reimburse/WorkspaceRateAndUnitPage.js
@@ -1,5 +1,5 @@
import lodashGet from 'lodash/get';
-import React from 'react';
+import React, {useCallback, useEffect} from 'react';
import {Keyboard, View} from 'react-native';
import {withOnyx} from 'react-native-onyx';
import _ from 'underscore';
@@ -36,56 +36,34 @@ const defaultProps = {
...policyDefaultProps,
};
-class WorkspaceRateAndUnitPage extends React.Component {
- constructor(props) {
- super(props);
- this.submit = this.submit.bind(this);
- this.validate = this.validate.bind(this);
- }
-
- componentDidMount() {
- if (lodashGet(this.props, 'policy.customUnits', []).length !== 0) {
+function WorkspaceRateAndUnitPage(props) {
+ const fetchData = useCallback(() => {
+ if (lodashGet(props, 'policy.customUnits', []).length !== 0) {
return;
}
- // When this page is accessed directly from url, the policy.customUnits data won't be available,
- // and we should trigger Policy.openWorkspaceReimburseView to get the data
BankAccounts.setReimbursementAccountLoading(true);
- Policy.openWorkspaceReimburseView(this.props.policy.id);
- }
-
- getUnitItems() {
- return [
- {label: this.props.translate('common.kilometers'), value: CONST.CUSTOM_UNITS.DISTANCE_UNIT_KILOMETERS},
- {label: this.props.translate('common.miles'), value: CONST.CUSTOM_UNITS.DISTANCE_UNIT_MILES},
- ];
- }
+ Policy.openWorkspaceReimburseView(props.policy.id);
+ }, [props]);
- getRateDisplayValue(value) {
- const numValue = this.getNumericValue(value);
- if (Number.isNaN(numValue)) {
- return '';
- }
- return numValue.toString().replace('.', this.props.toLocaleDigit('.')).substring(0, value.length);
- }
+ useEffect(() => {
+ fetchData();
+ }, [fetchData]);
- getNumericValue(value) {
- const numValue = NumberUtils.parseFloatAnyLocale(value.toString());
- if (Number.isNaN(numValue)) {
- return NaN;
- }
- return numValue.toFixed(3);
- }
+ const getUnitItems = () => [
+ {label: props.translate('common.kilometers'), value: CONST.CUSTOM_UNITS.DISTANCE_UNIT_KILOMETERS},
+ {label: props.translate('common.miles'), value: CONST.CUSTOM_UNITS.DISTANCE_UNIT_MILES},
+ ];
- saveUnitAndRate(unit, rate) {
- const distanceCustomUnit = _.find(lodashGet(this.props, 'policy.customUnits', {}), (u) => u.name === CONST.CUSTOM_UNITS.NAME_DISTANCE);
+ const saveUnitAndRate = (unit, rate) => {
+ const distanceCustomUnit = _.find(lodashGet(props, 'policy.customUnits', {}), (u) => u.name === CONST.CUSTOM_UNITS.NAME_DISTANCE);
if (!distanceCustomUnit) {
return;
}
const currentCustomUnitRate = _.find(lodashGet(distanceCustomUnit, 'rates', {}), (r) => r.name === CONST.CUSTOM_UNITS.DEFAULT_RATE);
const unitID = lodashGet(distanceCustomUnit, 'customUnitID', '');
const unitName = lodashGet(distanceCustomUnit, 'name', '');
- const rateNumValue = PolicyUtils.getNumericValue(rate, this.props.toLocaleDigit);
+ const rateNumValue = PolicyUtils.getNumericValue(rate, props.toLocaleDigit);
const newCustomUnit = {
customUnitID: unitID,
@@ -96,19 +74,19 @@ class WorkspaceRateAndUnitPage extends React.Component {
rate: rateNumValue * CONST.POLICY.CUSTOM_UNIT_RATE_BASE_OFFSET,
},
};
- Policy.updateWorkspaceCustomUnitAndRate(this.props.policy.id, distanceCustomUnit, newCustomUnit, this.props.policy.lastModified);
- }
+ Policy.updateWorkspaceCustomUnitAndRate(props.policy.id, distanceCustomUnit, newCustomUnit, props.policy.lastModified);
+ };
- submit(values) {
- this.saveUnitAndRate(values.unit, values.rate);
+ const submit = (values) => {
+ saveUnitAndRate(values.unit, values.rate);
Keyboard.dismiss();
- Navigation.goBack(ROUTES.WORKSPACE_REIMBURSE.getRoute(this.props.policy.id));
- }
+ Navigation.goBack(ROUTES.WORKSPACE_REIMBURSE.getRoute(props.policy.id));
+ };
- validate(values) {
+ const validate = (values) => {
const errors = {};
- const decimalSeparator = this.props.toLocaleDigit('.');
- const outputCurrency = lodashGet(this.props, 'policy.outputCurrency', CONST.CURRENCY.USD);
+ const decimalSeparator = props.toLocaleDigit('.');
+ const outputCurrency = lodashGet(props, 'policy.outputCurrency', CONST.CURRENCY.USD);
// Allow one more decimal place for accuracy
const rateValueRegex = RegExp(String.raw`^-?\d{0,8}([${getPermittedDecimalSeparator(decimalSeparator)}]\d{1,${CurrencyUtils.getCurrencyDecimals(outputCurrency) + 1}})?$`, 'i');
if (!rateValueRegex.test(values.rate) || values.rate === '') {
@@ -117,73 +95,73 @@ class WorkspaceRateAndUnitPage extends React.Component {
errors.rate = 'workspace.reimburse.lowRateError';
}
return errors;
- }
-
- render() {
- const distanceCustomUnit = _.find(lodashGet(this.props, 'policy.customUnits', {}), (unit) => unit.name === CONST.CUSTOM_UNITS.NAME_DISTANCE);
- const distanceCustomRate = _.find(lodashGet(distanceCustomUnit, 'rates', {}), (rate) => rate.name === CONST.CUSTOM_UNITS.DEFAULT_RATE);
- return (
-
- {() => (
- unit.name === CONST.CUSTOM_UNITS.NAME_DISTANCE);
+ const distanceCustomRate = _.find(lodashGet(distanceCustomUnit, 'rates', {}), (rate) => rate.name === CONST.CUSTOM_UNITS.DEFAULT_RATE);
+
+ return (
+
+ {() => (
+
+
+ Policy.clearCustomUnitErrors(props.policy.id, lodashGet(distanceCustomUnit, 'customUnitID', ''), lodashGet(distanceCustomRate, 'customUnitRateID', ''))
+ }
>
-
- Policy.clearCustomUnitErrors(this.props.policy.id, lodashGet(distanceCustomUnit, 'customUnitID', ''), lodashGet(distanceCustomRate, 'customUnitRateID', ''))
- }
- >
+
+
+
-
-
-
-
-
-
- )}
-
- );
- }
+
+
+
+ )}
+
+ );
}
WorkspaceRateAndUnitPage.propTypes = propTypes;
WorkspaceRateAndUnitPage.defaultProps = defaultProps;
+WorkspaceRateAndUnitPage.displayName = 'WorkspaceRateAndUnitPage';
export default compose(
withPolicy,
From ec3976cf8200d8f6d963c2db53a2e0f2e276c151 Mon Sep 17 00:00:00 2001
From: cdOut <88325488+cdOut@users.noreply.github.com>
Date: Wed, 13 Dec 2023 19:37:48 +0100
Subject: [PATCH 6/8] merge main into
form-migration/workspace-rate-and-unit-page
---
.eslintrc.js | 1 +
.github/PULL_REQUEST_TEMPLATE.md | 6 +-
.../setupGitForOSBotifyApp/action.yml | 5 +
.github/workflows/createNewVersion.yml | 12 +-
.../workflows/reassurePerformanceTests.yml | 6 +
.imgbotconfig | 4 +-
.storybook/public/index.css | 2 +-
.storybook/theme.js | 18 +-
android/app/build.gradle | 4 +-
.../empty-state_background-fade-dark.png | Bin 129303 -> 0 bytes
.../empty-state_background-fade-light.png | Bin 296676 -> 0 bytes
assets/images/example-check-image-en.png | Bin 8942 -> 0 bytes
assets/images/example-check-image-es.png | Bin 8916 -> 0 bytes
assets/images/home-background--android.svg | 2 +-
assets/images/home-background--mobile.svg | 2 +-
assets/images/home-fade-gradient--mobile.svg | 2 +-
assets/images/home-fade-gradient.svg | 2 +-
.../empty-state_background-fade-dark.png | Bin 0 -> 777444 bytes
.../empty-state_background-fade-light.png | Bin 0 -> 774367 bytes
.../example-check-image-dark-en.png | Bin 0 -> 5249 bytes
.../example-check-image-dark-es.png | Bin 0 -> 4836 bytes
.../example-check-image-light-en.png | Bin 0 -> 5192 bytes
.../example-check-image-light-es.png | Bin 0 -> 4690 bytes
assets/images/thumbs-up.svg | 8 +
config/webpack/webpack.common.js | 16 +-
contributingGuides/NAVIGATION.md | 18 +-
contributingGuides/REVIEWER_CHECKLIST.md | 2 +-
desktop/package-lock.json | 30 +-
desktop/package.json | 2 +-
docs/_includes/floating-concierge-button.html | 5 -
docs/_includes/footer.html | 2 +
docs/_includes/platform.html | 5 -
docs/_layouts/default.html | 3 -
docs/_sass/_colors.scss | 48 +-
docs/_sass/_main.scss | 84 +-
docs/_sass/_search-bar.scss | 26 +-
.../account-settings/Profile-Settings.md | 5 -
.../Personal-Cards.md | 5 -
.../Referral-Program.md | 0
.../getting-started/Mobile-App.md | 5 -
.../Domains-Overview.md | 141 +-
.../Referral-Program.md | 53 -
.../get-paid-back/Referral-Program.md | 53 +
.../get-paid-back/Request-Money.md | 36 +-
docs/assets/images/settings-old-dot.svg | 2 +-
docs/index.html | 5 -
ios/NewExpensify/Info.plist | 4 +-
ios/NewExpensifyTests/Info.plist | 4 +-
package-lock.json | 78 +-
package.json | 7 +-
...h => @react-navigation+native+6.1.8.patch} | 38 +-
...-web+0.19.9+005+image-header-support.patch | 200 --
src/CONST.ts | 150 +-
src/Expensify.js | 6 +-
src/ONYXKEYS.ts | 19 +-
src/ROUTES.ts | 86 +-
src/SCREENS.ts | 122 +-
src/components/AddressForm.js | 28 +-
.../AddressSearch/CurrentLocationButton.js | 7 +-
src/components/AddressSearch/index.js | 13 +-
src/components/AmountTextInput.js | 15 +-
.../BaseAnchorForAttachmentsOnly.js | 2 +-
.../BaseAnchorForCommentsOnly.js | 7 +-
src/components/ArchivedReportFooter.tsx | 4 +-
src/components/AttachmentModal.js | 39 +-
.../AttachmentCarousel/CarouselItem.js | 2 +-
.../extractAttachmentsFromReport.js | 29 +-
.../Attachments/AttachmentCarousel/index.js | 28 +-
.../AttachmentCarousel/index.native.js | 27 +-
.../AttachmentViewImage/index.js | 2 +-
.../AttachmentViewImage/index.native.js | 2 +-
.../Attachments/AttachmentView/index.js | 3 +-
.../BaseAutoCompleteSuggestions.tsx | 9 +-
.../AutoCompleteSuggestions/index.tsx | 3 +-
src/components/Avatar.tsx | 9 +-
.../AvatarCropModal/AvatarCropModal.js | 5 +-
.../AvatarCropModal/ImageCropView.js | 3 +-
src/components/AvatarWithDisplayName.tsx | 7 +-
src/components/AvatarWithImagePicker.js | 2 +-
src/components/Badge.tsx | 9 +-
src/components/Banner.tsx | 9 +-
src/components/BaseMiniContextMenuItem.js | 106 -
src/components/BaseMiniContextMenuItem.tsx | 85 +
src/components/BigNumberPad.tsx | 6 +-
src/components/Button/index.tsx | 9 +-
src/components/ButtonWithDropdownMenu.js | 5 +-
.../{CardPreview.js => CardPreview.tsx} | 35 +-
src/components/Checkbox.tsx | 5 +-
src/components/CollapsibleSection/index.tsx | 2 +-
src/components/Composer/index.js | 5 +-
src/components/ConfirmedRoute.js | 3 -
src/components/ContextMenuItem.js | 12 +-
src/components/CopyTextToClipboard.js | 45 -
src/components/CopyTextToClipboard.tsx | 45 +
src/components/CountrySelector.js | 3 +-
src/components/CurrencySymbolButton.js | 2 +-
.../index.tsx | 3 +-
.../DatePicker/CalendarPicker/ArrowIcon.js | 3 +-
.../DatePicker/CalendarPicker/index.js | 9 +-
src/components/DatePicker/index.js | 2 +-
.../DeeplinkWrapper/index.website.js | 8 +-
.../DistanceMapView/index.android.js | 3 +-
.../DistanceRequest/DistanceRequestFooter.js | 5 +-
src/components/DistanceRequest/index.js | 45 +-
src/components/DotIndicatorMessage.tsx | 5 +-
src/components/EReceipt.js | 3 +-
src/components/EReceiptThumbnail.js | 13 +-
.../EmojiPicker/CategoryShortcutButton.js | 11 +-
src/components/EmojiPicker/EmojiPicker.js | 3 +-
.../EmojiPicker/EmojiPickerButton.js | 9 +-
.../EmojiPicker/EmojiPickerButtonDropdown.js | 13 +-
.../EmojiPicker/EmojiPickerMenu/index.js | 9 +-
.../EmojiPickerMenu/index.native.js | 5 +-
.../EmojiPicker/EmojiPickerMenuItem/index.js | 13 +-
.../EmojiPickerMenuItem/index.native.js | 13 +-
.../EmojiPicker/EmojiSkinToneList.js | 2 +-
src/components/EmojiSuggestions.tsx | 9 +-
src/components/ExceededCommentLength.js | 44 +-
src/components/ExpensifyWordmark.tsx | 3 +-
src/components/FlatList/index.android.js | 79 -
src/components/FlatList/index.android.tsx | 43 +
.../FlatList/{index.js => index.ts} | 0
src/components/FloatingActionButton.js | 9 +-
src/components/FocusModeNotification.js | 3 +-
src/components/Form.js | 41 +-
src/components/Form/FormProvider.js | 470 +++--
src/components/FormAlertWithSubmitButton.js | 11 +
src/components/FormAlertWrapper.js | 6 +-
src/components/FormHelpMessage.js | 62 -
src/components/FormHelpMessage.tsx | 54 +
.../index.native.js | 3 +-
.../BaseHTMLEngineProvider.js | 6 +-
.../HTMLRenderers/CodeRenderer.js | 3 +-
.../HTMLRenderers/ImageRenderer.js | 2 +-
.../HTMLRenderers/MentionHereRenderer.js | 9 +-
.../HTMLRenderers/MentionUserRenderer.js | 11 +-
.../PreRenderer/BasePreRenderer.js | 2 +-
src/components/HeaderGap/index.desktop.js | 25 -
src/components/HeaderGap/index.desktop.tsx | 13 +
src/components/HeaderGap/index.js | 6 -
src/components/HeaderGap/index.tsx | 10 +
src/components/HeaderGap/types.ts | 10 +
src/components/HeaderPageLayout.js | 3 +-
src/components/HeaderWithBackButton/index.js | 11 +-
src/components/Icon/Expensicons.ts | 2 +
src/components/Icon/index.tsx | 17 +-
src/components/Image/BaseImage.js | 29 -
src/components/Image/BaseImage.native.js | 3 -
src/components/Image/index.js | 52 +-
src/components/Image/index.native.js | 63 +
src/components/ImageView/index.js | 7 +-
src/components/Indicator.js | 129 --
src/components/Indicator.tsx | 104 +
src/components/InlineCodeBlock/WrappedText.js | 77 -
.../InlineCodeBlock/WrappedText.tsx | 66 +
src/components/InlineCodeBlock/index.js | 22 -
.../{index.native.js => index.native.tsx} | 17 +-
src/components/InlineCodeBlock/index.tsx | 23 +
.../inlineCodeBlockPropTypes.js | 10 -
src/components/InlineCodeBlock/types.ts | 11 +
src/components/KYCWall/BaseKYCWall.js | 3 +-
src/components/LHNOptionsList/OptionRowLHN.js | 12 +-
.../BaseLocationErrorMessage.js | 9 +-
src/components/MagicCodeInput.js | 5 +-
...irection.web.tsx => Direction.website.tsx} | 0
.../{MapView.web.tsx => MapView.website.tsx} | 3 +-
src/components/MapView/index.js | 3 -
src/components/MapView/index.tsx | 10 +
src/components/MentionSuggestions.tsx | 21 +-
src/components/MenuItem.js | 28 +-
.../{MessagesRow.js => MessagesRow.tsx} | 42 +-
src/components/Modal/BaseModal.tsx | 10 +-
src/components/Modal/index.tsx | 5 +-
src/components/MoneyReportHeader.js | 49 +-
src/components/MoneyReportHeaderStatusBar.js | 3 +-
.../MoneyRequestConfirmationList.js | 17 +-
src/components/MoneyRequestHeaderStatusBar.js | 2 +-
...oraryForRefactorRequestConfirmationList.js | 781 +++++++
src/components/MultipleAvatars.tsx | 7 +-
src/components/OfflineWithFeedback.js | 143 --
src/components/OfflineWithFeedback.tsx | 147 ++
src/components/Onfido/index.native.js | 68 +-
src/components/OptionRow.js | 10 +-
.../OptionsSelector/BaseOptionsSelector.js | 2 +-
src/components/PDFView/PDFPasswordForm.js | 2 +-
src/components/PDFView/index.js | 2 +-
src/components/PDFView/index.native.js | 9 +-
src/components/ParentNavigationSubtitle.tsx | 2 +-
src/components/PinButton.js | 2 +-
src/components/PopoverWithMeasuredContent.js | 6 +-
src/components/PopoverWithoutOverlay/index.js | 34 +-
.../GenericPressable/BaseGenericPressable.tsx | 3 +-
.../Pressable/PressableWithDelayToggle.tsx | 13 +-
.../index.tsx | 3 +-
.../QRShare/QRShareWithDownload/index.js | 78 +-
.../QRShareWithDownload/index.native.js | 59 +-
src/components/QRShare/index.js | 139 +-
src/components/QRShare/propTypes.js | 14 +-
src/components/RadioButton.tsx | 2 +-
src/components/Reactions/AddReactionBubble.js | 15 +-
.../Reactions/EmojiReactionBubble.js | 11 +-
.../Reactions/MiniQuickEmojiReactions.js | 7 +-
.../ReportActionItem/MoneyReportView.js | 3 +-
.../ReportActionItem/MoneyRequestAction.js | 2 +-
.../ReportActionItem/MoneyRequestPreview.js | 21 +-
.../ReportActionItem/MoneyRequestView.js | 7 +-
.../ReportActionItem/ReportActionItemImage.js | 31 +-
.../ReportActionItemImages.js | 3 +-
.../ReportActionItem/ReportPreview.js | 49 +-
src/components/ReportActionItem/TaskAction.js | 4 +-
.../ReportActionItem/TaskPreview.js | 12 +-
src/components/ReportActionItem/TaskView.js | 9 +-
src/components/ReportHeaderSkeletonView.tsx | 7 +-
src/components/RoomHeaderAvatars.js | 11 +-
src/components/RoomNameInput/index.js | 2 +-
src/components/SAMLLoadingIndicator.js | 3 +-
.../SafeAreaConsumer/index.android.tsx | 4 +-
src/components/SafeAreaConsumer/index.tsx | 4 +-
src/components/SelectionList/BaseListItem.js | 15 +-
.../SelectionList/BaseSelectionList.js | 23 +-
src/components/SelectionList/RadioListItem.js | 27 +-
src/components/SelectionList/UserListItem.js | 6 +-
.../SelectionList/selectionListPropTypes.js | 6 +
src/components/SettlementButton.js | 32 +-
.../GoogleSignIn/index.website.js | 4 +-
src/components/SignInButtons/IconButton.js | 2 +-
src/components/SingleChoiceQuestion.tsx | 3 +-
src/components/SingleOptionSelector.js | 2 +-
src/components/SpacerView.js | 3 +-
.../SplashScreenHider/index.native.tsx | 4 +-
src/components/SplashScreenHider/index.tsx | 4 +-
src/components/SplashScreenHider/types.ts | 6 +-
src/components/SubscriptAvatar.tsx | 5 +-
src/components/Switch.tsx | 2 +-
src/components/TabSelector/TabSelector.js | 6 +-
src/components/TagPicker/index.js | 3 +-
src/components/Text.tsx | 32 +-
.../TextInput/BaseTextInput/index.js | 6 +-
.../TextInput/BaseTextInput/index.native.js | 5 +-
.../TextInput/TextInputLabel/index.js | 2 +-
src/components/TextLink.js | 101 -
src/components/TextLink.tsx | 79 +
src/components/ThreeDotsMenu/index.js | 2 +-
src/components/ThumbnailImage.tsx | 3 +-
src/components/TimePicker/TimePicker.js | 487 +++++
src/components/TimePicker/setSelection.ios.ts | 8 +
src/components/TimePicker/setSelection.ts | 18 +
src/components/Tooltip/BaseTooltip.native.js | 21 -
.../Tooltip/BaseTooltip/index.native.tsx | 12 +
.../{BaseTooltip.js => BaseTooltip/index.tsx} | 57 +-
.../Tooltip/PopoverAnchorTooltip.js | 59 -
.../Tooltip/PopoverAnchorTooltip.tsx | 38 +
...eBody.js => TooltipRenderedOnPageBody.tsx} | 97 +-
.../{TooltipSense.js => TooltipSense.tsx} | 4 +-
src/components/Tooltip/index.js | 37 -
src/components/Tooltip/index.tsx | 22 +
src/components/Tooltip/tooltipPropTypes.js | 52 -
src/components/Tooltip/types.ts | 40 +
...b.js => BaseUserDetailsTooltip.website.js} | 2 +-
src/components/ValuePicker/index.js | 3 +-
.../BaseVideoChatButtonAndMenu.js | 2 +-
.../{WalletSection.js => WalletSection.tsx} | 24 +-
src/components/optionPropTypes.js | 3 -
src/components/withStyleUtils.tsx | 32 +
src/components/withTheme.tsx | 11 +-
src/components/withThemeStyles.tsx | 11 +-
...AutoFocusInput.js => useAutoFocusInput.ts} | 17 +-
...dInputFocus.js => useDelayedInputFocus.ts} | 12 +-
src/hooks/useHandleExceedMaxCommentLength.ts | 27 +
.../{index.js => index.ts} | 18 +-
.../{index.js => index.ts} | 23 +-
src/languages/en.ts | 70 +-
src/languages/es.ts | 70 +-
src/languages/types.ts | 9 +
.../{index.web.ts => index.website.ts} | 0
src/libs/CardUtils.ts | 21 +-
src/libs/DateUtils.ts | 301 ++-
src/libs/DistanceRequestUtils.js | 112 -
src/libs/DistanceRequestUtils.ts | 123 ++
src/libs/E2E/apiMocks/openApp.ts | 27 -
src/libs/E2E/apiMocks/openReport.ts | 3 -
src/libs/EmailUtils.ts | 30 +
src/libs/EmojiUtils.ts | 37 +-
src/libs/GroupChatUtils.ts | 4 +-
src/libs/HeaderUtils.js | 28 -
src/libs/HeaderUtils.ts | 32 +
src/libs/IOUUtils.ts | 42 +-
src/libs/Localize/index.ts | 46 +-
src/libs/MessageElement.ts | 11 +
src/libs/MoneyRequestUtils.ts | 8 +-
.../Navigation/AppNavigator/AuthScreens.tsx | 2 +-
.../AppNavigator/ModalStackNavigators.tsx | 79 +-
.../AppNavigator/Navigators/Overlay.tsx | 4 +-
.../Navigators/RightModalNavigator.tsx | 49 +-
.../AppNavigator/RHPScreenOptions.ts | 4 +-
.../getRootNavigatorScreenOptions.ts | 8 +-
src/libs/Navigation/OnyxTabNavigator.tsx | 6 +-
src/libs/Navigation/linkingConfig.ts | 331 +--
src/libs/Navigation/types.ts | 66 +-
src/libs/Network/SequentialQueue.ts | 2 +-
src/libs/Network/enhanceParameters.ts | 3 +
.../{NextStepUtils.js => NextStepUtils.ts} | 15 +-
.../Notification/LocalNotification/types.ts | 3 +-
src/libs/OptionsListUtils.js | 7 +-
src/libs/PersonalDetailsUtils.js | 15 +-
src/libs/PolicyUtils.ts | 3 +-
src/libs/Pusher/pusher.ts | 34 +-
src/libs/PusherUtils.ts | 2 +-
src/libs/ReportActionsUtils.ts | 124 +-
src/libs/ReportUtils.ts | 259 ++-
src/libs/SessionUtils.ts | 2 +-
src/libs/SidebarUtils.ts | 30 +-
.../{index.web.ts => index.website.ts} | 0
src/libs/TaskUtils.ts | 51 +
src/libs/TransactionUtils.ts | 64 +-
.../{index.js => index.ts} | 14 +-
.../updateUnread/index.android.js | 2 -
.../updateUnread/index.android.ts | 6 +
.../{index.desktop.js => index.desktop.ts} | 6 +-
.../{index.ios.js => index.ios.ts} | 7 +-
.../{index.website.js => index.ts} | 12 +-
.../updateUnread/types.ts | 3 +
src/libs/ValidationUtils.ts | 48 +-
src/libs/actions/IOU.js | 423 +++-
src/libs/actions/PaymentMethods.ts | 6 +-
src/libs/actions/PersistedRequests.ts | 14 +-
src/libs/actions/PersonalDetails.ts | 4 +-
src/libs/actions/Policy.js | 9 +-
src/libs/actions/{Report.js => Report.ts} | 1837 +++++++++--------
src/libs/actions/Task.js | 32 -
src/libs/actions/Transaction.ts | 117 +-
src/libs/actions/User.js | 7 +-
src/libs/actions/Welcome.ts | 2 +-
.../{getModalState.js => getModalState.ts} | 12 +-
... KeyReportActionsDraftByReportActionID.ts} | 34 +-
src/libs/migrations/RenameReceiptFilename.js | 57 -
src/libs/migrations/RenameReceiptFilename.ts | 55 +
src/libs/shouldReopenOnfido/index.android.js | 1 -
src/libs/shouldReopenOnfido/index.android.ts | 5 +
src/libs/shouldReopenOnfido/index.js | 1 -
src/libs/shouldReopenOnfido/index.ts | 5 +
src/libs/shouldReopenOnfido/types.ts | 3 +
.../index.ios.ts} | 11 +-
.../index.ts} | 12 +-
src/libs/updateMultilineInputRange/types.ts | 5 +
src/pages/DetailsPage.js | 3 +-
src/pages/EditRequestAmountPage.js | 2 +-
src/pages/EditRequestDescriptionPage.js | 4 +-
src/pages/EditRequestDistancePage.js | 23 -
src/pages/EditRequestMerchantPage.js | 2 +-
src/pages/EditRequestPage.js | 29 +-
src/pages/EditSplitBillPage.js | 12 +-
.../EnablePayments/AdditionalDetailsStep.js | 8 +-
src/pages/ErrorPage/GenericErrorPage.js | 5 +-
src/pages/GetAssistancePage.js | 3 +-
src/pages/LogOutPreviousUserPage.js | 6 +-
.../PrivateNotes/PrivateNotesEditPage.js | 4 +-
src/pages/ProfilePage.js | 3 +-
src/pages/ReferralDetailsPage.js | 115 +-
src/pages/ReimbursementAccount/AddressForm.js | 4 +-
.../BankAccountManualStep.js | 15 +-
.../ReimbursementAccount/BankAccountStep.js | 13 +-
src/pages/ReimbursementAccount/CompanyStep.js | 8 +-
.../ReimbursementAccount/ExampleCheck.js | 24 +
.../ReimbursementAccount/IdentityForm.js | 6 +-
.../ReimbursementAccountPage.js | 14 +-
.../ReimbursementAccount/ValidationStep.js | 22 +-
.../ReimbursementAccount/exampleCheckImage.js | 14 -
src/pages/ReportDetailsPage.js | 7 +-
src/pages/ReportWelcomeMessagePage.js | 4 +-
src/pages/RoomMembersPage.js | 2 +-
.../TeachersUnite/IntroSchoolPrincipalPage.js | 6 +-
src/pages/TeachersUnite/KnowATeacherPage.js | 6 +-
src/pages/home/HeaderView.js | 6 +-
src/pages/home/ReportScreen.js | 16 +-
.../report/AnimatedEmptyStateBackground.js | 3 +-
.../BaseReportActionContextMenu.js | 9 +-
.../report/ContextMenu/ContextMenuActions.js | 23 +-
.../MiniReportActionContextMenu/index.js | 7 +-
src/pages/home/report/LinkPreviewer.js | 3 +-
.../report/ReactionList/HeaderReactionList.js | 9 +-
.../AttachmentPickerWithMenuItems.js | 12 +-
.../ComposerWithSuggestions.js | 12 +-
.../ReportActionCompose.js | 9 +-
.../report/ReportActionCompose/SendButton.js | 2 +-
src/pages/home/report/ReportActionItem.js | 26 +-
.../home/report/ReportActionItemCreated.js | 5 +-
.../home/report/ReportActionItemGrouped.js | 31 -
.../home/report/ReportActionItemGrouped.tsx | 22 +
.../home/report/ReportActionItemMessage.js | 15 +
.../report/ReportActionItemMessageEdit.js | 22 +-
.../report/ReportActionItemParentAction.js | 3 +-
.../home/report/ReportActionItemSingle.js | 7 +-
.../home/report/ReportActionItemThread.js | 2 +-
src/pages/home/report/ReportActionsList.js | 4 +-
.../report/ReportActionsListItemRenderer.js | 11 +-
src/pages/home/report/ReportActionsView.js | 4 -
.../home/report/withReportOrNotFound.tsx | 2 +-
.../home/sidebar/AvatarWithOptionalStatus.js | 21 +-
.../sidebar/PressableAvatarWithIndicator.js | 2 +-
src/pages/home/sidebar/SidebarLinks.js | 7 +-
src/pages/home/sidebar/SidebarLinksData.js | 25 +-
.../FloatingActionButtonAndPopover.js | 12 +-
src/pages/home/sidebar/SignInButton.js | 2 +-
src/pages/iou/MoneyRequestDatePage.js | 2 +-
src/pages/iou/MoneyRequestDescriptionPage.js | 6 +-
src/pages/iou/MoneyRequestMerchantPage.js | 2 +-
src/pages/iou/MoneyRequestSelectorPage.js | 10 +-
src/pages/iou/NewDistanceRequestPage.js | 16 +-
src/pages/iou/ReceiptSelector/index.js | 6 +-
src/pages/iou/ReceiptSelector/index.native.js | 6 +-
src/pages/iou/SplitBillDetailsPage.js | 2 +-
src/pages/iou/WaypointEditor.js | 5 +-
src/pages/iou/request/IOURequestStartPage.js | 175 ++
...yForRefactorRequestParticipantsSelector.js | 365 ++++
.../iou/request/step/IOURequestStepAmount.js | 121 ++
.../request/step/IOURequestStepCategory.js | 82 +
.../step/IOURequestStepConfirmation.js | 372 ++++
.../request/step/IOURequestStepCurrency.js | 162 ++
.../iou/request/step/IOURequestStepDate.js | 86 +
.../request/step/IOURequestStepDescription.js | 122 ++
.../request/step/IOURequestStepDistance.js | 234 +++
.../request/step/IOURequestStepMerchant.js | 109 +
.../step/IOURequestStepParticipants.js | 106 +
.../step/IOURequestStepRoutePropTypes.js | 23 +
.../CameraPermission/index.android.js | 12 +
.../CameraPermission/index.ios.js | 11 +
.../CameraPermission/index.js | 5 +
.../NavigationAwareCamera/index.js | 80 +
.../NavigationAwareCamera/index.native.js | 28 +
.../request/step/IOURequestStepScan/index.js | 351 ++++
.../step/IOURequestStepScan/index.native.js | 315 +++
.../iou/request/step/IOURequestStepTag.js | 105 +
.../request/step/IOURequestStepWaypoint.js | 278 +++
.../step/StepScreenDragAndDropWrapper.js | 70 +
.../iou/request/step/StepScreenWrapper.js | 78 +
.../step/withFullTransactionOrNotFound.js | 73 +
.../step/withWritableReportOrNotFound.js | 75 +
src/pages/iou/steps/MoneyRequestAmountForm.js | 8 +-
.../iou/steps/MoneyRequestConfirmPage.js | 2 +-
.../MoneyRequestParticipantsPage.js | 3 +-
.../MoneyRequestParticipantsSelector.js | 4 +-
src/pages/iou/steps/NewRequestAmountPage.js | 4 +-
src/pages/nextStepPropTypes.js | 4 +-
src/pages/reportPropTypes.js | 3 -
src/pages/settings/InitialSettingsPage.js | 18 +-
.../settings/Preferences/PreferencesPage.js | 2 +-
.../Profile/Contacts/NewContactMethodPage.js | 2 +-
.../ValidateCodeForm/BaseValidateCodeForm.js | 7 +-
.../Profile/CustomStatus/SetDatePage.js | 88 +
.../Profile/CustomStatus/SetTimePage.js | 73 +
.../CustomStatus/StatusClearAfterPage.js | 247 +++
.../Profile/CustomStatus/StatusPage.js | 221 +-
.../Profile/CustomStatus/StatusSetPage.js | 102 -
src/pages/settings/Profile/DisplayNamePage.js | 4 +-
.../Profile/PersonalDetails/LegalNamePage.js | 4 +-
.../settings/Security/CloseAccountPage.js | 4 +-
.../Wallet/ActivatePhysicalCardPage.js | 2 +-
src/pages/settings/Wallet/AddDebitCardPage.js | 10 +-
.../settings/Wallet/DangerCardSection.js | 33 -
.../settings/Wallet/ExpensifyCardPage.js | 22 +-
.../settings/Wallet/PaymentMethodList.js | 11 +-
.../settings/Wallet/RedDotCardSection.js | 40 +
src/pages/settings/Wallet/WalletEmptyState.js | 2 +-
src/pages/signin/ChangeExpensifyLoginLink.js | 2 +-
src/pages/signin/SignInHeroCopy.js | 3 +-
src/pages/signin/SignInPage.js | 3 +-
src/pages/signin/SignInPageHero.js | 3 +-
src/pages/signin/SignInPageLayout/Footer.js | 3 +-
.../SignInPageLayout/SignInPageContent.js | 3 +-
src/pages/signin/SignInPageLayout/index.js | 3 +-
.../ValidateCodeForm/BaseValidateCodeForm.js | 9 +-
src/pages/tasks/NewTaskDescriptionPage.js | 4 +-
src/pages/tasks/NewTaskDetailsPage.js | 4 +-
src/pages/tasks/NewTaskTitlePage.js | 2 +-
src/pages/tasks/TaskDescriptionPage.js | 4 +-
src/pages/tasks/TaskTitlePage.js | 2 +-
src/pages/workspace/WorkspaceInitialPage.js | 4 +-
.../workspace/WorkspaceInviteMessagePage.js | 6 +-
src/pages/workspace/WorkspaceInvitePage.js | 3 -
src/pages/workspace/WorkspaceMembersPage.js | 3 -
src/pages/workspace/WorkspaceNewRoomPage.js | 2 +-
src/pages/workspace/WorkspaceSettingsPage.js | 2 +-
.../reimburse/WorkspaceRateAndUnitPage.js | 2 +-
src/pages/workspace/withPolicy.tsx | 2 +-
src/stories/Composer.stories.js | 3 +-
src/stories/Form.stories.js | 6 +-
src/stories/MenuItem.stories.js | 12 +
...> PopoverWithMeasuredContentStyleUtils.ts} | 6 +-
src/styles/ThemeStylesContext.ts | 13 +-
src/styles/ThemeStylesProvider.tsx | 9 +-
src/styles/codeStyles/types.ts | 2 +-
src/styles/colors.ts | 37 +-
src/styles/getModalStyles.ts | 271 ---
src/styles/getTooltipStyles.ts | 301 ---
src/styles/illustrations/dark.ts | 6 +-
src/styles/illustrations/light.ts | 6 +-
src/styles/illustrations/types.ts | 2 +
src/styles/styles.ts | 102 +-
src/styles/themes/ThemeContext.ts | 4 +-
src/styles/themes/ThemeProvider.tsx | 4 +-
src/styles/themes/default.ts | 98 +-
src/styles/themes/light.ts | 94 +-
src/styles/themes/{Themes.ts => themes.ts} | 7 +-
src/styles/themes/types.ts | 2 +-
src/styles/useStyleUtils.ts | 14 +
src/styles/useThemeStyles.ts | 6 +-
src/styles/utilities/spacing.ts | 4 +
src/styles/utils/ModalStyleUtils.ts | 273 +++
.../ReportActionContextMenuStyleUtils.ts} | 32 +-
src/styles/utils/TooltipStyleUtils.ts | 301 +++
src/styles/{StyleUtils.ts => utils/index.ts} | 979 ++++-----
.../roundToNearestMultipleOfFour.ts | 0
src/styles/variables.ts | 1 +
src/types/modules/material-top-tabs.d.ts | 8 +
src/types/modules/pusher.d.ts | 5 +-
src/types/onyx/BankAccount.ts | 4 +-
src/types/onyx/Fund.ts | 3 +
src/types/onyx/Login.ts | 3 +
src/types/onyx/OriginalMessage.ts | 12 +-
src/types/onyx/PersonalDetails.ts | 7 +-
src/types/onyx/Policy.ts | 21 +-
src/types/onyx/Report.ts | 28 +-
src/types/onyx/ReportAction.ts | 54 +-
src/types/onyx/ReportActionReactions.ts | 25 +-
src/types/onyx/ReportUserIsTyping.ts | 3 +
src/types/onyx/Request.ts | 1 +
src/types/onyx/Transaction.ts | 5 +
src/types/onyx/index.ts | 14 +-
src/types/utils/callOrReturn.ts | 9 +
src/types/utils/textRef.ts | 5 +
src/types/utils/viewRef.ts | 5 +
tests/actions/IOUTest.js | 17 -
tests/e2e/config.dev.js | 9 +-
tests/e2e/testRunner.js | 19 +-
.../perf-test/GooglePlacesUtils.perf-test.js | 2 +-
.../ReportActionCompose.perf-test.js | 10 +-
.../perf-test/ReportActionsList.perf-test.js | 4 +-
.../perf-test/ReportActionsUtils.perf-test.ts | 16 +-
tests/perf-test/ReportScreen.perf-test.js | 4 +-
tests/perf-test/ReportUtils.perf-test.ts | 267 +++
tests/perf-test/SelectionList.perf-test.js | 8 +-
tests/perf-test/SidebarLinks.perf-test.js | 4 +-
tests/perf-test/SidebarUtils.perf-test.ts | 8 +-
tests/unit/LocalizeTests.js | 8 +-
tests/unit/OptionsListUtilsTest.js | 1 -
tests/unit/PersistedRequests.ts | 67 +
tests/unit/ReportActionsUtilsTest.js | 3 +-
tests/unit/ReportUtilsTest.js | 7 +-
tests/unit/SidebarFilterTest.js | 36 +-
tests/unit/SidebarOrderTest.js | 59 +-
tests/unit/SidebarTest.js | 6 +-
tests/utils/LHNTestUtils.js | 3 -
tests/utils/collections/transaction.ts | 32 +
tsconfig.json | 2 +-
.../assertions/createNewVersionAssertions.js | 16 +-
workflow_tests/mocks/createNewVersionMocks.js | 3 +-
557 files changed, 14019 insertions(+), 6662 deletions(-)
delete mode 100644 assets/images/empty-state_background-fade-dark.png
delete mode 100644 assets/images/empty-state_background-fade-light.png
delete mode 100644 assets/images/example-check-image-en.png
delete mode 100644 assets/images/example-check-image-es.png
create mode 100644 assets/images/themeDependent/empty-state_background-fade-dark.png
create mode 100644 assets/images/themeDependent/empty-state_background-fade-light.png
create mode 100644 assets/images/themeDependent/example-check-image-dark-en.png
create mode 100644 assets/images/themeDependent/example-check-image-dark-es.png
create mode 100644 assets/images/themeDependent/example-check-image-light-en.png
create mode 100644 assets/images/themeDependent/example-check-image-light-es.png
create mode 100644 assets/images/thumbs-up.svg
delete mode 100644 docs/_includes/floating-concierge-button.html
delete mode 100644 docs/articles/expensify-classic/account-settings/Profile-Settings.md
delete mode 100644 docs/articles/expensify-classic/bank-accounts-and-credit-cards/Personal-Cards.md
rename docs/articles/expensify-classic/{getting-started => get-paid-back}/Referral-Program.md (100%)
delete mode 100644 docs/articles/expensify-classic/getting-started/Mobile-App.md
delete mode 100644 docs/articles/new-expensify/billing-and-plan-types/Referral-Program.md
create mode 100644 docs/articles/new-expensify/get-paid-back/Referral-Program.md
rename patches/{@react-navigation+native+6.1.6.patch => @react-navigation+native+6.1.8.patch} (90%)
delete mode 100644 patches/react-native-web+0.19.9+005+image-header-support.patch
delete mode 100644 src/components/BaseMiniContextMenuItem.js
create mode 100644 src/components/BaseMiniContextMenuItem.tsx
rename src/components/{CardPreview.js => CardPreview.tsx} (62%)
delete mode 100644 src/components/CopyTextToClipboard.js
create mode 100644 src/components/CopyTextToClipboard.tsx
delete mode 100644 src/components/FlatList/index.android.js
create mode 100644 src/components/FlatList/index.android.tsx
rename src/components/FlatList/{index.js => index.ts} (100%)
delete mode 100644 src/components/FormHelpMessage.js
create mode 100644 src/components/FormHelpMessage.tsx
delete mode 100644 src/components/HeaderGap/index.desktop.js
create mode 100644 src/components/HeaderGap/index.desktop.tsx
delete mode 100644 src/components/HeaderGap/index.js
create mode 100644 src/components/HeaderGap/index.tsx
create mode 100644 src/components/HeaderGap/types.ts
delete mode 100644 src/components/Image/BaseImage.js
delete mode 100644 src/components/Image/BaseImage.native.js
create mode 100644 src/components/Image/index.native.js
delete mode 100644 src/components/Indicator.js
create mode 100644 src/components/Indicator.tsx
delete mode 100644 src/components/InlineCodeBlock/WrappedText.js
create mode 100644 src/components/InlineCodeBlock/WrappedText.tsx
delete mode 100644 src/components/InlineCodeBlock/index.js
rename src/components/InlineCodeBlock/{index.native.js => index.native.tsx} (50%)
create mode 100644 src/components/InlineCodeBlock/index.tsx
delete mode 100644 src/components/InlineCodeBlock/inlineCodeBlockPropTypes.js
create mode 100644 src/components/InlineCodeBlock/types.ts
rename src/components/MapView/{Direction.web.tsx => Direction.website.tsx} (100%)
rename src/components/MapView/{MapView.web.tsx => MapView.website.tsx} (98%)
delete mode 100644 src/components/MapView/index.js
create mode 100644 src/components/MapView/index.tsx
rename src/components/{MessagesRow.js => MessagesRow.tsx} (57%)
create mode 100755 src/components/MoneyTemporaryForRefactorRequestConfirmationList.js
delete mode 100644 src/components/OfflineWithFeedback.js
create mode 100644 src/components/OfflineWithFeedback.tsx
delete mode 100644 src/components/TextLink.js
create mode 100644 src/components/TextLink.tsx
create mode 100644 src/components/TimePicker/TimePicker.js
create mode 100644 src/components/TimePicker/setSelection.ios.ts
create mode 100644 src/components/TimePicker/setSelection.ts
delete mode 100644 src/components/Tooltip/BaseTooltip.native.js
create mode 100644 src/components/Tooltip/BaseTooltip/index.native.tsx
rename src/components/Tooltip/{BaseTooltip.js => BaseTooltip/index.tsx} (81%)
delete mode 100644 src/components/Tooltip/PopoverAnchorTooltip.js
create mode 100644 src/components/Tooltip/PopoverAnchorTooltip.tsx
rename src/components/Tooltip/{TooltipRenderedOnPageBody.js => TooltipRenderedOnPageBody.tsx} (62%)
rename src/components/Tooltip/{TooltipSense.js => TooltipSense.tsx} (82%)
delete mode 100644 src/components/Tooltip/index.js
create mode 100644 src/components/Tooltip/index.tsx
delete mode 100644 src/components/Tooltip/tooltipPropTypes.js
create mode 100644 src/components/Tooltip/types.ts
rename src/components/UserDetailsTooltip/{BaseUserDetailsTooltip.web.js => BaseUserDetailsTooltip.website.js} (98%)
rename src/components/{WalletSection.js => WalletSection.tsx} (60%)
create mode 100644 src/components/withStyleUtils.tsx
rename src/hooks/{useAutoFocusInput.js => useAutoFocusInput.ts} (73%)
rename src/hooks/{useDelayedInputFocus.js => useDelayedInputFocus.ts} (62%)
create mode 100644 src/hooks/useHandleExceedMaxCommentLength.ts
rename src/hooks/useInitialWindowDimensions/{index.js => index.ts} (80%)
rename src/hooks/useTabNavigatorFocus/{index.js => index.ts} (83%)
rename src/libs/Browser/{index.web.ts => index.website.ts} (100%)
delete mode 100644 src/libs/DistanceRequestUtils.js
create mode 100644 src/libs/DistanceRequestUtils.ts
create mode 100644 src/libs/EmailUtils.ts
delete mode 100644 src/libs/HeaderUtils.js
create mode 100644 src/libs/HeaderUtils.ts
create mode 100644 src/libs/MessageElement.ts
rename src/libs/{NextStepUtils.js => NextStepUtils.ts} (56%)
rename src/libs/StatusBar/{index.web.ts => index.website.ts} (100%)
create mode 100644 src/libs/TaskUtils.ts
rename src/libs/UnreadIndicatorUpdater/{index.js => index.ts} (60%)
delete mode 100644 src/libs/UnreadIndicatorUpdater/updateUnread/index.android.js
create mode 100644 src/libs/UnreadIndicatorUpdater/updateUnread/index.android.ts
rename src/libs/UnreadIndicatorUpdater/updateUnread/{index.desktop.js => index.desktop.ts} (77%)
rename src/libs/UnreadIndicatorUpdater/updateUnread/{index.ios.js => index.ios.ts} (69%)
rename src/libs/UnreadIndicatorUpdater/updateUnread/{index.website.js => index.ts} (76%)
create mode 100644 src/libs/UnreadIndicatorUpdater/updateUnread/types.ts
rename src/libs/actions/{Report.js => Report.ts} (60%)
rename src/libs/{getModalState.js => getModalState.ts} (57%)
rename src/libs/migrations/{KeyReportActionsDraftByReportActionID.js => KeyReportActionsDraftByReportActionID.ts} (62%)
delete mode 100644 src/libs/migrations/RenameReceiptFilename.js
create mode 100644 src/libs/migrations/RenameReceiptFilename.ts
delete mode 100644 src/libs/shouldReopenOnfido/index.android.js
create mode 100644 src/libs/shouldReopenOnfido/index.android.ts
delete mode 100644 src/libs/shouldReopenOnfido/index.js
create mode 100644 src/libs/shouldReopenOnfido/index.ts
create mode 100644 src/libs/shouldReopenOnfido/types.ts
rename src/libs/{UpdateMultilineInputRange/index.ios.js => updateMultilineInputRange/index.ios.ts} (82%)
rename src/libs/{UpdateMultilineInputRange/index.js => updateMultilineInputRange/index.ts} (83%)
create mode 100644 src/libs/updateMultilineInputRange/types.ts
create mode 100644 src/pages/ReimbursementAccount/ExampleCheck.js
delete mode 100644 src/pages/ReimbursementAccount/exampleCheckImage.js
delete mode 100644 src/pages/home/report/ReportActionItemGrouped.js
create mode 100644 src/pages/home/report/ReportActionItemGrouped.tsx
create mode 100644 src/pages/iou/request/IOURequestStartPage.js
create mode 100644 src/pages/iou/request/MoneyTemporaryForRefactorRequestParticipantsSelector.js
create mode 100644 src/pages/iou/request/step/IOURequestStepAmount.js
create mode 100644 src/pages/iou/request/step/IOURequestStepCategory.js
create mode 100644 src/pages/iou/request/step/IOURequestStepConfirmation.js
create mode 100644 src/pages/iou/request/step/IOURequestStepCurrency.js
create mode 100644 src/pages/iou/request/step/IOURequestStepDate.js
create mode 100644 src/pages/iou/request/step/IOURequestStepDescription.js
create mode 100644 src/pages/iou/request/step/IOURequestStepDistance.js
create mode 100644 src/pages/iou/request/step/IOURequestStepMerchant.js
create mode 100644 src/pages/iou/request/step/IOURequestStepParticipants.js
create mode 100644 src/pages/iou/request/step/IOURequestStepRoutePropTypes.js
create mode 100644 src/pages/iou/request/step/IOURequestStepScan/CameraPermission/index.android.js
create mode 100644 src/pages/iou/request/step/IOURequestStepScan/CameraPermission/index.ios.js
create mode 100644 src/pages/iou/request/step/IOURequestStepScan/CameraPermission/index.js
create mode 100644 src/pages/iou/request/step/IOURequestStepScan/NavigationAwareCamera/index.js
create mode 100644 src/pages/iou/request/step/IOURequestStepScan/NavigationAwareCamera/index.native.js
create mode 100644 src/pages/iou/request/step/IOURequestStepScan/index.js
create mode 100644 src/pages/iou/request/step/IOURequestStepScan/index.native.js
create mode 100644 src/pages/iou/request/step/IOURequestStepTag.js
create mode 100644 src/pages/iou/request/step/IOURequestStepWaypoint.js
create mode 100644 src/pages/iou/request/step/StepScreenDragAndDropWrapper.js
create mode 100644 src/pages/iou/request/step/StepScreenWrapper.js
create mode 100644 src/pages/iou/request/step/withFullTransactionOrNotFound.js
create mode 100644 src/pages/iou/request/step/withWritableReportOrNotFound.js
create mode 100644 src/pages/settings/Profile/CustomStatus/SetDatePage.js
create mode 100644 src/pages/settings/Profile/CustomStatus/SetTimePage.js
create mode 100644 src/pages/settings/Profile/CustomStatus/StatusClearAfterPage.js
delete mode 100644 src/pages/settings/Profile/CustomStatus/StatusSetPage.js
delete mode 100644 src/pages/settings/Wallet/DangerCardSection.js
create mode 100644 src/pages/settings/Wallet/RedDotCardSection.js
rename src/styles/{getPopoverWithMeasuredContentStyles.ts => PopoverWithMeasuredContentStyleUtils.ts} (89%)
delete mode 100644 src/styles/getModalStyles.ts
delete mode 100644 src/styles/getTooltipStyles.ts
rename src/styles/themes/{Themes.ts => themes.ts} (73%)
create mode 100644 src/styles/useStyleUtils.ts
create mode 100644 src/styles/utils/ModalStyleUtils.ts
rename src/styles/{getReportActionContextMenuStyles.ts => utils/ReportActionContextMenuStyleUtils.ts} (55%)
create mode 100644 src/styles/utils/TooltipStyleUtils.ts
rename src/styles/{StyleUtils.ts => utils/index.ts} (73%)
rename src/styles/{ => utils}/roundToNearestMultipleOfFour.ts (100%)
create mode 100644 src/types/modules/material-top-tabs.d.ts
create mode 100644 src/types/onyx/ReportUserIsTyping.ts
create mode 100644 src/types/utils/callOrReturn.ts
create mode 100644 src/types/utils/textRef.ts
create mode 100644 src/types/utils/viewRef.ts
create mode 100644 tests/perf-test/ReportUtils.perf-test.ts
create mode 100644 tests/unit/PersistedRequests.ts
create mode 100644 tests/utils/collections/transaction.ts
diff --git a/.eslintrc.js b/.eslintrc.js
index b71338d0c1a5..85a4e86797b6 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -174,6 +174,7 @@ module.exports = {
'rulesdir/prefer-underscore-method': 'off',
'rulesdir/prefer-import-module-contents': 'off',
'react/require-default-props': 'off',
+ 'react/prop-types': 'off',
'no-restricted-syntax': [
'error',
{
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 4100a13f8bee..4f7d1c71553a 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -18,8 +18,8 @@ $ https://github.com/Expensify/App/issues/
Do NOT only link the issue number like this: $ #
--->
-$
-PROPOSAL:
+$
+PROPOSAL:
### Tests
@@ -98,7 +98,7 @@ This is a checklist for PR authors. Please make sure to complete all tasks and c
- [ ] The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory
- [ ] If a new CSS style is added I verified that:
- [ ] A similar style doesn't already exist
- - [ ] The style can't be created with an existing [StyleUtils](https://github.com/Expensify/App/blob/main/src/styles/StyleUtils.js) function (i.e. `StyleUtils.getBackgroundAndBorderStyle(theme.componentBG)`)
+ - [ ] The style can't be created with an existing [StyleUtils](https://github.com/Expensify/App/blob/main/src/styles/utils/index.ts) function (i.e. `StyleUtils.getBackgroundAndBorderStyle(theme.componentBG)`)
- [ ] If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
- [ ] If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like `Avatar` is modified, I verified that `Avatar` is working as expected in all cases)
- [ ] If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
diff --git a/.github/actions/composite/setupGitForOSBotifyApp/action.yml b/.github/actions/composite/setupGitForOSBotifyApp/action.yml
index 7a90cc45257d..a6c487705c56 100644
--- a/.github/actions/composite/setupGitForOSBotifyApp/action.yml
+++ b/.github/actions/composite/setupGitForOSBotifyApp/action.yml
@@ -60,6 +60,11 @@ runs:
if: runner.debug == '1'
run: echo "GIT_TRACE=true" >> "$GITHUB_ENV"
+ - name: Sync clock
+ shell: bash
+ run: sudo sntp -sS time.windows.com
+ if: runner.os == 'macOS'
+
- name: Generate a token
id: generateToken
uses: actions/create-github-app-token@9d97a4282b2c51a2f4f0465b9326399f53c890d4
diff --git a/.github/workflows/createNewVersion.yml b/.github/workflows/createNewVersion.yml
index 5f7f95e102e3..f772bfb818f0 100644
--- a/.github/workflows/createNewVersion.yml
+++ b/.github/workflows/createNewVersion.yml
@@ -32,12 +32,6 @@ on:
OS_BOTIFY_COMMIT_TOKEN:
description: OSBotify personal access token, used to workaround committing to protected branch
required: true
- OS_BOTIFY_APP_ID:
- description: Application ID for OS Botify App
- required: true
- OS_BOTIFY_PRIVATE_KEY:
- description: OSBotify private key
- required: true
jobs:
validateActor:
@@ -76,18 +70,16 @@ jobs:
token: ${{ secrets.OS_BOTIFY_COMMIT_TOKEN }}
- name: Setup git for OSBotify
- uses: ./.github/actions/composite/setupGitForOSBotifyApp
+ uses: ./.github/actions/composite/setupGitForOSBotify
id: setupGitForOSBotify
with:
GPG_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }}
- OS_BOTIFY_APP_ID: ${{ secrets.OS_BOTIFY_APP_ID }}
- OS_BOTIFY_PRIVATE_KEY: ${{ secrets.OS_BOTIFY_PRIVATE_KEY }}
- name: Generate version
id: bumpVersion
uses: ./.github/actions/javascript/bumpVersion
with:
- GITHUB_TOKEN: ${{ steps.setupGitForOSBotify.outputs.OS_BOTIFY_API_TOKEN }}
+ GITHUB_TOKEN: ${{ secrets.OS_BOTIFY_COMMIT_TOKEN }}
SEMVER_LEVEL: ${{ inputs.SEMVER_LEVEL }}
- name: Commit new version
diff --git a/.github/workflows/reassurePerformanceTests.yml b/.github/workflows/reassurePerformanceTests.yml
index a58745b742ad..c49530c46faa 100644
--- a/.github/workflows/reassurePerformanceTests.yml
+++ b/.github/workflows/reassurePerformanceTests.yml
@@ -17,6 +17,11 @@ jobs:
- name: Setup NodeJS
uses: ./.github/actions/composite/setupNode
+ - name: Set dummy git credentials
+ run: |
+ git config --global user.email "test@test.com"
+ git config --global user.name "Test"
+
- name: Run performance testing script
shell: bash
run: |
@@ -27,6 +32,7 @@ jobs:
npm install --force
npx reassure --baseline
git switch --force --detach -
+ git merge --no-commit --allow-unrelated-histories "$BASELINE_BRANCH" -X ours
npm install --force
npx reassure --branch
diff --git a/.imgbotconfig b/.imgbotconfig
index 43d1b77166cc..45cdf03ec36e 100644
--- a/.imgbotconfig
+++ b/.imgbotconfig
@@ -1,7 +1,7 @@
{
"ignoredFiles": [
- "assets/images/empty-state_background-fade-dark.png", // Caused an issue with colour gradients, https://github.com/Expensify/App/issues/30499
- "assets/images/empty-state_background-fade-light.png"
+ "assets/images/themeDependent/empty-state_background-fade-dark.png", // Caused an issue with colour gradients, https://github.com/Expensify/App/issues/30499
+ "assets/images/themeDependent/empty-state_background-fade-light.png"
],
"aggressiveCompression": "false"
}
diff --git a/.storybook/public/index.css b/.storybook/public/index.css
index 8ace4b240684..2d2411c083c1 100644
--- a/.storybook/public/index.css
+++ b/.storybook/public/index.css
@@ -24,5 +24,5 @@ a.sidebar-item[data-selected="true"], a.sidebar-item[data-selected="true"]:focus
}
.sidebar-container {
- background: #07271f;
+ background: #072419;
}
diff --git a/.storybook/theme.js b/.storybook/theme.js
index 96631764726f..67898fb00943 100644
--- a/.storybook/theme.js
+++ b/.storybook/theme.js
@@ -7,17 +7,17 @@ export default create({
fontBase: 'ExpensifyNeue-Regular',
fontCode: 'monospace',
base: 'dark',
- appBg: colors.darkHighlightBackground,
- colorPrimary: colors.darkDefaultButton,
+ appBg: colors.productDark200,
+ colorPrimary: colors.productDark400,
colorSecondary: colors.green,
- appContentBg: colors.darkAppBackground,
- textColor: colors.darkPrimaryText,
- barTextColor: colors.darkPrimaryText,
+ appContentBg: colors.productDark100,
+ textColor: colors.productDark900,
+ barTextColor: colors.productDark900,
barSelectedColor: colors.green,
- barBg: colors.darkAppBackground,
- appBorderColor: colors.darkBorders,
- inputBg: colors.darkHighlightBackground,
- inputBorder: colors.darkBorders,
+ barBg: colors.productDark100,
+ appBorderColor: colors.productDark400,
+ inputBg: colors.productDark200,
+ inputBorder: colors.productDark400,
appBorderRadius: 8,
inputBorderRadius: 8,
});
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 04d711009c10..685e9f206eb4 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -91,8 +91,8 @@ android {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
multiDexEnabled rootProject.ext.multiDexEnabled
- versionCode 1001040902
- versionName "1.4.9-2"
+ versionCode 1001041200
+ versionName "1.4.12-0"
}
flavorDimensions "default"
diff --git a/assets/images/empty-state_background-fade-dark.png b/assets/images/empty-state_background-fade-dark.png
deleted file mode 100644
index 1caf5630bee37fbe12aa1d9e19f695c2f0f0a250..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 129303
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