Skip to content

Commit d3b7692

Browse files
authored
Merge branch 'Expensify:main' into fix/sq-crash-window
2 parents a86df44 + 337139e commit d3b7692

75 files changed

Lines changed: 1694 additions & 872 deletions

File tree

Some content is hidden

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

Mobile-Expensify

android/app/build.gradle

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

config/eslint/eslint.seatbelt.tsv

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -564,9 +564,7 @@
564564
"../../src/pages/workspace/WorkspaceMembersPage.tsx" "react-hooks/refs" 1
565565
"../../src/pages/workspace/WorkspaceNewRoomPage.tsx" "@typescript-eslint/no-deprecated/InteractionManager.runAfterInteractions" 1
566566
"../../src/pages/workspace/WorkspaceNewRoomPage.tsx" "react-hooks/set-state-in-effect" 3
567-
"../../src/pages/workspace/WorkspaceOverviewPage.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 4
568567
"../../src/pages/workspace/WorkspaceResetBankAccountModal.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 1
569-
"../../src/pages/workspace/WorkspacesListPage.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 4
570568
"../../src/pages/workspace/WorkspacesListPage.tsx" "no-restricted-imports" 1
571569
"../../src/pages/workspace/WorkspacesListPage.tsx" "react-hooks/set-state-in-effect" 1
572570
"../../src/pages/workspace/accounting/PolicyAccountingPage.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 1
@@ -618,9 +616,7 @@
618616
"../../src/pages/workspace/companyCards/addNew/PlaidConnectionStep.tsx" "@typescript-eslint/no-deprecated/InteractionManager.runAfterInteractions" 1
619617
"../../src/pages/workspace/companyCards/assignCard/ConfirmationStep.tsx" "@typescript-eslint/no-deprecated/InteractionManager.runAfterInteractions" 1
620618
"../../src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx" "react-hooks/preserve-manual-memoization" 1
621-
"../../src/pages/workspace/downgrade/WorkspaceDowngradePage.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 1
622-
"../../src/pages/workspace/downgrade/WorkspaceDowngradePage.tsx" "@typescript-eslint/no-deprecated/InteractionManager.runAfterInteractions" 2
623-
"../../src/pages/workspace/duplicate/WorkspaceDuplicateSelectFeaturesForm.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 1
619+
"../../src/pages/workspace/downgrade/WorkspaceDowngradePage.tsx" "@typescript-eslint/no-deprecated/InteractionManager.runAfterInteractions" 1
624620
"../../src/pages/workspace/duplicate/WorkspaceDuplicateSelectFeaturesForm.tsx" "react-hooks/preserve-manual-memoization" 2
625621
"../../src/pages/workspace/duplicate/WorkspaceDuplicateSelectFeaturesForm.tsx" "react-hooks/set-state-in-effect" 1
626622
"../../src/pages/workspace/expensifyCard/WorkspaceEditCardLimitPage.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 1

contributingGuides/FORMS.md

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -385,33 +385,6 @@ import KEYBOARD_SUBMIT_BEHAVIOR from './keyboardSubmitBehavior';
385385
> [!NOTE]
386386
> Only override `keyboardSubmitBehavior` on screens where `onSubmit` triggers navigation. For forms that stay on-screen after submission, keep the default (`'dismiss-then-submit'`) to avoid layout jumps.
387387
388-
### Reacting to form value changes (`FormValueWatcher`)
389-
390-
Sometimes a parent screen needs to react when a form value changes from outside the form — for example when an RHP picker writes to the Onyx draft via `setDraftValues` and the parent has to re-sync `FormProvider`'s internal state (clear `touched` flags, wipe local errors via `resetForm`, etc.).
391-
392-
Instead of adding a `useEffect` inside the parent (which can't see `FormProvider`'s `inputValues` directly), use the `FormValueWatcher` primitive together with `FormProvider`'s children render prop. It's a render-null component that fires `onValuesChange(current, previous)` whenever the `values` reference changes, and short-circuits when the reference is identical (no spurious fires).
393-
394-
```jsx
395-
<FormProvider formID={ONYXKEYS.FORMS.MY_FORM} ref={formRef} /* ... */>
396-
{({inputValues}) => (
397-
<>
398-
<FormValueWatcher
399-
values={inputValues}
400-
onValuesChange={(current, previous) => {
401-
if (current.type === previous.type) {
402-
return;
403-
}
404-
formRef.current?.resetForm(current);
405-
}}
406-
/>
407-
{/* ...InputWrappers... */}
408-
</>
409-
)}
410-
</FormProvider>
411-
```
412-
413-
Use it only when you genuinely need a cross-component reaction; for in-form logic, prefer `onValueChange` / `onInputChange` on the specific input.
414-
415388
### Safe Area Padding
416389

417390
Any `FormProvider.tsx` that has a button at the bottom. If the `<FormProvider>` is inside a `<ScreenWrapper>`, the bottom safe area inset is handled automatically (`includeSafeAreaPaddingBottom` needs to be set to `true`, but its the default).

contributingGuides/HOW_TO_BECOME_A_BACKEND_CONTRIBUTOR.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
**Overview**
22

3-
We are hiring an exceptionally strong Backend Engineer with deep expertise in C++ and PHP to join a small, senior, fully-remote engineering team. This is a high-trust, high-ownership environment with minimal process, no standups, and no sprint ceremonies.
3+
We are hiring an exceptionally strong Backend Engineer with deep expertise in C++ and PHP to join a small, senior, fully-remote engineering team. This is a high-trust, high-ownership environment with minimal process, no stand-ups, and no sprint ceremonies.
44

55
This role is intentionally designed for engineers who thrive with autonomy, clear ownership, and written communication. You will be highly visible, highly trusted, and expected to operate independently from day one.
66

@@ -19,7 +19,7 @@ As part of our high-vetting process, all shortlisted candidates will complete a
1919

2020
- Expert-level proficiency in both C++ and PHP
2121
- Clear commitment to C++ and PHP as long-term backend technologies (not stepping stones)
22-
- Demonstrated problem-solving ability, validated through a paid C++ and PHP technical challenge
22+
- Demonstrated problem-solving ability, validated through a C++ and PHP technical challenge
2323
- Strong backend systems thinking (performance, reliability, maintainability)
2424
- SQL experience is a plus, but not required
2525

@@ -32,13 +32,15 @@ As part of our high-vetting process, all shortlisted candidates will complete a
3232

3333
**Work Style & Autonomy**
3434

35-
- Thrives without traditional management, standups, or sprint structures
35+
- Thrives without traditional management, stand-ups, or sprint structures
3636
- Strong self-management, ownership mentality, and bias toward action
3737
- Able to operate effectively in a flat, non-hierarchical organization
3838
- Comfortable making decisions independently and being accountable for outcomes
3939

40-
**Time Zone & Availability**
40+
**Hours, Time Zone & Availability**
4141

42+
- Expected Hours: ~40 hours/week
43+
- Time off: Unpaid and flexible
4244
- Must have at least 6 hours of daily overlap with: US Pacific Time (PT) or Central European Time (CET)
4345
- Time zone overlap is especially critical during the first 3 months for onboarding and alignment
4446

docs/articles/new-expensify/reports-and-expenses/Create-and-Submit-Reports.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
title: Create-and-Submit-Reports.md
33
description: Learn how to use New Expensify’s report-first flow to create, edit, submit, and retract expense reports.
4-
keywords: [New Expensify, create report, submit report, retract report, add expenses, fix report, admin create report, create report on behalf, move expenses to new report]
4+
keywords: [New Expensify, create report, submit report, retract report, add expenses, fix report, admin create report, create report on behalf, move expenses to new report, pending card transactions, unable to submit report]
55
internalScope: Audience is members and Workspace Admins. Covers creating, submitting, editing, and retracting expense reports, including admin-created reports. Does not cover approvals, reimbursements, or exports.
66
---
77

@@ -179,6 +179,10 @@ Unsubmitted reports will remain in your Open reports section. You can go back an
179179

180180
The **Submit** button only appears once your report includes at least one valid expense. If the report has already been submitted, the button will no longer be visible. If your workspace has no approval workflow, the button will say **Mark as done** instead of **Submit**.
181181

182+
## Why can’t I submit a report with pending Expensify Card transactions?
183+
184+
If all transactions on your report are pending Expensify Card transactions, you'll see the **Submit** button but clicking it will display an **Unable to submit report** error. Pending transactions may take a few days to post. After at least one transaction has posted, you can submit the report.
185+
182186
## Can I remove an expense after submitting?
183187

184188
Yes. You’ll need to retract the report using More > Retract, depending on the report's state. Then you can remove or edit expenses before resubmitting.

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.4.0.0</string>
47+
<string>9.4.0.2</string>
4848
<key>FullStory</key>
4949
<dict>
5050
<key>OrgId</key>

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.4.0</string>
1515
<key>CFBundleVersion</key>
16-
<string>9.4.0.0</string>
16+
<string>9.4.0.2</string>
1717
<key>NSExtension</key>
1818
<dict>
1919
<key>NSExtensionPointIdentifier</key>

ios/Podfile.lock

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2417,7 +2417,7 @@ PODS:
24172417
- ReactCommon/turbomodule/core
24182418
- SocketRocket
24192419
- Yoga
2420-
- react-native-blob-util (0.22.2):
2420+
- react-native-blob-util (0.24.9):
24212421
- boost
24222422
- DoubleConversion
24232423
- fast_float
@@ -4866,7 +4866,7 @@ SPEC CHECKSUMS:
48664866
react-native-advanced-input-mask: 9c2b52e8d7b09d5df6a6d0f6aafaa46926e39df5
48674867
react-native-airship: 9968fae5afb9b18aa9e01e96c8c77a9a7ad7d1e7
48684868
react-native-app-logs: 8609315e85ebedb9da47120e5c0bcea5bd6e9d75
4869-
react-native-blob-util: 7f71e0af02279ef38a2ba43e8c2fcb79cf927732
4869+
react-native-blob-util: 871805e786e7c8e4a8c482e34ec6640ab19038fe
48704870
react-native-cameraroll: 8e83b1a4f8abb386b37599918a412add4a87c5e7
48714871
react-native-config: 62c1dce61201623334f751c71c7b12c4accbdff8
48724872
react-native-document-picker: 18a9d68e6117d37ac5facd87619cbc3ff17575a7

ios/ShareViewController/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.4.0</string>
1515
<key>CFBundleVersion</key>
16-
<string>9.4.0.0</string>
16+
<string>9.4.0.2</string>
1717
<key>NSExtension</key>
1818
<dict>
1919
<key>NSExtensionAttributes</key>

0 commit comments

Comments
 (0)