@supunlakmal/hooks

A comprehensive collection of production-ready, reusable React hooks written in TypeScript to simplify common UI patterns and browser API interactions.
Stop reinventing the wheel! @supunlakmal/hooks provides a wide arrays, easy-to-use hooks covering everything from state management enhancements and side effects to browser APIs and performance optimizations.
Why choose @supunlakmal/hooks?
- 🚀 Extensive Collection: Over 60+ hooks covering a vast range of common React development needs.
- 🛡️ Type-Safe: Written entirely in TypeScript for robust development.
- ✨ Simple API: Designed for ease of use and minimal boilerplate.
- 🌍 SSR Compatible: Hooks are designed to work safely in server-side rendering environments.
- 🧹 Automatic Cleanup: Handles listeners, timers, and observers correctly.
- ⚡ Performance Focused: Includes hooks like
useDebounce, useThrottle, and useVirtualList for optimization.
- 🧩 Minimal Dependencies: Core hooks have zero runtime dependencies (unless specified in individual hook docs).
Installation
npm install @supunlakmal/hooks
yarn add @supunlakmal/hooks
Quick Start Example
import React, { useState } from 'react';
import { useToggle, useDebounce, useWindowSize } from '@supunlakmal/hooks';
function ExampleComponent() {
const [isOpen, toggle] = useToggle(false);
const [inputValue, setInputValue] = useState('');
const debouncedSearchTerm = useDebounce(inputValue, 500);
const { width, height } = useWindowSize();
React.useEffect(() => {
if (debouncedSearchTerm) {
console.log(`Searching for: ${debouncedSearchTerm}`);
}
}, [debouncedSearchTerm]);
return (
<div>
{/* useToggle Example */}
<button onClick={toggle}>{isOpen ? 'Close' : 'Open'}</button>
{isOpen && <p>Content is visible!</p>}
<hr />
{/* useDebounce Example */}
<input
type="text"
placeholder="Search..."
value={inputValue}
onChange={(e) => setInputValue(e.target.value)}
/>
<p>Typing: {inputValue}</p>
<p>Debounced: {debouncedSearchTerm}</p>
<hr />
{/* useWindowSize Example */}
<p>
Window Size: {width}px x {height}px
</p>
</div>
);
}
Available Hooks
Executes a callback function on each frame of the requestAnimationFrame loop.
Provides real-time information about the device's battery status.
Manages a boolean state with convenient toggle, setTrue, and setFalse functions.
A useFetch variant with simple in-memory caching and TTL.
Triggers a callback when clicking outside an element or pressing the Escape key.
Copies text to the clipboard and shows timed feedback on success.
Initializes and returns a value that remains constant throughout the component's lifecycle.
Provides an interface for reading, writing, and deleting cookies.
Manages a countdown timer with start, pause, and reset controls.
A basic counter hook with increment, decrement, and reset functions.
A useEffect variant that allows you to conditionally run the effect based on a boolean flag.
Provides state and logic for implementing a custom context menu (right-click menu).
Provides a function to copy text to the clipboard and tracks status (uses fallback).
A hook to force a component to re-render.
Cycles through a list of values with next/previous controls.
Manages application theme preference (dark/light mode) with OS detection and local storage persistence.
Debounces a callback function, delaying its execution until a certain time has passed without changes.
A useEffect variant that debounces the effect callback.
A useFetch variant that debounces the fetch call.
Tracks the user's geographic location using the Geolocation API, with debouncing.
Debounces the result of a CSS media query.
Provides window dimensions debounced by a specified delay.
Provides a default value if the input value is null or undefined.
Computes derived state based on other values, recomputing only when dependencies change (wraps useMemo).
Tracks device motion information (acceleration, rotation rate) via the devicemotion event.
Tracks the physical orientation of the device via the deviceorientation event.
Sets and manages the document title.
Adds direct element draggability (positioning via transform) using pointer events, with bounds support.
Provides basic HTML Drag and Drop API event handling (dragstart, drag, dragend) for an element.
Efficiently tracks the dimensions (width/height) of a DOM element using ResizeObserver.
A hook to manage a state that cycles through values of an enum. (Description inferred - doc file was blank).
A hook to add error boundary to a component.
Creates a stable function reference that always calls the latest version of a callback.
Robustly attaches event listeners to window, document, or elements, handling cleanup.
Manages a connection to a Server-Sent Events (SSE) endpoint.
Utilizes the EyeDropper API to select colors from the screen.
Dynamically sets the website's favicon.
A simple hook for fetching data, managing loading and error states.
Manages complex component state using an explicit state machine definition.
Returns true if the component is rendering for the first time, false otherwise.
Traps keyboard focus within a specified container element when active (for modals, dialogs).
Determines if a specified element or any of its descendants currently have focus.
A basic hook for managing form state, input changes, and submission.
A comprehensive hook for form state, validation (change/blur/submit), and submission handling.
A hook to force a component to re-render.
Enters and exits fullscreen mode for an element, tracking the current state.
Functional state updates for React components. (Description inferred - doc file was blank).
Tracks the user's geographic location using the Geolocation API.
Tracks the user's geographic location continuously using the Geolocation API.
Determines if an element has ever been visible within the viewport.
Manages state with undo/redo history tracking.
Create a ref that can be used in a hook. (Description inferred - doc file was blank).
Tracks whether the mouse pointer is currently hovering over a specific DOM element.
Tracks hover state with a minimum duration delay.
Schedules a function to be called during browser idle periods using requestIdleCallback.
Monitors user idle state and screen lock status using the experimental Idle Detection API.
Initiates a data fetch after the user becomes active following a period of inactivity.
Monitors user activity and triggers callbacks based on idle/active status.
Tracks the loading status and dimensions of an image element.
Facilitates infinite scrolling using IntersectionObserver to trigger loading more data.
Monitors the intersection of a target element with the viewport or an ancestor.
A declarative hook for setting intervals (setInterval) with automatic cleanup.
Sets up an interval that only runs when a specific condition is met.
Returns true if the component is rendering for the first time, false otherwise.
Detects if the current viewport is mobile-sized based on a configurable breakpoint.
A hook that returns true if the component is mounted.
Generates unique IDs that are stable across server and client rendering environments.
A useLayoutEffect variant that works on the server and the client.
Detects specific keyboard combinations (shortcuts) being pressed.
Detects whether a specific key is currently being pressed down.
A hook that logs the component's lifecycle events.
A hook that provides functions to manipulate a list.
Manages an array state with helper functions for common array operations.
Manages state persisted in localStorage, synchronizing across tabs.
Manages a queue of items persisted in local storage.
Get the value from local storage.
Development utility to log component lifecycle events and prop changes.
Detects long press gestures (mouse or touch) on a target element.
A fetch variant that uses the user's location for the API endpoint.
Manages state in the form of a JavaScript Map, providing immutable update actions.
Manages an object or a Map-like state with helper functions to set, remove, and reset key-value pairs.
Get the size of an element. (Description inferred - doc file was blank).
Simplifies requesting and managing access to the user's camera and/or microphone.
Manages a mediated state value.
Tracks the state of a CSS media query.
Merges multiple React refs (callback or object refs) into a single callback ref.
Executes a callback function exactly once when the component mounts.
Tracks the current position of the mouse pointer globally.
Simplifies handling asynchronous data modification operations (POST, PUT, DELETE), managing status.
A useFetch variant that automatically refetches when the network status changes from offline to online.
A useWebSocket variant that automatically reconnects when the network status changes from offline to online.
Provides information about the user's network connection (speed, type) using the Network Information API.
Tracks the network state.
Enters and exits fullscreen mode for an element, tracking the current state. (Description inferred - doc was same as useFullscreen)
Utilizes the Notification API to display desktop notifications.
Tracks the browser's online/offline connection status.
Tracks the screen orientation (landscape or portrait).
Triggers a callback function when the user's mouse cursor leaves the main browser window or document area.
Tracks the visibility state of the current browser tab/page using the Page Visibility API.
Manages pagination logic for client-side data sets.
Queries the status of browser permissions (geolocation, notifications, etc.) using the Permissions API.
Manages a counter state that persists in local storage.
Manages boolean state that persists in local storage.
Detects and reacts to pinch-to-zoom gestures on a specified element.
Simplifies the creation and management of React Portals.
Tracks the user's preference for reduced motion using the prefers-reduced-motion media query.
Returns an array of the user's preferred languages, as configured in their browser.
Tracks the previous value of a state or prop from the last render.
Tracks the previous different value of a state or prop from the last render.
Simplifies handling promises, managing loading, error, and success states.
Manages a stateful queue (First-In, First-Out).
Creates a callback based on requestAnimationFrame.
Manages state updates deferred to the next browser animation frame.
Wraps useReducer to automatically log actions and state changes in development.
Tracks the number of times a component has rendered.
Force to re-render the component.
Provides a state variable and a function to reset it to its initial value.
Monitors changes to the dimensions of a target element using the ResizeObserver API.
Executes a callback whenever the browser's URL path changes (handles popstate and pushState).
Implements the roving tabindex accessibility pattern for keyboard navigation within a group.
Tracks the screen orientation (angle, type) using the Screen Orientation API.
Dynamically loads an external JavaScript script and tracks its loading status.
Prevents scrolling on the body element.
Tracks the current X and Y scroll position of the window or a specified element.
Monitors scroll position to determine which section element is currently active in the viewport.
Provides a function to programmatically scroll the window to the top.
Manages state persisted in sessionStorage for the duration of the session.
Manages state in the form of a JavaScript Set, providing immutable update actions.
Manages object state allowing partial updates, similar to class component setState.
A hook to use a basic step logic.
A hook to get the value from local or session storage.
Detects swipe gestures (left, right, up, down) on touch-enabled devices for a specified element.
Manages state persisted in localStorage and synchronizes across tabs.
Create a ref that syncs with another value.
Tracks the text currently selected by the user within the document.
Throttles a value, delaying updates until a certain time has passed without changes.
Throttles a callback, ensuring updates do not occur more frequently than a specified limit.
Attaches an event listener and throttles the callback execution.
Tracks the window's scroll position with throttled updates.
Throttles a state, ensuring updates do not occur more frequently than a specified limit.
A declarative hook for setting timeouts (setTimeout) with automatic cleanup.
Manages boolean state with convenient toggle, setOn, and setOff functions.
A basic hook for handling internationalization (i18n) with static resources.
Executes a cleanup function exactly once when the component unmounts.
Executes a cleanup function when the component unmounts.
A useEffect variant that skips the effect execution after the initial render (mount).
Utilizes the Vibration API to trigger device vibrations.
Performance optimization for rendering long lists by rendering only visible items (fixed height).
Tracks whether a target element is currently visible within the viewport or an ancestor using IntersectionObserver.
Manages the Screen Wake Lock API to prevent the screen from sleeping.
Manages WebSocket connections, state, messaging, and automatic reconnection.
Runs a function in a Web Worker thread to offload heavy computations from the main thread.
Development utility to debug component re-renders by logging changed props.
Returns the current dimensions (width and height) of the browser window.
Offloads expensive computations or functions to a separate Web Worker thread (alternative to useWebWorker).
Live Demo
A live demo environment showcasing all hooks will be available here