Skip to content

Commit

Permalink
feat(createstore): support namespace
Browse files Browse the repository at this point in the history
  • Loading branch information
ArrayZoneYour committed Aug 3, 2021
1 parent 669c627 commit b0994bd
Show file tree
Hide file tree
Showing 7 changed files with 144 additions and 76 deletions.
127 changes: 81 additions & 46 deletions __test__/lane/lane.spec.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/// <reference path="../index.d.ts" />
import { renderHook, act } from '@testing-library/react-hooks'
import { createStore, useModel } from '../../src'
import { createStore, useModel, Model } from '../../src'

describe('lane model', () => {
test('single model', async () => {
Expand All @@ -14,16 +14,49 @@ describe('lane model', () => {
renderTimes += 1
return { renderTimes, count, setCount }
})
await act(async () => {

act(() => {
expect(result.current.renderTimes).toEqual(1)
expect(result.current.count).toBe(1)
})

act(() => {
result.current.setCount(5)
})

act(() => {
expect(renderTimes).toEqual(2)
expect(result.current.count).toBe(5)
})
})

test('create store with namespace', async () => {
const { useStore } = Model({})
createStore('Shared', () => {
const [count, setCount] = useModel(1)
return { count, setCount }
})

let renderTimes = 0
const { result } = renderHook(() => {
// @ts-ignore
const { count, setCount } = useStore('Shared')
console.group('count: ', count)
console.group('setCount: ', setCount)
renderTimes += 1
return { renderTimes, count, setCount }
})
act(() => {
expect(renderTimes).toEqual(1)
expect(result.current.count).toBe(1)
})

await act(async () => {
await result.current.setCount(5)
act(() => {
// @ts-ignore
result.current.setCount(5)
})

await act(() => {
act(() => {
expect(renderTimes).toEqual(2)
expect(result.current.count).toBe(5)
})
Expand All @@ -40,16 +73,17 @@ describe('lane model', () => {
renderTimes += 1
return { renderTimes, count, setCount }
})
await act(async () => {

act(() => {
expect(renderTimes).toEqual(1)
expect(result.current.count).toBe(1)
})

await act(async () => {
await result.current.setCount((count) => count + 1)
act(() => {
result.current.setCount((count) => count + 1)
})

await act(() => {
act(() => {
expect(renderTimes).toEqual(2)
expect(result.current.count).toBe(2)
})
Expand All @@ -67,25 +101,25 @@ describe('lane model', () => {
renderTimes += 1
return { renderTimes, count, setCount }
})
await act(async () => {
act(() => {
expect(renderTimes).toEqual(1)
expect(result.current.count).toBe(true)
})

await act(async () => {
await result.current.setCount(false)
act(() => {
result.current.setCount(false)
})

await act(() => {
act(() => {
expect(renderTimes).toEqual(2)
expect(result.current.count).toBe(false)
})

await act(() => {
act(() => {
rerender()
})

await act(() => {
act(() => {
expect(renderTimes).toEqual(3)
expect(result.current.count).toBe(false)
})
Expand All @@ -103,26 +137,26 @@ describe('lane model', () => {
renderTimes += 1
return { renderTimes, count, setCount, name, setName }
})
await act(async () => {
act(() => {
expect(renderTimes).toEqual(1)
expect(result.current.count).toBe(1)
})

await act(async () => {
await result.current.setCount(5)
act(() => {
result.current.setCount(5)
})

await act(() => {
act(() => {
expect(renderTimes).toEqual(2)
expect(result.current.count).toBe(5)
expect(result.current.name).toBe('Jane')
})

await act(async () => {
await result.current.setName('Bob')
act(() => {
result.current.setName('Bob')
})

await act(() => {
act(() => {
expect(renderTimes).toEqual(3)
expect(result.current.name).toBe('Bob')
expect(result.current.count).toBe(5)
Expand All @@ -147,26 +181,27 @@ describe('lane model', () => {
renderTimes += 1
return { renderTimes, count, setCount, name, setName }
})
await act(async () => {

act(() => {
expect(renderTimes).toEqual(1)
expect(result.current.count).toBe(1)
})

await act(async () => {
await result.current.setCount(5)
act(() => {
result.current.setCount(5)
})

await act(() => {
act(() => {
expect(renderTimes).toEqual(2)
expect(result.current.count).toBe(5)
expect(result.current.name).toBe('Jane')
})

await act(async () => {
await result.current.setName('Bob')
act(() => {
result.current.setName('Bob')
})

await act(() => {
act(() => {
expect(renderTimes).toEqual(3)
expect(result.current.name).toBe('Bob')
expect(result.current.count).toBe(5)
Expand All @@ -190,16 +225,16 @@ describe('lane model', () => {
renderTimes += 1
return { renderTimes, count, setCount }
})
await act(async () => {
act(() => {
expect(renderTimes).toEqual(2)
expect(mirrorResult.current.count).toBe(1)
})

await act(async () => {
await result.current.setCount(5)
act(() => {
result.current.setCount(5)
})

await act(() => {
act(() => {
expect(renderTimes).toEqual(4)
expect(mirrorResult.current.count).toBe(5)
})
Expand Down Expand Up @@ -234,46 +269,46 @@ describe('lane model', () => {
renderTimes += 1
return { renderTimes, data, setName, name, status, set }
})
await act(async () => {
act(() => {
expect(renderTimes).toEqual(2)
expect(mirrorResult.current.name).toBe('Jane')
})

await act(async () => {
await result.current.setData({ status: 'SUCCESS' })
act(() => {
result.current.setData({ status: 'SUCCESS' })
})

// Both component will rerender
// TODO: Only rerender second FC
await act(() => {
act(() => {
expect(renderTimes).toEqual(4)
expect(mirrorResult.current.data).toEqual({ status: 'SUCCESS' })
})

await act(async () => {
await mirrorResult.current.setName('Bob')
act(() => {
mirrorResult.current.setName('Bob')
})

await act(() => {
act(() => {
expect(renderTimes).toEqual(6)
expect(mirrorResult.current.name).toBe('Bob')
expect(mirrorResult.current.status).toBe(false)
})

await act(async () => {
await mirrorResult.current.set(true)
act(() => {
mirrorResult.current.set(true)
})

await act(() => {
act(() => {
expect(renderTimes).toEqual(7)
expect(mirrorResult.current.status).toBe(true)
})

await act(async () => {
await mirrorResult.current.setName('Jane')
act(() => {
mirrorResult.current.setName('Jane')
})

await act(() => {
act(() => {
expect(renderTimes).toEqual(9)
expect(mirrorResult.current.name).toBe('Jane')
expect(mirrorResult.current.status).toBe(true)
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "react-model",
"version": "4.1.0-alpha.2",
"version": "4.1.0-alpha.3",
"description": "The State management library for React",
"main": "./dist/react-model.js",
"module": "./dist/react-model.esm.js",
Expand Down
2 changes: 1 addition & 1 deletion src/global.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ let withDevTools = false

let uid = 0 // The unique id of hooks
let storeId = 0 // The unique id of stores
let currentStoreId = 0 // Used for useModel
let currentStoreId = '0' // Used for useModel

export default {
Actions,
Expand Down
4 changes: 4 additions & 0 deletions src/helper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,9 @@ const setPartialState = (
return Global.State
}

const get = <T>(p: Array<string | number>) => (o: T) =>
p.reduce((xs: any, key) => (xs && xs[key] ? xs[key] : null), o)

const timeout = <T>(ms: number, data: T): Promise<T> =>
new Promise((resolve) =>
setTimeout(() => {
Expand Down Expand Up @@ -150,6 +153,7 @@ export {
setPartialState,
shallowEqual,
timeout,
get,
getCache,
getInitialState
}
2 changes: 1 addition & 1 deletion src/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ interface Global {
withDevTools: boolean
uid: number
storeId: number
currentStoreId: number
currentStoreId: string
}

type ClassSetter = React.Dispatch<any> | undefined
Expand Down
Loading

0 comments on commit b0994bd

Please sign in to comment.