aidbox-react
Advanced tools
Comparing version
import { RemoteData, RemoteDataResult } from '../libs/remoteData'; | ||
export interface ServiceManager<S> { | ||
reload: () => void; | ||
export interface ServiceManager<S, F> { | ||
reload: () => Promise<RemoteDataResult<S, F>>; | ||
softReload: () => Promise<RemoteDataResult<S, F>>; | ||
set: (dataOrFn: S | ((data: S) => S)) => void; | ||
} | ||
export declare function useService<S = any, F = any>(asyncFunction: () => Promise<RemoteDataResult<S, F>>, deps?: ReadonlyArray<any>): [RemoteData<S, F>, ServiceManager<S>]; | ||
export declare function useService<S = any, F = any>(asyncFunction: () => Promise<RemoteDataResult<S, F>>, deps?: ReadonlyArray<any>): [RemoteData<S, F>, ServiceManager<S, F>]; |
@@ -11,33 +11,65 @@ "use strict"; | ||
var _a = react_1.useState(remoteData_1.notAsked), remoteData = _a[0], setRemoteData = _a[1]; | ||
// Use another state variable to trigger effect on demand | ||
var _b = react_1.useState(0), reloadsCount = _b[0], setReloadsCount = _b[1]; | ||
var load = react_1.useCallback(function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { | ||
var err_1; | ||
return tslib_1.__generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
_a.trys.push([0, 2, , 3]); | ||
return [4 /*yield*/, asyncFunction()]; | ||
case 1: return [2 /*return*/, _a.sent()]; | ||
case 2: | ||
err_1 = _a.sent(); | ||
return [2 /*return*/, remoteData_1.failure(err_1.response ? err_1.response.data : err_1.message)]; | ||
case 3: return [2 /*return*/]; | ||
} | ||
}); | ||
}); }, deps); | ||
var softReload = react_1.useCallback(function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { | ||
var response; | ||
return tslib_1.__generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: return [4 /*yield*/, load()]; | ||
case 1: | ||
response = _a.sent(); | ||
setRemoteData(response); | ||
return [2 /*return*/, response]; | ||
} | ||
}); | ||
}); }, tslib_1.__spreadArrays(deps, [load])); | ||
var reload = react_1.useCallback(function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { | ||
var response; | ||
return tslib_1.__generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
setRemoteData(remoteData_1.loading); | ||
return [4 /*yield*/, load()]; | ||
case 1: | ||
response = _a.sent(); | ||
setRemoteData(response); | ||
return [2 /*return*/, response]; | ||
} | ||
}); | ||
}); }, tslib_1.__spreadArrays(deps, [load])); | ||
react_1.useEffect(function () { | ||
(function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { | ||
var response, err_1; | ||
return tslib_1.__generator(this, function (_a) { | ||
switch (_a.label) { | ||
var _a; | ||
return tslib_1.__generator(this, function (_b) { | ||
switch (_b.label) { | ||
case 0: | ||
setRemoteData(remoteData_1.loading); | ||
_a.label = 1; | ||
_a = setRemoteData; | ||
return [4 /*yield*/, load()]; | ||
case 1: | ||
_a.trys.push([1, 3, , 4]); | ||
return [4 /*yield*/, asyncFunction()]; | ||
case 2: | ||
response = _a.sent(); | ||
setRemoteData(response); | ||
return [3 /*break*/, 4]; | ||
case 3: | ||
err_1 = _a.sent(); | ||
setRemoteData(remoteData_1.failure(err_1.response ? err_1.response.data : err_1.message)); | ||
return [3 /*break*/, 4]; | ||
case 4: return [2 /*return*/]; | ||
_a.apply(void 0, [_b.sent()]); | ||
return [2 /*return*/]; | ||
} | ||
}); | ||
}); })(); | ||
// eslint-disable-next-line | ||
}, deps.concat(reloadsCount)); | ||
// eslint-disable-next-line react-hooks/exhaustive-deps | ||
}, tslib_1.__spreadArrays(deps, [load])); | ||
return [ | ||
remoteData, | ||
{ | ||
reload: function () { return setReloadsCount(function (count) { return count + 1; }); }, | ||
reload: reload, | ||
softReload: softReload, | ||
set: function (dataOrFn) { | ||
@@ -44,0 +76,0 @@ if (typeof dataOrFn === 'function') { |
{ | ||
"name": "aidbox-react", | ||
"version": "1.3.3", | ||
"version": "1.3.4", | ||
"scripts": { | ||
@@ -12,3 +12,3 @@ "build": "tsc", | ||
"dependencies": { | ||
"axios": "^0.21.1", | ||
"axios": "^0.21.2", | ||
"moment": "^2.29.1" | ||
@@ -15,0 +15,0 @@ }, |
@@ -1,7 +0,8 @@ | ||
import { useEffect, useState } from 'react'; | ||
import { useEffect, useState, useCallback } from 'react'; | ||
import { loading, notAsked, RemoteData, RemoteDataResult, success, failure, isSuccess } from '../libs/remoteData'; | ||
export interface ServiceManager<S> { | ||
reload: () => void; | ||
export interface ServiceManager<S, F> { | ||
reload: () => Promise<RemoteDataResult<S, F>>; | ||
softReload: () => Promise<RemoteDataResult<S, F>>; | ||
set: (dataOrFn: S | ((data: S) => S)) => void; | ||
@@ -13,20 +14,38 @@ } | ||
deps: ReadonlyArray<any> = [] | ||
): [RemoteData<S, F>, ServiceManager<S>] { | ||
): [RemoteData<S, F>, ServiceManager<S, F>] { | ||
const [remoteData, setRemoteData] = useState<RemoteData<S, F>>(notAsked); | ||
// Use another state variable to trigger effect on demand | ||
const [reloadsCount, setReloadsCount] = useState(0); | ||
const load = useCallback(async () => { | ||
try { | ||
return await asyncFunction(); | ||
} catch (err) { | ||
return failure(err.response ? err.response.data : err.message); | ||
} | ||
// eslint-disable-next-line react-hooks/exhaustive-deps | ||
}, deps); | ||
const softReload = useCallback(async () => { | ||
const response = await load(); | ||
setRemoteData(response); | ||
return response; | ||
// eslint-disable-next-line react-hooks/exhaustive-deps | ||
}, [...deps, load]); | ||
const reload = useCallback(async () => { | ||
setRemoteData(loading); | ||
const response = await load(); | ||
setRemoteData(response); | ||
return response; | ||
// eslint-disable-next-line react-hooks/exhaustive-deps | ||
}, [...deps, load]); | ||
useEffect(() => { | ||
(async () => { | ||
setRemoteData(loading); | ||
try { | ||
const response: RemoteDataResult<S, F> = await asyncFunction(); | ||
setRemoteData(response); | ||
} catch (err: any) { | ||
setRemoteData(failure(err.response ? err.response.data : err.message)); | ||
} | ||
setRemoteData(await load()); | ||
})(); | ||
// eslint-disable-next-line | ||
}, deps.concat(reloadsCount)); | ||
// eslint-disable-next-line react-hooks/exhaustive-deps | ||
}, [...deps, load]); | ||
@@ -36,3 +55,4 @@ return [ | ||
{ | ||
reload: () => setReloadsCount((count) => count + 1), | ||
reload, | ||
softReload, | ||
set: (dataOrFn: S | ((data: S) => S)) => { | ||
@@ -39,0 +59,0 @@ if (typeof dataOrFn === 'function') { |
Sorry, the diff of this file is not supported yet
159871
1.13%2811
1.77%67
-1.47%Updated