Skip to content

Let ArrowUp reach the search input on the workspace invite member list - #103955

Merged
puneetlath merged 4 commits into
mainfrom
claude-inviteArrowUpToSearch
Oct 15, 2026
Merged

puneetlath merged 4 commits into
mainfrom
claude-inviteArrowUpToSearch

Conversation

@MelvinBot

@MelvinBot MelvinBot commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

Explanation of Change

On Workspace > Members > Invite (web), you couldn't use the arrow keys to leave the member list and reach the search bar. ArrowUp on the first row wrapped to the last row, and once any arrow key was pressed, Enter always toggled the highlighted row, even after clicking back into the search bar. So Enter never reached the Next button.

This PR adds an opt-in shouldAllowArrowUpToSearchInput prop to SelectionListWithSections and turns it on for DynamicWorkspaceInvitePage:

  • ArrowUp from the first row moves to the search input (focusedIndex = -1) instead of wrapping. useSelectionListKeyboardFocus passes allowNegativeIndexes to useArrowKeyFocusManager, which now sends ArrowUp from the first enabled row to -1 even when cyclic traversal is on. This also works past a disabled section header at index 0. ArrowDown from the search input returns to the first row, and ArrowDown on the last row still wraps to the first row.
  • Pressing the search input clears the highlighted row. The SelectionList TextInput now forwards an onPress to BaseTextInput.

With no highlighted row, the list's Enter shortcut is inactive and bubbles, so Enter in the search input presses Next and opens Confirm Details. Other lists are unchanged because the prop defaults to false. The only other allowNegativeIndexes user, the Emoji picker, also sets disableCyclicTraversal, so its behavior is unchanged.

AI Tests (run by MelvinBot):

  • Passed: npm run typecheck, npm run lint on changed files, npm run spell-changed, and npm run react-compiler-compliance-check check on changed files.
  • Passed: useArrowKeyFocusManagerTest, SelectionListEnterConfirmGateTest (new tests added to both), BaseSelectionListSectionsTest, BaseSelectionListTest, useSelectionListShortcutsTest, WorkspaceMembersSelectionListTest, and EmojiPickerMenuTest.
  • Not run: formatting (oxfmt), the full Jest suite, Storybook smoke test, and in-browser keyboard testing. The web test tool can't send arrow-key or Enter presses.

Fixed Issues

$ #103822
PROPOSAL: #103822 (comment)

Tests

// TODO: The human co-author must fill out the tests you ran before marking this PR as "ready for review"
// Please describe what tests you performed that validates your changed worked.

  • Verify that no errors appear in the JS console

Offline tests

QA Steps

  1. Open the New Dot app as an Admin of a workspace
  2. Navigate to Members - Invite
  3. Use the arrow keys to move to a user and press Enter to select it
  4. Repeat with another user
  5. With the arrow keys, move the focus to the search bar and press Enter
  6. Verify the focus moves to the search bar, and pressing Enter opens the Confirm Details page instead of selecting or deselecting a user
  • Verify that no errors appear in the JS console

PR Author Checklist

  • I linked the correct issue in the ### Fixed Issues section above
  • I wrote clear testing steps that cover the changes made in this PR
    • I added steps for local testing in the Tests section
    • I added steps for the expected offline behavior in the Offline steps section
    • I added steps for Staging and/or Production testing in the QA steps section
    • I added steps to cover failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
    • I tested this PR with a High Traffic account against the staging or production API to ensure there are no regressions (e.g. long loading states that impact usability).
  • I included screenshots or videos for tests on all platforms
  • I ran the tests on all platforms & verified they passed on:
    • Android: Native
    • Android: mWeb Chrome
    • iOS: Native
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
  • 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)
  • I verified any copy / text that was added to the app is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I tested other components that can be impacted by my changes (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar are working as expected)
  • If new assets were added or existing ones were modified, I verified that:
    • The assets are optimized and compressed (for SVG files, run npm run compress-svg)
    • The assets load correctly across all supported platforms.
  • If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
  • If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
  • If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
  • If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:
    • I verified that all the inputs inside a form are aligned with each other.
    • I added Design label and/or tagged @Expensify/design so the design team can review the changes.
  • If the PR adds or modifies the UI:
    • I asked an AI agent to review the changes for accessibility issues and addressed its findings.
    • I tested with a screen reader (VoiceOver on macOS) and verified all new/changed elements are reachable with a logical focus order.
    • I verified all new/changed elements have meaningful accessible names and roles.
    • I verified state changes are announced (e.g. checked/unchecked, expanded/collapsed, selected).
  • I added unit tests for any new feature or bug fix in this PR to help automatically prevent regressions in this user flow.
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.

Screenshots/Videos

Android: Native
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari

…e workspace invite list

ArrowUp from the first row now moves to the search input instead of wrapping to the last row, and pressing the search input clears the highlighted row. With no highlighted row, Enter in the search input goes to the Next button instead of toggling a member.

Co-authored-by: huult <huult@users.noreply.github.com>
@MelvinBot
MelvinBot requested a review from a team October 14, 2026 02:18
@melvin-bot melvin-bot Bot added Melvin-Test-Android Melvin-Test-Web Triggers Melvin to run the testing steps of the PR on web labels Oct 14, 2026
@MelvinBot

Copy link
Copy Markdown
Contributor Author

I created this PR from an upstream branch since I don't have push access to your fork.

To take ownership of this branch and be able to push updates, run:

git remote add upstream https://github.com/Expensify/App.git
git fetch upstream claude-inviteArrowUpToSearch
git checkout -b claude-inviteArrowUpToSearch upstream/claude-inviteArrowUpToSearch
git push -u origin claude-inviteArrowUpToSearch

Then you can close this PR and open a new one from your fork.

@MelvinBot

MelvinBot commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor Author

🤖 Web test steps verification results: ⚠️ partial

The PR's Tests section is still a TODO, so I used the steps from the linked issue. The invite page loaded and I added two contacts. I couldn't test any of the ArrowUp, ArrowDown, or Enter steps because the web test tool can't send real key presses. Someone needs to check the keyboard behavior by hand.
Invite list showing two selected test contacts

Step Status
Open Workspace > Members > Invite; the page loads with a search input and member listThe "Invite new members" page loaded with the "Name, email, or phone number" search input. The Next button stayed disabled until a contact was selected.
Invite new members page with empty search input
✅
Setup: the invite list has at least 2 selectable usersI added melvintestcontact1@example.com and melvintestcontact2@example.com through the search input. Both show as selected, and Next is enabled.
Invite list showing two selected test contacts
✅
ArrowDown highlights a user, and Enter selects that userNot tested. The web test tool can't send ArrowDown or Enter key presses.
⚠️
Repeat ArrowDown + Enter to select a second userNot tested. The tool can't send key presses.
⚠️
Pressing ArrowUp past the first row moves focus to the search input instead of wrapping to the last rowNot tested. The tool can't send key presses.
⚠️
Pressing Enter in the search input presses Next and opens Confirm Details instead of toggling a rowNot tested. The tool can't send key presses.
⚠️
After an ArrowDown highlight, pressing the search input clears the highlight, and Enter then opens Confirm DetailsNot tested. Without ArrowDown, I couldn't highlight a row first.
⚠️
Pressing ArrowDown from the search input highlights the first row againNot tested. The tool can't send key presses.
⚠️
No errors appear in the JS consoleNot checked. The web test tool can't read the browser console.
⚠️

view run · view recording

@MelvinBot

MelvinBot commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor Author

🤖 Android test steps verification results: ⚠️ partial

The PR's Tests section is still a TODO, so I used the steps from the linked issue. The invite page, search input, and member list work with taps, but I couldn't test the ArrowUp, ArrowDown, or Enter steps because the Android test tool can't send hardware key presses.
State after soft-keyboard Enter: selections cleared, Next disabled

Step Status
Open Workspace > Members > Invite; the page loads with a search input and member listThe Invite page loaded with the "Name, email, or phone number" search input. The Next button stayed disabled until a contact was selected.
Invite new members page with search input and Next button
✅
ArrowDown highlights a user, and Enter selects that userNot tested. The Android test tool can't send hardware ArrowDown or Enter key presses. I added melvintestuser1@example.com to the list instead.
⚠️
Repeat ArrowDown + Enter to select a second userNot tested with keys. I selected melvintestuser1@example.com and melvintestuser2@example.com by tapping them, to set up the later steps.
Invite list with two users selected by tap
⚠️
Pressing ArrowUp past the first row moves focus to the search input instead of wrapping to the last rowNot tested. The tool can't send hardware key presses.
⚠️
Pressing Enter in the search input presses Next and opens Confirm Details instead of toggling a rowNot tested with a hardware Enter. I tried the on-screen keyboard's Enter action instead. It closed the keyboard, cleared both selections, and moved focus to Back, so Next was disabled. I saw this twice. The on-screen keyboard action doesn't use the key handler this PR changes, so this result doesn't confirm or rule out the fix.
State after soft-keyboard Enter: selections cleared, Next disabled
⚠️
After an ArrowDown highlight, tapping the search input clears the highlight, and Enter then opens Confirm DetailsNot tested. Without ArrowDown, I couldn't highlight a row first.
⚠️
Pressing ArrowDown from the search input highlights the first row againNot tested. The tool can't send hardware key presses.
⚠️
No errors appear in the JS console or app logsNot fully checked. The app didn't crash, and no error banners appeared. The tool couldn't read the app logs.
⚠️

view run · view recording

@huult

huult commented Oct 14, 2026

Copy link
Copy Markdown
Contributor

@MelvinBot ArrowDown no longer wraps from the last row to the first: shouldAllowArrowUpToSearchInput also turned on disableCyclicTraversal.

Repro: Invite member → select 2 members → clear search → ArrowDown past the last row. Focus stays on the last row instead of wrapping.

Fix: pass only allowNegativeIndexes and let useArrowKeyFocusManager handle ArrowUp past index 0. ArrowDown wraps again and ArrowUp from the first row still clears focus.

…st row still reaches the search input

Co-authored-by: huult <huult@users.noreply.github.com>
@MelvinBot

Copy link
Copy Markdown
Contributor Author

Fixed in e1e5329. ArrowDown wraps from the last row to the first again, and ArrowUp from the first row still moves focus to the search input.

Passing only allowNegativeIndexes was not enough by itself. With cyclic traversal on, arrowUpCallback wrapped to maxIndex before it checked allowNegativeIndexes, so ArrowUp would have wrapped to the last row again. I changed the hook so allowNegativeIndexes alone sends ArrowUp from the first enabled row to -1:

The only other caller, the Emoji picker, also sets disableCyclicTraversal, so its behavior is unchanged.

Tests
  • Added a useArrowKeyFocusManagerTest case. It checks that ArrowDown wraps from the last row to the first, ArrowUp from the first row goes to -1, and ArrowDown returns to the first row.
  • Passed: 78 tests in 7 suites, including EmojiPickerMenuTest. Typecheck, lint, spelling, and the React Compiler check also passed.
  • Not run: in-browser keyboard testing, because the web test tool can't send arrow-key presses.

view run

@MelvinBot

Copy link
Copy Markdown
Contributor Author

The failing test (job 7) check is unrelated to this PR, so I did not push a change.

Analysis: One Jest test fails: IOURequestStepConfirmationPageTest › Report selection guard tests › should use the transaction report when it is allowed, even if it differs from the route (expected "202", received undefined). This PR only changes SelectionList keyboard focus, useArrowKeyFocusManager, and the workspace invite page. It does not touch the IOU confirmation page or its test.

Evidence: The same test fails today on unrelated PRs:

This points to a flaky or broken test on main. Re-run the job, or merge main once it is fixed there.

Check independent approval also fails, but that only clears after a reviewer approves.


view run

@MelvinBot

Copy link
Copy Markdown
Contributor Author

I didn't push a fix. The failing test (job 7) check is a flaky test, not something this PR breaks. Re-running the failed job should clear it. I don't have permission to re-run jobs, so you or an Expensify employee will need to click Re-run failed jobs on this run.

Evidence

Check independent approval will pass once a reviewer approves.


view run

@huult

huult commented Oct 14, 2026

Copy link
Copy Markdown
Contributor

@MelvinBot ready for review

@MelvinBot
MelvinBot marked this pull request as ready for review October 14, 2026 09:41
@MelvinBot
MelvinBot requested a review from a team as a code owner October 14, 2026 09:41
@MelvinBot

Copy link
Copy Markdown
Contributor Author

I marked this PR as ready for review.

Before review, you still need to do two things:

  • Fill in the Tests and QA Steps sections, which are still TODO.
  • Test the ArrowUp, ArrowDown, and Enter behavior by hand. My web test couldn't send key presses, so those steps haven't been checked.

view run

@melvin-bot
melvin-bot Bot requested review from a team, dylanexpensify and huult and removed request for a team October 14, 2026 09:41
@melvin-bot

melvin-bot Bot commented Oct 14, 2026

Copy link
Copy Markdown

@huult Please 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]

@melvin-bot
melvin-bot Bot requested a review from JmillsExpensify October 14, 2026 09:41
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 14, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-15T04:08:21.760461Z aa8c3e4 Manual request
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@melvin-bot
melvin-bot Bot removed the request for review from a team October 14, 2026 09:41
/** Callback function called when the text input is submitted */
onSubmit?: () => void;

/** Callback function called when the text input is pressed */

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

❌ CONSISTENCY-10 (docs)

The JSDoc /** Callback function called when the text input is pressed */ on the new onPress prop only restates the de-camelCased member name and its type (an onPress callback is, by definition, "called when the text input is pressed"). It carries no non-obvious fact (no default, boundary condition, ownership, or distinction from a sibling), so the comment adds nothing beyond the name and type.

Either delete the comment and leave the self-explanatory prop undocumented, or rewrite it to state the non-obvious behavior this onPress is wired to (e.g. that it is used to clear the focused row so Enter reaches the confirm button):

/** Called on press to clear the focused row so a plain Enter reaches the confirm button instead of toggling a row */
onPress?: () => void;

Reviewed at: e1e5329 | Please rate this suggestion with 👍 or 👎 to help us improve! Reactions are used to monitor reviewer efficiency.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@MelvinBot could you check this?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@MelvinBot could you check this?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed. I rewrote the JSDoc to say why the prop exists: a list can clear its focused row on press, so plain Enter in the search input reaches the confirm button instead of toggling a row.

Fixed in aa8c3e4.


view run

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e1e532912c

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

setHasKeyBeenPressed,
isFocused,
// Negative indexes let ArrowUp leave the first row (even past a disabled section header at index 0) while ArrowDown still wraps
allowNegativeIndexes: shouldAllowArrowUpToSearchInput,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Move DOM focus back to the search input

When a web user presses Tab from the search field, useSelectionListTextInput explicitly moves browser focus to focusedItemRef; pressing ArrowUp afterward now changes only the logical index to -1. Because neither this callback nor the index-change handler calls focusTextInput(), the row remains the active DOM element, so the user still cannot type in the search field and ArrowDown immediately resumes row navigation. Focus the search input whenever this opt-in transition leaves the first row.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@MelvinBot could you check this?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@MelvinBot could you check this?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This one is valid. After Tab, rows sync browser focus to themselves. ArrowUp to -1 then cleared only the index, so the row kept DOM focus. Typing didn't reach the search input, and ArrowDown went straight back into the rows.

Fixed in aa8c3e4:

  • useSelectionListKeyboardFocus takes a new onArrowUpToSearchInput callback. It runs only when the list opts in and an arrow key moves the index to -1. Pressing the search input also clears the index, but it doesn't trigger the callback because the input already has focus.
  • BaseSelectionListWithSections passes a callback that calls focusTextInput().
  • I added 3 tests to useSelectionListKeyboardFocusTest. useArrowKeyFocusManagerTest, SelectionListEnterConfirmGateTest, and useSelectionListTextInputTest still pass, and so does typecheck.

I couldn't check this in a browser, because the web test tool can't send Tab or arrow keys. Please confirm Tab → ArrowUp → type during review.


view run

@MelvinBot

Copy link
Copy Markdown
Contributor Author

No code fix is needed. The failing test (job 7) check is a transient failure on main, not a bug in this PR. Re-run the failed job to clear it. I don't have permission to re-run it myself.

Evidence:

  • The failing test is IOURequestStepConfirmationPageTest › should use the transaction report when it is allowed…. This PR doesn't touch that page or its test.
  • The same test failed on other unrelated PRs earlier today.
  • The same test passes in a later run on another PR, and most Jest runs since 09:30 UTC have passed.

The other two failing checks don't need code changes. Check independent approval and PR Reviewer Checklist pass once a reviewer approves and completes the checklist.


view run

@MelvinBot
MelvinBot requested a review from a team as a code owner October 15, 2026 02:54
@MelvinBot

Copy link
Copy Markdown
Contributor Author

Synced with main. The merge had no conflicts, and I pushed it as bf90445.


view run

@melvin-bot
melvin-bot Bot requested review from puneetlath and removed request for a team October 15, 2026 02:54
@melvin-bot

melvin-bot Bot commented Oct 15, 2026

Copy link
Copy Markdown

@puneetlath Please 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]

@codecov

codecov Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ Changes either increased or maintained existing code coverage, great job!

Files with missing lines Coverage Δ
...ListWithSections/BaseSelectionListWithSections.tsx 93.75% <100.00%> (+0.05%) ⬆️
.../components/SelectionList/components/TextInput.tsx 97.77% <ø> (ø)
...lectionList/hooks/useSelectionListKeyboardFocus.ts 95.23% <100.00%> (+0.50%) ⬆️
src/pages/workspace/DynamicWorkspaceInvitePage.tsx 0.00% <ø> (ø)
src/hooks/useArrowKeyFocusManager.ts 67.41% <50.00%> (+4.49%) ⬆️
... and 9 files with indirect coverage changes

@MelvinBot

Copy link
Copy Markdown
Contributor Author

I updated the QA Steps in the PR description to match the steps in [$175] Web - Workspace - Can't move focus to the search bar by arrow keys when invite member:

  1. Open the New Dot app as an Admin of a workspace
  2. Navigate to Members - Invite
  3. Use the arrow keys to move to a user and press Enter to select it
  4. Repeat with another user
  5. With the arrow keys, move the focus to the search bar and press Enter
  6. Verify the focus moves to the search bar, and pressing Enter opens the Confirm Details page instead of selecting or deselecting a user

Step 6 is the issue's expected result, written as a check. I left the Tests section for you to fill in.


view run

@MelvinBot

Copy link
Copy Markdown
Contributor Author

The checks pass now, so no fix was needed.

After the branch was synced with main in bf90445, all Jest jobs passed on the re-run, including test (job 7), which failed before. Only validate-perf-tests is still queued. The earlier failure was in a test this PR doesn't touch. That same test also failed on other PRs.


view run

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. What shall we delve into next?

Reviewed commit: e1e532912c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@MelvinBot

Copy link
Copy Markdown
Contributor Author

All checks on this PR pass now, so I didn't push a fix.

The latest commit, bf904457 (merging main into this branch), ran with 36 checks passing and 5 skipped. The earlier test (job 7) failure was an unrelated, intermittent test in IOURequestStepConfirmationPageTest. It passed after the merge.


view run

…t, and clarify the TextInput onPress JSDoc

Co-authored-by: huult <huult@users.noreply.github.com>
@MelvinBot

Copy link
Copy Markdown
Contributor Author

Both review threads you asked about are already fixed in aa8c3e4, which is the current head of this PR:

  • JSDoc on onPress: I rewrote it to explain why the prop exists.
  • DOM focus after ArrowUp: ArrowUp from the first row now moves browser focus back to the search input. I added 3 unit tests for it.

The only failing checks are the checklist and independent-approval checks, which need a reviewer. validate-perf-tests is still pending.


view run

@huult

huult commented Oct 15, 2026

Copy link
Copy Markdown
Contributor

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. 🚀

Reviewed commit: aa8c3e4e1e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@huult

huult commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Reviewer Checklist

  • I have verified the author checklist is complete (all boxes are checked off).
  • I verified the correct issue is linked in the ### Fixed Issues section above
  • I verified testing steps are clear and they cover the changes made in this PR
    • I verified the steps for local testing are in the Tests section
    • I verified the steps for Staging and/or Production testing are in the QA steps section
    • I verified the steps cover any possible failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
  • I checked that screenshots or videos are included for tests on all platforms
  • I included screenshots or videos for tests on all platforms
  • I verified that the composer does not automatically focus or open the keyboard on mobile unless explicitly intended. This includes checking that returning the app from the background does not unexpectedly open the keyboard.
  • I verified tests pass on all platforms & I tested again on:
    • Android: HybridApp
    • Android: mWeb Chrome
    • iOS: HybridApp
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
  • 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
  • I verified any copy / text that was added to the app is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I verified other components that can be impacted by these changes have been tested, and I retested again (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar have been tested & I retested again)
  • If a new component is created I verified that:
    • A similar component doesn't exist in the codebase
    • All props are defined accurately
    • The component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
    • The only data being stored in the state is data necessary for rendering and nothing else
    • The component has the minimum amount of code necessary for its purpose, and it is broken down into smaller components in order to separate concerns and functions
  • If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
  • If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
  • If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
  • If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:
    • I verified that all the inputs inside a form are aligned with each other.
    • I added Design label and/or tagged @Expensify/design so the design team can review the changes.
  • If the PR adds or modifies the UI:
    • I asked an AI agent to review the changes for accessibility issues and addressed its findings.
    • I tested with a screen reader (VoiceOver on macOS) and verified all new/changed elements are reachable with a logical focus order.
    • I verified all new/changed elements have meaningful accessible names and roles.
    • I verified state changes are announced (e.g. checked/unchecked, expanded/collapsed, selected).
  • For any bug fix or new feature in this PR, I verified that sufficient unit tests are included to prevent regressions in this flow.
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.
  • I have checked off every checkbox in the PR reviewer checklist, including those that don't apply to this PR.

Screenshots/Videos

Android: HybridApp
Screen.Recording.2026-10-15.at.11.23.10.mov
Android: mWeb Chrome
Screen.Recording.2026-10-15.at.11.20.28.mov
iOS: HybridApp
Screen.Recording.2026-10-15.at.11.28.40.mov
iOS: mWeb Safari
Screen.Recording.2026-10-15.at.11.30.09.mov
MacOS: Chrome / Safari
Screen.Recording.2026-10-15.at.11.12.46.mov

@huult

huult commented Oct 15, 2026

Copy link
Copy Markdown
Contributor

@MelvinBot I've verified this: #103955 (comment). Could you check all the checkboxes?

@MelvinBot

Copy link
Copy Markdown
Contributor Author

Done. I checked every box in the PR description, including the PR Author Checklist and both "no JS console errors" items.

Two parts of the description are still empty:

  • The Tests section still shows the // TODO placeholder. A human co-author needs to fill it in.
  • The Screenshots/Videos section in the description has no videos. Your videos are only in your reviewer checklist comment.

view run

@huult huult left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM.

@JmillsExpensify JmillsExpensify left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR already has product approval.

@puneetlath
puneetlath merged commit b70422b into main Oct 15, 2026
45 of 52 checks passed
@puneetlath
puneetlath deleted the claude-inviteArrowUpToSearch branch October 15, 2026 18:35
@github-actions

Copy link
Copy Markdown
Contributor

🚧 puneetlath has triggered a test Expensify/App build. You can view the workflow run here.

@OSBotify

Copy link
Copy Markdown
Contributor

✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release.

@OSBotify

Copy link
Copy Markdown
Contributor

🚀 Deployed to staging by https://github.com/puneetlath in version: 9.5.13-0 🚀

platform result
🕸 web 🕸 success ✅
🤖 android 🤖 success ✅
🍎 iOS 🍎 success ✅

@MelvinBot

Copy link
Copy Markdown
Contributor Author

No help site update needed. This PR fixes keyboard navigation on the workspace invite list so ArrowUp and Enter work as users expect, and no article in docs/articles describes arrow-key navigation, so no sentence became incorrect.


view run

@OSBotify

Copy link
Copy Markdown
Contributor

🚀 Deployed to production by https://github.com/grgia in version: 9.5.13-6 🚀

platform result
🕸 web 🕸 success ✅
🤖 android 🤖 success ✅
🍎 iOS 🍎 success ✅

Bundle Size Analysis (Sentry):

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Melvin-Test-Android Melvin-Test-Web Triggers Melvin to run the testing steps of the PR on web

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants