Skip to content

Commit 9ab9091

Browse files
authored
Merge pull request #4 from LeetCode-OpenSource/update-use-observable
fix(use-observable): store subjects into state directly
2 parents cf85be1 + b3d89f4 commit 9ab9091

File tree

1 file changed

+20
-40
lines changed

1 file changed

+20
-40
lines changed

src/use-observable.ts

Lines changed: 20 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,12 @@
1-
import { Observable, BehaviorSubject, Subject } from 'rxjs'
1+
import { Observable, BehaviorSubject } from 'rxjs'
22
import { useState, useEffect, useMemo } from 'react'
33

4-
const PREFIX = '__SUBJECT__'
5-
6-
const propsSubjects: {
7-
[index: string]: Subject<any> | null
8-
} = {}
9-
10-
let subjectId = 0
11-
12-
const concatSubjectKey = (id: number) => `${PREFIX}${id}`
13-
144
export type InputFactory<T, U = undefined> = U extends undefined
155
? () => Observable<T>
166
: (props$: Observable<U>) => Observable<T>
177

18-
export function useObservable<T, U = undefined>(inputFactory: InputFactory<T, U>): T | null
19-
export function useObservable<T, U = undefined>(inputFactory: InputFactory<T, U>, initialState: T): T
8+
export function useObservable<T>(inputFactory: InputFactory<T>): T | null
9+
export function useObservable<T>(inputFactory: InputFactory<T>, initialState: T): T
2010
export function useObservable<T, U extends ReadonlyArray<any>>(
2111
inputFactory: InputFactory<T, U>,
2212
initialState: T,
@@ -28,36 +18,26 @@ export function useObservable<T, U extends ReadonlyArray<any> | undefined>(
2818
initialState?: T,
2919
inputs?: U,
3020
): T | null {
31-
const [state, setState] = useState<[T | null, number]>([initialState || null, 0])
32-
if (inputs) {
33-
useMemo(
34-
() => {
35-
const props$ = propsSubjects[concatSubjectKey(state[1])]
36-
if (props$) {
37-
props$.next(inputs)
38-
}
39-
},
40-
inputs as ReadonlyArray<any>,
41-
)
42-
}
21+
const [inputs$] = useState(new BehaviorSubject<U | undefined>(inputs))
22+
const [state, setState] = useState(typeof initialState !== 'undefined' ? initialState : null)
23+
4324
useEffect(
4425
() => {
45-
const props$ = new BehaviorSubject<U>(inputs as U)
46-
const input$ = (inputFactory as (...args: any[]) => Observable<T>)(
47-
typeof inputs !== 'undefined' ? props$ : void 0,
26+
const output$ = (inputFactory as (inputs$?: Observable<U | undefined>) => Observable<T>)(
27+
typeof inputs !== 'undefined' ? inputs$ : void 0,
4828
)
49-
subjectId++
50-
const subscription = input$.subscribe((value) => {
51-
setState([value, subjectId])
52-
})
53-
const subjectKey = concatSubjectKey(subjectId)
54-
propsSubjects[subjectKey] = props$
55-
return () => {
56-
subscription.unsubscribe()
57-
propsSubjects[subjectKey] = null
58-
}
29+
const subscription = output$.subscribe((value) => setState(value))
30+
return () => subscription.unsubscribe()
5931
},
60-
[0], // immutable forever
32+
[], // immutable forever
6133
)
62-
return state[0]
34+
35+
useMemo(
36+
() => {
37+
inputs$.next(inputs)
38+
},
39+
(inputs || []) as ReadonlyArray<any>,
40+
)
41+
42+
return state
6343
}

0 commit comments

Comments
 (0)