Skip to content

Commit 0c8bb69

Browse files
authored
Merge pull request #115 from OBe95/fix/event-callback-observables-order
Reverse EventCallback state$ and inputs$ order
2 parents 8ed1dae + 45cf257 commit 0c8bb69

File tree

6 files changed

+29
-21
lines changed

6 files changed

+29
-21
lines changed

README.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ function App() {
8080
type RestrictArray<T> = T extends any[] ? T : []
8181
type InputFactory<State, Inputs = undefined> = Inputs extends undefined
8282
? (state$: Observable<State>) => Observable<State>
83-
: (inputs$: Observable<RestrictArray<Inputs>>, state$: Observable<State>) => Observable<State>
83+
: (state$: Observable<State>, inputs$: Observable<RestrictArray<Inputs>>) => Observable<State>
8484

8585
declare function useObservable<State>(inputFactory: InputFactory<State>): State | null
8686
declare function useObservable<State>(inputFactory: InputFactory<State>, initialState: State): State
@@ -140,7 +140,7 @@ import { of } from 'rxjs'
140140
import { map } from 'rxjs/operators'
141141
142142
function App(props: { foo: number }) {
143-
const value = useObservable((inputs$) => inputs$.pipe(
143+
const value = useObservable((_, inputs$) => inputs$.pipe(
144144
map(([val]) => val + 1),
145145
), 200, [props.foo])
146146
return (
@@ -202,8 +202,8 @@ type EventCallback<EventValue, State, Inputs> = Inputs extends void
202202
? (eventSource$: Observable<EventValue>, state$: Observable<State>) => Observable<State>
203203
: (
204204
eventSource$: Observable<EventValue>,
205-
inputs$: Observable<RestrictArray<Inputs>>,
206205
state$: Observable<State>,
206+
inputs$: Observable<RestrictArray<Inputs>>,
207207
) => Observable<State>
208208
209209
declare function useEventCallback<EventValue, State = void>(
@@ -335,7 +335,7 @@ import "./styles.css";
335335
function App() {
336336
const [count, setCount] = useState(0);
337337
const [clickCallback, [description, x, y, prevDesc]] = useEventCallback(
338-
(event$, inputs$, state$) =>
338+
(event$, state$, inputs$) =>
339339
event$.pipe(
340340
map(event => [event.target.innerHTML, event.clientX, event.clientY]),
341341
combineLatest(inputs$),

playground/index.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ const mockBackendRequest = (event$: Observable<React.MouseEvent<HTMLHeadElement>
1414

1515
function IntervalValue(props: { interval: number }) {
1616
const [clickCallback, value] = useEventCallback(mockBackendRequest, 0, [])
17-
const intervalValue = useObservable(
18-
(inputs$, _) =>
17+
const intervalValue = useObservable<number, number[]>(
18+
(_, inputs$) =>
1919
inputs$.pipe(
2020
switchMap(([intervalTime]) => interval(intervalTime)),
2121
scan((acc) => acc + 1, 0),

src/__test__/use-event-callback.spec.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,8 @@ describe('useEventCallback specs', () => {
134134
const timeToDelay = 200
135135
const factory = (
136136
event$: Observable<React.MouseEvent<HTMLButtonElement>>,
137-
inputs$: Observable<number[]>,
138137
_state$: Observable<number>,
138+
inputs$: Observable<number[]>,
139139
): Observable<number> =>
140140
event$.pipe(
141141
combineLatest(inputs$),

src/__test__/use-observable.spec.tsx

+5-4
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,11 @@ describe('useObservable specs', () => {
121121
const spy = Sinon.spy()
122122
const timeToDelay = 200
123123
function Fixture(props: { foo: number; bar: string; baz: any }) {
124-
const value = useObservable((inputs$: Observable<[number, any] | null>) => inputs$.pipe(tap(spy)), null, [
125-
props.foo,
126-
props.baz,
127-
] as any)
124+
const value = useObservable(
125+
(_: Observable<number | null>, inputs$: Observable<[number, any] | null>) => inputs$.pipe(tap(spy)),
126+
null,
127+
[props.foo, props.baz] as any,
128+
)
128129
return (
129130
<>
130131
<h1>{value && value[0]}</h1>

src/use-event-callback.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ export type EventCallback<EventValue, State, Inputs> = Not<
1919
Inputs extends void ? true : false,
2020
(
2121
eventSource$: Observable<EventValue>,
22-
inputs$: Observable<RestrictArray<Inputs>>,
2322
state$: Observable<State>,
23+
inputs$: Observable<RestrictArray<Inputs>>,
2424
) => Observable<State>,
2525
(eventSource$: Observable<EventValue>, state$: Observable<State>) => Observable<State>
2626
>
@@ -67,7 +67,7 @@ export function useEventCallback<EventValue, State = void, Inputs = void>(
6767
if (!inputs) {
6868
value$ = (callback as EventCallback<EventValue, State, void>)(event$, state$ as Observable<State>)
6969
} else {
70-
value$ = (callback as any)(event$, inputs$ as Observable<Inputs>, state$ as Observable<State>)
70+
value$ = (callback as any)(event$, state$ as Observable<State>, inputs$ as Observable<Inputs>)
7171
}
7272
const subscription = value$.subscribe((value) => {
7373
state$.next(value)

src/use-observable.ts

+15-8
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,18 @@ import useConstant from 'use-constant'
44

55
import { RestrictArray } from './type'
66

7-
export type InputFactory<State> = (state$: Observable<State>) => Observable<State>;
8-
export type InputFactoryWithInputs<State, Inputs> = (inputs$: Observable<RestrictArray<Inputs>>, state$: Observable<State>) => Observable<State>;
9-
export function useObservable<State>(inputFactory: InputFactory<State>): State | null;
10-
export function useObservable<State>(inputFactory: InputFactory<State>, initialState: State): State;
11-
export function useObservable<State, Inputs>(inputFactory: InputFactoryWithInputs<State, Inputs>, initialState: State, inputs: RestrictArray<Inputs>): State;
7+
export type InputFactory<State> = (state$: Observable<State>) => Observable<State>
8+
export type InputFactoryWithInputs<State, Inputs> = (
9+
state$: Observable<State>,
10+
inputs$: Observable<RestrictArray<Inputs>>,
11+
) => Observable<State>
12+
export function useObservable<State>(inputFactory: InputFactory<State>): State | null
13+
export function useObservable<State>(inputFactory: InputFactory<State>, initialState: State): State
14+
export function useObservable<State, Inputs>(
15+
inputFactory: InputFactoryWithInputs<State, Inputs>,
16+
initialState: State,
17+
inputs: RestrictArray<Inputs>,
18+
): State
1219
export function useObservable<State, Inputs extends ReadonlyArray<any>>(
1320
inputFactory: InputFactoryWithInputs<State, Inputs>,
1421
initialState?: State,
@@ -27,11 +34,11 @@ export function useObservable<State, Inputs extends ReadonlyArray<any>>(
2734
let output$: BehaviorSubject<State>
2835
if (inputs) {
2936
output$ = (inputFactory as (
30-
inputs$: Observable<RestrictArray<Inputs> | undefined>,
3137
state$: Observable<State | undefined>,
32-
) => Observable<State>)(inputs$, state$) as BehaviorSubject<State>
38+
inputs$: Observable<RestrictArray<Inputs> | undefined>,
39+
) => Observable<State>)(state$, inputs$) as BehaviorSubject<State>
3340
} else {
34-
output$ = (inputFactory as unknown as (state$: Observable<State | undefined>) => Observable<State>)(
41+
output$ = ((inputFactory as unknown) as (state$: Observable<State | undefined>) => Observable<State>)(
3542
state$,
3643
) as BehaviorSubject<State>
3744
}

0 commit comments

Comments
 (0)