Skip to content

Commit bb992f8

Browse files
committed
Merge branch 'main' into chore/66456-remove-onyx-connect-shared-billing-grace-period-subscription-utils-5
2 parents df987f6 + e8c1064 commit bb992f8

File tree

992 files changed

+7569
-4169
lines changed

Some content is hidden

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

992 files changed

+7569
-4169
lines changed

.github/PULL_REQUEST_TEMPLATE.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@ This is a checklist for PR authors. Please make sure to complete all tasks and c
8686
- [ ] iOS: mWeb Safari
8787
- [ ] MacOS: Chrome / Safari
8888
- [ ] I verified there are no console errors (if there's a console error not related to the PR, report it or open an issue for it to be fixed)
89-
- [ ] I verified there are no new alerts related to the `canBeMissing` param for `useOnyx`
9089
- [ ] I followed proper code patterns (see [Reviewing the code](https://github.com/Expensify/App/blob/main/contributingGuides/PR_REVIEW_GUIDELINES.md#reviewing-the-code))
9190
- [ ] I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. `toggleReport` and not `onIconClick`)
9291
- [ ] I verified that comments were added to code that is not self explanatory

Mobile-Expensify

contributingGuides/OBSERVABILITY.md

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ When users encounter issues in live sessions that we can't reproduce locally, bu
1818
## Tools & implementation
1919

2020
We use **Sentry** for observability across all platforms (Web, iOS, Android) and environments (production, staging, development). Sentry collects traces, spans, and contextual data from user sessions to identify and diagnose issues. For a better understanding of Sentry visit [Sentry docs](https://docs.sentry.io/).
21-
For testing Sentry locally remember to set env variable `ENABLE_SENTRY_ON_DEV=true` in your local .env file.
21+
For testing Sentry locally, remember to see the section [Debugging Spans](#debugging-spans) below.
2222

2323
### Working with Spans
2424

@@ -62,6 +62,24 @@ cancelSpan(spanId); // Operation abandoned (e.g., user navigated away, component
6262

6363
The difference is that the latter adds a `canceled` attribute to the span indicating that it was canceled.
6464

65+
### Debugging Spans
66+
67+
Sentry is disabled in development by default. To enable it, add `ENABLE_SENTRY_ON_DEV=true` to your `.env` file. This activates an internal debug transport that logs span data locally instead of sending it to Sentry.
68+
69+
To view spans in the DevConsole, go to **Account → Troubleshoot → Log Sentry requests to console**.
70+
71+
In rare cases where you need to inspect spans directly in the Sentry dashboard, comment out the `transport` line in [`src/setup/telemetry/index.ts`](../src/setup/telemetry/index.ts):
72+
73+
```typescript
74+
Sentry.init({
75+
dsn: CONFIG.SENTRY_DSN,
76+
// transport: isDevelopment() ? makeDebugTransport : undefined,
77+
...
78+
});
79+
```
80+
81+
This sends spans to the real Sentry project instead of the local console.
82+
6583
### Constants
6684

6785
Defined in `src/CONST/index.ts` under `CONST.TELEMETRY`:
@@ -181,6 +199,22 @@ Add metrics when:
181199
- Debugging requires operation visibility
182200

183201
Don't add metrics for:
184-
- Internal operations invisible to users
202+
- Internal operations, invisible to users
185203
- Operations already covered by parent spans
186-
- Operations too granular to be actionable
204+
- Operations too granular to be actionable
205+
206+
## Working with Sentry Dashboard
207+
208+
### Filtering Spans
209+
210+
When debugging our manual spans, always filter out canceled spans to avoid noise. Use the following query (you can copy & paste it into the filter bar):
211+
212+
```
213+
span.status:ok !has:canceled has:tags[finished_manually,number]
214+
```
215+
216+
| Filter | Purpose |
217+
|--------|---------|
218+
| `span.status:ok` | Only show spans that completed without errors |
219+
| `!has:canceled` | Exclude spans abandoned mid-flight (e.g. user navigated away) |
220+
| `has:finished_manually` | Only show spans finished by our instrumentation, not auto-collected ones |

contributingGuides/REVIEWER_CHECKLIST.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
- [ ] iOS: mWeb Safari
1818
- [ ] MacOS: Chrome / Safari
1919
- [ ] If there are any errors in the console that are unrelated to this PR, I either fixed them (preferred) or linked to where I reported them in Slack
20-
- [ ] I verified there are no new alerts related to the `canBeMissing` param for `useOnyx`
2120
- [ ] I verified proper code patterns were followed (see [Reviewing the code](https://github.com/Expensify/App/blob/main/contributingGuides/PR_REVIEW_GUIDELINES.md#reviewing-the-code))
2221
- [ ] I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. `toggleReport` and not `onIconClick`).
2322
- [ ] I verified that comments were added to code that is not self explanatory

contributingGuides/philosophies/ONYX-DATA-MANAGEMENT.md

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ This is how the application manages all the data stored in Onyx.
99
- **Actions** - The files stored in `/src/libs/actions`
1010
- **Derived Values** - Special Onyx keys containing values computed from other Onyx values
1111
- **Collections** - Multiple related data objects stored as individual keys with IDs
12-
- **canBeMissing** - Parameter indicating whether a component expects Onyx data to be present
1312

1413
## Rules
1514
### - Actions MUST be the only means to write or read data from the server
@@ -126,24 +125,3 @@ compute: ([reports, personalDetails]) => {
126125
- Explain the purpose and dependencies
127126
- Document any special cases or performance considerations
128127
- Include type annotations for better developer experience
129-
130-
## canBeMissing Parameter
131-
132-
The `canBeMissing` parameter indicates whether a component connecting to Onyx expects the data to be present or if it can handle missing data gracefully.
133-
134-
### - Components MUST use the `canBeMissing` parameter appropriately
135-
This parameter was added because in some places we are assuming some data will be there, but actually we never load it, which leads to hard to debug bugs.
136-
137-
The linter error exists until we add the param to all callers. Once that happens we can make the param mandatory and remove the linter.
138-
139-
### - `canBeMissing` SHOULD be set to `false` when data is guaranteed to be present
140-
The main criteria for setting `canBeMissing` to `false`:
141-
142-
- **Data is always loaded before component renders**: If the data is always ensured to be loaded before this component renders, then `canBeMissing` SHOULD be set to `false`
143-
- **Always returned by OpenApp**: Any data that is always returned by `OpenApp` used in a component where we have a user (so not in the homepage for example) will have `canBeMissing` set to `false`
144-
- **User always has data**: Maybe we always try to load a piece of data, but the data can be missing/empty, in this case `canBeMissing` would be set to `false`
145-
146-
### - `canBeMissing` SHOULD be set to `true` for potentially missing data
147-
If neither of the above conditions apply, then the param SHOULD probably be `true`, but additionally we MUST make sure that the code using the data manages correctly the fact that the data might be missing.
148-
149-
Context: [Slack discussion](https://expensify.slack.com/archives/C03TQ48KC/p1741208342513379)

eslint.changed.config.mjs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ const config = defineConfig([
4343
rules: {
4444
'@typescript-eslint/no-deprecated': 'error',
4545
'rulesdir/no-default-id-values': 'error',
46-
'rulesdir/provide-canBeMissing-in-useOnyx': 'error',
4746
'rulesdir/no-unstable-hook-defaults': 'error',
4847
'no-restricted-syntax': [
4948
'error',

ios/Podfile.lock

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3482,7 +3482,7 @@ PODS:
34823482
- RNGoogleSignin (10.0.1):
34833483
- GoogleSignIn (~> 7.0)
34843484
- React-Core
3485-
- RNLiveMarkdown (0.1.321):
3485+
- RNLiveMarkdown (0.1.324):
34863486
- boost
34873487
- DoubleConversion
34883488
- fast_float
@@ -4679,7 +4679,7 @@ SPEC CHECKSUMS:
46794679
RNFS: 89de7d7f4c0f6bafa05343c578f61118c8282ed8
46804680
RNGestureHandler: b8d2e75c2e88fc2a1f6be3b3beeeed80b88fa37d
46814681
RNGoogleSignin: 89877c73f0fbf6af2038fbdb7b73b5a25b8330cc
4682-
RNLiveMarkdown: 93e71e9e8623139368e0e9a8d9c54a2beb67e731
4682+
RNLiveMarkdown: 60621617bc0504ac39669e3a8d1e9cadf1ada34f
46834683
RNLocalize: 05e367a873223683f0e268d0af9a8a8e6aed3b26
46844684
rnmapbox-maps: 392ac61c42a9ff01a51d4c2f6775d9131b5951fb
46854685
RNNitroSQLite: fb251387cfbee73b100cd484a3c886fda681b3b5

package-lock.json

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

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@
8181
"@expensify/nitro-utils": "file:./modules/ExpensifyNitroUtils",
8282
"@expensify/react-native-background-task": "file:./modules/background-task",
8383
"@expensify/react-native-hybrid-app": "file:./modules/hybrid-app",
84-
"@expensify/react-native-live-markdown": "0.1.321",
84+
"@expensify/react-native-live-markdown": "0.1.324",
8585
"@expensify/react-native-wallet": "0.1.11",
8686
"@expo/metro-runtime": "^6.0.2",
8787
"@formatjs/intl-listformat": "^7.5.7",
@@ -180,7 +180,7 @@
180180
"react-native-localize": "^3.5.4",
181181
"react-native-nitro-modules": "0.29.4",
182182
"react-native-nitro-sqlite": "9.2.0",
183-
"react-native-onyx": "3.0.35",
183+
"react-native-onyx": "3.0.38",
184184
"react-native-pager-view": "8.0.0",
185185
"react-native-pdf": "7.0.2",
186186
"react-native-performance": "^6.0.0",

src/CONST/index.ts

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1427,6 +1427,9 @@ const CONST = {
14271427
UPDATE_DEFAULT_APPROVER: 'POLICYCHANGELOG_UPDATE_DEFAULT_APPROVER',
14281428
UPDATE_SUBMITS_TO: 'POLICYCHANGELOG_UPDATE_SUBMITS_TO',
14291429
UPDATE_FORWARDS_TO: 'POLICYCHANGELOG_UPDATE_FORWARDS_TO',
1430+
UPDATE_CUSTOM_TAX_NAME: 'POLICYCHANGELOG_UPDATE_CUSTOM_TAX_NAME',
1431+
UPDATE_CURRENCY_DEFAULT_TAX: 'POLICYCHANGELOG_UPDATE_CURRENCY_DEFAULT_TAX',
1432+
UPDATE_FOREIGN_CURRENCY_DEFAULT_TAX: 'POLICYCHANGELOG_UPDATE_FOREIGN_CURRENCY_DEFAULT_TAX',
14301433
UPDATE_INVOICE_COMPANY_NAME: 'POLICYCHANGELOG_UPDATE_INVOICE_COMPANY_NAME',
14311434
UPDATE_INVOICE_COMPANY_WEBSITE: 'POLICYCHANGELOG_UPDATE_INVOICE_COMPANY_WEBSITE',
14321435
UPDATE_MANUAL_APPROVAL_THRESHOLD: 'POLICYCHANGELOG_UPDATE_MANUAL_APPROVAL_THRESHOLD',
@@ -2617,13 +2620,23 @@ const CONST = {
26172620
AUTO_CREATE_ENTITIES: 'autoCreateEntities',
26182621
APPROVAL_ACCOUNT: 'approvalAccount',
26192622
CUSTOM_FORM_ID_OPTIONS: 'customFormIDOptions',
2620-
TOKEN_INPUT_STEP_NAMES: ['1', '2', '3', '4', '5'],
2621-
TOKEN_INPUT_STEP_KEYS: {
2622-
0: 'installBundle',
2623-
1: 'enableTokenAuthentication',
2624-
2: 'enableSoapServices',
2625-
3: 'createAccessToken',
2626-
4: 'enterCredentials',
2623+
TOKEN_INPUT: {
2624+
STEP_INDEX_LIST: ['1', '2', '3', '4'],
2625+
PAGE_NAME: {
2626+
INSTALL: 'install',
2627+
AUTHENTICATION: 'authentication',
2628+
SOAP: 'soap',
2629+
ACCESS_TOKEN: 'access-token',
2630+
CREDENTIALS: 'credentials',
2631+
},
2632+
CREDENTIALS_PAGE_INDEX: 4,
2633+
STEP_KEYS: {
2634+
install: 'installBundle',
2635+
authentication: 'enableTokenAuthentication',
2636+
soap: 'enableSoapServices',
2637+
'access-token': 'createAccessToken',
2638+
credentials: 'enterCredentials',
2639+
},
26272640
},
26282641
IMPORT_CUSTOM_FIELDS: {
26292642
CUSTOM_SEGMENTS: 'customSegments',
@@ -8419,12 +8432,18 @@ const CONST = {
84198432
},
84208433
SELECTION_LIST: {
84218434
BASE_LIST_ITEM: 'SelectionList-BaseListItem',
8435+
SELECT_ALL: 'ListHeader-SelectAll',
84228436
SPLIT_LIST_ITEM_EDIT_BUTTON: 'SplitListItem-EditButton',
84238437
LIST_HEADER_SELECT_ALL: 'SelectionList-ListHeader-SelectAll',
84248438
},
84258439
SELECTION_LIST_WITH_SECTIONS: {
84268440
BASE_LIST_ITEM: 'SelectionListWithSections-BaseListItem',
8427-
SELECT_ALL: 'SelectionList-SelectAll',
8441+
SELECT_ALL: 'BaseSelectionListWithSections-SelectAll',
8442+
},
8443+
WORKSPACE_DUPLICATE_SELECT_FEATURES: {
8444+
SELECT_ALL: 'WorkspaceDuplicateSelectFeatures-SelectAll',
8445+
SPLIT_LIST_ITEM_EDIT_BUTTON: 'SplitListItem-EditButton',
8446+
LIST_HEADER_SELECT_ALL: 'SelectionList-ListHeader-SelectAll',
84288447
},
84298448
CONTEXT_MENU: {
84308449
REPLY_IN_THREAD: 'ContextMenu-ReplyInThread',
@@ -8939,22 +8958,22 @@ const CONST = {
89398958
HOME: {
89408959
ANNOUNCEMENTS: [
89418960
{
8942-
title: 'Start the year with smarter spending, admin controls, and more.',
8943-
subtitle: 'Product update',
8944-
url: 'https://use.expensify.com/blog/expensify-january-2026-product-update',
8945-
publishedDate: '2026-01-28',
8961+
title: 'Expensify and Xero partner to support SMBs',
8962+
subtitle: 'Press Release',
8963+
url: 'https://www.businesswire.com/news/home/20260212641796/en/Expensify-and-Xero-Enhance-Partnership-to-Support-Small-Businesses',
8964+
publishedDate: '2026-02-12',
89468965
},
89478966
{
8948-
title: 'Our favorite features + final upgrades of the year',
8967+
title: 'New Home page & upgraded Insights analytics',
89498968
subtitle: 'Product update',
8950-
url: 'https://use.expensify.com/blog/expensify-2025-year-end-product-update',
8951-
publishedDate: '2025-12-22',
8969+
url: 'https://use.expensify.com/blog/expensify-home-and-insights-update',
8970+
publishedDate: '2026-02-18',
89528971
},
89538972
{
8954-
title: 'Uber for business + Expensify automates ride and meal receipts',
8973+
title: 'Smarter spend controls & Concierge anywhere',
89558974
subtitle: 'Product update',
8956-
url: 'https://use.expensify.com/blog/uber-for-business-and-expensify-integration-update',
8957-
publishedDate: '2025-12-01',
8975+
url: 'https://use.expensify.com/blog/expensify-february-2026-product-update',
8976+
publishedDate: '2026-02-19',
89588977
},
89598978
],
89608979
},

0 commit comments

Comments
 (0)