@sigi/react
Version:
React bindings for sigi framework
53 lines (46 loc) • 1.17 kB
text/typescript
import { Effect, EffectModule, ImmerReducer, Module } from '@sigi/core'
import { Draft } from 'immer'
import { endWith, map, mergeMap, Observable, switchMap, timer } from 'rxjs'
interface State {
count: number
name: string
}
('CountModule')
export class CountModule extends EffectModule<State> {
defaultState = { count: 0, name: '' }
()
setCount(state: Draft<State>, count: number) {
state.count = count
}
()
setName(state: Draft<State>, name: string) {
state.name = name
}
({
ssr: true,
})
getCount(payload$: Observable<void>) {
return payload$.pipe(
mergeMap(() =>
timer(20).pipe(
map(() => this.getActions().setCount(1)),
endWith(this.terminate()),
),
),
)
}
({
payloadGetter: (ctx: { url: string }, skip) => ctx.url || skip,
skipFirstClientDispatch: false,
})
skippedEffect(payload$: Observable<string>) {
return payload$.pipe(
switchMap((name) =>
timer(20).pipe(
map(() => this.getActions().setName(name)),
endWith(this.terminate()),
),
),
)
}
}