UNPKG

5.12 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4Object.defineProperty(exports, "__esModule", {
5 value: true
6});
7exports["default"] = void 0;
8var _tslib = require("tslib");
9var _react = require("react");
10var _useEventListener = _interopRequireDefault(require("../useEventListener"));
11var _useMemoizedFn = _interopRequireDefault(require("../useMemoizedFn"));
12var _useRequest = _interopRequireDefault(require("../useRequest"));
13var _useUpdateEffect = _interopRequireDefault(require("../useUpdateEffect"));
14var _domTarget = require("../utils/domTarget");
15var _rect = require("../utils/rect");
16var useInfiniteScroll = function useInfiniteScroll(service, options) {
17 if (options === void 0) {
18 options = {};
19 }
20 var target = options.target,
21 isNoMore = options.isNoMore,
22 _a = options.threshold,
23 threshold = _a === void 0 ? 100 : _a,
24 _b = options.reloadDeps,
25 reloadDeps = _b === void 0 ? [] : _b,
26 manual = options.manual,
27 _onBefore = options.onBefore,
28 _onSuccess = options.onSuccess,
29 _onError = options.onError,
30 _onFinally = options.onFinally;
31 var _c = (0, _tslib.__read)((0, _react.useState)(), 2),
32 finalData = _c[0],
33 setFinalData = _c[1];
34 var _d = (0, _tslib.__read)((0, _react.useState)(false), 2),
35 loadingMore = _d[0],
36 setLoadingMore = _d[1];
37 var noMore = (0, _react.useMemo)(function () {
38 if (!isNoMore) return false;
39 return isNoMore(finalData);
40 }, [finalData]);
41 var _e = (0, _useRequest["default"])(function (lastData) {
42 return (0, _tslib.__awaiter)(void 0, void 0, void 0, function () {
43 var currentData;
44 var _a, _b;
45 return (0, _tslib.__generator)(this, function (_c) {
46 switch (_c.label) {
47 case 0:
48 return [4 /*yield*/, service(lastData)];
49 case 1:
50 currentData = _c.sent();
51 if (!lastData) {
52 setFinalData((0, _tslib.__assign)((0, _tslib.__assign)({}, currentData), {
53 list: (0, _tslib.__spreadArray)([], (0, _tslib.__read)((_a = currentData.list) !== null && _a !== void 0 ? _a : []), false)
54 }));
55 } else {
56 setFinalData((0, _tslib.__assign)((0, _tslib.__assign)({}, currentData), {
57 list: (0, _tslib.__spreadArray)((0, _tslib.__spreadArray)([], (0, _tslib.__read)((_b = lastData.list) !== null && _b !== void 0 ? _b : []), false), (0, _tslib.__read)(currentData.list), false)
58 }));
59 }
60 return [2 /*return*/, currentData];
61 }
62 });
63 });
64 }, {
65 manual: manual,
66 onFinally: function onFinally(_, d, e) {
67 setLoadingMore(false);
68 _onFinally === null || _onFinally === void 0 ? void 0 : _onFinally(d, e);
69 },
70 onBefore: function onBefore() {
71 return _onBefore === null || _onBefore === void 0 ? void 0 : _onBefore();
72 },
73 onSuccess: function onSuccess(d) {
74 setTimeout(function () {
75 // eslint-disable-next-line @typescript-eslint/no-use-before-define
76 scrollMethod();
77 });
78 _onSuccess === null || _onSuccess === void 0 ? void 0 : _onSuccess(d);
79 },
80 onError: function onError(e) {
81 return _onError === null || _onError === void 0 ? void 0 : _onError(e);
82 }
83 }),
84 loading = _e.loading,
85 run = _e.run,
86 runAsync = _e.runAsync,
87 cancel = _e.cancel;
88 var loadMore = (0, _useMemoizedFn["default"])(function () {
89 if (noMore) return;
90 setLoadingMore(true);
91 run(finalData);
92 });
93 var loadMoreAsync = (0, _useMemoizedFn["default"])(function () {
94 if (noMore) return Promise.reject();
95 setLoadingMore(true);
96 return runAsync(finalData);
97 });
98 var reload = function reload() {
99 setLoadingMore(false);
100 return run();
101 };
102 var reloadAsync = function reloadAsync() {
103 setLoadingMore(false);
104 return runAsync();
105 };
106 var scrollMethod = function scrollMethod() {
107 var el = (0, _domTarget.getTargetElement)(target);
108 if (!el) {
109 return;
110 }
111 el = el === document ? document.documentElement : el;
112 var scrollTop = (0, _rect.getScrollTop)(el);
113 var scrollHeight = (0, _rect.getScrollHeight)(el);
114 var clientHeight = (0, _rect.getClientHeight)(el);
115 if (scrollHeight - scrollTop <= clientHeight + threshold) {
116 loadMore();
117 }
118 };
119 (0, _useEventListener["default"])('scroll', function () {
120 if (loading || loadingMore) {
121 return;
122 }
123 scrollMethod();
124 }, {
125 target: target
126 });
127 (0, _useUpdateEffect["default"])(function () {
128 run();
129 }, (0, _tslib.__spreadArray)([], (0, _tslib.__read)(reloadDeps), false));
130 return {
131 data: finalData,
132 loading: !loadingMore && loading,
133 loadingMore: loadingMore,
134 noMore: noMore,
135 loadMore: loadMore,
136 loadMoreAsync: loadMoreAsync,
137 reload: (0, _useMemoizedFn["default"])(reload),
138 reloadAsync: (0, _useMemoizedFn["default"])(reloadAsync),
139 mutate: setFinalData,
140 cancel: cancel
141 };
142};
143var _default = useInfiniteScroll;
144exports["default"] = _default;
\No newline at end of file