Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
94 commits
Select commit Hold shift + click to select a range
4b12b1a
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz May 22, 2026
4551621
perf: migrate transaction list from .map() to FlashList for virtualiz…
TMisiukiewicz May 21, 2026
f68b1ee
perf: unify transactions + actions into one virtualised list
TMisiukiewicz May 22, 2026
d64ff24
fix: restore lastTransactionID and isDesktopTableLayout
TMisiukiewicz May 22, 2026
f4fbe38
fix: CI spellcheck and remove memoization wrappers
TMisiukiewicz May 25, 2026
1ee223b
fix: rephrase virtualized comment to satisfy cspell
TMisiukiewicz May 25, 2026
52ceec0
use Flashlist
TMisiukiewicz May 25, 2026
2779f70
refactor: extract unified list render-prop body into sub-component
TMisiukiewicz May 25, 2026
71af131
fix: hoist long-press modal out of virtualised footer cell
TMisiukiewicz May 25, 2026
81bb0f0
Merge branch 'main' into perf/virtualised-report-list
TMisiukiewicz May 25, 2026
1220e39
refactor: extract long-press modal and horizontal scroll wrapper comp…
TMisiukiewicz May 25, 2026
6b5c9be
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz May 26, 2026
143946e
remove dead keyExtractor from transaction list controller
TMisiukiewicz May 26, 2026
03ce297
fix unread marker index offset when transactions are present
TMisiukiewicz May 26, 2026
4af0be0
avoid scanning transactions when resolving linked action index
TMisiukiewicz May 26, 2026
2a930b8
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz May 26, 2026
27b98dd
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz May 27, 2026
e58e95c
Pin scroll to bottom while deferred report items hydrate
TMisiukiewicz May 27, 2026
c89d0da
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz May 27, 2026
aea7de0
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz May 27, 2026
27f405d
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz May 28, 2026
08653dd
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz May 28, 2026
25e7c49
allow to skip deferring RBR message to prevent dynamic changes to ite…
TMisiukiewicz May 28, 2026
9623fb0
add drawDistance
TMisiukiewicz May 28, 2026
d297183
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz May 29, 2026
8e92d9b
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz May 29, 2026
d437268
Merge branch 'main' into perf/virtualised-report-list
TMisiukiewicz Jun 1, 2026
7c40dfc
Extract MoneyRequestReportUnifiedList and remove render-prop inversion
TMisiukiewicz Jun 1, 2026
c009779
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz Jun 1, 2026
06ff7ac
Merge branch 'main' into perf/virtualised-report-list
TMisiukiewicz Jun 1, 2026
c834467
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz Jun 2, 2026
1884a8d
Defer mark-as-read until scroll reaches bottom in Latest messages
TMisiukiewicz Jun 2, 2026
032cb74
Precompute report-action errors once for per-transaction RBR check
TMisiukiewicz Jun 2, 2026
d681da1
Feed stable report projection to transaction list to avoid read-state…
TMisiukiewicz Jun 2, 2026
033ef71
Pass transaction thread ID so report-view rows skip RBR inner when empty
TMisiukiewicz Jun 2, 2026
52e87f1
Jump to latest messages via scrollToIndex to avoid blank landing on l…
TMisiukiewicz Jun 2, 2026
4239613
remove timeout
TMisiukiewicz Jun 2, 2026
a92c4da
Revert "remove timeout"
TMisiukiewicz Jun 2, 2026
1e187a7
Merge branch 'main' of https://github.com/Expensify/App into perf/vir…
TMisiukiewicz Jun 2, 2026
03b0b31
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz Jun 3, 2026
5546ddf
remove dead code (knip)
TMisiukiewicz Jun 3, 2026
961619b
fix spellcheck
TMisiukiewicz Jun 3, 2026
9845546
fix lint
TMisiukiewicz Jun 3, 2026
6584330
fix knip
TMisiukiewicz Jun 3, 2026
b6382a1
fix knip
TMisiukiewicz Jun 3, 2026
11c274d
Merge branch 'main' into perf/virtualised-report-list
adhorodyski Jun 5, 2026
7f65626
Merge remote-tracking branch 'exfy/main' into perf/virtualised-report…
adhorodyski Jun 9, 2026
d371d26
Merge branch 'Expensify:main' into perf/virtualised-report-list
adhorodyski Jun 10, 2026
c2f98c0
Forward report list ref via @components/FlashList instead of unsafe c…
adhorodyski Jun 10, 2026
98b1b27
Drop now-unused UnifiedListItem export
adhorodyski Jun 10, 2026
4fdc5ff
Merge remote-tracking branch 'exfy/main' into perf/virtualised-report…
adhorodyski Jun 15, 2026
22ca09a
Remove unused eslint-disable directive for jsx-props-no-spreading
adhorodyski Jun 15, 2026
36d0f52
Merge remote-tracking branch 'exfy/main' into perf/virtualised-report…
adhorodyski Jun 15, 2026
9d42673
Merge ck/main into perf/virtualised-report-list
TMisiukiewicz Jun 16, 2026
6a58ae0
Merge branch 'Expensify:main' into perf/virtualised-report-list
adhorodyski Jun 19, 2026
b6f91e1
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz Jun 23, 2026
80de6da
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz Jun 24, 2026
6d55beb
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz Jun 26, 2026
dee88a1
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz Jun 26, 2026
2f6ffe9
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz Jun 29, 2026
3ffd015
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz Jun 29, 2026
0ab57c6
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz Jun 30, 2026
6a46748
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz Jun 30, 2026
ea2194f
Merge main into perf/virtualised-report-list
TMisiukiewicz Jul 1, 2026
73c309b
Merge branch 'main' into perf/virtualised-report-list
TMisiukiewicz Jul 2, 2026
c832398
Add ExternalScrollFlashListTable + overrideWindowSize flash-list patch
TMisiukiewicz Jul 2, 2026
1e6462b
Pin group-by/columns controls; scroll only column header with table
TMisiukiewicz Jul 2, 2026
dc5373a
reset the offset
TMisiukiewicz Jul 2, 2026
606bda3
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz Jul 2, 2026
a579798
fix CI
TMisiukiewicz Jul 2, 2026
cc1278d
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz Jul 2, 2026
e0c9ed8
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz Jul 3, 2026
0a8bcf2
run fmt
TMisiukiewicz Jul 3, 2026
c303939
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz Jul 6, 2026
95bb8a1
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz Jul 7, 2026
c601033
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz Jul 7, 2026
6515218
Fix scroll drift by skipping deferred RBR in wide transaction rows
TMisiukiewicz Jul 7, 2026
521a48c
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz Jul 9, 2026
8e32c70
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz Jul 9, 2026
54d45e8
fix scroll and skeleton gate
TMisiukiewicz Jul 9, 2026
005ecdd
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz Jul 9, 2026
d484c3e
Fix report jumping to chat on open by disabling MVCP for horizontal t…
TMisiukiewicz Jul 9, 2026
b5dc428
Fix crash on back-navigation from report with wide transaction table
TMisiukiewicz Jul 9, 2026
4399bac
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz Jul 9, 2026
235fa98
Make FlashList MVCP header-aware to fix deep-link scroll on wide table
TMisiukiewicz Jul 9, 2026
395ff51
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz Jul 10, 2026
d88edbf
Merge remote-tracking branch 'origin/main' into perf/virtualised-repo…
TMisiukiewicz Jul 10, 2026
e61478a
Restore flexGrow1 in TableBody empty state to keep scrolling fix
TMisiukiewicz Jul 10, 2026
edf2b30
Remove unused horizontalScrollRestorationKey
TMisiukiewicz Jul 10, 2026
71f12e8
Use indexed scrollToBottom for received-message autoscroll
TMisiukiewicz Jul 10, 2026
1814a1e
Re-anchor deep-linked report action after it paginates in
TMisiukiewicz Jul 10, 2026
970d609
Swallow FlashList teardown throw without string-matching the message
TMisiukiewicz Jul 10, 2026
335748a
Seed nested list viewportHeight with window height to avoid blank fir…
TMisiukiewicz Jul 10, 2026
d87908c
Always feed scroll offset store so horizontal-table transition isn't …
TMisiukiewicz Jul 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
diff --git a/node_modules/@shopify/flash-list/dist/FlashListProps.d.ts b/node_modules/@shopify/flash-list/dist/FlashListProps.d.ts
index fa786bf..014eb62 100644
--- a/node_modules/@shopify/flash-list/dist/FlashListProps.d.ts
+++ b/node_modules/@shopify/flash-list/dist/FlashListProps.d.ts
@@ -99,6 +99,15 @@ export interface FlashListProps<TItem> extends Omit<ScrollViewProps, "maintainVi
* Rendered as the main scrollview.
*/
renderScrollComponent?: React.ComponentType<ScrollViewProps> | React.ExoticComponent<ScrollViewProps> | React.FC<ScrollViewProps>;
+ /**
+ * When set, the list uses this as its visible window size instead of measuring its outer container.
+ * Intended for externally-driven lists (a custom non-scrolling `renderScrollComponent` fed synthetic scroll
+ * events), where the outer container is as tall as the full content and can't be used as the viewport.
+ */
+ overrideWindowSize?: {
+ width: number;
+ height: number;
+ };
/**
* Draw distance for advanced rendering (in dp/px)
*/
diff --git a/node_modules/@shopify/flash-list/dist/recyclerview/RecyclerView.js b/node_modules/@shopify/flash-list/dist/recyclerview/RecyclerView.js
index ef4daf2..063fd1a 100644
--- a/node_modules/@shopify/flash-list/dist/recyclerview/RecyclerView.js
+++ b/node_modules/@shopify/flash-list/dist/recyclerview/RecyclerView.js
@@ -28,7 +28,7 @@ import { RenderTimeTracker } from "./helpers/RenderTimeTracker";
const RecyclerViewComponent = (props, ref) => {
var _a, _b, _c, _d;
// Destructure props and initialize refs
- const { horizontal, renderItem, data, extraData, onLoad, CellRendererComponent, overrideProps, refreshing, onRefresh, progressViewOffset, ListEmptyComponent, ListHeaderComponent, ListHeaderComponentStyle, ListFooterComponent, ListFooterComponentStyle, ItemSeparatorComponent, renderScrollComponent, style, stickyHeaderIndices, maintainVisibleContentPosition, onCommitLayoutEffect, onChangeStickyIndex, stickyHeaderConfig, inverted, ...rest } = props;
+ const { horizontal, renderItem, data, extraData, onLoad, CellRendererComponent, overrideProps, refreshing, onRefresh, progressViewOffset, ListEmptyComponent, ListHeaderComponent, ListHeaderComponentStyle, ListFooterComponent, ListFooterComponentStyle, ItemSeparatorComponent, renderScrollComponent, style, stickyHeaderIndices, maintainVisibleContentPosition, onCommitLayoutEffect, onChangeStickyIndex, stickyHeaderConfig, inverted, overrideWindowSize, ...rest } = props;
const [renderTimeTracker] = useState(() => new RenderTimeTracker());
renderTimeTracker.startTracking();
// Sticky header config
@@ -147,12 +147,15 @@ const RecyclerViewComponent = (props, ref) => {
: horizontal
? firstChildViewLayout.x
: firstChildViewLayout.y;
+ // overrideWindowSize lets an externally-driven list (no own scroller, container is as tall as the full
+ // content) declare its visible window; everything else still uses the real measurement.
+ const windowSize = overrideWindowSize !== null && overrideWindowSize !== void 0 ? overrideWindowSize : outerViewSize;
// Update the RecyclerView manager with window dimensions
recyclerViewManager.updateLayoutParams({
- width: horizontal ? outerViewSize.width : firstChildViewLayout.width,
+ width: horizontal ? windowSize.width : firstChildViewLayout.width,
height: horizontal
? firstChildViewLayout.height
- : outerViewSize.height,
+ : windowSize.height,
}, isHorizontalRTL && recyclerViewManager.hasLayout()
? firstItemOffset -
recyclerViewManager.getChildContainerDimensions().width
diff --git a/node_modules/@shopify/flash-list/src/FlashListProps.ts b/node_modules/@shopify/flash-list/src/FlashListProps.ts
index 76dd0c8..5a5c0f5 100644
--- a/node_modules/@shopify/flash-list/src/FlashListProps.ts
+++ b/node_modules/@shopify/flash-list/src/FlashListProps.ts
@@ -160,6 +160,16 @@ export interface FlashListProps<TItem>
| React.ExoticComponent<ScrollViewProps>
| React.FC<ScrollViewProps>;

+ /**
+ * When set, the list uses this as its visible window size instead of measuring its outer container.
+ * Intended for externally-driven lists (a custom non-scrolling `renderScrollComponent` fed synthetic scroll
+ * events), where the outer container is as tall as the full content and can't be used as the viewport.
+ */
+ overrideWindowSize?: {
+ width: number;
+ height: number;
+ };
+
/**
* Draw distance for advanced rendering (in dp/px)
*/
diff --git a/node_modules/@shopify/flash-list/src/recyclerview/RecyclerView.tsx b/node_modules/@shopify/flash-list/src/recyclerview/RecyclerView.tsx
index bc27739..a7829d5 100644
--- a/node_modules/@shopify/flash-list/src/recyclerview/RecyclerView.tsx
+++ b/node_modules/@shopify/flash-list/src/recyclerview/RecyclerView.tsx
@@ -90,6 +90,7 @@ const RecyclerViewComponent = <T,>(
onChangeStickyIndex,
stickyHeaderConfig,
inverted,
+ overrideWindowSize,
...rest
} = props;

@@ -265,13 +266,17 @@ const RecyclerViewComponent = <T,>(
? firstChildViewLayout.x
: firstChildViewLayout.y;

+ // overrideWindowSize lets an externally-driven list (no own scroller, container is as tall as the full
+ // content) declare its visible window; everything else still uses the real measurement.
+ const windowSize = overrideWindowSize ?? outerViewSize;
+
// Update the RecyclerView manager with window dimensions
recyclerViewManager.updateLayoutParams(
{
- width: horizontal ? outerViewSize.width : firstChildViewLayout.width,
+ width: horizontal ? windowSize.width : firstChildViewLayout.width,
height: horizontal
? firstChildViewLayout.height
- : outerViewSize.height,
+ : windowSize.height,
},
isHorizontalRTL && recyclerViewManager.hasLayout()
? firstItemOffset -
Loading
Loading