Skip to content

Commit 80743ea

Browse files
committed
merge main
1 parent 1bf9857 commit 80743ea

File tree

46 files changed

+1082
-613
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+1082
-613
lines changed

android/app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,8 @@ android {
110110
minSdkVersion rootProject.ext.minSdkVersion
111111
targetSdkVersion rootProject.ext.targetSdkVersion
112112
multiDexEnabled rootProject.ext.multiDexEnabled
113-
versionCode 1009008700
114-
versionName "9.0.87-0"
113+
versionCode 1009008703
114+
versionName "9.0.87-3"
115115
// Supported language variants must be declared here to avoid from being removed during the compilation.
116116
// This also helps us to not include unnecessary language variants in the APK.
117117
resConfigs "en", "es"

docs/articles/new-expensify/getting-started/Create-a-company-workspace.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ You can get support any time by locating your chat with Concierge in your chat i
2121

2222
# 2. Create a new workspace
2323

24+
Members can submit and manage their expenses in a workspace in Expensify. Each workspace has its own set of rules, settings, and integrations.
25+
2426
<ol type="a">
2527
<li>Click your profile photo or icon in the bottom left menu.</li>
2628
<li>Scroll down and click <b>Workspaces</b> in the left menu.</li>

docs/articles/new-expensify/getting-started/Join-your-company's-workspace.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ Get started by downloading Expensify mobile or desktop apps and ensure you’re
1616
- **Mobile Devices:** Download the Expensify app for [Android](https://play.google.com/store/apps/details?id=com.expensify.chat) or [iOS](https://apps.apple.com/us/app/expensify-cash/id1530278510).
1717
- **Desktop Devices:** Download the Expensify app for [macOS](https://new.expensify.com/NewExpensify.dmg).
1818

19-
## Use Expensify on the Web:
19+
## Use Expensify on the web:
2020

2121
Expensify is also accessible via the web and supports the following browsers:
2222

@@ -76,9 +76,9 @@ By using a compatible device or browser, you’ll ensure the best experience wit
7676
# 3. Meet Concierge
7777

7878
Concierge is your personal assistant that walks you through setting up your account and also provides:
79-
- Reminders to do things like submit your expenses
80-
- Alerts when more information is needed on an expense report
81-
- Updates on new and improved account features
79+
- Reminders to do things like submit your expenses.
80+
- Alerts when more information is needed on an expense report.
81+
- Updates on new and improved account features.
8282

8383
You can get support any time by locating your chat with Concierge in your chat inbox. You can ask questions and receive direct support in this thread.
8484

@@ -92,7 +92,7 @@ You can create an expense by SmartScanning a receipt to automatically capture th
9292

9393
{% include option.html value="desktop" %}
9494
<ol type="a">
95-
<li>Click the + icon in the bottom left menu and select <b>Submit Expense</b>.</li>
95+
<li>Click the + icon in the bottom left menu and select <b>Create Expense</b>.</li>
9696
<li>Click <b>Scan</b>.</li>
9797
<li>Drag and drop the receipt into Expensify, or click <b>Choose File</b> to select it from your saved files. <i>Note: The SmartScan process will auto-populate the merchant, date, and amount.</i></li>
9898
<li>Use the search field to find the desired workspace or an individual’s name, email, or phone number.</li>
@@ -104,7 +104,7 @@ You can create an expense by SmartScanning a receipt to automatically capture th
104104

105105
{% include option.html value="mobile" %}
106106
<ol type="a">
107-
<li>Tap the + icon at the bottom of the screen and select <b>Submit Expense</b>.</li>
107+
<li>Tap the + icon at the bottom of the screen and select <b>Create Expense</b>.</li>
108108
<li>Tap <b>Scan</b>.</li>
109109
<li>Tap the green button to take a photo of a receipt, or tap the Image icon to the left of it to upload a receipt from your phone. <i>Note: The SmartScan process will auto-populate the merchant, date, and amount</i>.</li>
110110
<li>Use the search field to find the desired workspace or an individual’s name, email, or phone number.</li>

ios/NewExpensify/Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
</dict>
4545
</array>
4646
<key>CFBundleVersion</key>
47-
<string>9.0.87.0</string>
47+
<string>9.0.87.3</string>
4848
<key>FullStory</key>
4949
<dict>
5050
<key>OrgId</key>

ios/NewExpensifyTests/Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,6 @@
1919
<key>CFBundleSignature</key>
2020
<string>????</string>
2121
<key>CFBundleVersion</key>
22-
<string>9.0.87.0</string>
22+
<string>9.0.87.3</string>
2323
</dict>
2424
</plist>

ios/NotificationServiceExtension/Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<key>CFBundleShortVersionString</key>
1414
<string>9.0.87</string>
1515
<key>CFBundleVersion</key>
16-
<string>9.0.87.0</string>
16+
<string>9.0.87.3</string>
1717
<key>NSExtension</key>
1818
<dict>
1919
<key>NSExtensionPointIdentifier</key>

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "new.expensify",
3-
"version": "9.0.87-0",
3+
"version": "9.0.87-3",
44
"author": "Expensify, Inc.",
55
"homepage": "https://new.expensify.com",
66
"description": "New Expensify is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.",

src/ONYXKEYS.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -558,6 +558,8 @@ const ONYXKEYS = {
558558
ADD_PAYMENT_CARD_FORM_DRAFT: 'addPaymentCardFormDraft',
559559
WORKSPACE_SETTINGS_FORM: 'workspaceSettingsForm',
560560
WORKSPACE_CATEGORY_FORM: 'workspaceCategoryForm',
561+
WORKSPACE_CONFIRMATION_FORM: 'workspaceConfirmationForm',
562+
WORKSPACE_CONFIRMATION_FORM_DRAFT: 'workspaceConfirmationFormDraft',
561563
WORKSPACE_CATEGORY_FORM_DRAFT: 'workspaceCategoryFormDraft',
562564
WORKSPACE_CATEGORY_DESCRIPTION_HINT_FORM: 'workspaceCategoryDescriptionHintForm',
563565
WORKSPACE_CATEGORY_DESCRIPTION_HINT_FORM_DRAFT: 'workspaceCategoryDescriptionHintFormDraft',
@@ -743,6 +745,7 @@ type OnyxFormValuesMapping = {
743745
[ONYXKEYS.FORMS.ADD_PAYMENT_CARD_FORM]: FormTypes.AddPaymentCardForm;
744746
[ONYXKEYS.FORMS.WORKSPACE_SETTINGS_FORM]: FormTypes.WorkspaceSettingsForm;
745747
[ONYXKEYS.FORMS.WORKSPACE_CATEGORY_FORM]: FormTypes.WorkspaceCategoryForm;
748+
[ONYXKEYS.FORMS.WORKSPACE_CONFIRMATION_FORM]: FormTypes.WorkspaceConfirmationForm;
746749
[ONYXKEYS.FORMS.WORKSPACE_TAG_FORM]: FormTypes.WorkspaceTagForm;
747750
[ONYXKEYS.FORMS.WORKSPACE_TAX_CUSTOM_NAME]: FormTypes.WorkspaceTaxCustomName;
748751
[ONYXKEYS.FORMS.WORKSPACE_COMPANY_CARD_FEED_NAME]: FormTypes.WorkspaceCompanyCardFeedName;

src/ROUTES.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ import type AssertTypesNotEqual from './types/utils/AssertTypesNotEqual';
1313
/**
1414
* Builds a URL with an encoded URI component for the `backTo` param which can be added to the end of URLs
1515
*/
16-
function getUrlWithBackToParam<TUrl extends string>(url: TUrl, backTo?: string): `${TUrl}` {
17-
const backToParam = backTo ? (`${url.includes('?') ? '&' : '?'}backTo=${encodeURIComponent(backTo)}` as const) : '';
16+
function getUrlWithBackToParam<TUrl extends string>(url: TUrl, backTo?: string, shouldEncodeURIComponent = true): `${TUrl}` {
17+
const backToParam = backTo ? (`${url.includes('?') ? '&' : '?'}backTo=${shouldEncodeURIComponent ? encodeURIComponent(backTo) : backTo}` as const) : '';
1818
return `${url}${backToParam}` as `${TUrl}`;
1919
}
2020

@@ -777,7 +777,7 @@ const ROUTES = {
777777
},
778778
POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_EXPORT: {
779779
route: 'settings/workspaces/:policyID/accounting/quickbooks-online/export',
780-
getRoute: (policyID: string, backTo?: string) => `settings/workspaces/${policyID}/accounting/quickbooks-online/export?backTo=${backTo}` as const,
780+
getRoute: (policyID: string, backTo?: string) => getUrlWithBackToParam(`settings/workspaces/${policyID}/accounting/quickbooks-online/export` as const, backTo, false),
781781
},
782782
POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_COMPANY_CARD_EXPENSE_ACCOUNT: {
783783
route: 'settings/workspaces/:policyID/accounting/quickbooks-online/export/company-card-expense-account',
@@ -1270,7 +1270,7 @@ const ROUTES = {
12701270
WORKSPACE_COMPANY_CARD_EXPORT: {
12711271
route: 'settings/workspaces/:policyID/company-cards/:bank/:cardID/edit/export',
12721272
getRoute: (policyID: string, cardID: string, bank: string, backTo?: string) =>
1273-
`settings/workspaces/${policyID}/company-cards/${bank}/${cardID}/edit/export?backTo=${backTo}` as const,
1273+
getUrlWithBackToParam(`settings/workspaces/${policyID}/company-cards/${bank}/${cardID}/edit/export`, backTo, false),
12741274
},
12751275
WORKSPACE_EXPENSIFY_CARD: {
12761276
route: 'settings/workspaces/:policyID/expensify-card',
@@ -1487,6 +1487,10 @@ const ROUTES = {
14871487
},
14881488
WELCOME_VIDEO_ROOT: 'onboarding/welcome-video',
14891489
EXPLANATION_MODAL_ROOT: 'onboarding/explanation',
1490+
WORKSPACE_CONFIRMATION: {
1491+
route: 'workspace/confirmation',
1492+
getRoute: (backTo?: string) => getUrlWithBackToParam(`workspace/confirmation`, backTo),
1493+
},
14901494
MIGRATED_USER_WELCOME_MODAL: 'onboarding/migrated-user-welcome',
14911495

14921496
TRANSACTION_RECEIPT: {
@@ -1562,7 +1566,7 @@ const ROUTES = {
15621566
},
15631567
POLICY_ACCOUNTING_XERO_EXPORT: {
15641568
route: 'settings/workspaces/:policyID/accounting/xero/export',
1565-
getRoute: (policyID: string, backTo?: string) => `settings/workspaces/${policyID}/accounting/xero/export?backTo=${backTo}` as const,
1569+
getRoute: (policyID: string, backTo?: string) => getUrlWithBackToParam(`settings/workspaces/${policyID}/accounting/xero/export` as const, backTo, false),
15661570
},
15671571
POLICY_ACCOUNTING_XERO_PREFERRED_EXPORTER_SELECT: {
15681572
route: 'settings/workspaces/:policyID/connections/xero/export/preferred-exporter/select',
@@ -1687,7 +1691,7 @@ const ROUTES = {
16871691
},
16881692
POLICY_ACCOUNTING_NETSUITE_EXPORT: {
16891693
route: 'settings/workspaces/:policyID/connections/netsuite/export/',
1690-
getRoute: (policyID: string, backTo?: string) => `settings/workspaces/${policyID}/connections/netsuite/export?backTo=${backTo}` as const,
1694+
getRoute: (policyID: string, backTo?: string) => getUrlWithBackToParam(`settings/workspaces/${policyID}/connections/netsuite/export/` as const, backTo, false),
16911695
},
16921696
POLICY_ACCOUNTING_NETSUITE_PREFERRED_EXPORTER_SELECT: {
16931697
route: 'settings/workspaces/:policyID/connections/netsuite/export/preferred-exporter/select',
@@ -1825,7 +1829,7 @@ const ROUTES = {
18251829
},
18261830
POLICY_ACCOUNTING_SAGE_INTACCT_EXPORT: {
18271831
route: 'settings/workspaces/:policyID/accounting/sage-intacct/export',
1828-
getRoute: (policyID: string, backTo?: string) => `settings/workspaces/${policyID}/accounting/sage-intacct/export?backTo=${backTo}` as const,
1832+
getRoute: (policyID: string, backTo?: string) => getUrlWithBackToParam(`settings/workspaces/${policyID}/accounting/sage-intacct/export` as const, backTo, false),
18291833
},
18301834
POLICY_ACCOUNTING_SAGE_INTACCT_PREFERRED_EXPORTER: {
18311835
route: 'settings/workspaces/:policyID/accounting/sage-intacct/export/preferred-exporter',

src/SCREENS.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ const SCREENS = {
159159
DETAILS: 'Details',
160160
PROFILE: 'Profile',
161161
REPORT_DETAILS: 'Report_Details',
162+
WORKSPACE_CONFIRMATION: 'Workspace_Confirmation',
162163
REPORT_SETTINGS: 'Report_Settings',
163164
REPORT_DESCRIPTION: 'Report_Description',
164165
PARTICIPANTS: 'Participants',
@@ -326,6 +327,8 @@ const SCREENS = {
326327
EXPORT: 'Report_Details_Export',
327328
},
328329

330+
WORKSPACE_CONFIRMATION: {ROOT: 'Workspace_Confirmation_Root'},
331+
329332
WORKSPACE: {
330333
ACCOUNTING: {
331334
ROOT: 'Policy_Accounting',

src/components/CurrencyPicker.tsx

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
import React, {forwardRef, useState} from 'react';
2+
import type {ForwardedRef} from 'react';
3+
import {View} from 'react-native';
4+
import useLocalize from '@hooks/useLocalize';
5+
import useStyleUtils from '@hooks/useStyleUtils';
6+
import useThemeStyles from '@hooks/useThemeStyles';
7+
import variables from '@styles/variables';
8+
import CONST from '@src/CONST';
9+
import CurrencySelectionListWithOnyx from './CurrencySelectionList';
10+
import HeaderWithBackButton from './HeaderWithBackButton';
11+
import MenuItemWithTopDescription from './MenuItemWithTopDescription';
12+
import Modal from './Modal';
13+
import ScreenWrapper from './ScreenWrapper';
14+
import type {ValuePickerItem, ValuePickerProps} from './ValuePicker/types';
15+
16+
type CurrencyPickerProps = {
17+
selectedCurrency?: string;
18+
};
19+
function CurrencyPicker({selectedCurrency, label = '', errorText = '', value, onInputChange, furtherDetails}: ValuePickerProps & CurrencyPickerProps, forwardedRef: ForwardedRef<View>) {
20+
const StyleUtils = useStyleUtils();
21+
const styles = useThemeStyles();
22+
const [isPickerVisible, setIsPickerVisible] = useState(false);
23+
const {translate} = useLocalize();
24+
25+
const showPickerModal = () => {
26+
setIsPickerVisible(true);
27+
};
28+
29+
const hidePickerModal = () => {
30+
setIsPickerVisible(false);
31+
};
32+
33+
const updateInput = (item: ValuePickerItem) => {
34+
if (item.value !== selectedCurrency) {
35+
onInputChange?.(item.value);
36+
}
37+
hidePickerModal();
38+
};
39+
40+
const descStyle = !selectedCurrency || selectedCurrency.length === 0 ? StyleUtils.getFontSizeStyle(variables.fontSizeLabel) : null;
41+
42+
return (
43+
<View>
44+
<MenuItemWithTopDescription
45+
ref={forwardedRef}
46+
shouldShowRightIcon
47+
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
48+
title={value || ''}
49+
descriptionTextStyle={descStyle}
50+
description={label}
51+
onPress={showPickerModal}
52+
furtherDetails={furtherDetails}
53+
brickRoadIndicator={errorText ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined}
54+
errorText={errorText}
55+
/>
56+
57+
<Modal
58+
type={CONST.MODAL.MODAL_TYPE.RIGHT_DOCKED}
59+
isVisible={isPickerVisible}
60+
onClose={() => hidePickerModal}
61+
onModalHide={hidePickerModal}
62+
hideModalContentWhileAnimating
63+
useNativeDriver
64+
onBackdropPress={hidePickerModal}
65+
>
66+
<ScreenWrapper
67+
style={styles.pb0}
68+
includePaddingTop={false}
69+
includeSafeAreaPaddingBottom={false}
70+
testID={label}
71+
>
72+
<HeaderWithBackButton
73+
title={label}
74+
onBackButtonPress={hidePickerModal}
75+
/>
76+
<CurrencySelectionListWithOnyx
77+
onSelect={(item) => updateInput({value: item.currencyCode})}
78+
searchInputLabel={translate('common.currency')}
79+
initiallySelectedCurrencyCode={selectedCurrency}
80+
/>
81+
</ScreenWrapper>
82+
</Modal>
83+
</View>
84+
);
85+
}
86+
87+
CurrencyPicker.displayName = 'CurrencyPicker';
88+
89+
export default forwardRef(CurrencyPicker);

src/languages/en.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,6 @@ const translations = {
358358
invalidRateError: 'Please enter a valid rate.',
359359
lowRateError: 'Rate must be greater than 0.',
360360
email: 'Please enter a valid email address.',
361-
login: 'An error occurred while logging in. Please try again.',
362361
},
363362
comma: 'comma',
364363
semicolon: 'semicolon',
@@ -2517,6 +2516,7 @@ const translations = {
25172516
carType: 'Car type',
25182517
cancellation: 'Cancellation policy',
25192518
cancellationUntil: 'Free cancellation until',
2519+
freeCancellation: 'Free cancellation',
25202520
confirmation: 'Confirmation number',
25212521
},
25222522
train: 'Rail',
@@ -3560,7 +3560,7 @@ const translations = {
35603560
},
35613561
earnSection: {
35623562
title: 'Earn',
3563-
subtitle: 'Enable optional functionality to streamline your revenue and get paid faster.',
3563+
subtitle: 'Streamline your revenue and get paid faster.',
35643564
},
35653565
organizeSection: {
35663566
title: 'Organize',
@@ -3817,7 +3817,7 @@ const translations = {
38173817
},
38183818
emptyWorkspace: {
38193819
title: 'Create a workspace',
3820-
subtitle: 'Create a workspace to track receipts, reimburse expenses, send invoices, and more -- all at the speed of chat.',
3820+
subtitle: 'Create a workspace to track receipts, reimburse expenses, send invoices, and more all at the speed of chat.',
38213821
createAWorkspaceCTA: 'Get Started',
38223822
features: {
38233823
trackAndCollect: 'Track and collect receipts',
@@ -3835,6 +3835,7 @@ const translations = {
38353835
new: {
38363836
newWorkspace: 'New workspace',
38373837
getTheExpensifyCardAndMore: 'Get the Expensify Card and more',
3838+
confirmWorkspace: 'Confirm Workspace',
38383839
},
38393840
people: {
38403841
genericFailureMessage: 'An error occurred removing a member from the workspace, please try again.',
@@ -4557,6 +4558,7 @@ const translations = {
45574558
description: 'Choose from the support options below:',
45584559
chatWithConcierge: 'Chat with Concierge',
45594560
scheduleSetupCall: 'Schedule a setup call',
4561+
scheduleADemo: 'Schedule a demo',
45604562
questionMarkButtonTooltip: 'Get assistance from our team',
45614563
exploreHelpDocs: 'Explore help docs',
45624564
},

src/languages/es.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,6 @@ const translations = {
349349
invalidRateError: 'Por favor, introduce una tarifa válida.',
350350
lowRateError: 'La tarifa debe ser mayor que 0.',
351351
email: 'Por favor, introduzca una dirección de correo electrónico válida.',
352-
login: 'Se produjo un error al iniciar sesión. Por favor intente nuevamente.',
353352
},
354353
comma: 'la coma',
355354
semicolon: 'el punto y coma',
@@ -2541,6 +2540,7 @@ const translations = {
25412540
carType: 'Tipo de coche',
25422541
cancellation: 'Política de cancelación',
25432542
cancellationUntil: 'Cancelación gratuita hasta el',
2543+
freeCancellation: 'Cancelación gratuita',
25442544
confirmation: 'Número de confirmación',
25452545
},
25462546
train: 'Tren',
@@ -3602,7 +3602,7 @@ const translations = {
36023602
},
36033603
earnSection: {
36043604
title: 'Gane',
3605-
subtitle: 'Habilita funciones opcionales para agilizar tus ingresos y recibir pagos más rápido.',
3605+
subtitle: 'Agiliza tus ingresos y recibe pagos más rápido.',
36063606
},
36073607
organizeSection: {
36083608
title: 'Organizar',
@@ -3879,6 +3879,7 @@ const translations = {
38793879
new: {
38803880
newWorkspace: 'Nuevo espacio de trabajo',
38813881
getTheExpensifyCardAndMore: 'Consigue la Tarjeta Expensify y más',
3882+
confirmWorkspace: 'Confirmar espacio de trabajo',
38823883
},
38833884
people: {
38843885
genericFailureMessage: 'Se ha producido un error al intentar eliminar a un miembro del espacio de trabajo. Por favor, inténtalo más tarde.',
@@ -4604,6 +4605,7 @@ const translations = {
46044605
description: 'Elige una de las siguientes opciones:',
46054606
chatWithConcierge: 'Chatear con Concierge',
46064607
scheduleSetupCall: 'Concertar una llamada',
4608+
scheduleADemo: 'Programa una demostración',
46074609
questionMarkButtonTooltip: 'Obtén ayuda de nuestro equipo',
46084610
exploreHelpDocs: 'Explorar la documentación de ayuda',
46094611
},

src/libs/API/parameters/CreateWorkspaceParams.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ type CreateWorkspaceParams = {
1111
customUnitID: string;
1212
customUnitRateID: string;
1313
engagementChoice?: string;
14+
currency: string;
15+
file?: File;
1416
};
1517

1618
export default CreateWorkspaceParams;

0 commit comments

Comments
 (0)