Merge main into my branch to fix failed lint test - #84652
Conversation
The previous approach of deriving the return value instead of resetting internal isDraggingOver state left the internal state stale, preventing the DragAndDropProvider overlay from hiding after a file drop in the DualDropZone. Use the "adjust state during render" pattern to properly reset isDraggingOver when the screen loses focus or becomes disabled, while keeping ref/timeout cleanup in the effect. This fixes the set-state-in- effect ESLint warning without breaking the drop behavior. Made-with: Cursor
…ge hydration The previous useInitialValue hook captured cardList on the first render, which could be empty if Onyx hadn't hydrated yet. The new useInitialOnyxValue hook subscribes to an Onyx key and captures its value once the status first transitions to 'loaded', giving a stable snapshot unaffected by hydration timing. Made-with: Cursor
Defer rendering SearchMultipleSelectionPicker until the search advanced filters form has loaded from Onyx, preventing initiallySelectedItems from being captured as empty during initial hydration. Made-with: Cursor
Fixes #84349 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ILURES sets tsgo infers narrow literal unions for Set elements, causing .has() to reject the wider MultifactorAuthenticationReason type. Adding an explicit ReasonValue type parameter to both sets resolves the mismatch.
Use policy.exporter (same as Reports sidebar) instead of isPreferredExporter() (connection-level exporters) in todos.ts, ensuring the Home page For You section matches the Reports sidebar. Made-with: Cursor
…rkflow Stage 2 of tsgo integration (#83349): AI agents now use the faster typecheck-tsgo command (~10x faster, usually stricter than tsc) during iterative development. CI continues to validate with tsc separately.
…SelectOnMount Co-authored-by: Vinh Hoang <hoangzinh@users.noreply.github.com>
Reword Post-Edit Checklist to clarify when to run typecheck-tsgo and that CI merge gate uses tsc. Update command reference label.
|
@puneetlath @kadiealexander One of you needs to copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button] NOTE: It looks like |
| sentryLabel={CONST.SENTRY_LABEL.REFERRAL_PROGRAM.CTA} | ||
| > | ||
| <RenderHTML html={translate(`referralProgram.${referralContentType}.buttonText`)} /> | ||
| <View style={[styles.br2, styles.highlightBG, styles.flexRow, styles.justifyContentBetween, styles.alignItemsCenter, {gap: 10, padding: 10}, styles.pl5, style]}> |
There was a problem hiding this comment.
❌ CONSISTENCY-2 (docs)
The inline style {gap: 10, padding: 10} uses undocumented magic numbers for gap and padding. These values should be extracted to named constants or use existing theme style utilities for consistency and maintainability.
Extract these to named constants or use theme styles:
// Option A: use theme spacing
style={[styles.br2, styles.highlightBG, styles.flexRow, styles.justifyContentBetween, styles.alignItemsCenter, styles.gap2, styles.p2, styles.pl5, style]}
// Option B: named constant if no matching theme style
const BANNER_GAP = 10;
const BANNER_PADDING = 10;Please rate this suggestion with 👍 or 👎 to help us improve! Reactions are used to monitor reviewer efficiency.
| }; | ||
|
|
||
| // Width of the close button (touchableButtonImage) + the gap between text and button. | ||
| const CLOSE_BUTTON_OFFSET = variables.componentSizeNormal + 10; |
There was a problem hiding this comment.
❌ CONSISTENCY-2 (docs)
The magic number 10 in variables.componentSizeNormal + 10 represents the gap between text and the close button but is not defined as a named constant. While the comment on line 24 explains the intent, the value itself should be a named constant for clarity.
Extract the gap value to a named constant:
const BANNER_GAP = 10;
const CLOSE_BUTTON_OFFSET = variables.componentSizeNormal + BANNER_GAP;Please rate this suggestion with 👍 or 👎 to help us improve! Reactions are used to monitor reviewer efficiency.
|
|
||
| The Expensify Card is available for companies in the United Kingdom and select European countries. This guide walks you through eligibility and how to set up and start using the card in GBP or EUR. | ||
|
|
||
| Workspace Admins can issue virtual Expensify Cards to members and manage spending in GBP or EUR. Physical cards will be available soon. |
There was a problem hiding this comment.
No future tense promises: "Physical cards will be available soon" is a forward-looking promise that may become stale or inaccurate. Consider removing this sentence or rephrasing to something like "Physical cards are not yet available." without a time-based promise.
| - Sweden | ||
| - United Kingdom | ||
|
|
||
| ## What are the pre-requisites to set up the Expensify Card in the UK and EU |
There was a problem hiding this comment.
Readability: "pre-requisites" should be written as one word: "prerequisites."
|
|
||
| 1. Have a GBP or EUR bank account connected. To connect one, [Enable Global Reimbursement](https://help.expensify.com/articles/new-expensify/wallet-and-payments/Enable-Global-Reimbursement). | ||
| 2. Complete the **[Know Your Customer (KYC)](https://launch-workflow.trulioo.com/68223577c5dae52a6ec9347f)** and **[Know Your Business (KYB)](https://launch-workflow.trulioo.com/681a7cc4e65d2e48f19de9c3)** forms. | ||
| 3. Share the last 90 days of statements from your connected GBP or EUR bank account with Concierge so they can assess your eligible limit |
There was a problem hiding this comment.
Readability: Missing period at the end of step 3. All steps in a numbered list should end with consistent punctuation.
|
|
||
| --- | ||
|
|
||
| ## 1. How to enable the Expensify Card on your workspace |
There was a problem hiding this comment.
Structure/Consistency: This heading uses a numbered prefix ("## 1. How to enable...") while all other section headings in this article do not use numbers (e.g., "## How to link...", "## How to issue..."). Remove the "1." prefix for consistency:
| ## 1. How to enable the Expensify Card on your workspace | |
| ## How to enable the Expensify Card on your workspace |
|
|
||
| 1. From navigation tabs (on the left on Web, on the bottom on Mobile), choose **Workspaces > [Workspace Name] > More features**. | ||
| 2. In the **Spend** section, enable **Expensify Card**. | ||
| 3. So that we can assess your request, reach out to Concierge and provide the last 90 days of statements from the connected UK or EU bank account |
There was a problem hiding this comment.
No first person: "So that we can assess your request" uses first person ("we"). Rephrase to avoid first person. For example:
| 3. So that we can assess your request, reach out to Concierge and provide the last 90 days of statements from the connected UK or EU bank account | |
| 3. To have your eligible limit assessed, reach out to Concierge and provide the last 90 days of statements from the connected UK or EU bank account. |
|
|
||
| --- | ||
|
|
||
| ## How to link a bank account to settle the Expensify Card |
There was a problem hiding this comment.
Formatting: There is an extra space between ## and How in this heading. Should be a single space:
| ## How to link a bank account to settle the Expensify Card | |
| ## How to link a bank account to settle the Expensify Card |
| ## How to link a bank account to settle the Expensify Card | ||
|
|
||
| 1. From navigation tabs (on the left on Web, on the bottom on Mobile), choose **Workspaces > [Workspace Name] > Expensify Card** | ||
| 2. Click **Issue new card**. |
There was a problem hiding this comment.
Consistency: This section uses "Click" for the action verb (lines 82, 90, 99), while the "enable" section on line 71 uses "choose." For HelpDot consistency, consider using "Select" throughout, which is the convention used in the Create-and-manage-expense-tags article in this same PR.
|
|
||
| ## What exchange rate does the Expensify Card use for foreign currency purchases? | ||
|
|
||
| We use the [Visa FX calculator](https://www.visa.co.uk/support/consumer/travel-support/exchange-rate-calculator.html) to determine exchange rates for purchases made in currencies other than GBP or EUR. Please ensure that you edit the bank fee to **0%** when using the calculator, as the Expensify Card does not incur any foreign exchange fees. |
There was a problem hiding this comment.
No first person: "We use the Visa FX calculator" uses first person. Rephrase to remove "we." For example:
"The Expensify Card uses the Visa FX calculator to determine exchange rates for purchases made in currencies other than GBP or EUR."
|
|
||
| --- | ||
|
|
||
| ## Workspace & Policy |
There was a problem hiding this comment.
Terminology violation: The heading "Workspace & Policy" uses "Policy," which should be "Workspace" per Expensify style guidelines. Consider renaming to something like "Workspace Configuration" (which is already used as a sub-heading on line 28), or removing this heading entirely since the sub-heading on line 28 already covers it.
Additionally, this heading creates a structural issue: "## Workspace & Policy" on line 26 is immediately followed by another ## heading "## Workspace Configuration" on line 28, making the first heading appear empty with no content beneath it.
|
|
||
| - Point members to existing, shipped documentation for what is available today. | ||
| - Do not cite this page or its URL in member-facing responses. | ||
| - Point users to existing, shipped documentation for what is available today. |
There was a problem hiding this comment.
Terminology violation: "Point users to existing, shipped documentation" uses "users" instead of "members," which is the standard Expensify term. This line also appears to duplicate line 82 which says the same thing with "members." Consider removing this duplicate line or consolidating:
| - Point users to existing, shipped documentation for what is available today. | |
| - Point members to existing, shipped documentation for what is available today. |
|
|
||
| --- | ||
|
|
||
| - When a member asks "Is X available?" or "When is Y coming?" – check this list before answering. |
There was a problem hiding this comment.
Structure: This section of instructions (lines 80-85) appears to be guidance for AgentZero behavior but lacks a heading. Consider adding a descriptive heading like ## How AgentZero should use this page to improve scannability and AI readiness.
|
|
||
| ## How to create a tag manually | ||
|
|
||
| 1. In the navigation tabs (on the left on web, and at the bottom on mobile), select **Workspaces** > **[workspace name]** |
There was a problem hiding this comment.
Consistency (punctuation): Step 1 on this line is missing a period at the end, while step 1 on line 27 in the previous section has a period. Similarly, step 3 on line 37 is missing a period. Please add periods at the end of all steps for consistency throughout the article.
|
|
||
| --- | ||
|
|
||
| ## How to import single-level Tags using a spreadsheet |
There was a problem hiding this comment.
AI Readiness / Consistency: The heading "How to import single-level Tags using a spreadsheet" capitalizes "Tags" mid-sentence. Throughout the article, "Tags" is sometimes capitalized as a proper noun and sometimes lowercase. Since this is referring to the feature name, choose one convention and apply it consistently. In headings, only the first word should be capitalized per Expensify style (e.g., "How to import single-level tags using a spreadsheet").
|
|
||
| Use this option when you want one flat list of tags (for example: Marketing, Sales, IT). | ||
|
|
||
| 1. In the navigation tabs (on the left on web, and at the bottom on mobile), select **Workspaces** > **[workspace name]** |
There was a problem hiding this comment.
Consistency (punctuation): Step 1 here is missing a period at the end. Same issue on line 48 (step 3). Please ensure all steps end with a period.
|
|
||
| --- | ||
|
|
||
| ## How single-level Tags and multi-level Tags affect tag fields on expenses |
There was a problem hiding this comment.
AI Readiness / Consistency: The heading "How single-level Tags and multi-level Tags affect tag fields on expenses" capitalizes "Tags" inconsistently -- it is capitalized twice but then "tag fields" is lowercase. Use consistent casing throughout.
|
|
||
| Example: If you use single-level Tags for Department, members will see one field labeled **Tag** and choose one department. | ||
|
|
||
| **Multi-level tags** |
There was a problem hiding this comment.
Readability (punctuation): "Multi-level tags" sub-heading on this line is missing a colon or period for consistency with "Single-level tags:" on line 93, which has a colon.
| - There is a GL code in the adjacent column (if applicable) | ||
| 7. Select **Import**. | ||
|
|
||
| The linked templates can be used to import multi-level tags: |
There was a problem hiding this comment.
Readability: "The linked templates can be used to import multi-level tags" is passive voice. Consider rephrasing to active voice: "Use the following templates to import multi-level tags:"
| https://help.expensify.com/articles/expensify-classic/connections/TriNet-Integration,https://help.expensify.com/articles/expensify-classic/connections/TriNet | ||
| https://help.expensify.com/unlisted/avoiding-duplicates,https://help.expensify.com/expensify-classic/hubs/expenses/How-to-prevent-duplicate-expenses | ||
| https://help.expensify.com/articles/new-expensify/settings/title:%20Personal-Expense-Rules,https://help.expensify.com/articles/new-expensify/settings/Personal-Expense-Rules | ||
| https://help.expensify.com/articles/new-expensify/expensify-card/docs/articles/new-expensify/expensify-card/UK-and-EU-Expensify-Card,https://help.expensify.com/unlisted/UK-and-EU-Expensify-Card.md |
There was a problem hiding this comment.
Accuracy: The source URL path appears malformed -- it contains a doubled path segment: articles/new-expensify/expensify-card/docs/articles/new-expensify/expensify-card/UK-and-EU-Expensify-Card. It looks like docs/articles/new-expensify/expensify-card/ was accidentally included twice. Additionally, the target URL ends with .md (/unlisted/UK-and-EU-Expensify-Card.md), which is unusual for a redirect target -- the .md extension is typically not included in help site URLs.
Expected source might be something like:
https://help.expensify.com/articles/new-expensify/expensify-card/UK-and-EU-Expensify-Card
And the target URL should likely not have .md:
https://help.expensify.com/unlisted/UK-and-EU-Expensify-Card
HelpDot Documentation ReviewOverall AssessmentThis PR merges Scores Summary
Key FindingsPositive aspects:
Issues to address:
RecommendationsPriority (should fix):
Suggestions (nice to have):
Files Reviewed
This review was generated by an automated documentation quality assessment. |
Codecov Report❌ Looks like you've decreased code coverage for some files. Please write tests to increase, or at least maintain, the existing level of code coverage. See our documentation here for how to interpret this table.
|
|
🚀 Deployed to staging by https://github.com/stephanieelliott in version: 9.3.35-0 🚀
|
|
🚀 Deployed to production by https://github.com/luacmartins in version: 9.3.35-1 🚀
|
Explanation of Change
Fixed Issues
$
PROPOSAL:
Tests
Offline tests
QA Steps
// TODO: These must be filled out, or the issue title must include "[No QA]."
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectiontoggleReportand notonIconClick)src/languages/*files and using the translation methodSTYLE.md) were followedAvatar, I verified the components usingAvatarare working as expected)StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))npm run compress-svg)Avataris modified, I verified thatAvataris working as expected in all cases)Designlabel and/or tagged@Expensify/designso the design team can review the changes.ScrollViewcomponent to make it scrollable when more elements are added to the page.mainbranch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTeststeps.Screenshots/Videos
Android: Native
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari