
Security News
Insecure Agents Podcast: How to Keep AI Agents From Bypassing Security Controls
Socket CTO Ahmad Nassri discusses how to keep AI agents from bypassing package blocks, limit credential access, and monitor their actions.
viewport-scroll
Advanced tools
A simple React component to track the window's viewport-scroll position.
A simple and lightweight React component to effortlessly track the window's viewport-scroll position and trigger actions like infinite scrolling.
ViewportScroll component.npm install viewport-scroll
or
yarn add viewport-scroll
Here's a simple example of how to use ViewportScroll to implement infinite scrolling:
import ViewportScroll, { type ScrollHandlerType } from "viewport-scroll";
import { useState } from "react";
type State = {
isLoading: boolean;
data: {
id: number;
name: string;
}[];
};
export default function App() {
const [user, setUser] = useState<State>({ isLoading: false, data: [] });
const getCharacter: ScrollHandlerType = async ({ page, setHasMore }) => {
try {
setUser((prev) => ({ ...prev, isLoading: true }));
await new Promise((resolve) => setTimeout(resolve, 1000));
const data = await (await fetch(`https://rickandmortyapi.com/api/character?page=${page}`)).json();
const results = data?.results ?? [];
if (results.length === 0 || !data.info?.next) {
setHasMore(false);
}
setUser((prev) => ({ isLoading: false, data: [...prev.data, ...results] }));
} catch (error) {
setUser((prev) => ({ ...prev, isLoading: false }));
setHasMore(false);
}
};
return (
<div className="App">
<h1>Infinite Scroll with ViewportScroll</h1>
<ViewportScroll
threshold={200}
isLoading={user.isLoading}
asyncHandler={getCharacter}
style={{ height: "400px", width: "80%", overflowY: "auto", margin: "auto", border: "1px solid #ccc", padding: "1rem" }}
>
{user.data.map((char) => (
<div key={char.id} style={{ padding: "1rem", borderBottom: "1px solid #eee" }}>
<h3>{char.name}</h3>
</div>
))}
{user.isLoading && <div style={{ textAlign: "center", padding: "1rem" }}>Loading more characters...</div>}
</ViewportScroll>
</div>
);
}
| Prop | Type | Default | Description |
|---|---|---|---|
threshold | number | 200 | The distance in pixels from the bottom of the scrollable element at which the asyncHandler is triggered. |
isLoading | boolean | false | A boolean to indicate if the asyncHandler is currently running. This prevents multiple calls. |
asyncHandler | ({ page, setHasMore }) => Promise<void> | - | The asynchronous function to call when the scroll threshold is reached. |
style | React.CSSProperties | - | Custom styles to apply to the scrollable container. |
children | React.ReactNode | - | The content to be rendered inside the scrollable container. |
Contributions, issues, and feature requests are welcome! Feel free to check the issues page.
This project is ISC licensed.
FAQs
A simple React component to track the window's viewport-scroll position.
The npm package viewport-scroll receives a total of 2 weekly downloads. As such, viewport-scroll popularity was classified as not popular.
We found that viewport-scroll demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.

Security News
Socket CTO Ahmad Nassri discusses how to keep AI agents from bypassing package blocks, limit credential access, and monitor their actions.

Security News
GPT-6 Astra tried to plant malicious code in simulated open source projects using fake GitHub accounts and deceptive PRs during an assigned CTF challenge.

Security News
upm uses Node.js to deliver fast npm installs in about 250 KB, with a JavaScript API and security defaults.