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 🙏

© 2024 – Pkg Stats / Ryan Hefner

react-dynamic-hooks

v1.0.3

Published

'react-dynamic-hooks' is a set of React hooks designed to handle infinite scrolling, manage cookie state, manage storage state (both session and local storage), retrieve user location, and copy text to the clipboard. These hooks aim to simplify common tas

Downloads

10

Readme

React Dynamic Hooks

react-dynamic-hooks is a set of React hooks for handling infinite scrolling, cookie state management, storage state management (session and local storage), geolocation, and clipboard copying. These hooks aim to simplify common tasks in React applications.

Table Content

Installation

Install the package using npm or yarn:

npm install react-dynamic-hooks

or

yarn add react-dynamic-hooks

Hooks

useInfinityScroller

This hook takes care of infinite scrolling logic, allowing you to focus on rendering data and handling loading states.

Parameters :

  • scrollContainerRef : A reference to the scroll container element.
  • setData : Function to set the fetched data.
  • fetchData : Async function to fetch data. It should accept a page number as an argument.
  • page : The current page number.
  • setPage : Function to update the page number.
  • loadTriggerOffset(optional): Offset from the bottom to trigger the load more action. Default is 50.

Returns :

  • isLoading : Boolean indicating if data is being loaded.
  • hasMore : Boolean indicating if there are more items to load.
import React, { useRef, useState } from "react";
import { useInfinityScroller } from "react-dynamic-hooks";

const MyComponent = () => {
    const [data, setData] = useState([]);
    const [page, setPage] = useState(1);
    const containerRef = useRef(null);

    const fetchData = async (page) => {
        // Ensure to pass the "page" parameter (you can name it as you like) to fetch the corresponding data.

        try {
            const response = await fetch(
                `https://jsonplaceholder.typicode.com/todos?_page=${page}&_limit=10`
            );

            const jsonData = await response.json();
            return jsonData; // Must return data(Array)
        } catch (error) {
            console.log(error); //Handle errors
            return []; // Return empty array in case of error
        }
    };

    const { isLoading, hasMore } = useInfinityScroller(
        containerRef,
        setData,
        fetchData,
        page,
        setPage
    );

    return (
        <div
            className=""
            style={{
                display: "grid",
                placeItems: "center",
                height: "90vh",
                width: "90vw",
            }}
        >
            <div
                className=""
                style={{
                    overflowY: "auto",
                    height: "40vh",
                    width: "40vw",
                    background: "aliceblue",
                    padding: "10px",
                }} //overflowY must be 'auto' or 'scroll' (other than 'hidden')
                //Giving height is also necessary for this div
                ref={containerRef}
            >
                {data &&
                    data.length > 0 &&
                    data.map((d, index) => (
                        <div key={index} style={{ marginBottom: "10px" }}>
                            <div className="">{d.id} id</div>
                            <div className="">{d.userId} userId</div>
                        </div>
                    ))}
            </div>
        </div>
    );
};

useAsyncEffect

A hook for using asynchronous functions in useEffect. This hook is similar to useEffect only change is in this hook we can pass Async function.

Parameters :

  • effect : Async function to run
  • deps : Dependency array (Optional) (default : [] )
import { useAsyncEffect } from "react-dynamic-hooks";

const ExampleComponent = () => {
    useAsyncEffect(async () => {
        const data = await fetchData();
        console.log(data);
    }, []);

    return <div>Check the console for data</div>;
};

useCookieState

useCookieState acts like useState for cookies. It returns a funtion to update that cookie state.

Parameters :

  • key : The name of the cookie
  • defaultValue : The initial value to use if the cookie doesn't exist. It's optional.

Returns :

  • [value, setValue] : The current value and a function to update that cookie.
import { useCookieState } from "react-dynamic-hooks";

const MyComponent = () => {
    const [token, setToken] = useCookieState("authToken", null); //If cookie not exist then set to null

    return (
        <>
            {!token ? (
                <>
                    <h1>User is logged in</h1>
                </>
            ) : (
                <>
                    <h1>Please login</h1>
                </>
            )}
        </>
    );
};

There is also two additional functions for your convenience :

setCookie

Parameters :

  • name : The name of the cookie
  • value : Value of the cookie
  • options(Optional) : Options for cookie like expires, path, domain, secure, httpOnly, maxAge, sameSite
setCookie("authToken", token);

getCookie

Parameters :

  • name : The name of the cookies

Returns :

  • value : Cookie value or null if not exist
getCookie("authToken");

useCopyToClipboard

A hook for copying text to the clipboard.

Parameters :

  • text : The text you want to copy to the clipboard.

Returns :

  • Promise<boolean> : A promise that resolves to true if the text was successfully copied, otherwise false.
import React, { useState } from "react";
import { useCopyToClipboard } from "react-dynamic-hooks";

const CopyTextComponent = () => {
    const [text, setText] = useState("");
    const [copyStatus, setCopyStatus] = useState(null);

    const handleCopy = async () => {
        const result = await useCopyToClipboard(text);
        setCopyStatus(result ? "Copied!" : "Failed to copy.");
    };

    return (
        <div>
            <input
                type="text"
                value={text}
                onChange={(e) => setText(e.target.value)}
                placeholder="Enter text to copy"
            />
            <button onClick={handleCopy}>Copy to Clipboard</button>
            {copyStatus && <p>{copyStatus}</p>}
        </div>
    );
};

export default CopyTextComponent;

useGeolocation

useGeolocation is a custom React hook for accessing the user's geolocation. It handles obtaining and watching the user's position, managing loading state, and handling errors.

Parameters :

  • options (optional): An object with options for the geolocation API. These options can include:
    • enableHighAccuracy: A boolean indicating whether to request the most accurate location possible. Default is false.
    • timeout: The maximum length of time (in milliseconds) the device is allowed to take in order to return a position. Default is Infinity.
    • maximumAge: The maximum age (in milliseconds) of a possible cached position that is acceptable to return. Default is 0.

Returns :

  • loading: A boolean indicating whether the geolocation data is still being fetched.
  • error: An error object if there was an error while fetching the geolocation data.
  • data: An object containing the geolocation coordinates (latitude, longitude, etc.) of the user.
import React from "react";
import { useGeolocation } from "react-dynamic-hooks";

const GeolocationComponent = () => {
    const { loading, error, data } = useGeolocation({
        enableHighAccuracy: true,
    });

    if (loading) return <p>Loading...</p>;
    if (error) return <p>Error: {error.message}</p>;

    return (
        <div>
            <h1>User Location</h1>
            <p>Latitude: {data.latitude}</p>
            <p>Longitude: {data.longitude}</p>
            <p>Accuracy: {data.accuracy} meters</p>
        </div>
    );
};

export default GeolocationComponent;

useLocalStorageState

useLocalStorageState behaves like useState for local storage. It retrieves a value from local storage based on a key, and automatically updates your component's state when the value changes. This allows your component to stay in sync with local storage data.

Parameters :

  • key : The name of the key in localstorage
  • defaultValue : The initial value to use if the key doesn't exist in localstorage. It's optional.

Returns :

  • [value, setValue] : The current value and a function to update that localstorage item.
import { useLocalStorageState } from "react-dynamic-hooks";

const MyComponent = () => {
    const [theme, setTheme] = useLocalStorageState("theme", 'light'); //If theme not exist then set to light

    return (
        <>
            <div className=`${theme}`>
                //Component
            </div>
        </>
    );
};

useSessionStorageState

useSessionStorageState behaves like useState for session storage. It retrieves a value from session storage based on a key, and automatically updates your component's state when the value changes. This allows your component to stay in sync with session storage data.

Parameters :

  • key : The name of the key in session storage
  • defaultValue : The initial value to use if the key doesn't exist in session storage

Returns :

  • [value, setValue] : The current value and a function to update that session storage item.
import { useSessionStorageState } from "react-dynamic-hooks";

const MyComponent = () => {
    const [theme, setTheme] = useSessionStorageState("theme", 'light'); //If theme not exist then set to light

    return (
        <>
            <div className=`${theme}`>
                //Component
            </div>
        </>
    );
};

License

MIT

Authors