@astral/mobx-query 1.4.0 → 1.5.0
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.
- package/AuxiliaryQuery/AuxiliaryQuery.d.ts +25 -26
- package/AuxiliaryQuery/AuxiliaryQuery.js +59 -34
- package/DataStorage/DataStorage.d.ts +10 -12
- package/DataStorage/DataStorage.js +11 -17
- package/InfiniteQuery/InfiniteQuery.d.ts +37 -55
- package/InfiniteQuery/InfiniteQuery.js +31 -57
- package/MobxQuery/MobxQuery.d.ts +35 -20
- package/MobxQuery/MobxQuery.js +22 -14
- package/Mutation/Mutation.d.ts +11 -34
- package/Mutation/Mutation.js +11 -38
- package/Query/Query.d.ts +32 -50
- package/Query/Query.js +25 -53
- package/QueryContainer/QueryContainer.d.ts +61 -0
- package/QueryContainer/QueryContainer.js +79 -0
- package/QueryContainer/index.d.ts +1 -0
- package/QueryContainer/index.js +1 -0
- package/README.md +25 -0
- package/StatusStorage/StatusStorage.d.ts +25 -0
- package/StatusStorage/StatusStorage.js +36 -0
- package/StatusStorage/index.d.ts +1 -0
- package/StatusStorage/index.js +1 -0
- package/StorageFactory/StorageFactory.d.ts +13 -0
- package/StorageFactory/StorageFactory.js +19 -0
- package/StorageFactory/index.d.ts +1 -0
- package/StorageFactory/index.js +1 -0
- package/package.json +1 -1
- package/types.d.ts +12 -12
|
@@ -1,30 +1,25 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { action, computed, makeObservable, when } from 'mobx';
|
|
2
2
|
import { AuxiliaryQuery } from '../AuxiliaryQuery';
|
|
3
|
+
import { QueryContainer } from '../QueryContainer';
|
|
3
4
|
export const DEFAULT_INFINITE_ITEMS_COUNT = 30;
|
|
4
5
|
/**
|
|
5
|
-
*
|
|
6
|
+
* стор для работы с инфинити запросами,
|
|
6
7
|
* которые должны быть закешированы,
|
|
7
8
|
*/
|
|
8
|
-
export class InfiniteQuery {
|
|
9
|
-
constructor(executor, { incrementCount = DEFAULT_INFINITE_ITEMS_COUNT, onError, enabledAutoFetch, fetchPolicy, dataStorage, }) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
*/
|
|
13
|
-
this.auxiliary = new AuxiliaryQuery();
|
|
9
|
+
export class InfiniteQuery extends QueryContainer {
|
|
10
|
+
constructor(executor, { incrementCount = DEFAULT_INFINITE_ITEMS_COUNT, onError, enabledAutoFetch, fetchPolicy, dataStorage, statusStorage, backgroundStatusStorage = null, }) {
|
|
11
|
+
super(statusStorage, backgroundStatusStorage, new AuxiliaryQuery(statusStorage, backgroundStatusStorage));
|
|
12
|
+
this.executor = executor;
|
|
14
13
|
/**
|
|
15
|
-
*
|
|
14
|
+
* счетчик отступа для инфинити запроса
|
|
16
15
|
*/
|
|
17
16
|
this.offset = 0;
|
|
18
17
|
/**
|
|
19
|
-
*
|
|
18
|
+
* флаг того, что мы достигли предела запрашиваемых элементов
|
|
20
19
|
*/
|
|
21
20
|
this.isEndReached = false;
|
|
22
21
|
/**
|
|
23
|
-
*
|
|
24
|
-
*/
|
|
25
|
-
this.isInvalid = false;
|
|
26
|
-
/**
|
|
27
|
-
* @description обработчик успешного запроса, проверяет что мы достигли предела
|
|
22
|
+
* обработчик успешного запроса, проверяет что мы достигли предела
|
|
28
23
|
*/
|
|
29
24
|
this.submitSuccess = (result, onSuccess, isIncrement) => {
|
|
30
25
|
onSuccess === null || onSuccess === void 0 ? void 0 : onSuccess(result);
|
|
@@ -34,7 +29,6 @@ export class InfiniteQuery {
|
|
|
34
29
|
else {
|
|
35
30
|
this.storage.setData(result);
|
|
36
31
|
}
|
|
37
|
-
this.isInvalid = false;
|
|
38
32
|
// убеждаемся что результат запроса действительно массив,
|
|
39
33
|
// и если количество элементов в ответе меньше,
|
|
40
34
|
// чем запрашивалось, значит у бэка их больше нет,
|
|
@@ -47,7 +41,7 @@ export class InfiniteQuery {
|
|
|
47
41
|
}
|
|
48
42
|
};
|
|
49
43
|
/**
|
|
50
|
-
*
|
|
44
|
+
* форс метод для установки данных
|
|
51
45
|
*/
|
|
52
46
|
this.forceUpdate = (data) => {
|
|
53
47
|
this.offset = 0;
|
|
@@ -56,13 +50,13 @@ export class InfiniteQuery {
|
|
|
56
50
|
this.submitSuccess(data);
|
|
57
51
|
};
|
|
58
52
|
/**
|
|
59
|
-
*
|
|
53
|
+
* метод для инвалидации данных
|
|
60
54
|
*/
|
|
61
55
|
this.invalidate = () => {
|
|
62
|
-
this.
|
|
56
|
+
this.auxiliary.invalidate();
|
|
63
57
|
};
|
|
64
58
|
/**
|
|
65
|
-
*
|
|
59
|
+
* метод для запроса следующего набора данных
|
|
66
60
|
*/
|
|
67
61
|
this.fetchMore = () => {
|
|
68
62
|
// если мы еще не достигли предела
|
|
@@ -78,16 +72,16 @@ export class InfiniteQuery {
|
|
|
78
72
|
}
|
|
79
73
|
};
|
|
80
74
|
/**
|
|
81
|
-
*
|
|
75
|
+
* синхронный метод получения данных
|
|
82
76
|
*/
|
|
83
77
|
this.sync = (params) => {
|
|
84
78
|
const isInstanceAllow = !(this.isLoading || this.isSuccess);
|
|
85
|
-
if (this.isNetworkOnly || this.isInvalid || isInstanceAllow) {
|
|
79
|
+
if (this.isNetworkOnly || this.auxiliary.isInvalid || isInstanceAllow) {
|
|
86
80
|
this.proceedSync(params);
|
|
87
81
|
}
|
|
88
82
|
};
|
|
89
83
|
/**
|
|
90
|
-
*
|
|
84
|
+
* метод для переиспользования синхронной логики запроса
|
|
91
85
|
*/
|
|
92
86
|
this.proceedSync = ({ onSuccess, onError, } = {}) => {
|
|
93
87
|
this.offset = 0;
|
|
@@ -108,13 +102,13 @@ export class InfiniteQuery {
|
|
|
108
102
|
});
|
|
109
103
|
};
|
|
110
104
|
/**
|
|
111
|
-
*
|
|
105
|
+
* aсинхронный метод получения данных,
|
|
112
106
|
* подходит для изменения параметров запроса(фильтров),
|
|
113
107
|
* при котором будет сброшен offset,
|
|
114
108
|
* предполагается, что нужно будет самостоятельно обрабатывать ошибку
|
|
115
109
|
*/
|
|
116
110
|
this.async = () => {
|
|
117
|
-
if (!this.isNetworkOnly && this.isSuccess && !this.isInvalid) {
|
|
111
|
+
if (!this.isNetworkOnly && this.isSuccess && !this.auxiliary.isInvalid) {
|
|
118
112
|
return Promise.resolve(this.storage.data);
|
|
119
113
|
}
|
|
120
114
|
this.offset = 0;
|
|
@@ -132,17 +126,24 @@ export class InfiniteQuery {
|
|
|
132
126
|
};
|
|
133
127
|
this.storage = dataStorage;
|
|
134
128
|
this.incrementCount = incrementCount;
|
|
135
|
-
this.executor = executor;
|
|
136
129
|
this.defaultOnError = onError;
|
|
137
130
|
this.enabledAutoFetch = enabledAutoFetch;
|
|
138
131
|
this.defaultFetchPolicy = fetchPolicy;
|
|
139
|
-
|
|
132
|
+
makeObservable(this, {
|
|
133
|
+
data: computed,
|
|
134
|
+
infiniteExecutor: computed,
|
|
135
|
+
forceUpdate: action,
|
|
136
|
+
async: action,
|
|
137
|
+
sync: action,
|
|
138
|
+
fetchMore: action,
|
|
139
|
+
submitSuccess: action,
|
|
140
|
+
});
|
|
140
141
|
}
|
|
141
142
|
get isNetworkOnly() {
|
|
142
143
|
return this.defaultFetchPolicy === 'network-only';
|
|
143
144
|
}
|
|
144
145
|
/**
|
|
145
|
-
*
|
|
146
|
+
* метод для обогащения параметров текущими значениями для инфинити
|
|
146
147
|
*/
|
|
147
148
|
get infiniteExecutor() {
|
|
148
149
|
return () => this.executor({
|
|
@@ -151,7 +152,7 @@ export class InfiniteQuery {
|
|
|
151
152
|
});
|
|
152
153
|
}
|
|
153
154
|
/**
|
|
154
|
-
*
|
|
155
|
+
* вычисляемое свойство, содержащее реактивные данные,
|
|
155
156
|
* благодаря mobx, при изменении isInvalid, свойство будет вычисляться заново,
|
|
156
157
|
* следовательно, стриггерится условие невалидности,
|
|
157
158
|
* и начнется запрос, в результате которого, данные обновятся
|
|
@@ -161,7 +162,7 @@ export class InfiniteQuery {
|
|
|
161
162
|
!this.isSuccess &&
|
|
162
163
|
!this.isLoading &&
|
|
163
164
|
!this.isError;
|
|
164
|
-
if (this.isInvalid || shouldSync) {
|
|
165
|
+
if (this.auxiliary.isInvalid || shouldSync) {
|
|
165
166
|
// т.к. при вызове апдейта, изменяются флаги, на которые подписан data,
|
|
166
167
|
// нужно вызывать этот экшн асинхронно
|
|
167
168
|
when(() => true, this.proceedSync);
|
|
@@ -169,31 +170,4 @@ export class InfiniteQuery {
|
|
|
169
170
|
// возвращаем имеющиеся данные
|
|
170
171
|
return this.storage.data;
|
|
171
172
|
}
|
|
172
|
-
/**
|
|
173
|
-
* @description флаг загрузки данных
|
|
174
|
-
*/
|
|
175
|
-
get isLoading() {
|
|
176
|
-
return this.auxiliary.isLoading;
|
|
177
|
-
}
|
|
178
|
-
/**
|
|
179
|
-
* @description флаг обозначающий, что последний запрос был зафейлен
|
|
180
|
-
*/
|
|
181
|
-
get isError() {
|
|
182
|
-
return this.auxiliary.isError;
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* @description данные о последней ошибке
|
|
186
|
-
*/
|
|
187
|
-
get error() {
|
|
188
|
-
return this.auxiliary.error;
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* @description флаг обозначающий, что последний запрос был успешно завершен
|
|
192
|
-
*/
|
|
193
|
-
get isSuccess() {
|
|
194
|
-
return this.auxiliary.isSuccess;
|
|
195
|
-
}
|
|
196
|
-
get isIdle() {
|
|
197
|
-
return this.auxiliary.isIdle;
|
|
198
|
-
}
|
|
199
173
|
}
|
package/MobxQuery/MobxQuery.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { type InfiniteExecutor, InfiniteQuery, type InfiniteQueryParams } from '
|
|
|
3
3
|
import { Mutation, type MutationExecutor, type MutationParams } from '../Mutation';
|
|
4
4
|
import type { CacheKey, FetchPolicy } from '../types';
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
6
|
+
* стандартный обработчик ошибки запроса,
|
|
7
7
|
* будет вызван, если при вызове sync не был передан отдельный onError параметр
|
|
8
8
|
*/
|
|
9
9
|
type OnError<TError = unknown> = (error: TError) => void;
|
|
@@ -11,72 +11,87 @@ type MobxQueryParams = {
|
|
|
11
11
|
fetchPolicy?: FetchPolicy;
|
|
12
12
|
onError?: OnError;
|
|
13
13
|
/**
|
|
14
|
-
*
|
|
14
|
+
* флаг, отвечающий за автоматический запрос данных при обращении к полю data
|
|
15
15
|
* @default false
|
|
16
16
|
*/
|
|
17
17
|
enabledAutoFetch?: boolean;
|
|
18
18
|
};
|
|
19
|
-
type CreateQueryParams<TResult, TError> = Omit<QueryParams<TResult, TError>, 'dataStorage'
|
|
20
|
-
|
|
19
|
+
type CreateQueryParams<TResult, TError, TIsBackground extends boolean> = Omit<QueryParams<TResult, TError, TIsBackground>, 'dataStorage' | 'statusStorage' | 'backgroundStatusStorage'> & {
|
|
20
|
+
/**
|
|
21
|
+
* режим фонового обновления
|
|
22
|
+
*/
|
|
23
|
+
isBackground?: TIsBackground;
|
|
24
|
+
};
|
|
25
|
+
type CreateInfiniteQueryParams<TResult, TError, TIsBackground extends boolean> = Omit<InfiniteQueryParams<TResult, TError, TIsBackground>, 'dataStorage' | 'statusStorage' | 'backgroundStatusStorage'> & {
|
|
26
|
+
/**
|
|
27
|
+
* режим фонового обновления
|
|
28
|
+
*/
|
|
29
|
+
isBackground?: TIsBackground;
|
|
30
|
+
};
|
|
21
31
|
/**
|
|
22
|
-
*
|
|
32
|
+
* Сервис, позволяющий кэшировать данные.
|
|
23
33
|
*/
|
|
24
34
|
export declare class MobxQuery<TDefaultError = void> {
|
|
25
35
|
/**
|
|
26
|
-
*
|
|
36
|
+
* объект соответствия хешей ключей и их значений
|
|
27
37
|
*/
|
|
28
38
|
private keys;
|
|
29
39
|
/**
|
|
30
|
-
*
|
|
40
|
+
* Map соответствия хешей ключей к запомненным сторам
|
|
31
41
|
*/
|
|
32
42
|
private cacheableStores;
|
|
33
43
|
/**
|
|
34
|
-
*
|
|
44
|
+
* фабрика создания хранилищ данных для обычного Query
|
|
35
45
|
*/
|
|
36
46
|
private queryDataStorageFactory;
|
|
37
47
|
/**
|
|
38
|
-
*
|
|
48
|
+
* фабрика создания хранилищ статусов между экземплярами Query и экземллярами Infinite Query.
|
|
49
|
+
*/
|
|
50
|
+
private statusStorageFactory;
|
|
51
|
+
/**
|
|
52
|
+
* фабрика создания хранилищ данных для Infinite Query
|
|
39
53
|
*/
|
|
40
54
|
private infiniteQueryDataStorageFactory;
|
|
41
55
|
/**
|
|
42
|
-
*
|
|
56
|
+
* стандартный обработчик ошибок, будет использован, если не передан другой
|
|
43
57
|
*/
|
|
44
58
|
private readonly defaultErrorHandler?;
|
|
45
59
|
/**
|
|
46
|
-
*
|
|
60
|
+
* стандартное поведение политики кеширования
|
|
47
61
|
*/
|
|
48
62
|
private readonly defaultFetchPolicy;
|
|
49
63
|
/**
|
|
50
|
-
*
|
|
64
|
+
* флаг, отвечающий за автоматический запрос данных при обращении к полю data
|
|
51
65
|
* @default false
|
|
52
66
|
*/
|
|
53
67
|
private readonly defaultEnabledAutoFetch;
|
|
54
68
|
private serialize;
|
|
55
69
|
constructor({ onError, fetchPolicy, enabledAutoFetch, }?: MobxQueryParams);
|
|
56
70
|
/**
|
|
57
|
-
*
|
|
71
|
+
* метод для инвалидации по списку ключей,
|
|
58
72
|
* предполагается использование из домена
|
|
59
73
|
*/
|
|
60
74
|
invalidate: (keysParts: CacheKey[]) => void;
|
|
61
75
|
/**
|
|
62
|
-
*
|
|
76
|
+
* метод инвалидации всех query
|
|
63
77
|
*/
|
|
64
78
|
invalidateQueries: () => void;
|
|
65
79
|
/**
|
|
66
|
-
*
|
|
80
|
+
* метод, который занимается проверкой наличия стора по ключу,
|
|
67
81
|
* и если нет, создает новый, добавляет его к себе в память, и возвращает его пользователю
|
|
68
82
|
*/
|
|
69
83
|
private getCachedQuery;
|
|
84
|
+
private getBackgroundStatusStorage;
|
|
70
85
|
/**
|
|
71
|
-
*
|
|
86
|
+
* метод создания стора, кешируется
|
|
72
87
|
*/
|
|
73
|
-
createQuery: <TResult, TError = TDefaultError>(key: CacheKey[], executor: QueryExecutor<TResult>, params?: CreateQueryParams<TResult, TError> | undefined) => Query<TResult, TError>;
|
|
88
|
+
createQuery: <TResult, TError = TDefaultError, TIsBackground extends boolean = false>(key: CacheKey[], executor: QueryExecutor<TResult>, params?: CreateQueryParams<TResult, TError, TIsBackground> | undefined) => Query<TResult, TError, TIsBackground>;
|
|
74
89
|
/**
|
|
75
|
-
*
|
|
90
|
+
* метод создания инфинит стора, кешируется
|
|
76
91
|
*/
|
|
77
|
-
createInfiniteQuery: <TResult, TError = TDefaultError>(key: CacheKey[], executor: InfiniteExecutor<TResult>, params?: CreateInfiniteQueryParams<TResult, TError> | undefined) => InfiniteQuery<TResult, TError>;
|
|
92
|
+
createInfiniteQuery: <TResult, TError = TDefaultError, TIsBackground extends boolean = false>(key: CacheKey[], executor: InfiniteExecutor<TResult>, params?: CreateInfiniteQueryParams<TResult, TError, TIsBackground> | undefined) => InfiniteQuery<TResult, TError, TIsBackground>;
|
|
78
93
|
/**
|
|
79
|
-
*
|
|
94
|
+
* метод создания мутации, не кешируется
|
|
80
95
|
*/
|
|
81
96
|
createMutation: <TResult, TError = TDefaultError, TExecutorParams = void>(executor: MutationExecutor<TResult, TExecutorParams>, params?: MutationParams<TResult, TError> | undefined) => Mutation<TResult, TError, TExecutorParams>;
|
|
82
97
|
}
|
package/MobxQuery/MobxQuery.js
CHANGED
|
@@ -2,34 +2,39 @@ import { Query } from '../Query';
|
|
|
2
2
|
import { InfiniteQuery, } from '../InfiniteQuery';
|
|
3
3
|
import { Mutation, } from '../Mutation';
|
|
4
4
|
import { DataStorageFactory } from '../DataStorage';
|
|
5
|
+
import { StatusStorageFactory } from '../StatusStorage';
|
|
5
6
|
/**
|
|
6
|
-
*
|
|
7
|
+
* время, спустя которое, запись о query c network-only будет удалена
|
|
7
8
|
*/
|
|
8
9
|
const DEFAULT_TIME_TO_CLEAN = 100;
|
|
9
10
|
/**
|
|
10
|
-
*
|
|
11
|
+
* Сервис, позволяющий кэшировать данные.
|
|
11
12
|
*/
|
|
12
13
|
export class MobxQuery {
|
|
13
14
|
constructor({ onError, fetchPolicy = 'cache-first', enabledAutoFetch = false, } = {}) {
|
|
14
15
|
/**
|
|
15
|
-
*
|
|
16
|
+
* объект соответствия хешей ключей и их значений
|
|
16
17
|
*/
|
|
17
18
|
this.keys = {};
|
|
18
19
|
/**
|
|
19
|
-
*
|
|
20
|
+
* Map соответствия хешей ключей к запомненным сторам
|
|
20
21
|
*/
|
|
21
22
|
this.cacheableStores = new Map();
|
|
22
23
|
/**
|
|
23
|
-
*
|
|
24
|
+
* фабрика создания хранилищ данных для обычного Query
|
|
24
25
|
*/
|
|
25
26
|
this.queryDataStorageFactory = new DataStorageFactory();
|
|
26
27
|
/**
|
|
27
|
-
*
|
|
28
|
+
* фабрика создания хранилищ статусов между экземплярами Query и экземллярами Infinite Query.
|
|
29
|
+
*/
|
|
30
|
+
this.statusStorageFactory = new StatusStorageFactory();
|
|
31
|
+
/**
|
|
32
|
+
* фабрика создания хранилищ данных для Infinite Query
|
|
28
33
|
*/
|
|
29
34
|
this.infiniteQueryDataStorageFactory = new DataStorageFactory();
|
|
30
35
|
this.serialize = (data) => JSON.stringify(data);
|
|
31
36
|
/**
|
|
32
|
-
*
|
|
37
|
+
* метод для инвалидации по списку ключей,
|
|
33
38
|
* предполагается использование из домена
|
|
34
39
|
*/
|
|
35
40
|
this.invalidate = (keysParts) => {
|
|
@@ -46,7 +51,7 @@ export class MobxQuery {
|
|
|
46
51
|
});
|
|
47
52
|
};
|
|
48
53
|
/**
|
|
49
|
-
*
|
|
54
|
+
* метод инвалидации всех query
|
|
50
55
|
*/
|
|
51
56
|
this.invalidateQueries = () => {
|
|
52
57
|
[...this.cacheableStores.entries()].forEach(([, store]) => {
|
|
@@ -54,7 +59,7 @@ export class MobxQuery {
|
|
|
54
59
|
});
|
|
55
60
|
};
|
|
56
61
|
/**
|
|
57
|
-
*
|
|
62
|
+
* метод, который занимается проверкой наличия стора по ключу,
|
|
58
63
|
* и если нет, создает новый, добавляет его к себе в память, и возвращает его пользователю
|
|
59
64
|
*/
|
|
60
65
|
this.getCachedQuery = (key, createStore, fetchPolicy) => {
|
|
@@ -82,30 +87,33 @@ export class MobxQuery {
|
|
|
82
87
|
}
|
|
83
88
|
return store;
|
|
84
89
|
};
|
|
90
|
+
this.getBackgroundStatusStorage = (key, hasBackground) => (hasBackground
|
|
91
|
+
? this.statusStorageFactory.getStorage([...key, true])
|
|
92
|
+
: null);
|
|
85
93
|
/**
|
|
86
|
-
*
|
|
94
|
+
* метод создания стора, кешируется
|
|
87
95
|
*/
|
|
88
96
|
this.createQuery = (key, executor, params) => {
|
|
89
97
|
const fetchPolicy = (params === null || params === void 0 ? void 0 : params.fetchPolicy) || this.defaultFetchPolicy;
|
|
90
98
|
return this.getCachedQuery(key, () => {
|
|
91
99
|
var _a;
|
|
92
100
|
return new Query(executor, Object.assign(Object.assign({}, params), { onError: ((params === null || params === void 0 ? void 0 : params.onError) ||
|
|
93
|
-
this.defaultErrorHandler), enabledAutoFetch: (_a = params === null || params === void 0 ? void 0 : params.enabledAutoFetch) !== null && _a !== void 0 ? _a : this.defaultEnabledAutoFetch, fetchPolicy: fetchPolicy, dataStorage: this.queryDataStorageFactory.getStorage(key) }));
|
|
101
|
+
this.defaultErrorHandler), enabledAutoFetch: (_a = params === null || params === void 0 ? void 0 : params.enabledAutoFetch) !== null && _a !== void 0 ? _a : this.defaultEnabledAutoFetch, fetchPolicy: fetchPolicy, dataStorage: this.queryDataStorageFactory.getStorage(key), statusStorage: this.statusStorageFactory.getStorage(key), backgroundStatusStorage: this.getBackgroundStatusStorage(key, Boolean(params === null || params === void 0 ? void 0 : params.isBackground)) }));
|
|
94
102
|
}, fetchPolicy);
|
|
95
103
|
};
|
|
96
104
|
/**
|
|
97
|
-
*
|
|
105
|
+
* метод создания инфинит стора, кешируется
|
|
98
106
|
*/
|
|
99
107
|
this.createInfiniteQuery = (key, executor, params) => {
|
|
100
108
|
const fetchPolicy = (params === null || params === void 0 ? void 0 : params.fetchPolicy) || this.defaultFetchPolicy || '';
|
|
101
109
|
return this.getCachedQuery(key, () => {
|
|
102
110
|
var _a;
|
|
103
111
|
return new InfiniteQuery(executor, Object.assign(Object.assign({}, params), { onError: ((params === null || params === void 0 ? void 0 : params.onError) ||
|
|
104
|
-
this.defaultErrorHandler), enabledAutoFetch: (_a = params === null || params === void 0 ? void 0 : params.enabledAutoFetch) !== null && _a !== void 0 ? _a : this.defaultEnabledAutoFetch, dataStorage: this.infiniteQueryDataStorageFactory.getStorage(key), fetchPolicy: fetchPolicy }));
|
|
112
|
+
this.defaultErrorHandler), enabledAutoFetch: (_a = params === null || params === void 0 ? void 0 : params.enabledAutoFetch) !== null && _a !== void 0 ? _a : this.defaultEnabledAutoFetch, dataStorage: this.infiniteQueryDataStorageFactory.getStorage(key), statusStorage: this.statusStorageFactory.getStorage(key), fetchPolicy: fetchPolicy, backgroundStatusStorage: this.getBackgroundStatusStorage(key, Boolean(params === null || params === void 0 ? void 0 : params.isBackground)) }));
|
|
105
113
|
}, fetchPolicy);
|
|
106
114
|
};
|
|
107
115
|
/**
|
|
108
|
-
*
|
|
116
|
+
* метод создания мутации, не кешируется
|
|
109
117
|
*/
|
|
110
118
|
this.createMutation = (executor, params) => new Mutation(executor, Object.assign(Object.assign({}, params), { onError: (params === null || params === void 0 ? void 0 : params.onError) || this.defaultErrorHandler }));
|
|
111
119
|
this.defaultErrorHandler = onError;
|
package/Mutation/Mutation.d.ts
CHANGED
|
@@ -1,57 +1,34 @@
|
|
|
1
|
+
import { AuxiliaryQuery } from '../AuxiliaryQuery';
|
|
1
2
|
import type { QueryBaseActions, Sync, SyncParams } from '../types';
|
|
3
|
+
import { QueryContainer } from '../QueryContainer';
|
|
2
4
|
/**
|
|
3
|
-
*
|
|
5
|
+
* исполнитель запроса
|
|
4
6
|
*/
|
|
5
7
|
export type MutationExecutor<TResult, TParams> = (params: TParams) => Promise<TResult>;
|
|
6
8
|
export type MutationParams<TResult, TError> = {
|
|
7
9
|
/**
|
|
8
|
-
*
|
|
10
|
+
* обработчик ошибки, вызываемый по умолчанию
|
|
9
11
|
*/
|
|
10
12
|
onError?: SyncParams<TResult, TError>['onError'];
|
|
11
13
|
};
|
|
12
14
|
/**
|
|
13
|
-
*
|
|
15
|
+
* простой стор для запросов, которые не требуют кэширования,
|
|
14
16
|
* пример - POST запросы
|
|
15
17
|
*/
|
|
16
|
-
export declare class Mutation<TResult, TError = void, TExecutorParams = void> implements QueryBaseActions<TResult, TError, TExecutorParams> {
|
|
18
|
+
export declare class Mutation<TResult, TError = void, TExecutorParams = void> extends QueryContainer<TError, AuxiliaryQuery<TResult, TError>, false> implements QueryBaseActions<TResult, TError, TExecutorParams> {
|
|
19
|
+
private readonly executor;
|
|
17
20
|
/**
|
|
18
|
-
*
|
|
21
|
+
* обработчик ошибки, вызываемый по умолчанию
|
|
19
22
|
*/
|
|
20
|
-
private
|
|
21
|
-
/**
|
|
22
|
-
* @description исполнитель запроса, ожидается,
|
|
23
|
-
* что будет использоваться что-то из слоя sources
|
|
24
|
-
*/
|
|
25
|
-
private executor;
|
|
26
|
-
/**
|
|
27
|
-
* @description обработчик ошибки, вызываемый по умолчанию
|
|
28
|
-
*/
|
|
29
|
-
private defaultOnError?;
|
|
23
|
+
private readonly defaultOnError?;
|
|
30
24
|
constructor(executor: MutationExecutor<TResult, TExecutorParams>, { onError }?: MutationParams<TResult, TError>);
|
|
31
25
|
/**
|
|
32
|
-
*
|
|
26
|
+
* синхронный метод получения/отправки данных
|
|
33
27
|
*/
|
|
34
28
|
sync: Sync<TResult, TError, TExecutorParams>;
|
|
35
29
|
/**
|
|
36
|
-
*
|
|
30
|
+
* асинхронный метод получения/отправки данных,
|
|
37
31
|
* предполагается, что нужно будет самостоятельно обрабатывать ошибку
|
|
38
32
|
*/
|
|
39
33
|
async: (params: TExecutorParams) => Promise<TResult>;
|
|
40
|
-
/**
|
|
41
|
-
* @description флаг загрузки данных
|
|
42
|
-
*/
|
|
43
|
-
get isLoading(): boolean;
|
|
44
|
-
/**
|
|
45
|
-
* @description флаг обозначающий, что последний запрос был зафейлен
|
|
46
|
-
*/
|
|
47
|
-
get isError(): boolean;
|
|
48
|
-
/**
|
|
49
|
-
* @description данные о последней ошибке
|
|
50
|
-
*/
|
|
51
|
-
get error(): TError | undefined;
|
|
52
|
-
/**
|
|
53
|
-
* @description флаг обозначающий, что последний запрос был успешно завершен
|
|
54
|
-
*/
|
|
55
|
-
get isSuccess(): boolean;
|
|
56
|
-
get isIdle(): boolean;
|
|
57
34
|
}
|
package/Mutation/Mutation.js
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { action, makeObservable } from 'mobx';
|
|
2
2
|
import { AuxiliaryQuery } from '../AuxiliaryQuery';
|
|
3
|
+
import { QueryContainer } from '../QueryContainer';
|
|
4
|
+
import { StatusStorage } from '../StatusStorage';
|
|
3
5
|
/**
|
|
4
|
-
*
|
|
6
|
+
* простой стор для запросов, которые не требуют кэширования,
|
|
5
7
|
* пример - POST запросы
|
|
6
8
|
*/
|
|
7
|
-
export class Mutation {
|
|
9
|
+
export class Mutation extends QueryContainer {
|
|
8
10
|
constructor(executor, { onError } = {}) {
|
|
11
|
+
const statusStorage = new StatusStorage();
|
|
12
|
+
super(statusStorage, null, new AuxiliaryQuery(statusStorage, null));
|
|
13
|
+
this.executor = executor;
|
|
9
14
|
/**
|
|
10
|
-
*
|
|
11
|
-
*/
|
|
12
|
-
this.auxiliary = new AuxiliaryQuery();
|
|
13
|
-
/**
|
|
14
|
-
* @description синхронный метод получения/отправки данных
|
|
15
|
+
* синхронный метод получения/отправки данных
|
|
15
16
|
*/
|
|
16
17
|
this.sync = (options) => {
|
|
17
18
|
const { onSuccess, onError, params } = options || {};
|
|
@@ -31,41 +32,13 @@ export class Mutation {
|
|
|
31
32
|
});
|
|
32
33
|
};
|
|
33
34
|
/**
|
|
34
|
-
*
|
|
35
|
+
* асинхронный метод получения/отправки данных,
|
|
35
36
|
* предполагается, что нужно будет самостоятельно обрабатывать ошибку
|
|
36
37
|
*/
|
|
37
38
|
this.async = (params) => {
|
|
38
39
|
return this.auxiliary.getUnifiedPromise(() => this.executor(params));
|
|
39
40
|
};
|
|
40
|
-
this.executor = executor;
|
|
41
41
|
this.defaultOnError = onError;
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* @description флаг загрузки данных
|
|
46
|
-
*/
|
|
47
|
-
get isLoading() {
|
|
48
|
-
return this.auxiliary.isLoading;
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* @description флаг обозначающий, что последний запрос был зафейлен
|
|
52
|
-
*/
|
|
53
|
-
get isError() {
|
|
54
|
-
return this.auxiliary.isError;
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* @description данные о последней ошибке
|
|
58
|
-
*/
|
|
59
|
-
get error() {
|
|
60
|
-
return this.auxiliary.error;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* @description флаг обозначающий, что последний запрос был успешно завершен
|
|
64
|
-
*/
|
|
65
|
-
get isSuccess() {
|
|
66
|
-
return this.auxiliary.isSuccess;
|
|
67
|
-
}
|
|
68
|
-
get isIdle() {
|
|
69
|
-
return this.auxiliary.isIdle;
|
|
42
|
+
makeObservable(this, { async: action, sync: action });
|
|
70
43
|
}
|
|
71
44
|
}
|