1- import { Observable , BehaviorSubject , Subject } from 'rxjs'
1+ import { Observable , BehaviorSubject } from 'rxjs'
22import { 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-
144export 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
2010export 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