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
[Due for payment 2026-10-15] [Refactor] MoneyRequestConfirmationList follow-up: stabilize controller props, dedupe variant shell, single-path context #102283
1. Stop passing the whole context bag to the controllers
hooks/useConfirmationListData.ts:277-354 returns one large object. Every variant passes it to ConfirmationDataContext.Provider value={data}. A change to any key gives data a new identity, for example formError on a keystroke, formattedAmount, or isConfirming. Then every consumer re-renders. On main, FieldAutoSelector and SplitBillController could skip those renders.
Return a prop bundle for each controller from the hook, the way it already returns layoutProps, errorState, and visibilityFlags. For example, add taxControllerProps and fieldAutoSelectProps. Pass the bundles as props so the compiler memoizes each controller separately.
ConfirmationListLayout.tsx:46 reads the whole context just to get isReadOnly. Move isReadOnly into layoutProps and drop that context read. This is the smallest useful version of the change.
2. Remove the duplicated shell from the six variants
The variants are 75–85% identical. Each one builds the same shell by hand:
the provider
the controller mount list
ConfirmationFieldsProvider
the <View> wrapper
a 7–9 line footer prop bundle
Only the set of mounted controllers really differs. Move the shared shell into one place, for example ConfirmationListLayout taking {data, listFooterContent, children}. Each variant would then only choose its controllers.
Caveat: The controllers render before ConfirmationListLayout on purpose, so their effects run before the footer fields' effects. For example, TaxController seeds taxCode and taxAmount before TaxFields reads them. Any restructure must keep that effect order, and it needs testing across all expense types.
3. Give each value one path on the context object
About a dozen values are reachable through two or three paths. For example, transactionID is available as data.transactionID, layoutProps.transactionID, and confirmationFieldsProviderProps.transactionID. The same is true of these values:
formattedAmount
setFormError
clearFormErrors
shouldShowTax
shouldShowCategories
isCategoryRequired
isReadOnly
policyID
reportID
iouType
isPolicyExpenseChat
Call sites already mix these paths. For example, ScanConfirmationList.tsx:30 reads data.layoutProps.transactionID, even though data.transactionID exists. Pick one shape.
Also, declare ConfirmationData explicitly. Today ConfirmationDataContext.ts:6 types it as ReturnType<typeof useConfirmationListData>, so nothing defines the contract.
Testing
Run the expense-type matrix from the Tests section of Split MoneyRequestConfirmationList: Manual, Scan, Multi-scan, Distance (map, manual, and odometer), Per diem, Time, Split, Invoice, Pay, Track → Submit, split details, and Share.
⚠️MelvinBot didn't finish that one — the run was killed before I could reply (usually a Cloudflare CPU limit on a long investigation). Please retry with a more specific question, and if this keeps happening post in #melvinbot-ai.
The solution for this issue has been 🚀 deployed to production 🚀 in version 9.5.5-2 and is now subject to a 7-day regression period 📆. Here is the list of pull requests that resolve this issue:
If no regressions arise, payment will be issued on 2026-10-15. 🎊
The following checklist (instructions) will need to be completed before the issue can be closed. Please copy/paste the Contributor+ Checklist from here into a new comment on this GH and complete it. If you have the K2 extension, you can simply click: [this button]. If no checklist is needed for this issue, you can click: [no checklist button]
Activity
IOURequestStepConfirmation,MoneyRequestConfirmationList, anduseExpenseSubmissionper expense type #99449situchan commentedon Sep 25, 2026
@MelvinBot assign me here too
melvin-bot commentedon Sep 25, 2026
MelvinBot commentedon Sep 25, 2026
Done. You're now assigned to this issue, alongside
VickyStash.view run
VickyStash commentedon Sep 28, 2026
Updates:
VickyStash commentedon Sep 29, 2026
PR is ready for review: #102405
2 remaining items
melvin-bot commentedon Oct 8, 2026
@situchan
The solution for this issue has been 🚀 deployed to production 🚀 in version 9.5.5-2 and is now subject to a 7-day regression period 📆. Here is the list of pull requests that resolve this issue:
If no regressions arise, payment will be issued on 2026-10-15. 🎊
The following checklist (instructions) will need to be completed before the issue can be closed. Please copy/paste the Contributor+ Checklist from here into a new comment on this GH and complete it. If you have the K2 extension, you can simply click: [this button]. If no checklist is needed for this issue, you can click: [no checklist button]
situchan commentedon Oct 9, 2026
Not overdue
melvin-bot commentedon Oct 12, 2026
@situchan Whoops! This issue is 2 days overdue. Let's get this updated quick!
melvin-bot commentedon Oct 14, 2026
Triggered auto assignment to @mallenexpensify (
Awaiting Payment)melvin-bot commentedon Oct 14, 2026
Payment Summary
Resolving PRs:
MoneyRequestConfirmationList follow-up: stabilize controller props, dedupe variant shell, single-path context #102405
Contributor: @VickyStash does not require payment (Contractor)
Reviewer: @situchan owed $175 via NewDot
BugZero Checklist (@mallenexpensify)
mallenexpensify commentedon Oct 17, 2026
Payment Summary
Contributor+: @situchan due $175 via NewDot