From 4faedc23ce2d0198661b5f30fe990191a6b4b7ea Mon Sep 17 00:00:00 2001 From: Jerko Steiner Date: Thu, 1 Aug 2019 19:03:10 +0700 Subject: [PATCH] WIP: Add ability to define reducer handlers --- packages/jsonrpc/src/redux.test.ts | 25 ++++++++++++++++++++++++- packages/jsonrpc/src/redux.ts | 19 +++++++++++++++++++ packages/jsonrpc/src/types.ts | 7 +++++++ 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/packages/jsonrpc/src/redux.test.ts b/packages/jsonrpc/src/redux.test.ts index 4b666b5..177e7b7 100644 --- a/packages/jsonrpc/src/redux.test.ts +++ b/packages/jsonrpc/src/redux.test.ts @@ -7,7 +7,7 @@ import express from 'express' import {AddressInfo} from 'net' import {Server} from 'http' import {TPendingActions, TAllActions} from './types' -import {createReduxClient, createReducer} from './redux' +import {createReduxClient, createReducer, createReducer2} from './redux' import {createRemoteClient} from './remote' import {createStore} from '@rondo/client' import {jsonrpc} from './express' @@ -107,6 +107,29 @@ describe('createReduxClient', () => { } }) + const reducer2 = createReducer2('myService', defaultState) + ({ + add(state, action) { + const s: Partial = { + // a: 1, + add: action.payload, + } + return s + }, + addAsync(state, action) { + return state + }, + addAsyncWithContext(state, action) { + return state + }, + addStringsAsync(state, action) { + return state + }, + addWithContext(state, action) { + return state + }, + }) + const store = createStore({reducer})() function handleAction(state: any, action: AllActions) { diff --git a/packages/jsonrpc/src/redux.ts b/packages/jsonrpc/src/redux.ts index d4f8e87..30ee815 100644 --- a/packages/jsonrpc/src/redux.ts +++ b/packages/jsonrpc/src/redux.ts @@ -4,6 +4,7 @@ import { TReduxed, TResolvedActions, TAllActions, + TReduxHandlers, } from './types' import {createRemoteClient} from './remote' @@ -62,3 +63,21 @@ export const createReducer = ( error: '', }, action) } + +export const createReducer2 = ( + actionType: ActionType, + defaultState: State, +) => >( + handlers: TReduxHandlers, +) => { + return createReducer(actionType, defaultState)((state, action) => { + if (action.method in handlers) { + const newState = handlers[action.method](state, action) + return { + ...state, + newState, + } + } + return state + }) +} diff --git a/packages/jsonrpc/src/types.ts b/packages/jsonrpc/src/types.ts index 60d5f0e..f318099 100644 --- a/packages/jsonrpc/src/types.ts +++ b/packages/jsonrpc/src/types.ts @@ -22,6 +22,13 @@ export type TReduxed = { IRPCPendingAction>>, ActionType, K> } +export type TReduxHandlers = { + [K in keyof T]: ( + state: State, + action: TResolved>>, + ) => Partial +} + export interface IRPCPendingAction< T, ActionType extends string, Method extends string | number | symbol > extends IPendingAction {