0.7.2 ā€¢ Published 5 months ago

react-persistent-state-hook v0.7.2

Weekly downloads
-
License
MIT
Repository
github
Last release
5 months ago

react-persistent-state-hook

usePersistentState(value, storageKey, options): [value, setValue, purgeValue]

Build status npm bundle size License Version status

šŸ’”šŸ§  A React useState() replacement with built-in persistence with Web Storage API. First-class TypeScript support šŸ’Ŗ

yarn add react-persistent-state-hook # or npm, pnpm, bun, etc.
// It works just like magic šŸŒŸ
const [name, setName] = usePersistentState("John", "user-name")

// For more safety, provide a UNIQUE storageKey (strongly recommended šŸ’Ŗ)
const [name, setName] = usePersistentState("Billy", "ui/userAuth/name")

// For more versatility, use ENUMs as keys
const [name, setName] = usePersistentState("Tim", StorageKeys.USER_NAME)

Table of contents:

  1. Key Features
  2. Usage
  3. Options API
  4. Roadmap
  5. Contributing

Key Features

usePersistentState adds persistence to React.useState method:

  1. šŸ£ Plug'n'play with Minimal Configuration:

    A simple replacement for React.useState hook - provide a unique key and you're good to go!

  2. šŸ§  Data Persistence:

    Store state values in localStorage or sessionStorage. Until version 2, we only support Web Storage API, but more are coming.

  3. ā™»ļø Platform-Agnostic:

    usePersistentState gracefully handles scenarios where Web Storage is not available, behaving exactly like React.useState.

  4. šŸ“­ No Dependencies:

    Keep your project light - no dependencies and a single peer dependency (react >= 16.8).

  5. šŸ§‘ā€šŸ’» First-class TypeScript Support:

    Fully typed with TypeScript! šŸŽ‰

  6. šŸš§ Roadmap for Continuous Improvement:

    • The roadmap outlines upcoming features and enhancements, ensuring your state management needs are met.
  7. šŸ“š Documentation and Tutorials:

    Straight-forward readme with examples and comprehensive JSDoc annotations for the hook and its options.

RPSH is committed to delivering a minimal and flexible solution for state management and persistence in React applications. Join me on this journey by contributing! šŸš€


Usage

Start by importing the hook:

import { usePersistentState } from "react-persistent-state-hook"

Basic usage

// Replace React.useState without breaking functionality - uses `localStorage`
const [count, setCount] = usePersistentState(0, "count")
const [count, setCount] = usePersistentState(() => 0, "count")

// Easy switching between local and session storages
const [count, setCount] = usePersistentState(0, "unique-key", "local")
const [count, setCount] = usePersistentState(0, "unique-key", "session")

// Configurable with options API
const [count, setCount] = usePersistentState(0, "unique-key", { verbose: true, persistent: false })

šŸ’” Possible state management replacement (like context or Redux) with zero configuration in situations where data loss is acceptable (like UI preferences). ā˜ļø

// You can use your own prefixes to group related keys and prevent conflicts
const [count, setCount] = usePersistentState(0, "count", { prefix: "ui/homepage" })

Advanced usage

šŸ’” You can create a custom usePersistentState hook with default options easily to share or persist configuration values across your application or different contexts:

import { createPersistentStateHook } from "react-persistent-state-hook"

// Create your own hook with defaults
export const useMyPersistentState = createPersistentStateHook({
  storageType: "session",
  prefix: "homepage/pagination",
})

// Usage - you can still override default options
const [page, setPage] = useMyPersistentState(1, "page")

Options API

The Options API in react-persistent-state-hook allows you to tweak the behavior of the hook. More configuration options are coming soon in minor releases.

Breaking changes in the Options API or elsewhere in react-persistent-state-hook are only released in major versions šŸ¤ž

type Options = {
  /** Print all warnings and errors in console. Overrides `silent` option.
   *  @default false */
  verbose: boolean

  /** The type of Web Storage API to use (either "session" or "local").
   *  @default "local" */
  storageType: StorageType

  /** Allow programatically enabling and disabling persistence in-place.
   *  @default true */
  persistent: boolean

  /** Allow the use of custom key prefix - group contexts or invalidate state version.
   *  @default "[rpsh]" */
  prefix: string
}

Roadmap

Current Plans (v1.0.0 Release):

  • Resolution Strategies ?
    • Add option to always override with new value, prefer stored value, or use stored if new value is undefined (default)
  • 1.0.0 Release šŸŽ‰
    • Freeze the main branch and move development to dev-v1.x branches, that eventually get merged into main as PRs. We need to act responsible šŸ‘Øā€šŸ«

Planned Improvements

  • More Storage Types
    • Add support for IndexedDB, AsyncStorage (React Native), URL params, cookies, etc.
  • Even Smaller Footprint
    • Reduce bundle size as much as possible
  • Custom Serialization and Deserialization Methods
    • Add the ability to configure your own serialization and deserialization functions instead of relying on JSON.stringify and JSON.parse - for example to support Date and custom objects
  • Open-source Friendliness
    • Add a CONTRIBUTING.md file to make it easier for contributors to get started, link to it from README.md
    • Provide a solid tutorial for contributors, set up PR template, issue template, etc.
  • Storage Adapters API
    • Say goodbye to Web Storage API as a core feature and say hello to storage adapters API. More flexibility, more possibilities! šŸ”„
    • Implement Web Storage and in-memory storage as exported storage adapter functions / objects

Contributing

Start a new issue whenever you have any questions, problems or suggestions! Or feel free to open a pull request if you want to contribute. To increase the speed of getting your PR merged, please open an issue first to discuss your idea.

More info coming soon.

0.7.2

5 months ago

0.7.1

5 months ago

0.7.0

5 months ago

0.14.0

8 months ago

0.13.0

8 months ago

0.12.2

8 months ago

0.12.1

8 months ago

0.12.0

8 months ago

0.10.1

8 months ago

0.9.10

8 months ago

0.9.9

8 months ago

0.9.8

8 months ago

0.9.7

8 months ago

0.9.6

8 months ago

0.9.5

8 months ago

0.9.4

8 months ago

0.9.2

8 months ago

0.9.1

8 months ago

0.9.0

8 months ago