|
|
@@ -2445,6 +2445,39 @@ describe('ChatView', () => {
|
|
|
}
|
|
|
})
|
|
|
|
|
|
+ it('lets small reader movements accumulate past the follow threshold during growth', () => {
|
|
|
+ let notify: (() => void) | undefined
|
|
|
+ class ResizeObserverStub {
|
|
|
+ constructor(callback: ResizeObserverCallback) {
|
|
|
+ notify = () => { callback([], this as unknown as ResizeObserver) }
|
|
|
+ }
|
|
|
+
|
|
|
+ observe = vi.fn()
|
|
|
+ disconnect = vi.fn()
|
|
|
+ }
|
|
|
+ vi.stubGlobal('ResizeObserver', ResizeObserverStub)
|
|
|
+ const h = makeHarness({ nodes: [user(1, 'q'), assistant(2, 'a')] })
|
|
|
+ const view = render(<h.ChatView {...h.props} />)
|
|
|
+ const scroller = view.container.querySelector('[class*="scroll"]') as HTMLDivElement
|
|
|
+ const metrics = installScrollMetrics(scroller, 1_000, 300)
|
|
|
+ expect(notify).toBeDefined()
|
|
|
+ scroller.scrollTop = 700
|
|
|
+ fireEvent.scroll(scroller)
|
|
|
+ fireEvent(scroller, new Event('scrollend'))
|
|
|
+ scroller.scrollTop = 690
|
|
|
+ fireEvent.scroll(scroller)
|
|
|
+ metrics.setHeight(1_020)
|
|
|
+ act(() => { notify?.() })
|
|
|
+ expect(scroller.scrollTop).toBe(690)
|
|
|
+ scroller.scrollTop = 680
|
|
|
+ fireEvent.scroll(scroller)
|
|
|
+ fireEvent(scroller, new Event('scrollend'))
|
|
|
+ expect(view.getByLabelText('回到底部')).toBeTruthy()
|
|
|
+ metrics.setHeight(1_040)
|
|
|
+ act(() => { notify?.() })
|
|
|
+ expect(scroller.scrollTop).toBe(680)
|
|
|
+ })
|
|
|
+
|
|
|
it('clears an away sample when a back-to-bottom delivery restores pinned ownership', () => {
|
|
|
const h = makeHarness({ nodes: [user(1, 'q'), assistant(2, 'a')] })
|
|
|
const view = render(<h.ChatView {...h.props} />)
|
|
|
@@ -2476,6 +2509,7 @@ describe('ChatView', () => {
|
|
|
fireEvent.scroll(scroller)
|
|
|
scroller.scrollTop = 500
|
|
|
fireEvent.scroll(scroller)
|
|
|
+ fireEvent(scroller, new Event('scrollend'))
|
|
|
expect(view.getByLabelText('回到底部')).toBeTruthy()
|
|
|
const rect = vi.spyOn(HTMLElement.prototype, 'getBoundingClientRect')
|
|
|
try {
|