1.0.7 • Published 3 years ago

react-context-storage v1.0.7

Weekly downloads
9
License
MIT
Repository
github
Last release
3 years ago

react-context-storage

This is a very lightweight(~5kb) alternative to Redux store based on React Context API. Supports multiple storages, reducers, saving to LocalStorage and SessionStorage.

Installation

npm install react-context-storage

Requirements

React v^16.9.0

API

withStorageProvider

withStorageProvider(
{
  storageName: string, // Name of your storage
  defaultValues: object, // Default state of your storage
  reducer: (state: object, action: { type: string, value: any }) => object, // Reducer that takes in storage state, modifies it based on action type and returns a new state
  useSession: boolean, // Save storage to SessionStorage and retrieve it next time by storageName
  useLocal: boolean, // Save storage to LocalStorage and retrieve it next time by storageName
}
)(
  Provider: React.ComponentType // This component will provide Storage access to the child components
)

withStorage

withStorage(
  storageName: string
)(
  Consumer: React.ComponentType // Storage will be passed to this component via "context" prop
)

Usage

Please check out src/sample-app for a live demo.

import React from 'react';
import { withStorageProvider, withStorage } from 'react-context-storage';
import { INCREMENT_COUNTER } from './actions';
import { counterReducer } from './reducers';

const storageName = 'counter-storage';
const defaultValues = {
  counter: 0,
};
const useSession = true;
const useLocal = false;

/* 
Consumer component that will have a "context" prop which contains:
  storage - storage object
  dispatch - function that dispatches an action which gets passed into reducer
*/
const Consumer = ({
  context: {
    storage: { counter },
    dispatch,
  },
}) => {
  const onClick = () => dispatch({ type: INCREMENT_COUNTER, value: 1 });
  return (
    <>
      <button type="submit" onClick={onClick}>
        Increment counter
      </button>
      <p>{`Counter value: ${counter}`}</p>
    </>
  );
};

/*
Wraps Consumer component with Storage.
*/
const ConsumerWithStorage = withStorage(storageName)(Consumer);

/*
Should be wrapped with Storage Provider.
*/
const App = () => (
  <>
    <h2>Counter App</h2>
    <ConsumerWithStorage />
  </>
);

/* 
Wraps parent component with Storage Provider allowing using Storage in children components.
Pass in your reducer to handle actions dispatched in Consumer components.
*/
export const AppWithStorageProvider = withStorageProvider({
  storageName,
  defaultValues,
  reducer: counterReducer,
  useSession,
  useLocal,
})(App);

License

Copyright (c) 2020 Aleksandr Novikov. MIT License.

1.0.7

3 years ago

1.0.6

4 years ago

1.0.5

4 years ago

1.0.4

4 years ago

1.0.3

4 years ago

1.0.2

4 years ago

1.0.1

4 years ago

1.0.0

4 years ago