Skip to content

Commit

Permalink
feat: support setValue & setValues pass function
Browse files Browse the repository at this point in the history
  • Loading branch information
chnliquan committed Jul 12, 2021
1 parent bc80cd3 commit 7877f83
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 16 deletions.
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

35 changes: 23 additions & 12 deletions src/core/Model.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -132,12 +132,9 @@ export class Model<C extends ModelConfig> {
)

const state = mapStateToModel(model.state)
model.state = state

return {
state,
reducers: model.reducers,
effects: model.effects,
}
return model
}

private produceState(state: C['state'], reducer: ConfigReducer, payload: any = []): C['state'] {
Expand Down Expand Up @@ -184,9 +181,17 @@ export class Model<C extends ModelConfig> {
// internal reducer setValue
if (!reducers.setValue) {
reducers.setValue = (key, value): void => {
const newState = this.produceState(this.model.state, draft => {
draft[key] = value
})
let newState

if (isFunction(value)) {
newState = this.produceState(this.model.state, draft => {
draft[key] = value(this.model.state[key])
})
} else {
newState = this.produceState(this.model.state, draft => {
draft[key] = value
})
}

this.model.state = newState
this.notify('setValue', newState)
Expand All @@ -196,11 +201,17 @@ export class Model<C extends ModelConfig> {
// internal reducer setValues
if (!reducers.setValues) {
reducers.setValues = (partialState): void => {
const newState = this.produceState(this.model.state, draft => {
Object.keys(partialState).forEach(key => {
draft[key] = partialState[key]
let newState

if (isFunction(partialState)) {
newState = partialState(this.model.state)
} else {
newState = this.produceState(this.model.state, draft => {
Object.keys(partialState).forEach(key => {
draft[key] = partialState[key]
})
})
})
}

this.model.state = newState

Expand Down
1 change: 1 addition & 0 deletions src/core/Store.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,7 @@ export class Store<C extends Configs> {
return WithModels
}
}

public getState(): ModelState<C>
public getState<K extends keyof C>(modelName: K): C[K]['state']
public getState<K extends keyof C>(modelName?: K) {
Expand Down
14 changes: 12 additions & 2 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,19 @@ interface ModelEffectState {
readonly loading: boolean
}

interface BuildInReducerSetValue<S = any> {
<K extends keyof S>(key: K, value: (prevState: S[K]) => S[K]): void
<K extends keyof S>(key: K, value: S[K]): void
}

interface BuildInReducerSetValues<S = any> {
(state: (prevState: S) => S): void
(partialState: Partial<S>): void
}

interface BuildInReducers<S = any> {
setValue: <K extends keyof S>(key: K, value: S[K]) => void
setValues: (state: Partial<S>) => void
setValue: <K extends keyof S>(key: K, value: S[K] | ((prevState: S[K]) => S[K])) => void
setValues: (state: Partial<S> | ((prevState: S) => S)) => void
reset: <K extends keyof S>(key?: K) => void
}

Expand Down
2 changes: 1 addition & 1 deletion test/reducer.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ describe('reducer test', () => {
result.current.reducers.setValue('data', 1)
})

expect(result.current.state.data).toBeUndefined()
expect(result.current.state.data).toBe(1)
})

it('should provider build-in reducers when no customize passed', () => {
Expand Down

0 comments on commit 7877f83

Please sign in to comment.