@sigi/react
Version:
React bindings for sigi framework
64 lines (56 loc) • 1.39 kB
text/typescript
import { Effect, EffectModule, ImmerReducer, Module } from '@sigi/core'
import { Injectable } from '@sigi/di'
import { Draft } from 'immer'
import { endWith, map, mergeMap, Observable, of, switchMap } from 'rxjs'
()
export class Service {
getName() {
return of('client service')
}
}
interface State {
count: number
name: string
}
('ServiceModule')
export class ServiceModule extends EffectModule<State> {
readonly defaultState = { count: 0, name: '' }
constructor(public readonly service: Service) {
super()
}
()
setName(state: Draft<State>, name: string) {
state.name = name
}
({
ssr: true,
})
setNameEffect(payload$: Observable<void>) {
return payload$.pipe(
switchMap(() =>
this.service.getName().pipe(
map((name) => this.getActions().setName(name)),
endWith(this.terminate()),
),
),
)
}
({
payloadGetter: (ctx: { failure: boolean }, skip) => {
if (!ctx.failure) {
return skip
}
return 1
},
})
setNameWithFailure(payload$: Observable<number | undefined>) {
return payload$.pipe(
mergeMap((p) => {
if (p) {
return of(this.retryOnClient().setNameWithFailure(), this.terminate())
}
return of(this.getActions().setName('From retry'))
}),
)
}
}