Skip to content

Commit 4959ce1

Browse files
committed
Merge branch 'main' into alberto-PRLink
2 parents a9c68e9 + e6811d9 commit 4959ce1

374 files changed

Lines changed: 9129 additions & 8835 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.

.github/workflows/test.yml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,6 @@ jobs:
3131
- name: Setup Node
3232
uses: ./.github/actions/composite/setupNode
3333

34-
- name: Get number of CPU cores
35-
id: cpu-cores
36-
uses: SimenB/github-actions-cpu-cores@31e91de0f8654375a21e8e83078be625380e2b18
37-
3834
- name: Cache Jest cache
3935
id: cache-jest-cache
4036
# v5.0.1

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 1009036200
115-
versionName "9.3.62-0"
114+
versionCode 1009036204
115+
versionName "9.3.62-4"
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"

babel.config.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,9 @@ const metro = {
130130
production: {
131131
plugins: [['transform-remove-console', {exclude: ['error', 'warn']}]],
132132
},
133+
test: {
134+
plugins: ['@babel/plugin-transform-dynamic-import'],
135+
},
133136
},
134137
};
135138

contributingGuides/PERFORMANCE.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ Since our codebase is very complex, it results in a large DOM tree rendered for
282282

283283
One of the most common issues is related to modals, popovers, and tooltips — elements that may appear on the screen. The problem is that they are usually present in the DOM tree even when initially invisible. Because of this, the initial render time of a screen may increase, ultimately slowing down the app.
284284

285-
The solution is better control of invisible elements, making sure they are not included in the first render. This can be done, e.g., by a simple `return null`, smart usage of `lazy loading`, the `useTransition` hook, or the `<Deferred />` component.
285+
The solution is better control of invisible elements, making sure they are not included in the first render. This can be done, e.g., by a simple `return null`, smart usage of `lazy loading`, the `useTransition` hook, or the [`<NavigationDeferredMount />`](/src/components/NavigationDeferredMount.tsx) component. `<NavigationDeferredMount />` gates a heavy subtree behind navigation transition completion via `TransitionTracker`, rendering a cheap `placeholder` until the nav animation has finished, then mounting its `children` inside `startTransition` — ideal for heavy subtrees (e.g. report headers, page-level secondary actions) mounted during navigation transitions that pull many `useOnyx` subscriptions or heavy hooks but don't need to be interactive on first render.
286286

287287
Another issue worth mentioning is unnecessary code execution, especially for elements that are never shown on a specific platform. In theory, we separate the logic between platforms by using index.tsx/index.native.tsx files, but sometimes platform-specific logic may slip in, causing unnecessary execution. For example, this may happen when logic specific to a wide layout (applicable only for web) is included.
288288

@@ -294,6 +294,7 @@ Examples:
294294
- [PopoverWithMeasuredContent optimization for mobile](https://github.com/Expensify/App/pull/68223) - returns early to avoid unnecessary calculations
295295
- [Reduce confirm modal initial render count](https://github.com/Expensify/App/pull/67518) - returns early to reduce first load cost
296296
- [Do not render PopoverMenu until it gets opened](https://github.com/Expensify/App/pull/67877) - adds a wrapper to control if `PopoverMenu` should be rendered
297+
- [Defer mount of MoneyReportHeaderSecondaryActions](https://github.com/Expensify/App/pull/88522) - introduces `NavigationDeferredMount` and uses it to defer the "More" dropdown subtree (20+ `useOnyx` subscriptions) until the navigation transition completes
297298

298299
# Proposing Performance Improvements
299300

contributingGuides/STYLE.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -571,9 +571,7 @@ When you change the function id argument type to allow `undefined`, check if it
571571
572572
```diff
573573
function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = false, updatedTransaction, isFromReviewDuplicates = false}: MoneyRequestViewProps) {
574-
const [parentReportActions] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${parentReportID}`, {
575-
canEvict: false,
576-
});
574+
const [parentReportActions] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${parentReportID}`);
577575
- const parentReportAction = parentReportActions?.[report?.parentReportActionID ?? '-1'];
578576
+ const parentReportAction = parentReportActions?.[report?.parentReportActionID];
579577
```

contributingGuides/philosophies/ONYX-DATA-MANAGEMENT.md

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,7 @@ Different platforms come with varying storage capacities and Onyx has a way to g
3535

3636
**To flag a key as safe for removal:**
3737
- Add the key to the `evictableKeys` option in `Onyx.init(options)`
38-
- Implement `canEvict` in the Onyx config for each component subscribing to a key
39-
- The key will only be deleted when all subscribers return `true` for `canEvict`
40-
41-
Example:
42-
```js
43-
Onyx.init({
44-
evictableKeys: [ONYXKEYS.COLLECTION.REPORT_ACTIONS],
45-
});
46-
47-
const [reportActions] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, {canEvict: !isActiveReport});
48-
```
38+
- A least recently accessed key will only be deleted when an Onyx operation retries after failing.
4939

5040
## Onyx Derived Values
5141

cspell.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -912,6 +912,7 @@
912912
"Zürcher",
913913
"CARDFROZEN",
914914
"CARDUNFROZEN",
915+
"backgrounded",
915916
"Kolkata"
916917
],
917918
"ignorePaths": [

docs/articles/expensify-classic/settings/Avoiding-common-scams.md

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,16 @@
22
title: Avoiding common scams
33
description: Learn how to recognize and avoid common phishing scams that pretend to be from Expensify, including fake phone calls and emails asking for your Magic Code.
44
keywords: [Expensify scam, phishing, Magic Code, security, login code, avoid fraud, suspicious email, fake call, fraud prevention]
5+
internalScope: Audience is all Expensify members. Covers identifying and responding to scams involving Magic Codes. Does not cover account recovery or dispute workflows.
56
---
6-
<div id="expensify-classic" markdown="1">
77

8-
# How to avoid scams pretending to be from Expensify
8+
# Avoiding common scams
99

1010
Some scammers try to impersonate Expensify by sending fake emails or calling you directly, often asking for your **Magic Code** (your login code). These scams are designed to trick you into giving up access to your Expensify account.
1111

12-
This guide explains what these scams look like, how to spot them, and what to do if you think you've been targeted.
12+
This article explains how these scams work, how to recognize them, and what actions to take.
13+
14+
**Note:** Expensify will never call you asking for login codes, passwords, or payment information. If you receive such a call, it's a scam.
1315

1416
---
1517

@@ -21,21 +23,17 @@ The **Magic Code** is a one-time login code Expensify emails or texts to you whe
2123

2224
---
2325

24-
## Common scams to watch out for
25-
26-
Here are the most common types of scams we've seen targeting Expensify members:
27-
28-
### 1. Phone call scams requesting your Magic Code
26+
## How to recognize phone call scams pretending to be Expensify
2927

3028
- The scammer claims to be from Expensify and needs your Magic Code to verify your account.
3129
- They may spoof a legitimate phone number to make it seem more convincing.
3230
- Some scammers may create a sense of urgency (e.g., “We detected suspicious activity on your account.”)
3331

34-
**If someone calls you asking for your Magic Code, hang up immediately.**
32+
**If you receive this type of call, hang up.**
3533

3634
---
3735

38-
### 2. Phishing emails and texts requesting you use their link to login to Expensify
36+
## How to recognize phishing emails or texts pretending to be Expensify
3937

4038
- Emails and text messages often look like they’re from Expensify or Visa, but the sender address is likely not from an expensify.com email address.
4139
- These emails and text messages may have links that lead to a fake login page, prompt you to reset your password, or ask you to reply with your Magic Code.
@@ -45,32 +43,46 @@ Here are the most common types of scams we've seen targeting Expensify members:
4543

4644
---
4745

48-
## How to stay safe
49-
50-
Here’s how you can protect your Expensify account:
46+
## How to protect your Expensify account
5147

5248
- **Never share your Magic Code** — not over the phone, not by email, not via text.
5349
- **Don’t click suspicious links** — always verify the sender’s email address.
54-
- **Use 2FA** (two-factor authentication) to add an extra layer of security.
55-
- **If in doubt, message Concierge** directly from within the Expensify app.
50+
- **Use two-factor authentication (2FA)** - this adds an extra layer of security to your account.
51+
- **If in doubt, message Concierge** - reach out directly from within the Expensify app.
52+
53+
[Learn how to enable two-factor authentication](/articles/expensify-classic/settings/Two-Factor-Authentication).
54+
55+
---
56+
57+
## What to do if you receive a Magic Code you didn't request
58+
59+
If you receive a Magic Code email but didn’t try to log in, this does not necessarily mean your account has been compromised. It can happen for a variety of reasons, such as someone mistyping an email address.
60+
61+
Here's what to do:
62+
63+
1. **Do not share the code with anyone** — simply ignore or delete the email.
64+
2. **Do not click any links** in the email.
65+
3. **Consider enabling [two-factor authentication](/articles/expensify-classic/settings/Two-Factor-Authentication)** for extra account security.
66+
67+
**Note:** You do not need to lock your account just because you received an unexpected Magic Code. Only lock your account if you believe someone has gained access to your email account or if you shared your Magic Code with someone.
5668

5769
---
5870

5971
## What to do if you shared your Magic Code
6072

6173
If you accidentally gave someone your Magic Code, act fast:
6274

63-
1. **[Lock your Expensify account](https://help.expensify.com/articles/expensify-classic/settings/Report-Suspicious-Activity)** immediately to block unauthorized access.
75+
1. **[Lock your Expensify account](/articles/expensify-classic/settings/Report-Suspicious-Activity)** immediately to block unauthorized access.
6476
2. **Contact Concierge** from a safe device and explain the situation.
65-
3. **[Enable two-factor authentication](https://help.expensify.com/articles/expensify-classic/settings/Two-Factor-Authentication)** to protect your account going forward.
77+
3. **[Enable two-factor authentication](/articles/expensify-classic/settings/Two-Factor-Authentication)** to protect your account going forward.
6678

6779
---
6880

6981
## How to report phishing and lock your account
7082

7183
If you believe your account has been targeted or compromised:
7284

73-
1. **[Lock your Expensify account](https://help.expensify.com/articles/expensify-classic/settings/Report-Suspicious-Activity)** immediately to block unauthorized access.
85+
1. **[Lock your Expensify account](/articles/expensify-classic/settings/Report-Suspicious-Activity)** immediately to block unauthorized access.
7486
2. **Message Concierge immediately** via [email](mailto:concierge@expensify.com), or from within the Expensify app (web or mobile).
7587
3. Let us know if you’ve received a suspicious message or phone call.
7688
4. Our team will work to secure your account.
@@ -90,9 +102,12 @@ Expensify uses Magic Codes instead of passwords to simplify login while keeping
90102

91103
Legitimate Expensify emails always come from an address ending in **@expensify.com** or **@team.expensify.com**. If you’re unsure, don’t click any links — just log into the Expensify app directly and message Concierge.
92104

105+
## I received a Magic Code I didn't request. Is my account compromised?
106+
107+
No. Receiving an unrequested Magic Code does not mean your account is compromised. It most likely means someone entered your email address by mistake when trying to log in. As long as you don't share the code with anyone, your account is safe. You can simply ignore or delete the email. If you want extra protection, enable [two-factor authentication](/articles/expensify-classic/settings/Two-Factor-Authentication).
108+
93109
## Can Expensify call me?
94110

95111
Expensify will **never** call you asking for login codes, passwords, or payment information. If you receive such a call, it's a scam.
96112

97-
</div>
98113

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
---
2+
title: Accounting Search Shortcuts
3+
description: Use the Accounting search shortcuts on the Spend page to review expense status, prepare for export, and reconcile transactions with your accounting records.
4+
keywords: [New Expensify, accounting expensify, reconcile expenses, awaiting export, cash accruals, card accruals, card statements, bank reconciliation, month-end close, search shortcut, accounting shortcut]
5+
internalScope: Audience is Workspace Admins. Covers using the Accounting section to review expense states and support reconciliation workflows. Does not cover exporting or performing reconciliation in detail.
6+
---
7+
8+
# Accounting Search Shortcuts
9+
10+
The **Accounting** search shortcuts on the **Spend** page bring together the expense views you need to reconcile your records and close your books. It helps you identify what’s ready to export, what still needs attention, and what should be matched against statements or bank data.
11+
12+
Workspace Admins can use these shortcuts to validate totals, track liabilities, and ensure your expenses align with accounting records before and after export.
13+
14+
---
15+
16+
## Who can use Accounting search shortcuts
17+
18+
Workspace Admins with:
19+
- Approvals turned on
20+
- Either reimbursements enabled or at least one card feed connected
21+
22+
---
23+
24+
## How to use the Accounting search shortcuts
25+
26+
1. In the navigation tabs (on the left on web, on the bottom on mobile) select **Spend**.
27+
2. In the **Accounting** section, choose a search shortcut based on what you need to review.
28+
3. Use filters like **Date**, **Feed**, or **Posted** to refine your view.
29+
4. Review the **Total** in the footer to understand the amount for that view.
30+
31+
Once you’ve reviewed the expenses, you can export them to a CSV if you need to share or work with the data outside of Expensify. Learn how to [export expenses to a CSV](/articles/new-expensify/reports-and-expenses/How-to-Export-Expenses#how-to-export-multiple-expenses).
32+
33+
---
34+
35+
## What each Accounting search shortcut shows you
36+
37+
- **Awaiting export**: Reports that are approved and ready to be exported to your accounting system.
38+
- **Cash accruals**: Reimbursable expenses that are not yet approved and may need to be accrued.
39+
- **Card accruals**: Imported card expenses that are not yet approved and may need to be accrued.
40+
- **Card statements**: Credit card expenses grouped by statement periods to help you reconcile against your card statement.
41+
- **Bank reconciliation**: Reimbursed reports and Expensify Card settlement withdrawals to help you match transactions with your bank data.
42+
43+
---
44+
45+
## What happens after you review expenses with Accounting search shortcuts
46+
47+
- You can identify reports that are ready to export to your accounting system.
48+
- You can account for unapproved expenses as accruals before closing a period.
49+
- You can verify imported credit card expense totals against statements and bank data.
50+
- You can ensure your records are complete before and after reconciliation.
51+
52+
---
53+
54+
# FAQ
55+
56+
## Why don’t I see all Accounting search shortcuts?
57+
58+
Some search shortcuts only appear when the required features are enabled:
59+
60+
- **Cash accruals** requires reimbursements
61+
- **Card accruals** and **Card statements** require a card feed
62+
- **Bank reconciliation** requires a validated business bank account.
63+
64+
If a feature isn’t enabled, its shortcut won’t appear.
65+
66+
## Can I export expenses from the Accounting search shortcuts?
67+
68+
Yes. You can export expenses from any shortcut to a CSV file if you need to use the data outside of Expensify.
69+
70+
71+
## Why does the total change when I apply filters?
72+
73+
The **Total** reflects only the expenses shown in your current shortcut. Changing filters like **Date**, **Feed,** or **Posted** will update the total based on those results.
74+
75+
## Can I filter Card accruals by feed?
76+
77+
Yes. If you have more than one card feed, a **Feed** filter will appear so you can review one account at a time.
78+

0 commit comments

Comments
 (0)