Download packages/cli/src/ui/hooks/useBatchedScroll.ts from SaylorTwift/gemini-cli: direct link, hf CLI and curl.
- Browser
- Download file 1.11 kB
-
https://huggingface.co/SaylorTwift/gemini-cli/resolve/main/packages/cli/src/ui/hooks/useBatchedScroll.ts
- Command line
-
hf download hf://SaylorTwift/gemini-cli/packages/cli/src/ui/hooks/useBatchedScroll.ts
-
curl -L -o useBatchedScroll.ts https://huggingface.co/SaylorTwift/gemini-cli/resolve/main/packages/cli/src/ui/hooks/useBatchedScroll.ts
1.11 kB
| /** | |
| * @license | |
| * Copyright 2025 Google LLC | |
| * SPDX-License-Identifier: Apache-2.0 | |
| */ | |
| import { useRef, useLayoutEffect, useCallback } from 'react'; | |
| /** | |
| * A hook to manage batched scroll state updates. | |
| * It allows multiple scroll operations within the same tick to accumulate | |
| * by keeping track of a 'pending' state that resets after render. | |
| */ | |
| export function useBatchedScroll(currentScrollTop: number) { | |
| const pendingScrollTopRef = useRef<number | null>(null); | |
| // We use a ref for currentScrollTop to allow getScrollTop to be stable | |
| // and not depend on the currentScrollTop value directly in its dependency array. | |
| const currentScrollTopRef = useRef(currentScrollTop); | |
| useLayoutEffect(() => { | |
| currentScrollTopRef.current = currentScrollTop; | |
| pendingScrollTopRef.current = null; | |
| }); | |
| const getScrollTop = useCallback( | |
| () => pendingScrollTopRef.current ?? currentScrollTopRef.current, | |
| [], | |
| ); | |
| const setPendingScrollTop = useCallback((newScrollTop: number) => { | |
| pendingScrollTopRef.current = newScrollTop; | |
| }, []); | |
| return { getScrollTop, setPendingScrollTop }; | |
| } | |