# @react-rxjs/utils ## Installation npm install @react-rxjs/utils ## API ### useSubscribe A React hook that creates a subscription to the provided observable once the component mounts and it unsubscribes when the component unmounts. Arguments: - `source$`: Source observable that the hook will subscribe to. - `unsubscribeGraceTime`: Amount of time in ms that the hook should wait before unsubscribing from the source observable after it unmounts (default = 200). Important: This hook doesn't trigger any updates. ### Subscribe A React Component that creates a subscription to the provided observable once the component mounts and it unsubscribes from it when the component unmounts. Properties: - `source$`: Source observable that the Component will subscribe to. - `graceTime`: an optional property that describes the amount of time in ms that the Component should wait before unsubscribing from the source observable after it unmounts (default = 200). Important: This Component doesn't trigger any updates. ### groupInMap A RxJS pipeable operator which groups all values by key and emits a Map that holds the latest value for each key Arguments: - `keyGetter`: A function that extracts the key for each item. - `projection`: Projection function for each group. ```ts const votesByKey$ = new Subject<{ key: string }>() const counters$ = votesByKey$.pipe( groupInMap( (vote) => vote.key, (votes$) => votes$.pipe( mapTo(1), scan((count) => count + 1), takeWhile((count) => count < 3), ), ), ) counters$.subscribe((counters) => { console.log("counters$:") counters.forEach((value, key) => { console.log(`${key}: ${value}`) }) }) votesByKey$.next({ key: "foo" }) // > counters$: // > foo: 1 votesByKey$.next({ key: "foo" }) // > counters$: // > foo: 2 votesByKey$.next({ key: "bar" }) // > counters$: // > foo: 2 // > bar: 1 votesByKey$.next({ key: "foo" }) // > counters$: // > bar: 1 votesByKey$.next({ key: "bar" }) // > counters$: // > bar: 2 // votesByKey$.next({ key: "bar" }) // > counters$: ``` ### mergeWithKey Emits the values from all the streams of the provided object, in a result which provides the key of the stream of that emission. Arguments: - `inputObject`: Object of streams ```ts const inc$ = new Subject() const dec$ = new Subject() const resetTo$ = new Subject() const counter$ = mergeWithKey({ inc$, dec$, resetTo$, }).pipe( scan((acc, current) => { switch (current.type) { case "inc$": return acc + 1 case "dec$": return acc - 1 case "resetTo$": return current.payload default: return acc } }, 0), startWith(0), ) ```