You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Confirm new expenses with a “View” toast on Spend instead of scrolling to and highlighting the row #91408
When a user creates an expense from the global create FAB (or any flow that lands them on the Spend page), New Expensify confirms the expense was saved by navigating to Reports > Expense, finding the new row in the sorted/grouped FlashList, scrolling to it, and running a Reanimated worklet that fades its background. Producing that visible effect chains together navigation readiness, screen mount, deferred API writes, deferred heavy sort/group work, snapshot delivery, FlashList mount, and an onLayout-driven scrollToIndex — and two unrelated 300ms timers in useSearchHighlightAndScroll clear the orchestration state regardless of whether any of that has finished. Optimistic rows are placed at the bottom of page 1, then re-placed at their true sorted position once the server snapshot arrives, which routinely falls on a later page. The same logic produces meaningfully different observable behaviour on web, Android, and iOS, because every stage in the chain (navigation timing, InteractionManager, FlashList native engine, Reanimated scheduling) behaves differently per platform — see my case-by-case investigation (cases 1a/1b/2a/2b) in the issue thread.
Problem
When a user creates an expense from a flow that lands on the Spend page, if the new row is not present at its final sorted position in the rendered FlashList within ~300ms, then the row is neither scrolled to nor highlighted, leaving the user with no visual confirmation that the expense was created.
Solution
After the optimistic write is queued, fire a single toast — built on the existing GrowlNotification already mounted globally — that says “Expense created.” with a trailing View link, and remove the scroll-and-highlight choreography from Spend on every platform.
GrowlNotification is rendered at the root of the tree and animated by Reanimated on the UI thread, so its appearance has no dependency on the Spend list mounting, the snapshot loading, sort order being final, or onLayout firing within any deadline. Because the trigger fires synchronously with the optimistic write, the user sees the confirmation before the navigation pipeline finishes, and the View link reaches the new expense by transactionID directly — bypassing the “find a moving target in a paginated, re-sorting list” problem entirely. Visual treatment, position, and link styling follow the design discussion in the issue thread
Hello, current state of the issue is that the main flow is working nicely on web app (in both desktop and mobile environment) and right now I'm fixing the issue with displaying the toast properly on mobile platforms (the "View" button is moved out of growl container):
changed the title [-][Due for payment 2026-10-12] Confirm new expenses with a “View” toast on Spend instead of scrolling to and highlighting the row[/-][+]Confirm new expenses with a “View” toast on Spend instead of scrolling to and highlighting the row[/+]on Oct 14, 2026
@MelvinBot suggest compensation amount based on size of PRs, number of commits, comments and discussions, scope changes during work, complexity, followup issues fixes, production bug fixes
I suggest $2,000 for situchan's C+ review on this issue. That's 8× the standard $250 review rate. Both contributors are contractors, so situchan is the only person to pay here.
+1,342/−1,223, 69 files, 39 commits. Full regression retest across web, mWeb, and Android.
$750
6 v2 follow-up fix PRs
Reviewed and approved all 6. Most are small; one is +257 lines.
$250
Production bugs fixed along the way
99249, 99253, 99258, and 102845 were already happening on production and were verified fixed in v2.
$250
Total
$2,000
An internal engineer should still confirm two points before payment:
Regression penalty. The contributor guidelines cut C+ pay by 50% for each regression that review should have caught. v1 had 7 deploy blockers and v2 had 6. QA caught all of them on staging, and v1 was reverted before it reached production. Whether they count as regressions is a call for the internal team.
Timeline:situchan started reviewing on 2026-07-03, v1 merged on 2026-08-21, v2 merged on 2026-10-01, and the last follow-up fixes merged in October. That's about 3.5 months of review.
Verify one growl appears. View opens the last duplicated expense.
Open an expense in Spend > More > Split > split into 2 and Save.
Verify one growl appears. View opens the last split expense.
(Native only) Share an image into Expensify from another app and submit it as an expense.
Verify one growl appears and the app navigates once.
Test 5: No growl where the user already sees the expense list
Go to a workspace chat and create an expense.
Open the expense from Inbox > More > Split > Save.
Verify no growl appears.
Create a new empty report. Open FAB > Create expense > Manual, select that report in the Report field and tap Create expense while the report is open.
Verify no growl appears.
Open a 1:1 DM and split an expense with that user. Then use the Split manual, Split scan and Split distance quick actions from FAB.
Verify no growl appears for any of them.
Go to a workspace chat, create an expense, open it and send a message in its thread.
Close the report, reopen the expense from the LHN, then More > Split > Save.
Verify no growl appears.
In the self DM, create an expense. Open it from Home > Recently added, then More > Split > Save.
Verify no growl appears.
Test 6: Navigation and UI around the growl
Go to a workspace chat. Open the Concierge side panel and create an expense from FAB.
Close the side panel.
Verify the growl is visible on top.
From Inbox, create an expense from FAB. Tap View, then More > Split > Save.
Verify the app does not jump back to the workspace chat.
From the LHN, create an expense into a workspace chat and quickly tap its preview. Tap View on the growl.
Verify View only closes the growl. Tap back 3 times and verify you land on the LHN without the expense reopening.
Open Home > Recently added > an expense > More > Split > Save. Tap View, close the expense RHP, then on the report RHP tap More > Delete.
Verify the central pane returns to the workspace chat.
In Spend, select an expense, then Duplicate expense. Select an expense again, open the dropdown menu and tap View on the growl.
Verify the dropdown menu closes.
Enable high contrast in Account > Preferences > Theme and create an expense.
Verify the View link on the growl is underlined.
Test 7: Offline, delete invoice
Go offline. Open FAB > Send invoice and send it to any user.
Right click the invoice preview > Delete > Delete. Tap View on the growl.
Verify nothing happens and no skeleton loader report opens.
Test 8: Opening an expense or invoice via the growl behaves like opening it from the chat
Open FAB > Send invoice and send an invoice to any user. Tap View on the "Invoice sent" growl.
Verify no Join button appears on the invoice report.
From Inbox, create 2 manual expenses from FAB into the same workspace chat. Tap View on the second growl.
Tap More > Delete > Delete.
Verify you land on the parent report, not the workspace chat.
Create another expense from FAB into the same workspace chat and tap View. Tap the expense header to open the details page and delete the expense from there.
Verify you land on the parent report again, matching step 5.
Test 9: Offline, opened via the growl
Create a manual expense from FAB into a workspace chat.
Go offline. Create a second expense from FAB into the same workspace chat and tap View on the growl.
Verify the header shows the expense name (a brief skeleton is fine) and never shows "Chat Report".
Go back and tap the expense preview in the workspace chat.
Verify the header again never shows "Chat Report".
Still offline, create a manual expense from FAB and tap View on the growl.
Tap More > Move to report > Create report.
Verify the workspace avatar stays in the report header.
Activity
melvin-bot commentedon May 22, 2026
Current assignee @shawnborton is eligible for the NewFeature assigner, not assigning anyone new.
borys3kk commentedon May 25, 2026
Hello, current state of the issue is that the main flow is working nicely on web app (in both desktop and mobile environment) and right now I'm fixing the issue with displaying the toast properly on mobile platforms (the "View" button is moved out of growl container):
melvin-bot commentedon May 28, 2026
@borys3kk Uh oh! This issue is overdue by 2 days. Don't forget to update your issues!
borys3kk commentedon May 29, 2026
Not overdue, issue is being discussed in the PR, also looking for solution to no navigation bug in cold start
melvin-bot commentedon Jun 1, 2026
@borys3kk Whoops! This issue is 2 days overdue. Let's get this updated quick!
150 remaining items
[-][Due for payment 2026-10-12] Confirm new expenses with a “View” toast on Spend instead of scrolling to and highlighting the row[/-][+]Confirm new expenses with a “View” toast on Spend instead of scrolling to and highlighting the row[/+]mallenexpensify commentedon Oct 14, 2026
Please comment and tag me if/when payment is due, thx
melvin-bot commentedon Oct 19, 2026
@situchan Huh... This is 4 days overdue. Who can take care of this?
melvin-bot commentedon Oct 21, 2026
@situchan Still overdue 6 days?! Let's take care of this!
situchan commentedon Oct 23, 2026
@MelvinBot suggest compensation amount based on size of PRs, number of commits, comments and discussions, scope changes during work, complexity, followup issues fixes, production bug fixes
v1: #96496 (followup issues: #99248, #99252, #99255, #99257, #99261, #99262, #99264)
v2: #100015 (followup issues: #102831, #102833, #102848, #102850, #102857, #102889)
Fixing the bugs happening on production: #99249, #99253, #99258, #102845, #102945
MelvinBot commentedon Oct 23, 2026
I suggest $2,000 for
situchan's C+ review on this issue. That's 8× the standard $250 review rate. Both contributors are contractors, sosituchanis the only person to pay here.situchanleft 5 reviews, 10 comments, and 7 inline comments. A contributor handoff changed the approach mid-review.An internal engineer should still confirm two points before payment:
mollfpras C+. I left it out of the total. If any follow-up issue payssituchanseparately, take that amount off here.Follow-up PRs and issues counted
v2 follow-up PRs, all by
mhawrylukand approved bysituchan:situchancomments)v1 deploy blockers checked in v2: #99248, #99252 (not a bug), #99255, #99257, #99261 (not a bug), #99262 (not a bug), #99264, plus the production bugs #99249, #99253, and #99258.
Timeline:
situchanstarted reviewing on 2026-07-03, v1 merged on 2026-08-21, v2 merged on 2026-10-01, and the last follow-up fixes merged in October. That's about 3.5 months of review.situchan commentedon Oct 23, 2026
Price increase request
Melvin suggested: $2000
I suggest Total: $1750
cc: @mountiny
situchan commentedon Oct 23, 2026
Regression Test Proposal
Test 1: Growl from global create (Inbox and Spend)
Test 2: View opens the right destination
Test 3: Self DM, invoice, per diem with submissions disabled
Test 4: Batch flows show one growl for the last expense
Test 5: No growl where the user already sees the expense list
Test 6: Navigation and UI around the growl
Test 7: Offline, delete invoice
Test 8: Opening an expense or invoice via the growl behaves like opening it from the chat
Test 9: Offline, opened via the growl
Do we agree 👍 or 👎?
melvin-bot commentedon Oct 26, 2026
@situchan Whoops! This issue is 2 days overdue. Let's get this updated quick!