Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
64f531b
perf: memoize VList timeline items to prevent mass re-renders
Just-Insane Apr 10, 2026
c9f4537
fix(timeline): make mutationVersion optional in UseProcessedTimelineO…
Just-Insane Apr 10, 2026
885cf0b
fix(timeline): satisfy lint rules in TimelineItem memo component
Just-Insane Apr 10, 2026
70e4552
chore: add changeset for perf-timeline-item-memo
Just-Insane Apr 10, 2026
2b9758f
fix(timeline): preempt atBottom to prevent Jump to Latest flashing at…
Just-Insane Apr 10, 2026
8aea0a1
fix(timeline): suppress intermediate VList scroll events after progra…
Just-Insane Apr 10, 2026
7322feb
fix(timeline): set programmatic guard in scrollToBottom; keep guard a…
Just-Insane Apr 10, 2026
bc4eb26
fix(notifications): defer notification jump until live timeline is no…
Just-Insane Apr 11, 2026
c3d7cf5
fix(timeline): skip scroll-cache save when viewing a historical event…
Just-Insane Apr 11, 2026
76c8f70
test(timeline): add useProcessedTimeline unit tests + fix stale itemI…
Just-Insane Apr 11, 2026
32c504c
perf(timeline): restore VList cache + skip 80 ms timer on room revisit
Just-Insane Apr 9, 2026
57ce5a0
fix(timeline): correct scroll-cache save/load paths
Just-Insane Apr 9, 2026
2ee4554
fix(timeline): save scroll cache in pendingReadyRef recovery path
Just-Insane Apr 10, 2026
bdea2e7
chore: add changeset for perf-timeline-scroll-cache
Just-Insane Apr 10, 2026
89f4632
fix(timeline): preempt atBottom to prevent Jump to Latest flashing at…
Just-Insane Apr 10, 2026
394aca2
fix(timeline): suppress intermediate VList scroll events after progra…
Just-Insane Apr 10, 2026
44c9dd2
test(timeline): add roomScrollCache unit tests
Just-Insane Apr 11, 2026
ac4fd94
fix: auto-format roomScrollCache test file for prettier compliance
Just-Insane Apr 12, 2026
781a8e2
refactor(timeline): replace eslint-disables with custom areEqual comp…
Just-Insane Apr 14, 2026
ce11afe
fix(ui): phantom unread dot + blank notification page recovery
Just-Insane Apr 13, 2026
1939599
fix: use useLayoutEffect for auto-scroll recovery after timeline rese…
Just-Insane Apr 14, 2026
77fbe22
fix(timeline): use scrollToIndex for stay-at-bottom and remove premat…
Just-Insane Apr 14, 2026
fa8bb1e
fix(timeline): use timestamp-based settling window to suppress spurio…
Just-Insane Apr 14, 2026
4e5b037
fix(timeline): address review feedback for timeline-item-memo
Just-Insane Apr 15, 2026
f78496d
fix: scope roomScrollCache to userId
Just-Insane Apr 15, 2026
10fa77c
Merge branch 'fix/vlist-hover-transform' into fix/ui-regressions
Just-Insane Apr 15, 2026
6e8f572
chore: add changeset for timeline scroll fixes
Just-Insane Apr 15, 2026
eac371a
fix(timeline): add behavior parameter to scrollToBottom callback
Just-Insane Apr 15, 2026
5af258a
fix(timeline): use timestamp settling window for programmatic scroll …
Just-Insane Apr 15, 2026
8e07aec
fix(timeline): arm scroll guard in ResizeObserver and scrollToBottom
Just-Insane Apr 15, 2026
c9763ab
fix(timeline): set programmaticScrollToBottomRef before all bottom-pi…
Just-Insane Apr 15, 2026
93b7fb8
fix(timeline): remove scroll settling guard, match upstream scroll ap…
Just-Insane Apr 16, 2026
eefceb9
fix(nav): check DM membership before space parents in useRoomNavigate
Just-Insane Apr 15, 2026
6dcb99e
fix(timeline): add hysteresis to atBottom threshold
Just-Insane Apr 16, 2026
2727ac7
fix(timeline): suppress jump button flash during initial scroll settle
Just-Insane Apr 16, 2026
be8c28a
fix(timeline): remove scroll hysteresis, match upstream 100px threshold
Just-Insane Apr 16, 2026
7bddc4f
fix(timeline): chase bottom when content grows while user is pinned
Just-Insane Apr 16, 2026
29fa6ea
fix(timeline): restore useLayoutEffect auto-scroll, fix new-message s…
Just-Insane Apr 16, 2026
23dbfc6
fix(timeline): restore useLayoutEffect auto-scroll, fix new-message s…
Just-Insane Apr 16, 2026
6cfb025
fix(timeline): restore upstream scroll pattern for new messages
Just-Insane Apr 16, 2026
4e4cace
fix(timeline): restore upstream scroll pattern for new messages
Just-Insane Apr 16, 2026
4148bfa
fix(timeline): align scrollToBottom with upstream, fix eventId race
Just-Insane Apr 17, 2026
1ac909d
fix(timeline): align scrollToBottom with upstream, fix eventId race
Just-Insane Apr 17, 2026
30a26ea
feat(timeline): add video aspectRatio and VList itemSize hint
Just-Insane Apr 17, 2026
c8189ea
fix(timeline): skip scroll handler during init to prevent jitter
Just-Insane Apr 17, 2026
5c94190
perf(timeline): skip redundant re-render on TimelineReset
Just-Insane Apr 17, 2026
29fc1d0
perf(timeline): hide content during genuine TimelineReset re-render
Just-Insane Apr 17, 2026
4f2e3e0
feat(timeline): show skeleton overlay while measuring first-visit rooms
Just-Insane Apr 17, 2026
32917c2
fix(timeline): eliminate room-open and jump-to-message jitter
Just-Insane Apr 17, 2026
1b5b284
fix(timeline): skip TimelineReset hide for additive sliding-sync resets
Just-Insane Apr 17, 2026
5b58dd5
Merge branch 'feat/media-dimension-hints' into perf/timeline-rendering
Just-Insane Apr 17, 2026
1c5dc03
Merge branch 'fix/timeline-jitter' into perf/timeline-rendering
Just-Insane Apr 17, 2026
7cf0def
Merge fix/ui-regressions into perf/timeline-rendering (resolve confli…
Just-Insane Apr 17, 2026
deae460
Merge perf/timeline-item-memo into perf/timeline-rendering (resolve c…
Just-Insane Apr 17, 2026
131fe1c
fix(timeline): guard cache restore, unread dots, and jump scroll-back
Just-Insane Apr 17, 2026
4e4d368
fix(timeline): prevent double-render and content-chase flash
Just-Insane Apr 18, 2026
f9c5b4d
fix(timeline): restore room-open position and dedupe overlap
Just-Insane Apr 18, 2026
399c7cb
chore(timeline): clean reveal comment
Just-Insane Apr 18, 2026
78cdd24
fix(timeline): invalidate stale room scroll cache
Just-Insane Apr 19, 2026
e4e6b83
fix(timeline): remove stale room scroll restore
Just-Insane Apr 19, 2026
abc83a2
chore(timeline): fix room timeline formatting
Just-Insane Apr 19, 2026
7835ed1
feat(timeline): restore room cache by event anchor
Just-Insane Apr 19, 2026
b4ee4ee
fix(timeline): resolve anchored cache restore wiring
Just-Insane Apr 19, 2026
ed9915c
fix(timeline): finalize anchored cache restore
Just-Insane Apr 19, 2026
efd8578
fix(timeline): align reset relinking with upstream
Just-Insane Apr 19, 2026
5814956
fix(timeline): stabilize bottom pin and unread fallback
Just-Insane Apr 19, 2026
b2878b5
fix(timeline): align initial room-fill thresholds
Just-Insane Apr 19, 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
5 changes: 5 additions & 0 deletions .changeset/fix-timeline-scroll-regressions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
default: patch
---

Fix timeline scroll regressions: stay-at-bottom, Jump to Latest button flicker, phantom unread dot, and blank notification page recovery
5 changes: 5 additions & 0 deletions .changeset/perf-timeline-item-memo.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
default: patch
---

Memoize individual VList timeline items to prevent mass re-renders when unrelated state changes (e.g. typing indicators, read receipts, or new messages while not at the bottom).
5 changes: 5 additions & 0 deletions .changeset/perf-timeline-scroll-cache.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
default: patch
---

Cache VList item heights across room visits to restore scroll position instantly and skip the 80 ms opacity-fade stabilisation timer on revisit.
3 changes: 3 additions & 0 deletions src/app/components/message/content/VideoContent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -110,9 +110,12 @@ export const VideoContent = as<'div', VideoContentProps>(
if (autoPlay) loadSrc();
}, [autoPlay, loadSrc]);

const hasDimensions = typeof info?.w === 'number' && typeof info?.h === 'number';

return (
<Box
className={classNames(css.RelativeBase, className)}
style={hasDimensions ? { aspectRatio: `${info.w} / ${info.h}` } : undefined}
{...props}
ref={ref}
onPointerEnter={() => setIsHovered(true)}
Expand Down
Loading
Loading