npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

@supunlakmal/hooks

v1.3.1

Published

A collection of reusable React hooks

Maintainers

supunlakmalsupunlakmal

Keywords

reactreact hookscustom hooksreact utilitiesreact state managementtypescriptfrontendweb developmentjavascriptes6npm packageopen sourceui componentsuser interfaceperformance optimizationaccessibilitydeveloper toolssoftware developmentweb appssingle page applicationspareactjsreact developmentcomponent libraryreact toolkitreact componentreact patternshooks libraryhooks collectionfunctional programmingstate hookseffect hooksreact contextreact routerreact performancereact optimizationreact formform validationresponsive designmobile friendlycross platformprogressive web apppwafrontend developmentmodern javascriptbabelwebpackesnextnodejsnpmyarnmonorepocode qualitylintingtestingjestreact testing librarycontinuous integrationci cddevopstypescript hooksreact typescriptreact 18concurrent modesuspensereact suspensehooks best practicesreact best practicesreact communityfrontend toolsweb performancereact animationdrag and dropaccessibility hookskeyboard navigationseo friendlycode reusemodular codeclean codereact stateimmutable statereact lifecyclereact hooks tutorialreact hooks examplesreact hooks libraryhooksutility hooksstate managementperformanceuseToggleuseDebounceuseFetchuseAsyncuseLocalStorageuseSessionStorageuseClickOutsideuseEventListeneruseWindowSizeuseFormuseValidationuseIntervaluseTimeoutusePrevioususeIntersectionObserveruseVirtualListusePaginationuseDarkModeuseClipboarduseWebSocketuseScrolluseAnimationuseDraguseDraggableuseFocusTrapuseMediaQuerybrowser apiuseAnimationuseAsyncAbortableuseBreakpointuseBroadcastChanneluseCachedFetchuseClipboarduseContextMenuuseCopyToClipboarduseControlledRerenderStateuseCountdownuseCounteruseConditionalEffectuseDarkModeuseDebouncedStateuseDebouncedFetchuseDebouncedGeolocationuseDebouncedMediaQueryuseDeepCompareEffectuseDebouncedCallbackuseDebouncedEffectuseDerivedStateuseDefaultuseDocumentTitleuseDeviceMotionuseLocationBasedFetchuseDeviceOrientationuseEyeDropperuseFaviconuseGeolocationContinuoususeErrorBoundaryuseMobileuseNewFullscreenuseElementSizeuseFirstMountStateuseFiniteStateMachineuseFormValidationuseFullscreenuseGeolocationuseHoveruseFunctionalStateuseHookableRefuseIsMounteduseIsomorphicLayoutEffectuseLifecycleLoggeruseListuseLocalStorageValueuseLocalStorageQueueuseMediaStreamuseMeasureuseMediatedStateuseCustomCompareEffectuseCustomCompareMemousePreviousDifferentusePersistentToggleuseInfiniteScrolluseIsFirstRenderuseKeyCombouseKeyPressuseLogger

Readme

@supunlakmal/hooks

NPM Version License: ISC TypeScript npm GitHub last commit bundle size Install Size

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
# or
yarn add @supunlakmal/hooks

Quick Start Example

import React, { useState } from 'react';
import { useToggle, useDebounce, useWindowSize } from '@supunlakmal/hooks';

function ExampleComponent() {
  // Effortlessly manage boolean state
  const [isOpen, toggle] = useToggle(false);

  // Debounce rapid input changes
  const [inputValue, setInputValue] = useState('');
  const debouncedSearchTerm = useDebounce(inputValue, 500);

  // Get window dimensions easily
  const { width, height } = useWindowSize();

  // Use debounced value for API calls, etc.
  React.useEffect(() => {
    if (debouncedSearchTerm) {
      console.log(`Searching for: ${debouncedSearchTerm}`);
      // Fetch API call here...
    }
  }, [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

Hooks are organized into thematic categories so you can quickly jump to the patterns you need. Every entry links to its detailed guide in docs/.

1. State Management

Enhanced useState-style primitives for toggles, lists, finite state machines, and other complex data structures.

| Hook | Description | | :--- | :--- | | useBoolean | Manages a boolean state with explicit setTrue, setFalse, and toggle functions. | | useConst | Initializes and returns a constant value that persists across renders. | | useControlledRerenderState | A useState alternative where the state setter can cancel a re-render. | | useCounter | Manages a number state with increment, decrement, set, and reset actions. | | useCycle | Cycles through a predefined list of values. | | useDefault | Returns a default value if the provided value is null or undefined. | | useDerivedState | A semantic wrapper around useMemo for creating state based on other values. | | useEnum | Manages state that is constrained to the values of a given enum object. | | useFiniteStateMachine | Manages complex state using an explicit finite state machine definition. | | useFirstMountState | Returns true only on the first render of a component. | | useFunctionalState | A useState variant that returns a getter function for the state. | | useHistoryState | Manages state with a history, allowing for undo and redo operations. | | useIsFirstRender | Returns true only on the initial render of a component. | | useIsMounted | Returns a function that indicates if the component is currently mounted. | | useList | Manages an array state with a comprehensive set of list manipulation actions. | | useListState | Manages an array state with basic list manipulation functions. | | useMap | Manages a Map object as state with actions to manipulate it. | | useMapState | Manages a key-value object as state with set, remove, and reset functions. | | useMediatedState | A useState variant where every value set is passed through a mediator function. | | usePrevious | Returns the value of a prop or state from the previous render. | | usePreviousDifferent | Returns the last value that was different from the current value. | | useQueue | Manages a queue (First-In, First-Out) with methods to add, remove, and peek. | | useResetState | A useState variant that includes a function to reset the state to its initial value. | | useSet | Manages a Set object as state with actions to manipulate it. | | useSetState | Manages an object state, merging updates similarly to this.setState in class components. | | useStateWithHistory | Manages state with a history of changes, allowing for undo and redo operations. | | useStepper | Manages state for multi-step forms or wizards. | | useToggle | Manages a boolean state with a toggle function. |

2. Side Effects & Lifecycle

Hooks that orchestrate effects, logging, and lifecycle nuances beyond vanilla useEffect.

| Hook | Description | | :--- | :--- | | useConditionalEffect | A useEffect that only runs its callback if a set of conditions are met. | | useCustomCompareEffect | A useEffect that uses a custom comparator function for its dependency array. | | useDeepCompareEffect | A useEffect that performs a deep comparison of its dependencies. | | useDebouncedEffect | A useEffect whose callback function is debounced. | | useIsomorphicLayoutEffect | A hook that uses useLayoutEffect in the browser and useEffect on the server. | | useLifecycleLogger | Logs component lifecycle events (mount, update, unmount) to the console. | | useLogger | Logs component lifecycle events and prop changes. | | useMount | Runs a callback function once when the component mounts. | | useThrottledEffect | A useEffect whose callback function is throttled. | | useUnmount | Runs a callback function when the component unmounts. | | useUnmountEffect | Runs an effect only when the component is unmounted. | | useUpdateEffect | A useEffect that skips the initial render and only runs on updates. | | useWhyDidYouUpdate | A debugging tool that logs which props changed on a component re-render. | | useErrorBoundary | Imperative helpers for programmatically triggering and resetting React error boundaries. | | useReducerLogger | Wraps useReducer to log every action and resulting state, aiding debugging. |

3. Data Fetching

Helpers for REST-style data loading, request cancellation, debouncing, and network-aware flows.

| Hook | Description | | :--- | :--- | | useAsync | Manages the state of an asynchronous function call. | | useAsyncAbortable | An useAsync variant that provides an AbortSignal to the async function. | | useCachedFetch | A useFetch variant with in-memory caching to avoid redundant requests. | | useDebouncedFetch | A useFetch variant that debounces the request trigger. | | useDelete | A specialized useFetch for making DELETE requests. | | useFetch | A general-purpose hook for fetching data from an API. | | useGet | A specialized useFetch for making GET requests. | | useIdleFetch | Triggers a data fetch when the user becomes active after a period of inactivity. | | useLocationBasedFetch | Fetches data from an API based on the user's current geolocation. | | useMutation | Manages asynchronous operations that modify data (e.g., POST, PUT, DELETE). | | useNetworkAwareFetch | A useFetch variant that only runs when the user is online. | | usePatch | A specialized useFetch for making PATCH requests. | | usePost | A specialized useFetch for making POST requests. | | usePromise | Manages the state of a promise-based function. | | usePut | A specialized useFetch for making PUT requests. |

4. Browser & Web APIs

Wrappers around platform APIs such as Clipboard, Storage, Battery, Permissions, and Web Workers.

| Hook | Description | | :--- | :--- | | useBatteryStatus | Tracks the device's battery status using the Battery Status API. | | useBroadcastChannel | Enables cross-tab/window communication using the Broadcast Channel API. | | useClipboard | Interacts with the system clipboard for copying and pasting. | | useClipboardWithFeedback | An extension of useClipboard that provides feedback when text is copied. | | useCookie | Manages a specific browser cookie. | | useCopyToClipboard | A hook specifically for copying text to the clipboard. | | useDeviceMotion | Tracks device motion information like acceleration and rotation rate. | | useDeviceOrientation | Tracks the physical orientation of the device. | | useDocumentTitle | Sets the document.title of the page. | | useEventSource | Connects to a Server-Sent Events (SSE) endpoint. | | useEyeDropper | Uses the experimental EyeDropper API to sample colors from the screen. | | useFavicon | Dynamically sets the website's favicon. | | useFullscreen | Manages the fullscreen state for a specific element. | | useGeolocation | Tracks the user's geolocation. | | useGeolocationContinuous | Provides a continuous stream of geolocation data. | | useIdleCallback | Schedules a function to be executed during browser idle periods. | | useIdleDetection | Detects user idle state and screen lock status using the Idle Detection API. | | useLocalStorage | Manages state with localStorage, automatically syncing between state and storage. | | useLocalStorageQueue | Manages a queue that is persisted in localStorage. | | useLocalStorageValue | Manages a single localStorage key. | | useMediaStream | Manages access to the user's media devices (camera, microphone). | | useNetworkAwareWebSocket | Manages a WebSocket connection that is only active when the user is online. | | useNetworkSpeed | Gets information about the user's network connection speed and type. | | useNetworkState | Tracks the state of the browser's network connection. | | useNotification | Manages web notifications. | | useOnlineStatus | Tracks the browser's online status. | | useOrientation | Tracks the device's screen orientation. | | usePageVisibility | Tracks the visibility state of the browser page/tab. | | usePermission | Queries the status of a browser permission using the Permissions API. | | usePersistentCounter | A counter that persists its state in localStorage. | | usePersistentToggle | A boolean state that persists in localStorage. | | usePreferredLanguages | Retrieves the user's preferred languages from the browser. | | usePrefersReducedMotion | Detects if the user prefers reduced motion. | | useQueryParam | Synchronizes a state variable with a URL query parameter. | | useScreenOrientation | Tracks the screen orientation state. | | useScript | Dynamically loads an external script and tracks its loading state. | | useSessionStorage | Manages state with sessionStorage, automatically syncing between state and storage. | | useSpeechSynthesis | Utilizes the browser's Speech Synthesis API (Text-to-Speech). | | useStorageValue | A generic hook for managing a single key in a Storage object. | | useSyncedLocalStorage | A useLocalStorage variant that syncs its state across multiple tabs/windows. | | useVibration | Interacts with the browser's Vibration API. | | useWakeLock | Manages a screen wake lock to prevent the device from sleeping. | | useWebSocket | Manages WebSocket connections. | | useWebWorker | Runs a function in a web worker to avoid blocking the main thread. | | useWorker | Another hook for running functions in a web worker. | | useDarkMode | Synchronizes the UI theme with system preferences and persists overrides in localStorage. | | useDebouncedGeolocation | Throttles high-frequency geolocation updates so downstream effects run at a manageable cadence. |

5. User Interface & DOM

DOM-centric hooks for layout measurements, interactions, viewport tracking, and accessibility patterns.

| Hook | Description | | :--- | :--- | | useBreakpoint | Determines the currently active responsive breakpoint. | | useClickOutside | Detects clicks outside of a specified element. | | useClickOutsideWithEscape | Triggers a callback on a click outside an element or on pressing the 'Escape' key. | | useContextMenu | Manages the state for a custom context menu. | | useDebouncedMediaQuery | A useMediaQuery variant that debounces the result. | | useDebouncedWindowSize | A useWindowSize variant that provides debounced dimensions. | | useDrag | Provides basic drag-and-drop event handling for an element. | | useDraggable | Makes a DOM element draggable. | | useElementSize | Observes an element's size and provides its width and height. | | useFocusTrap | Traps focus within a specified container element. | | useFocusWithinState | Tracks whether an element or any of its descendants has focus. | | useHasBeenVisible | Tracks if an element has ever become visible in the viewport. | | useHover | Detects whether a DOM element is being hovered over. | | useHoverDelay | Tracks if an element has been hovered for a minimum specified duration. | | useImageOnLoad | Tracks the loading status and dimensions of an image. | | useInfiniteScroll | Implements infinite scrolling. | | useIntersectionObserver | Tracks the visibility of an element within the viewport. | | useMeasure | Tracks element dimensions using ResizeObserver. | | useMediaQuery | Tracks the state of a CSS media query. | | useMergeRefs | Merges multiple refs into a single callback ref. | | useMobile | Returns whether the current viewport is mobile-sized. | | useMousePosition | Tracks the current position of the mouse pointer. | | usePageLeave | Triggers a callback when the user's mouse cursor leaves the viewport. | | usePagination | Manages pagination state and controls. | | usePinchZoom | Detects pinch-to-zoom gestures on a target element. | | usePortal | Manages a React Portal. | | useResizeObserver | Monitors changes to an element's size using ResizeObserver. | | useRovingTabIndex | Implements the roving tabindex accessibility pattern. | | useScrollLock | Locks and unlocks body scroll. | | useScrollPosition | Tracks the scroll position of the window or a specific element. | | useScrollSpy | Monitors scroll position to determine which element is currently active. | | useScrollToTop | Provides a function to scroll the window to the top. | | useSwipe | Detects swipe gestures on a target element. | | useTextSelection | Tracks the user's text selection within the document. | | useVirtualList | Optimizes the rendering of long lists by only rendering visible items. | | useVisibility | Tracks whether an element is visible in the viewport. | | useWindowSize | Tracks the browser window's dimensions. | | useHookableRef | Combines refs with callbacks so consumers can observe element mount/unmount events. | | useIsomorphicId | Creates a stable ID that works consistently in SSR and CSR environments. |

6. Event Handling

Utilities that simplify attaching listeners, key combos, long presses, and history changes.

| Hook | Description | | :--- | :--- | | useEventListener | Attaches an event listener to a target element. | | useEventCallback | Creates a stable callback function that always calls the latest version of the provided callback. | | useKeyCombo | Detects specific keyboard combinations (shortcuts). | | useKeyPress | Detects when a specific key is pressed down. | | useLongPress | Detects long press events on an element. | | useRouteChange | Executes a callback when the browser's route changes. | | useThrottledEventListener | Attaches an event listener with a throttled callback. |

7. Performance & Optimization

Debounce/throttle utilities, RAF helpers, and render diagnostics that keep components snappy.

| Hook | Description | | :--- | :--- | | useDebounce | Debounces a value, delaying its update until a specified time has passed without change. | | useDebouncedCallback | Creates a debounced version of a callback function. | | useDebouncedState | A useState variant where the state updates are debounced. | | useForceUpdate | Provides a function to manually force a component to re-render. | | useRafCallback | Schedules a callback to be executed on the next animation frame. | | useRafState | A useState variant that updates state on the next animation frame. | | useRenderCount | Tracks the number of times a component has rendered. | | useRerender | Provides a function to manually trigger a re-render. | | useThrottle | Throttles a value, ensuring it updates at most once per specified interval. | | useThrottledCallback | Creates a throttled version of a callback function. | | useThrottledScroll | Tracks window scroll position with throttled updates. | | useThrottledState | A useState variant where state updates are throttled. | | useCustomCompareMemo | Memo variant that reruns its factory only when a custom comparator reports dependency changes. | | useSyncedRef | Keeps a mutable ref in sync with the latest value without re-rendering consumers. |

8. Forms

Form-centric hooks for managing inputs, validation, and lightweight i18n.

| Hook | Description | | :--- | :--- | | useForm | Manages form state, input changes, and submission handling. | | useFormValidation | Manages form state with built-in validation and submission logic. | | useTranslation | A basic internationalization (i18n) hook for translating form labels and messages. |

9. Timers & Intervals

Declarative abstractions over setTimeout and setInterval, including countdowns and idle timers.

| Hook | Description | | :--- | :--- | | useCountdown | Manages a countdown timer with start, pause, and reset controls. | | useIdleTimer | Detects user inactivity. | | useInterval | Sets up an interval that repeatedly calls a function. | | useIntervalWhen | An useInterval variant that only runs when a specific condition is true. | | useTimeout | Sets up a timeout that calls a function after a delay. |

10. Animation

Hooks powered by requestAnimationFrame for smooth motion primitives.

| Hook | Description | | :--- | :--- | | useAnimation | Manages a basic animation loop using requestAnimationFrame. | | useAnimationFrame | Runs a callback function repeatedly using requestAnimationFrame. |