From 9fd02eb821c670c9f1684dca9a652d7cdd11a870 Mon Sep 17 00:00:00 2001 From: xobotyi Date: Wed, 30 Oct 2019 16:51:33 +0300 Subject: [PATCH] feat: react-like state resolver to use it in stateful hooks; --- src/__tests__/resolveHookState.ts | 26 ++++++++++++++++++++++++++ src/util/resolveHookState.ts | 18 ++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 src/__tests__/resolveHookState.ts create mode 100644 src/util/resolveHookState.ts diff --git a/src/__tests__/resolveHookState.ts b/src/__tests__/resolveHookState.ts new file mode 100644 index 0000000000..520136bf27 --- /dev/null +++ b/src/__tests__/resolveHookState.ts @@ -0,0 +1,26 @@ +import { resolveHookState } from '../util/resolveHookState'; + +describe('resolveHookState', () => { + it('should defined', () => { + expect(resolveHookState).toBeDefined(); + }); + + it(`should return value as is if it's not a function`, () => { + expect(resolveHookState(1)).toBe(1); + expect(resolveHookState('HI!')).toBe('HI!'); + expect(resolveHookState(undefined)).toBe(undefined); + }); + + it('should call passed function', () => { + const spy = jest.fn(); + resolveHookState(spy); + expect(spy).toHaveBeenCalled(); + }); + + it('should pass 2nd parameter to function', () => { + const spy = jest.fn(); + resolveHookState(spy, 123); + expect(spy).toHaveBeenCalled(); + expect(spy.mock.calls[0][0]).toBe(123); + }); +}); diff --git a/src/util/resolveHookState.ts b/src/util/resolveHookState.ts new file mode 100644 index 0000000000..a207afc99f --- /dev/null +++ b/src/util/resolveHookState.ts @@ -0,0 +1,18 @@ +export type StateSetter = (prevState: S) => S; +export type InitialStateSetter = () => S; + +export type InitialHookState = S | InitialStateSetter; +export type HookState = S | StateSetter; +export type ResolvableHookState = S | StateSetter | InitialStateSetter; + +export function resolveHookState(newState: S | InitialStateSetter): S; +export function resolveHookState(newState: Exclude, StateSetter>, currentState: S): S; +// tslint:disable-next-line:unified-signatures +export function resolveHookState(newState: StateSetter, currentState: S): S; +export function resolveHookState(newState: ResolvableHookState, currentState?: S): S { + if (typeof newState === 'function') { + return (newState as Function)(currentState); + } + + return newState as S; +}