floppy-disk 2.5.0 → 2.6.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,167 @@
1
+ import { Maybe } from '../utils';
2
+ import { SelectDeps } from '../vanilla';
3
+ import { CreateQueryOptions, QueryState } from './create-query';
4
+ import { StoreKey } from './create-stores';
5
+ export declare const createBiDirectionQuery: <TKey extends StoreKey = StoreKey, TResponse = any, TData extends any[] = any[], TError = unknown, TPageParam = any>(queryFn: (key: TKey, state: QueryState<TKey, TResponse, TData, TError, TPageParam>, direction: 'prev' | 'next') => Promise<TResponse>, options: Omit<CreateQueryOptions<TKey, TResponse, TData, TError, TPageParam>, "select" | "getNextPageParam"> & {
6
+ getPrevPageParam: (lastPage: TResponse, index: number, stateBeforeCallQuery: QueryState<TKey, TResponse, TData, TError, TPageParam>) => Maybe<TPageParam>;
7
+ getNextPageParam: (lastPage: TResponse, index: number, stateBeforeCallQuery: QueryState<TKey, TResponse, TData, TError, TPageParam>) => Maybe<TPageParam>;
8
+ select: (response: TResponse, state: Pick<QueryState<TKey, TResponse, TData, TError, TPageParam>, "data" | "key">, direction: 'prev' | 'next') => TData;
9
+ }) => {
10
+ (...args: [Maybe<TKey>, SelectDeps<QueryState<TKey, TResponse, TData, TError, TPageParam>>?] | [SelectDeps<QueryState<TKey, TResponse, TData, TError, TPageParam>>?]): {
11
+ data: (never[] | TData)[number][];
12
+ fetchPrevPage: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
13
+ hasPrevPage: boolean;
14
+ isWaitingPrevPage: boolean;
15
+ key: TKey;
16
+ keyHash: string;
17
+ fetch: () => void;
18
+ forceFetch: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
19
+ fetchNextPage: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
20
+ reset: () => void;
21
+ optimisticUpdate: (response: TResponse | ((prevState: QueryState<TKey, TResponse, TData, TError, TPageParam>) => TResponse)) => {
22
+ revert: () => void;
23
+ invalidate: () => void;
24
+ };
25
+ isWaiting: boolean;
26
+ isWaitingNextPage: boolean;
27
+ isRefetching: boolean;
28
+ isRefetchError: boolean;
29
+ isPreviousData: boolean;
30
+ isOptimisticData: boolean;
31
+ error: TError | undefined;
32
+ errorUpdatedAt: number | undefined;
33
+ retryCount: number;
34
+ isGoingToRetry: boolean;
35
+ pageParam: Maybe<TPageParam>;
36
+ pageParams: Maybe<TPageParam>[];
37
+ hasNextPage: boolean;
38
+ retryNextPageCount: number;
39
+ isGoingToRetryNextPage: boolean;
40
+ status: "loading";
41
+ isLoading: true;
42
+ isSuccess: false;
43
+ isError: false;
44
+ response: undefined;
45
+ responseUpdatedAt: undefined;
46
+ } | {
47
+ data: (never[] | TData)[number][];
48
+ fetchPrevPage: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
49
+ hasPrevPage: boolean;
50
+ isWaitingPrevPage: boolean;
51
+ key: TKey;
52
+ keyHash: string;
53
+ fetch: () => void;
54
+ forceFetch: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
55
+ fetchNextPage: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
56
+ reset: () => void;
57
+ optimisticUpdate: (response: TResponse | ((prevState: QueryState<TKey, TResponse, TData, TError, TPageParam>) => TResponse)) => {
58
+ revert: () => void;
59
+ invalidate: () => void;
60
+ };
61
+ isWaiting: boolean;
62
+ isWaitingNextPage: boolean;
63
+ isRefetching: boolean;
64
+ isRefetchError: boolean;
65
+ isPreviousData: boolean;
66
+ isOptimisticData: boolean;
67
+ error: TError | undefined;
68
+ errorUpdatedAt: number | undefined;
69
+ retryCount: number;
70
+ isGoingToRetry: boolean;
71
+ pageParam: Maybe<TPageParam>;
72
+ pageParams: Maybe<TPageParam>[];
73
+ hasNextPage: boolean;
74
+ retryNextPageCount: number;
75
+ isGoingToRetryNextPage: boolean;
76
+ status: "error";
77
+ isLoading: false;
78
+ isSuccess: false;
79
+ isError: true;
80
+ response: undefined;
81
+ responseUpdatedAt: undefined;
82
+ } | {
83
+ data: (never[] | TData)[number][];
84
+ fetchPrevPage: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
85
+ hasPrevPage: boolean;
86
+ isWaitingPrevPage: boolean;
87
+ key: TKey;
88
+ keyHash: string;
89
+ fetch: () => void;
90
+ forceFetch: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
91
+ fetchNextPage: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
92
+ reset: () => void;
93
+ optimisticUpdate: (response: TResponse | ((prevState: QueryState<TKey, TResponse, TData, TError, TPageParam>) => TResponse)) => {
94
+ revert: () => void;
95
+ invalidate: () => void;
96
+ };
97
+ isWaiting: boolean;
98
+ isWaitingNextPage: boolean;
99
+ isRefetching: boolean;
100
+ isRefetchError: boolean;
101
+ isPreviousData: boolean;
102
+ isOptimisticData: boolean;
103
+ error: TError | undefined;
104
+ errorUpdatedAt: number | undefined;
105
+ retryCount: number;
106
+ isGoingToRetry: boolean;
107
+ pageParam: Maybe<TPageParam>;
108
+ pageParams: Maybe<TPageParam>[];
109
+ hasNextPage: boolean;
110
+ retryNextPageCount: number;
111
+ isGoingToRetryNextPage: boolean;
112
+ status: "success";
113
+ isLoading: false;
114
+ isSuccess: true;
115
+ isError: false;
116
+ response: TResponse;
117
+ responseUpdatedAt: number | undefined;
118
+ };
119
+ get(): {
120
+ prev: QueryState<TKey, TResponse, TData, TError, TPageParam>;
121
+ next: QueryState<TKey, TResponse, TData, TError, TPageParam>;
122
+ };
123
+ setInitialResponse: (options: {
124
+ key?: Maybe<TKey>;
125
+ response: TResponse;
126
+ skipRevalidation?: boolean | undefined;
127
+ }) => void;
128
+ reset(): void;
129
+ resetSpecificKey(key: Maybe<TKey>): void;
130
+ invalidate: () => void;
131
+ invalidateSpecificKey: (key?: Maybe<TKey>) => void;
132
+ suspend: (key?: Maybe<TKey>) => {
133
+ key: TKey;
134
+ keyHash: string;
135
+ fetch: () => void;
136
+ forceFetch: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
137
+ fetchNextPage: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
138
+ reset: () => void;
139
+ optimisticUpdate: (response: TResponse | ((prevState: QueryState<TKey, TResponse, TData, TError, TPageParam>) => TResponse)) => {
140
+ revert: () => void;
141
+ invalidate: () => void;
142
+ };
143
+ isWaiting: boolean;
144
+ isWaitingNextPage: boolean;
145
+ isRefetching: boolean;
146
+ isRefetchError: boolean;
147
+ isPreviousData: boolean;
148
+ isOptimisticData: boolean;
149
+ error: TError | undefined;
150
+ errorUpdatedAt: number | undefined;
151
+ retryCount: number;
152
+ isGoingToRetry: boolean;
153
+ pageParam: Maybe<TPageParam>;
154
+ pageParams: Maybe<TPageParam>[];
155
+ hasNextPage: boolean;
156
+ retryNextPageCount: number;
157
+ isGoingToRetryNextPage: boolean;
158
+ } & {
159
+ status: "success";
160
+ isLoading: false;
161
+ isSuccess: true;
162
+ isError: false;
163
+ data: TData;
164
+ response: TResponse;
165
+ responseUpdatedAt: number | undefined;
166
+ };
167
+ };
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createBiDirectionQuery = void 0;
4
+ const utils_1 = require("../utils");
5
+ const create_query_1 = require("./create-query");
6
+ const createBiDirectionQuery = (queryFn, options) => {
7
+ const { getPrevPageParam, getNextPageParam, select, ...restOptions } = options;
8
+ const usePrevPagesQuery = (0, create_query_1.createQuery)((key, state) => queryFn(key, state, 'prev'), {
9
+ defaultDeps: (state) => [
10
+ state.isWaiting,
11
+ state.data,
12
+ state.error,
13
+ state.isWaitingNextPage,
14
+ state.hasNextPage,
15
+ ],
16
+ fetchOnMount: false,
17
+ getNextPageParam: getPrevPageParam,
18
+ select: (response, state) => select(response, state, 'prev'),
19
+ ...restOptions,
20
+ });
21
+ const useNextPagesQuery = (0, create_query_1.createQuery)(async (key, state) => {
22
+ const isInitialPage = state.pageParam === undefined;
23
+ const pQuery = usePrevPagesQuery.get(key);
24
+ try {
25
+ const response = await queryFn(key, state, 'next');
26
+ if (isInitialPage) {
27
+ const prevPageParam = getPrevPageParam(response, 1, pQuery);
28
+ usePrevPagesQuery.set(key, (prev) => ({
29
+ pageParams: [prevPageParam, ...prev.pageParams.slice(1)],
30
+ hasNextPage: prev.isLoading ? (0, utils_1.hasValue)(prevPageParam) : prev.hasNextPage,
31
+ }));
32
+ if (!pQuery.isLoading)
33
+ pQuery.forceFetch();
34
+ }
35
+ return response;
36
+ }
37
+ catch (error) {
38
+ if (isInitialPage && !pQuery.isLoading)
39
+ pQuery.reset();
40
+ throw error;
41
+ }
42
+ }, {
43
+ getNextPageParam: getNextPageParam,
44
+ select: (response, state) => select(response, state, 'next'),
45
+ ...restOptions,
46
+ });
47
+ const useBiDirectionQuery = (...args) => {
48
+ const pQuery = usePrevPagesQuery(...args);
49
+ const nQuery = useNextPagesQuery(...args);
50
+ return {
51
+ ...nQuery,
52
+ data: [...(pQuery.data || []), ...(nQuery.data || [])],
53
+ fetchPrevPage: pQuery.fetchNextPage,
54
+ hasPrevPage: pQuery.hasNextPage,
55
+ isWaitingPrevPage: pQuery.isWaitingNextPage || (pQuery.isLoading && pQuery.isWaiting),
56
+ };
57
+ };
58
+ useBiDirectionQuery.get = () => {
59
+ return {
60
+ prev: usePrevPagesQuery.get(),
61
+ next: useNextPagesQuery.get(),
62
+ };
63
+ };
64
+ useBiDirectionQuery.setInitialResponse = useNextPagesQuery.setInitialResponse;
65
+ useBiDirectionQuery.reset = () => {
66
+ usePrevPagesQuery.reset();
67
+ useNextPagesQuery.reset();
68
+ };
69
+ useBiDirectionQuery.resetSpecificKey = (key) => {
70
+ usePrevPagesQuery.resetSpecificKey(key);
71
+ useNextPagesQuery.resetSpecificKey(key);
72
+ };
73
+ useBiDirectionQuery.invalidate = useNextPagesQuery.invalidate;
74
+ useBiDirectionQuery.invalidateSpecificKey = useNextPagesQuery.invalidateSpecificKey;
75
+ useBiDirectionQuery.suspend = useNextPagesQuery.suspend;
76
+ return useBiDirectionQuery;
77
+ };
78
+ exports.createBiDirectionQuery = createBiDirectionQuery;
@@ -191,7 +191,7 @@ export type CreateQueryOptions<TKey extends StoreKey = StoreKey, TResponse = any
191
191
  *
192
192
  * This function should return a variable that will be stored as `pageParam` that can be used when fetching next page.
193
193
  */
194
- getNextPageParam?: (lastPage: TResponse, index: number) => Maybe<TPageParam>;
194
+ getNextPageParam?: (lastPage: TResponse, index: number, stateBeforeCallQuery: QueryState<TKey, TResponse, TData, TError, TPageParam>) => Maybe<TPageParam>;
195
195
  onBeforeFetch?: (cancel: () => void, state: QueryState<TKey, TResponse, TData, TError, TPageParam>) => void;
196
196
  onSuccess?: (response: TResponse, stateBeforeCallQuery: QueryState<TKey, TResponse, TData, TError, TPageParam>) => void;
197
197
  onError?: (error: TError, stateBeforeCallQuery: QueryState<TKey, TResponse, TData, TError, TPageParam>) => void;
@@ -58,11 +58,11 @@ const createQuery = (queryFn, options = {}) => {
58
58
  };
59
59
  const forceFetch = () => new Promise((resolve) => {
60
60
  const state = get();
61
+ const { isWaiting, isLoading, pageParams } = state;
61
62
  const responseAllPages = [];
62
- const newPageParams = [state.pageParams[0]];
63
- let pageParam = state.pageParams[0];
63
+ const newPageParams = [pageParams[0]];
64
+ let pageParam = pageParams[0];
64
65
  clearTimeout(refetchIntervalTimeoutId.get(keyHash));
65
- const { isWaiting, isLoading, pageParams } = state;
66
66
  if (isWaiting || !(0, utils_1.getValueOrComputedValue)(enabled, key))
67
67
  return resolve(state);
68
68
  let shouldcancel = false;
@@ -84,8 +84,8 @@ const createQuery = (queryFn, options = {}) => {
84
84
  set({ isGoingToRetry: false, isWaiting: true, isRefetching: true });
85
85
  clearTimeout(retryTimeoutId.get(keyHash));
86
86
  }
87
- const stateBeforeCallQuery = { ...get(), pageParam };
88
87
  preventReplaceResponse.set(keyHash, false);
88
+ const stateBeforeCallQuery = { ...get(), pageParam };
89
89
  queryFn(key, stateBeforeCallQuery)
90
90
  .then((response) => {
91
91
  if (preventReplaceResponse.get(keyHash)) {
@@ -93,7 +93,7 @@ const createQuery = (queryFn, options = {}) => {
93
93
  return resolve(get());
94
94
  }
95
95
  responseAllPages.push(response);
96
- const newPageParam = getNextPageParam(response, responseAllPages.length);
96
+ const newPageParam = getNextPageParam(response, responseAllPages.length, stateBeforeCallQuery);
97
97
  newPageParams.push(newPageParam);
98
98
  if ((0, utils_1.hasValue)(newPageParam) && newPageParams.length < pageParams.length) {
99
99
  pageParam = newPageParam;
@@ -209,7 +209,7 @@ const createQuery = (queryFn, options = {}) => {
209
209
  const stateBeforeCallQuery = get();
210
210
  queryFn(key, { ...state, pageParam })
211
211
  .then((response) => {
212
- const newPageParam = getNextPageParam(response, pageParams.length);
212
+ const newPageParam = getNextPageParam(response, pageParams.length, stateBeforeCallQuery);
213
213
  set({
214
214
  isWaitingNextPage: false,
215
215
  response,
@@ -330,9 +330,10 @@ const createQuery = (queryFn, options = {}) => {
330
330
  useQuery.setInitialResponse = ({ key, response, skipRevalidation }) => {
331
331
  // eslint-disable-next-line react-hooks/rules-of-hooks
332
332
  (0, hooks_1.useState)(() => {
333
- if (response === undefined || useQuery.get(key).data)
333
+ const state = useQuery.get(key);
334
+ if (response === undefined || state.isSuccess)
334
335
  return;
335
- const newPageParam = getNextPageParam(response, 1);
336
+ const newPageParam = getNextPageParam(response, 1, state);
336
337
  useQuery.set(key, {
337
338
  status: 'success',
338
339
  isLoading: false,
@@ -1,5 +1,6 @@
1
1
  export * from './create-store';
2
2
  export * from './create-stores';
3
3
  export * from './create-query';
4
+ export * from './create-bi-direction-query';
4
5
  export * from './create-mutation';
5
6
  export * from './with-context';
@@ -4,5 +4,6 @@ const tslib_1 = require("tslib");
4
4
  tslib_1.__exportStar(require("./create-store"), exports);
5
5
  tslib_1.__exportStar(require("./create-stores"), exports);
6
6
  tslib_1.__exportStar(require("./create-query"), exports);
7
+ tslib_1.__exportStar(require("./create-bi-direction-query"), exports);
7
8
  tslib_1.__exportStar(require("./create-mutation"), exports);
8
9
  tslib_1.__exportStar(require("./with-context"), exports);
@@ -0,0 +1,167 @@
1
+ import { Maybe } from '../utils';
2
+ import { SelectDeps } from '../vanilla';
3
+ import { CreateQueryOptions, QueryState } from './create-query';
4
+ import { StoreKey } from './create-stores';
5
+ export declare const createBiDirectionQuery: <TKey extends StoreKey = StoreKey, TResponse = any, TData extends any[] = any[], TError = unknown, TPageParam = any>(queryFn: (key: TKey, state: QueryState<TKey, TResponse, TData, TError, TPageParam>, direction: 'prev' | 'next') => Promise<TResponse>, options: Omit<CreateQueryOptions<TKey, TResponse, TData, TError, TPageParam>, "select" | "getNextPageParam"> & {
6
+ getPrevPageParam: (lastPage: TResponse, index: number, stateBeforeCallQuery: QueryState<TKey, TResponse, TData, TError, TPageParam>) => Maybe<TPageParam>;
7
+ getNextPageParam: (lastPage: TResponse, index: number, stateBeforeCallQuery: QueryState<TKey, TResponse, TData, TError, TPageParam>) => Maybe<TPageParam>;
8
+ select: (response: TResponse, state: Pick<QueryState<TKey, TResponse, TData, TError, TPageParam>, "data" | "key">, direction: 'prev' | 'next') => TData;
9
+ }) => {
10
+ (...args: [Maybe<TKey>, SelectDeps<QueryState<TKey, TResponse, TData, TError, TPageParam>>?] | [SelectDeps<QueryState<TKey, TResponse, TData, TError, TPageParam>>?]): {
11
+ data: (never[] | TData)[number][];
12
+ fetchPrevPage: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
13
+ hasPrevPage: boolean;
14
+ isWaitingPrevPage: boolean;
15
+ key: TKey;
16
+ keyHash: string;
17
+ fetch: () => void;
18
+ forceFetch: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
19
+ fetchNextPage: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
20
+ reset: () => void;
21
+ optimisticUpdate: (response: TResponse | ((prevState: QueryState<TKey, TResponse, TData, TError, TPageParam>) => TResponse)) => {
22
+ revert: () => void;
23
+ invalidate: () => void;
24
+ };
25
+ isWaiting: boolean;
26
+ isWaitingNextPage: boolean;
27
+ isRefetching: boolean;
28
+ isRefetchError: boolean;
29
+ isPreviousData: boolean;
30
+ isOptimisticData: boolean;
31
+ error: TError | undefined;
32
+ errorUpdatedAt: number | undefined;
33
+ retryCount: number;
34
+ isGoingToRetry: boolean;
35
+ pageParam: Maybe<TPageParam>;
36
+ pageParams: Maybe<TPageParam>[];
37
+ hasNextPage: boolean;
38
+ retryNextPageCount: number;
39
+ isGoingToRetryNextPage: boolean;
40
+ status: "loading";
41
+ isLoading: true;
42
+ isSuccess: false;
43
+ isError: false;
44
+ response: undefined;
45
+ responseUpdatedAt: undefined;
46
+ } | {
47
+ data: (never[] | TData)[number][];
48
+ fetchPrevPage: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
49
+ hasPrevPage: boolean;
50
+ isWaitingPrevPage: boolean;
51
+ key: TKey;
52
+ keyHash: string;
53
+ fetch: () => void;
54
+ forceFetch: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
55
+ fetchNextPage: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
56
+ reset: () => void;
57
+ optimisticUpdate: (response: TResponse | ((prevState: QueryState<TKey, TResponse, TData, TError, TPageParam>) => TResponse)) => {
58
+ revert: () => void;
59
+ invalidate: () => void;
60
+ };
61
+ isWaiting: boolean;
62
+ isWaitingNextPage: boolean;
63
+ isRefetching: boolean;
64
+ isRefetchError: boolean;
65
+ isPreviousData: boolean;
66
+ isOptimisticData: boolean;
67
+ error: TError | undefined;
68
+ errorUpdatedAt: number | undefined;
69
+ retryCount: number;
70
+ isGoingToRetry: boolean;
71
+ pageParam: Maybe<TPageParam>;
72
+ pageParams: Maybe<TPageParam>[];
73
+ hasNextPage: boolean;
74
+ retryNextPageCount: number;
75
+ isGoingToRetryNextPage: boolean;
76
+ status: "error";
77
+ isLoading: false;
78
+ isSuccess: false;
79
+ isError: true;
80
+ response: undefined;
81
+ responseUpdatedAt: undefined;
82
+ } | {
83
+ data: (never[] | TData)[number][];
84
+ fetchPrevPage: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
85
+ hasPrevPage: boolean;
86
+ isWaitingPrevPage: boolean;
87
+ key: TKey;
88
+ keyHash: string;
89
+ fetch: () => void;
90
+ forceFetch: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
91
+ fetchNextPage: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
92
+ reset: () => void;
93
+ optimisticUpdate: (response: TResponse | ((prevState: QueryState<TKey, TResponse, TData, TError, TPageParam>) => TResponse)) => {
94
+ revert: () => void;
95
+ invalidate: () => void;
96
+ };
97
+ isWaiting: boolean;
98
+ isWaitingNextPage: boolean;
99
+ isRefetching: boolean;
100
+ isRefetchError: boolean;
101
+ isPreviousData: boolean;
102
+ isOptimisticData: boolean;
103
+ error: TError | undefined;
104
+ errorUpdatedAt: number | undefined;
105
+ retryCount: number;
106
+ isGoingToRetry: boolean;
107
+ pageParam: Maybe<TPageParam>;
108
+ pageParams: Maybe<TPageParam>[];
109
+ hasNextPage: boolean;
110
+ retryNextPageCount: number;
111
+ isGoingToRetryNextPage: boolean;
112
+ status: "success";
113
+ isLoading: false;
114
+ isSuccess: true;
115
+ isError: false;
116
+ response: TResponse;
117
+ responseUpdatedAt: number | undefined;
118
+ };
119
+ get(): {
120
+ prev: QueryState<TKey, TResponse, TData, TError, TPageParam>;
121
+ next: QueryState<TKey, TResponse, TData, TError, TPageParam>;
122
+ };
123
+ setInitialResponse: (options: {
124
+ key?: Maybe<TKey>;
125
+ response: TResponse;
126
+ skipRevalidation?: boolean | undefined;
127
+ }) => void;
128
+ reset(): void;
129
+ resetSpecificKey(key: Maybe<TKey>): void;
130
+ invalidate: () => void;
131
+ invalidateSpecificKey: (key?: Maybe<TKey>) => void;
132
+ suspend: (key?: Maybe<TKey>) => {
133
+ key: TKey;
134
+ keyHash: string;
135
+ fetch: () => void;
136
+ forceFetch: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
137
+ fetchNextPage: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
138
+ reset: () => void;
139
+ optimisticUpdate: (response: TResponse | ((prevState: QueryState<TKey, TResponse, TData, TError, TPageParam>) => TResponse)) => {
140
+ revert: () => void;
141
+ invalidate: () => void;
142
+ };
143
+ isWaiting: boolean;
144
+ isWaitingNextPage: boolean;
145
+ isRefetching: boolean;
146
+ isRefetchError: boolean;
147
+ isPreviousData: boolean;
148
+ isOptimisticData: boolean;
149
+ error: TError | undefined;
150
+ errorUpdatedAt: number | undefined;
151
+ retryCount: number;
152
+ isGoingToRetry: boolean;
153
+ pageParam: Maybe<TPageParam>;
154
+ pageParams: Maybe<TPageParam>[];
155
+ hasNextPage: boolean;
156
+ retryNextPageCount: number;
157
+ isGoingToRetryNextPage: boolean;
158
+ } & {
159
+ status: "success";
160
+ isLoading: false;
161
+ isSuccess: true;
162
+ isError: false;
163
+ data: TData;
164
+ response: TResponse;
165
+ responseUpdatedAt: number | undefined;
166
+ };
167
+ };
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createBiDirectionQuery = void 0;
4
+ const utils_1 = require("../utils");
5
+ const create_query_1 = require("./create-query");
6
+ const createBiDirectionQuery = (queryFn, options) => {
7
+ const { getPrevPageParam, getNextPageParam, select, ...restOptions } = options;
8
+ const usePrevPagesQuery = (0, create_query_1.createQuery)((key, state) => queryFn(key, state, 'prev'), {
9
+ defaultDeps: (state) => [
10
+ state.isWaiting,
11
+ state.data,
12
+ state.error,
13
+ state.isWaitingNextPage,
14
+ state.hasNextPage,
15
+ ],
16
+ fetchOnMount: false,
17
+ getNextPageParam: getPrevPageParam,
18
+ select: (response, state) => select(response, state, 'prev'),
19
+ ...restOptions,
20
+ });
21
+ const useNextPagesQuery = (0, create_query_1.createQuery)(async (key, state) => {
22
+ const isInitialPage = state.pageParam === undefined;
23
+ const pQuery = usePrevPagesQuery.get(key);
24
+ try {
25
+ const response = await queryFn(key, state, 'next');
26
+ if (isInitialPage) {
27
+ const prevPageParam = getPrevPageParam(response, 1, pQuery);
28
+ usePrevPagesQuery.set(key, (prev) => ({
29
+ pageParams: [prevPageParam, ...prev.pageParams.slice(1)],
30
+ hasNextPage: prev.isLoading ? (0, utils_1.hasValue)(prevPageParam) : prev.hasNextPage,
31
+ }));
32
+ if (!pQuery.isLoading)
33
+ pQuery.forceFetch();
34
+ }
35
+ return response;
36
+ }
37
+ catch (error) {
38
+ if (isInitialPage && !pQuery.isLoading)
39
+ pQuery.reset();
40
+ throw error;
41
+ }
42
+ }, {
43
+ getNextPageParam: getNextPageParam,
44
+ select: (response, state) => select(response, state, 'next'),
45
+ ...restOptions,
46
+ });
47
+ const useBiDirectionQuery = (...args) => {
48
+ const pQuery = usePrevPagesQuery(...args);
49
+ const nQuery = useNextPagesQuery(...args);
50
+ return {
51
+ ...nQuery,
52
+ data: [...(pQuery.data || []), ...(nQuery.data || [])],
53
+ fetchPrevPage: pQuery.fetchNextPage,
54
+ hasPrevPage: pQuery.hasNextPage,
55
+ isWaitingPrevPage: pQuery.isWaitingNextPage || (pQuery.isLoading && pQuery.isWaiting),
56
+ };
57
+ };
58
+ useBiDirectionQuery.get = () => {
59
+ return {
60
+ prev: usePrevPagesQuery.get(),
61
+ next: useNextPagesQuery.get(),
62
+ };
63
+ };
64
+ useBiDirectionQuery.setInitialResponse = useNextPagesQuery.setInitialResponse;
65
+ useBiDirectionQuery.reset = () => {
66
+ usePrevPagesQuery.reset();
67
+ useNextPagesQuery.reset();
68
+ };
69
+ useBiDirectionQuery.resetSpecificKey = (key) => {
70
+ usePrevPagesQuery.resetSpecificKey(key);
71
+ useNextPagesQuery.resetSpecificKey(key);
72
+ };
73
+ useBiDirectionQuery.invalidate = useNextPagesQuery.invalidate;
74
+ useBiDirectionQuery.invalidateSpecificKey = useNextPagesQuery.invalidateSpecificKey;
75
+ useBiDirectionQuery.suspend = useNextPagesQuery.suspend;
76
+ return useBiDirectionQuery;
77
+ };
78
+ exports.createBiDirectionQuery = createBiDirectionQuery;
@@ -190,7 +190,7 @@ export type CreateQueryOptions<TKey extends StoreKey = StoreKey, TResponse = any
190
190
  *
191
191
  * This function should return a variable that will be stored as `pageParam` that can be used when fetching next page.
192
192
  */
193
- getNextPageParam?: (lastPage: TResponse, index: number) => Maybe<TPageParam>;
193
+ getNextPageParam?: (lastPage: TResponse, index: number, stateBeforeCallQuery: QueryState<TKey, TResponse, TData, TError, TPageParam>) => Maybe<TPageParam>;
194
194
  onBeforeFetch?: (cancel: () => void, state: QueryState<TKey, TResponse, TData, TError, TPageParam>) => void;
195
195
  onSuccess?: (response: TResponse, stateBeforeCallQuery: QueryState<TKey, TResponse, TData, TError, TPageParam>) => void;
196
196
  onError?: (error: TError, stateBeforeCallQuery: QueryState<TKey, TResponse, TData, TError, TPageParam>) => void;
@@ -57,11 +57,11 @@ const createQuery = (queryFn, options = {}) => {
57
57
  };
58
58
  const forceFetch = () => new Promise((resolve) => {
59
59
  const state = get();
60
+ const { isWaiting, isLoading, pageParams } = state;
60
61
  const responseAllPages = [];
61
- const newPageParams = [state.pageParams[0]];
62
- let pageParam = state.pageParams[0];
62
+ const newPageParams = [pageParams[0]];
63
+ let pageParam = pageParams[0];
63
64
  clearTimeout(refetchIntervalTimeoutId.get(keyHash));
64
- const { isWaiting, isLoading, pageParams } = state;
65
65
  if (isWaiting || !(0, utils_1.getValueOrComputedValue)(enabled, key))
66
66
  return resolve(state);
67
67
  let shouldcancel = false;
@@ -83,8 +83,8 @@ const createQuery = (queryFn, options = {}) => {
83
83
  set({ isGoingToRetry: false, isWaiting: true, isRefetching: true });
84
84
  clearTimeout(retryTimeoutId.get(keyHash));
85
85
  }
86
- const stateBeforeCallQuery = { ...get(), pageParam };
87
86
  preventReplaceResponse.set(keyHash, false);
87
+ const stateBeforeCallQuery = { ...get(), pageParam };
88
88
  queryFn(key, stateBeforeCallQuery)
89
89
  .then((response) => {
90
90
  if (preventReplaceResponse.get(keyHash)) {
@@ -92,7 +92,7 @@ const createQuery = (queryFn, options = {}) => {
92
92
  return resolve(get());
93
93
  }
94
94
  responseAllPages.push(response);
95
- const newPageParam = getNextPageParam(response, responseAllPages.length);
95
+ const newPageParam = getNextPageParam(response, responseAllPages.length, stateBeforeCallQuery);
96
96
  newPageParams.push(newPageParam);
97
97
  if ((0, utils_1.hasValue)(newPageParam) && newPageParams.length < pageParams.length) {
98
98
  pageParam = newPageParam;
@@ -208,7 +208,7 @@ const createQuery = (queryFn, options = {}) => {
208
208
  const stateBeforeCallQuery = get();
209
209
  queryFn(key, { ...state, pageParam })
210
210
  .then((response) => {
211
- const newPageParam = getNextPageParam(response, pageParams.length);
211
+ const newPageParam = getNextPageParam(response, pageParams.length, stateBeforeCallQuery);
212
212
  set({
213
213
  isWaitingNextPage: false,
214
214
  response,
@@ -329,9 +329,10 @@ const createQuery = (queryFn, options = {}) => {
329
329
  useQuery.setInitialResponse = ({ key, response, skipRevalidation }) => {
330
330
  // eslint-disable-next-line react-hooks/rules-of-hooks
331
331
  (0, react_1.useState)(() => {
332
- if (response === undefined || useQuery.get(key).data)
332
+ const state = useQuery.get(key);
333
+ if (response === undefined || state.isSuccess)
333
334
  return;
334
- const newPageParam = getNextPageParam(response, 1);
335
+ const newPageParam = getNextPageParam(response, 1, state);
335
336
  useQuery.set(key, {
336
337
  status: 'success',
337
338
  isLoading: false,
@@ -1,5 +1,6 @@
1
1
  export * from './create-store';
2
2
  export * from './create-stores';
3
3
  export * from './create-query';
4
+ export * from './create-bi-direction-query';
4
5
  export * from './create-mutation';
5
6
  export * from './with-context';
@@ -4,5 +4,6 @@ const tslib_1 = require("tslib");
4
4
  tslib_1.__exportStar(require("./create-store"), exports);
5
5
  tslib_1.__exportStar(require("./create-stores"), exports);
6
6
  tslib_1.__exportStar(require("./create-query"), exports);
7
+ tslib_1.__exportStar(require("./create-bi-direction-query"), exports);
7
8
  tslib_1.__exportStar(require("./create-mutation"), exports);
8
9
  tslib_1.__exportStar(require("./with-context"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "floppy-disk",
3
- "version": "2.5.0",
3
+ "version": "2.6.0-beta.2",
4
4
  "description": "FloppyDisk - lightweight, simple, and powerful state management library",
5
5
  "keywords": [
6
6
  "state",