Skip to content

Commit

Permalink
fix(selector): add shallowEqual and fix types issue
Browse files Browse the repository at this point in the history
  • Loading branch information
ArrayZoneYour committed May 19, 2020
1 parent 08a2084 commit 5134373
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 17 deletions.
28 changes: 28 additions & 0 deletions src/helper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -116,11 +116,39 @@ const getCache = (modelName: string, actionName: string) => {
return JSONString ? JSON.parse(JSONString) : null
}

const shallowEqual = (objA: any, objB: any) => {
if (objA === objB) return true
if (
typeof objA !== 'object' ||
objA === null ||
typeof objB ||
objB === null
) {
return false
}
const keysA = Object.keys(objA)
const keysB = Object.keys(objB)

if (keysA.length !== keysB.length) return false

for (let i = 0; i < keysA.length; i++) {
if (
!Object.prototype.hasOwnProperty.call(objB, keysA[i]) ||
objA[keysA[i]] !== objB[keysA[i]]
) {
return false
}
}

return true
}

export {
Consumer,
consumerActions,
GlobalContext,
setPartialState,
shallowEqual,
timeout,
getCache,
getInitialState
Expand Down
20 changes: 9 additions & 11 deletions src/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -120,11 +120,16 @@ type Selector<S, R> = (state: S) => R
interface API<MT extends ModelType = ModelType<any, any, {}>> {
__id: string
__ERROR__?: boolean
useStore: <F extends Selector<Get<MT, 'state'>, any>>(
useStore: <
F extends Selector<Get<MT, 'state'>, any> = Selector<
Get<MT, 'state'>,
unknown
>
>(
selector?: F
) => [
F extends Selector<Get<MT, 'state'>, any>
? Equals<F, Selector<Get<MT, 'state'>, any>> extends true
? Equals<F, Selector<Get<MT, 'state'>, unknown>> extends true
? Get<MT, 'state'>
: ReturnType<F>
: Get<MT, 'state'>,
Expand All @@ -142,19 +147,12 @@ interface API<MT extends ModelType = ModelType<any, any, {}>> {
}

interface APIs<M extends Models> {
useStore: // | (<K extends keyof M>(
// name: K
// ) => M[K] extends API
// ? ReturnType<Get<M[K], 'useStore'>>
// : M[K] extends ModelType
// ? [Get<M[K], 'state'>, getConsumerActionsType<Get<M[K], 'actions'>>]
// : any)
<
useStore: <
K extends keyof M,
S extends M[K] extends API
? ArgumentTypes<Get<M[K], 'useStore'>>[1]
: M[K] extends ModelType
? Selector<Get<M[K], 'state'>, any>
? Selector<Get<M[K], 'state'>, unknown>
: any
>(
name: K,
Expand Down
13 changes: 7 additions & 6 deletions src/middlewares.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { getCache, setPartialState, timeout } from './helper'
import { getCache, setPartialState, timeout, shallowEqual } from './helper'
// -- Middlewares --

const config: MiddlewareConfig = {
Expand Down Expand Up @@ -152,11 +152,12 @@ const communicator: Middleware = async (context, restMiddlewares) => {
if (setter) {
if (!setter.selector) {
setter.setState(Global.State[modelName])
} else if (
setter.selector(Global.State[modelName]) !== setter.selectorRef
) {
setter.selectorRef = setter.selector(Global.State[modelName])
setter.setState(Global.State[modelName])
} else {
const newSelectorRef = setter.selector(Global.State[modelName])
if (!shallowEqual(newSelectorRef, setter.selectorRef)) {
setter.selectorRef = newSelectorRef
setter.setState(Global.State[modelName])
}
}
}
})
Expand Down

0 comments on commit 5134373

Please sign in to comment.