1 | import { useState, useEffect, useCallback } from "react";
|
2 | import { Subject } from "rxjs";
|
3 | import useConstant from "./useConstant";
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 | export default function useEventCallback(callback, initialState) {
|
12 | const [state, setState] = useState(initialState);
|
13 | const event$ = useConstant(() => new Subject());
|
14 |
|
15 | function eventCallback(e) {
|
16 | return event$.next(e);
|
17 | }
|
18 |
|
19 | const returnedCallback = useCallback(eventCallback, []);
|
20 |
|
21 | useEffect(() => {
|
22 | let value$ = callback(event$);
|
23 | const subscription = value$.subscribe(value => setState(value));
|
24 |
|
25 | return () => {
|
26 | subscription.unsubscribe();
|
27 | event$.complete();
|
28 | };
|
29 | }, []);
|
30 |
|
31 | return [returnedCallback, state];
|
32 | }
|