UNPKG

1.09 kBJavaScriptView Raw
1import { useEffect, useRef, useState, useCallback } from "react";
2import isEqual from "lodash/isEqual";
3
4function useService(service, params) {
5 const prevParams = useRef(null);
6 const [callback, { loading, error, response }] = useServiceCallback(service);
7
8 useEffect(() => {
9 if (!isEqual(prevParams.current, params)) {
10 prevParams.current = params;
11 callback(params);
12 }
13 });
14
15 return { loading, error, response };
16}
17
18export function useServiceCallback(service) {
19 const [loading, setLoading] = useState(false);
20 const [error, setError] = useState(null);
21 const [response, setResponse] = useState(null);
22
23 const callback = useCallback(
24 params => {
25 setLoading(true);
26 setError(null);
27 service(params)
28 .then(response => {
29 setLoading(false);
30 setResponse(response);
31 })
32 .catch(error => {
33 setLoading(false);
34 setError(error);
35 });
36 },
37 [service]
38 );
39
40 return [callback, { loading, error, response }];
41}
42
43export default useService;