From 4a68461e76a219342112bfd4df5342996ced2cce Mon Sep 17 00:00:00 2001 From: AnatoleLucet Date: Wed, 4 Nov 2020 12:14:44 +0100 Subject: [PATCH] feat: add persist middleware --- src/middleware.ts | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/src/middleware.ts b/src/middleware.ts index d532e2bcba..5cbad4b13e 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -1,10 +1,10 @@ import { - State, GetState, - SetState, - StoreApi, PartialState, + SetState, + State, StateCreator, + StoreApi, } from './vanilla' export const redux = ( @@ -116,3 +116,35 @@ export const combine = < api as StoreApi ) ) + +type StateStorage = { + getItem: (key: string) => string | null | Promise + setItem: (key: string, value: string) => void | Promise +} + +export const persist = ( + name: string, + config: StateCreator, + storage: StateStorage = localStorage +) => (set: SetState, get: GetState, api: StoreApi): S => { + const state = config( + (payload) => { + set(payload) + + storage.setItem(name, JSON.stringify(get())) + }, + get, + api + ) + + ;(async () => { + try { + const storedState = await storage.getItem(name) + if (storedState) set(JSON.parse(storedState)) + } catch (e) { + console.error(new Error(`Unable to get to stored state in "${name}"`)) + } + })() + + return state +}