Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Reviewer's GuideRefines chat auto-scroll behavior so that the list only auto-scrolls when the user sends a new message, stabilizes scroll position when streaming ends, and moves the AutoScroll overlay outside the virtualized list to prevent it from being recycled and to keep the back-to-bottom control visible. Sequence diagram for updated chat auto scroll on user messagesequenceDiagram
actor User
participant ConversationInput
participant ConversationStore
participant VirtualizedList
participant useScrollToUserMessage
participant VList
User->>ConversationInput: Type and send message
ConversationInput->>ConversationStore: append user message
ConversationStore-->>VirtualizedList: update displayMessages
VirtualizedList->>VirtualizedList: compute isLastMessageFromUser
VirtualizedList->>useScrollToUserMessage: call with dataSourceLength, isLastMessageFromUser, scrollToIndex
useScrollToUserMessage->>useScrollToUserMessage: detect hasNewMessage
alt last message is from user
useScrollToUserMessage->>VList: scrollToIndex(dataSourceLength - 2, align start, smooth true)
else last message is from agent
useScrollToUserMessage--xVList: no auto scroll
end
note over User,VList: Auto scroll is only triggered for new user messages, not for agent responses
Sequence diagram for preserving scroll when streaming endssequenceDiagram
participant VList
participant AutoScroll
participant useAutoScroll
participant ScrollContainer
VList->>AutoScroll: render with enabled true
AutoScroll->>useAutoScroll: useAutoScroll(enabled true, deps)
useAutoScroll->>ScrollContainer: attach scroll listener
loop streaming messages
ScrollContainer->>useAutoScroll: scroll events
useAutoScroll->>useAutoScroll: manage userHasScrolled
end
AutoScroll->>AutoScroll: streaming ends
AutoScroll->>useAutoScroll: re render with enabled false
useAutoScroll->>useAutoScroll: detect enabled transitioned from true to false
useAutoScroll->>ScrollContainer: read currentScrollTop
useAutoScroll->>useAutoScroll: set isAutoScrollingRef true
useAutoScroll->>ScrollContainer: requestAnimationFrame restore scrollTop
useAutoScroll->>useAutoScroll: reset isAutoScrollingRef false
note over VList,ScrollContainer: Scroll position is preserved across DOM changes when streaming stops
Class diagram for updated chat auto scroll components and hooksclassDiagram
class VirtualizedList {
<<component>>
- virtuaRef : VListHandle
- scrollEndTimerRef : Timeout | null
- displayMessages : Message[]
- lastMessage : Message | undefined
- isLastMessageFromUser : boolean
+ VirtualizedList(props dataSource : string[], itemContent : function) ReactElement
}
class useScrollToUserMessage {
<<hook>>
- prevLengthRef : number
+ useScrollToUserMessage(dataSourceLength : number, isLastMessageFromUser : boolean, scrollToIndex : function) void
}
class AutoScroll {
<<component>>
- shouldAutoScroll : boolean
- atBottom : boolean
- dbMessages : Message[]
- lastMessageContentLength : number
+ AutoScroll() ReactElement
+ scrollToBottom(force : boolean) void
}
class useAutoScroll {
<<hook>>
- ref : HTMLElement | null
- userHasScrolled : boolean
- isAutoScrollingRef : boolean
- prevEnabledRef : boolean
+ useAutoScroll(enabled : boolean, deps : any[]) HTMLElement | null
+ handleScroll() void
+ scrollToBottom(force : boolean) void
}
class VList {
<<component>>
+ scrollToIndex(index : number, options : ScrollOptions) void
}
class BackBottom {
<<component>>
+ BackBottom(onScrollToBottom : function, visible : boolean) ReactElement
}
VirtualizedList ..> useScrollToUserMessage : uses
VirtualizedList ..> AutoScroll : renders
VirtualizedList ..> VList : renders
AutoScroll ..> useAutoScroll : uses
AutoScroll ..> BackBottom : renders
useScrollToUserMessage ..> VList : calls scrollToIndex
class Message {
+ id : string
+ role : string
+ content : string
}
VirtualizedList --> "*" Message : displayMessages
AutoScroll --> "*" Message : dbMessages
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
TestGru AssignmentSummary
Tip You can |
There was a problem hiding this comment.
Hey - I've left some high level feedback:
- In
useScrollToUserMessage, thescrollToIndex(dataSourceLength - 2, ...)call can produce a negative index whendataSourceLength < 2; consider guarding ondataSourceLength >= 2before attempting to scroll. - The
scrollToIndexoption type currently uses{ align?: string; smooth?: boolean }; you may want to narrowalignto the actual allowed values for the underlying virtual list API (e.g.'start' | 'center' | 'end'), which will help catch misuse at compile time. - In
VirtualizedList,displayMessagesis re-selected fromuseConversationStoreeven thoughdataSourceis already provided as a prop; if these are meant to stay in sync, consider derivingisLastMessageFromUserfromdataSourceor passingisLastMessageFromUserin as a prop to avoid subtle desynchronization issues.
Prompt for AI Agents
Please address the comments from this code review:
## Overall Comments
- In `useScrollToUserMessage`, the `scrollToIndex(dataSourceLength - 2, ...)` call can produce a negative index when `dataSourceLength < 2`; consider guarding on `dataSourceLength >= 2` before attempting to scroll.
- The `scrollToIndex` option type currently uses `{ align?: string; smooth?: boolean }`; you may want to narrow `align` to the actual allowed values for the underlying virtual list API (e.g. `'start' | 'center' | 'end'`), which will help catch misuse at compile time.
- In `VirtualizedList`, `displayMessages` is re-selected from `useConversationStore` even though `dataSource` is already provided as a prop; if these are meant to stay in sync, consider deriving `isLastMessageFromUser` from `dataSource` or passing `isLastMessageFromUser` in as a prop to avoid subtle desynchronization issues.Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## next #11734 +/- ##
==========================================
+ Coverage 74.15% 74.17% +0.01%
==========================================
Files 1191 1193 +2
Lines 94815 94886 +71
Branches 12500 10909 -1591
==========================================
+ Hits 70313 70384 +71
Misses 24412 24412
Partials 90 90
Flags with carried forward coverage won't be shown. Click here to find out more.
🚀 New features to boost your workflow:
|
|
❤️ Great PR @arvinxx ❤️ The growth of project is inseparable from user feedback and contribution, thanks for your contribution! If you are interesting with the lobehub developer community, please join our discord and then dm @arvinxx or @canisminor1990. They will invite you to our private developer channel. We are talking about the lobe-chat development or sharing ai newsletter around the world. |
## [Version 2.0.0-next.351](v2.0.0-next.350...v2.0.0-next.351) <sup>Released on **2026-01-23**</sup> #### 🐛 Bug Fixes - **misc**: Fix auto scroll. <br/> <details> <summary><kbd>Improvements and Fixes</kbd></summary> #### What's fixed * **misc**: Fix auto scroll, closes [#11734](#11734) ([892fa9f](892fa9f)) </details> <div align="right"> [](#readme-top) </div>
|
🎉 This PR is included in version 2.0.0-next.351 🎉 The release is available on: Your semantic-release bot 📦🚀 |
## [Version 1.154.0](v1.153.1...v1.154.0) <sup>Released on **2026-01-23**</sup> #### ♻ Code Refactoring - **misc**: Migrate AI Rules to Claude Code Skills. #### ✨ Features - **database**: Extended async task with metadata and parent id, added index. - **misc**: Remove NextAuth. #### 🐛 Bug Fixes - **copilot**: History popover not refreshing when agentId changes. - **editor**: Prevent crash when toggling enableInputMarkdown setting. - **home**: Use correct CreateGroupModal for session group creation. - **model-runtime**: Handle null content in anthropic message builder. - **ModelSelect**: Resolve tooltip hover causing popup to close. - **pdf**: Ensure worker config before Document render. - **store**: Delete message before regeneration. - **misc**: Fix auto scroll, fix favorite refresh bug and group topic refresh issue, fixed the agent group builder tools excaution edge case crash, page content switch mismatch, when use market group, the group sys role was not used. <br/> <details> <summary><kbd>Improvements and Fixes</kbd></summary> #### Code refactoring * **misc**: Migrate AI Rules to Claude Code Skills, closes [lobehub#11737](https://github.com/jaworldwideorg/OneJA-Bot/issues/11737) ([346fc46](346fc46)) #### What's improved * **database**: Extended async task with metadata and parent id, added index, closes [lobehub#11712](https://github.com/jaworldwideorg/OneJA-Bot/issues/11712) ([31d2f26](31d2f26)) * **misc**: Remove NextAuth, closes [lobehub#11732](https://github.com/jaworldwideorg/OneJA-Bot/issues/11732) ([1eff864](1eff864)) #### What's fixed * **copilot**: History popover not refreshing when agentId changes, closes [lobehub#11731](https://github.com/jaworldwideorg/OneJA-Bot/issues/11731) ([64f39e7](64f39e7)) * **editor**: Prevent crash when toggling enableInputMarkdown setting, closes [lobehub#11755](https://github.com/jaworldwideorg/OneJA-Bot/issues/11755) ([ea5eed8](ea5eed8)) * **home**: Use correct CreateGroupModal for session group creation, closes [lobehub#11752](https://github.com/jaworldwideorg/OneJA-Bot/issues/11752) ([36bcc50](36bcc50)) * **model-runtime**: Handle null content in anthropic message builder, closes [lobehub#11756](https://github.com/jaworldwideorg/OneJA-Bot/issues/11756) ([539753a](539753a)) * **ModelSelect**: Resolve tooltip hover causing popup to close, closes [lobehub#11742](https://github.com/jaworldwideorg/OneJA-Bot/issues/11742) ([1b73f14](1b73f14)) * **pdf**: Ensure worker config before Document render, closes [lobehub#11746](https://github.com/jaworldwideorg/OneJA-Bot/issues/11746) ([ad34072](ad34072)) * **store**: Delete message before regeneration, closes [lobehub#11760](https://github.com/jaworldwideorg/OneJA-Bot/issues/11760) ([a8a6300](a8a6300)) * **misc**: Fix auto scroll, closes [lobehub#11734](https://github.com/jaworldwideorg/OneJA-Bot/issues/11734) ([892fa9f](892fa9f)) * **misc**: Fix favorite refresh bug and group topic refresh issue, closes [lobehub#11745](https://github.com/jaworldwideorg/OneJA-Bot/issues/11745) ([5d115ef](5d115ef)) * **misc**: Fixed the agent group builder tools excaution edge case crash, closes [lobehub#11735](https://github.com/jaworldwideorg/OneJA-Bot/issues/11735) ([5de4742](5de4742)) * **misc**: Page content switch mismatch, closes [lobehub#11758](https://github.com/jaworldwideorg/OneJA-Bot/issues/11758) ([fdc8f95](fdc8f95)) * **misc**: When use market group, the group sys role was not used, closes [lobehub#11739](https://github.com/jaworldwideorg/OneJA-Bot/issues/11739) ([afc76f9](afc76f9)) </details> <div align="right"> [](#readme-top) </div>
💻 Change Type
🔗 Related Issue
fix LOBE-3608
🔀 Description of Change
🧪 How to Test
📸 Screenshots / Videos
📝 Additional Information
Summary by Sourcery
Improve chat auto-scroll behavior to better handle user messages and virtualized rendering.
Bug Fixes:
Enhancements: