@td-design/rn-hooks
Version:
从ahooks里面抽取的一些在rn项目里可以使用的hooks。提高开发效率
81 lines (78 loc) • 3.5 kB
JavaScript
import { __read, __awaiter, __generator, __spreadArray, __assign } from '../_virtual/_tslib.js';
import useMemoizedFn from '../useMemoizedFn/index.js';
import useRequest from '../useRequest/index.js';
import useSafeState from '../useSafeState/index.js';
import useUpdateEffect from '../useUpdateEffect/index.js';
var INITIAL_PAGE = 1;
var INITIAL_PAGE_SIZE = 10;
function useInfiniteScroll(service, options) {
var _this = this;
var _a = options || {}, _b = _a.manual, manual = _b === void 0 ? false : _b, _c = _a.refreshDeps, refreshDeps = _c === void 0 ? [] : _c, onBefore = _a.onBefore, onSuccess = _a.onSuccess, onError = _a.onError, onFinally = _a.onFinally;
var _d = __read(useSafeState(), 2), data = _d[0], setData = _d[1];
var _e = __read(useSafeState(false), 2), loadingMore = _e[0], setLoadingMore = _e[1];
var _f = __read(useSafeState(false), 2), noMoreData = _f[0], setNoMoreData = _f[1];
var _g = useRequest(function (lastData) { return __awaiter(_this, void 0, void 0, function () {
var currentData;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, service(lastData
? {
page: lastData.page + 1,
pageSize: lastData.pageSize,
}
: {
page: INITIAL_PAGE,
pageSize: INITIAL_PAGE_SIZE,
})];
case 1:
currentData = _a.sent();
if (!currentData) {
setNoMoreData(true);
return [2 /*return*/, currentData];
}
setNoMoreData(currentData.page * currentData.pageSize >= currentData.total);
if (!lastData) {
setData(__assign(__assign({}, currentData), { list: __spreadArray([], __read((currentData.list || [])), false) }));
}
else {
setData(__assign(__assign({}, currentData), { list: __spreadArray(__spreadArray([], __read((lastData.list || [])), false), __read((currentData.list || [])), false) }));
}
return [2 /*return*/, currentData];
}
});
}); }, {
manual: manual,
onBefore: onBefore,
onSuccess: onSuccess,
onError: onError,
onFinally: function (_, d, e) {
setLoadingMore(false);
onFinally === null || onFinally === void 0 ? void 0 : onFinally(d, e);
},
}), loading = _g.loading, error = _g.error, run = _g.run, runAsync = _g.runAsync, cancel = _g.cancel;
var loadMore = useMemoizedFn(function () {
if (noMoreData)
return;
setLoadingMore(true);
return run(data);
});
var refresh = useMemoizedFn(function () {
setLoadingMore(false);
return runAsync();
});
useUpdateEffect(function () {
run();
}, __spreadArray([], __read(refreshDeps), false));
return {
data: (data === null || data === void 0 ? void 0 : data.list) || [],
loading: loading,
loadingMore: loadingMore,
noMoreData: noMoreData,
error: error,
loadMore: loadMore,
refresh: refresh,
cancel: cancel,
mutate: setData,
};
}
export { useInfiniteScroll as default };