# hooked-on-storage

> Store and rehydrate values in storage.

Latest version **0.1.0** (published 2020-05-04) · MIT license · 0 weekly downloads

## Install

```sh
npm install hooked-on-storage
pnpm add hooked-on-storage
yarn add hooked-on-storage
bun add hooked-on-storage
```

## Health

**Score 30/100 (F)** — status: abandoned.

Positive: has types; esm support; no vulnerabilities; high quality score.

Warnings: low downloads; pre 1.0.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 0.1.0 |
| Published | 2020-05-04 |
| First published | 2020-05-04 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Dependencies | 0 |
| Unpacked size | 55.7 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 1 |
| Maintainers | rzane |

## Links

- npm: https://www.npmjs.com/package/hooked-on-storage
- Repository: https://github.com/rzane/hooked-on-storage
- npm.io page: https://npm.io/package/hooked-on-storage

## Recent versions

- 0.1.0 (latest) — 2020-05-04

## README

<h1 align="center">Hooked on Storage</h1>

<div align="center">

![Build](https://github.com/rzane/hooked-on-storage/workflows/CI/badge.svg)
![Version](https://img.shields.io/npm/v/hooked-on-storage)
![Size](https://img.shields.io/bundlephobia/minzip/hooked-on-storage)
![License](https://img.shields.io/npm/l/hooked-on-storage)

</div>

A React hook to provide efficient access to properties in storage. It is compatible with the following storage adapters:

- [`localStorage`](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage)
- [`sessionStorage`](https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage)
- [`@react-native-community/async-storage`](https://github.com/react-native-community/async-storage)

## Install

This package can be installed from NPM.

```sh
$ yarn add hooked-on-storage
```

## Usage

### 1. Create a stored property with `createStorage`

First, you'll need to declare a stored property:

```typescript
import { createStorage } from "hooked-on-storage";

const counter = createStorage<number>({
  key: "count",
  adapter: localStorage,
  defaultValue: 0,
});
```

The `counter` provides some conveniences over using `localStorage` directly. Keep in mind that if you directly modify a value in `localStorage` or your components won't rerender.

#### Set the value

The value will automatically be serialized using `JSON.stringify` before being inserted into storage. You can customize this behavior by specifing the `parse` option.

```typescript
await counter.set(1);
```

#### Get the current value

The value will automatically be deserialized using `JSON.parse`. You can customize this behavior by specifing the `parse` option.

If the value does not exist in storage, the `defaultValue` will be returned.

```typescript
await counter.get();
```

#### Remove the value

```typescript
await counter.remove();
```

#### Subscribe to changes

```typescript
counter.onChange((value) => {
  console.log("changed:", value);
});
```

### 2: Setup the `<StorageProvider />`

At the top of your component tree, you'll need to define a provider for your storage.

```jsx
import { StorageProvider, Hydrated } from "hooked-on-storage";

ReactDOM.render(
  <StorageProvider hydrate={[counter]}>
    <h1>Counter</h1>

    <Hydrated fallback={<p>Hydrating...</p>}>
      <Counter />
    </Hydrated>
  </StorageProvider>
);
```

Using the `<Hydrated />` component is entirely optional. It allows us to render
a loading screen while we load the values from storage.

### Step 3: Use a stored property with `useStorage`

```jsx
import { useStorage } from "hooked-on-storage";

const Counter = () => {
  const [count, setCount, hydrated] = useStorage(counter);
  const decrement = () => setCount(count - 1);
  const increment = () => setCount(count + 1);

  // Because we used `<Hydrated />` above, this will never be false.
  if (!hydrated) {
    return <p>Hydrating...</p>;
  }

  return (
    <div>
      <h4>{count}</h4>
      <button onClick={increment}>-</button>
      <button onClick={decrement}>+</button>
    </div>
  );
};
```

---
_Source: https://npm.io/package/hooked-on-storage · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
