@astral/mobx-query 1.3.3 → 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.
@@ -1,30 +1,25 @@
1
- import { makeAutoObservable, when } from 'mobx';
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
- * @description стор для работы с инфинити запросами,
6
+ * стор для работы с инфинити запросами,
6
7
  * которые должны быть закешированы,
7
8
  */
8
- export class InfiniteQuery {
9
- constructor(executor, { incrementCount = DEFAULT_INFINITE_ITEMS_COUNT, onError, enabledAutoFetch, fetchPolicy, dataStorage, }) {
10
- /**
11
- * @description инстанс вспомогательного стора
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
- * @description счетчик отступа для инфинити запроса
14
+ * счетчик отступа для инфинити запроса
16
15
  */
17
16
  this.offset = 0;
18
17
  /**
19
- * @description флаг того, что мы достигли предела запрашиваемых элементов
18
+ * флаг того, что мы достигли предела запрашиваемых элементов
20
19
  */
21
20
  this.isEndReached = false;
22
21
  /**
23
- * @description флаг необходимости выполнить обновления данных
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
- * @description форс метод для установки данных
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
- * @description метод для инвалидации данных
53
+ * метод для инвалидации данных
60
54
  */
61
55
  this.invalidate = () => {
62
- this.isInvalid = true;
56
+ this.auxiliary.invalidate();
63
57
  };
64
58
  /**
65
- * @description метод для запроса следующего набора данных
59
+ * метод для запроса следующего набора данных
66
60
  */
67
61
  this.fetchMore = () => {
68
62
  // если мы еще не достигли предела
@@ -78,16 +72,16 @@ export class InfiniteQuery {
78
72
  }
79
73
  };
80
74
  /**
81
- * @description синхронный метод получения данных
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
- * @description метод для переиспользования синхронной логики запроса
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
- * @description aсинхронный метод получения данных,
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
- makeAutoObservable(this);
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
- * @description метод для обогащения параметров текущими значениями для инфинити
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
- * @description вычисляемое свойство, содержащее реактивные данные,
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,28 +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
173
  }
@@ -1,12 +1,9 @@
1
- import type { QueryExecutor, QueryParams } from '../Query';
2
- import { Query } from '../Query';
3
- import type { InfiniteExecutor, InfiniteQueryParams } from '../InfiniteQuery';
4
- import { InfiniteQuery } from '../InfiniteQuery';
5
- import type { MutationExecutor, MutationParams } from '../Mutation';
6
- import { Mutation } from '../Mutation';
1
+ import { Query, type QueryExecutor, type QueryParams } from '../Query';
2
+ import { type InfiniteExecutor, InfiniteQuery, type InfiniteQueryParams } from '../InfiniteQuery';
3
+ import { Mutation, type MutationExecutor, type MutationParams } from '../Mutation';
7
4
  import type { CacheKey, FetchPolicy } from '../types';
8
5
  /**
9
- * @description стандартный обработчик ошибки запроса,
6
+ * стандартный обработчик ошибки запроса,
10
7
  * будет вызван, если при вызове sync не был передан отдельный onError параметр
11
8
  */
12
9
  type OnError<TError = unknown> = (error: TError) => void;
@@ -14,72 +11,87 @@ type MobxQueryParams = {
14
11
  fetchPolicy?: FetchPolicy;
15
12
  onError?: OnError;
16
13
  /**
17
- * @description флаг, отвечающий за автоматический запрос данных при обращении к полю data
14
+ * флаг, отвечающий за автоматический запрос данных при обращении к полю data
18
15
  * @default false
19
16
  */
20
17
  enabledAutoFetch?: boolean;
21
18
  };
22
- type CreateQueryParams<TResult, TError> = Omit<QueryParams<TResult, TError>, 'dataStorage'>;
23
- type CreateInfiniteQueryParams<TResult, TError> = Omit<InfiniteQueryParams<TResult, TError>, 'dataStorage'>;
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
+ };
24
31
  /**
25
- * @description Сервис, позволяющий кэшировать данные.
32
+ * Сервис, позволяющий кэшировать данные.
26
33
  */
27
34
  export declare class MobxQuery<TDefaultError = void> {
28
35
  /**
29
- * @description объект соответствия хешей ключей и их значений
36
+ * объект соответствия хешей ключей и их значений
30
37
  */
31
38
  private keys;
32
39
  /**
33
- * @description Map соответствия хешей ключей к запомненным сторам
40
+ * Map соответствия хешей ключей к запомненным сторам
34
41
  */
35
42
  private cacheableStores;
36
43
  /**
37
- * @description фабрика создания хранилищ данных для обычного Query
44
+ * фабрика создания хранилищ данных для обычного Query
38
45
  */
39
46
  private queryDataStorageFactory;
40
47
  /**
41
- * @description фабрика создания хранилищ данных для Infinite Query
48
+ * фабрика создания хранилищ статусов между экземплярами Query и экземллярами Infinite Query.
49
+ */
50
+ private statusStorageFactory;
51
+ /**
52
+ * фабрика создания хранилищ данных для Infinite Query
42
53
  */
43
54
  private infiniteQueryDataStorageFactory;
44
55
  /**
45
- * @description стандартный обработчик ошибок, будет использован, если не передан другой
56
+ * стандартный обработчик ошибок, будет использован, если не передан другой
46
57
  */
47
58
  private readonly defaultErrorHandler?;
48
59
  /**
49
- * @description стандартное поведение политики кеширования
60
+ * стандартное поведение политики кеширования
50
61
  */
51
62
  private readonly defaultFetchPolicy;
52
63
  /**
53
- * @description флаг, отвечающий за автоматический запрос данных при обращении к полю data
64
+ * флаг, отвечающий за автоматический запрос данных при обращении к полю data
54
65
  * @default false
55
66
  */
56
67
  private readonly defaultEnabledAutoFetch;
57
68
  private serialize;
58
69
  constructor({ onError, fetchPolicy, enabledAutoFetch, }?: MobxQueryParams);
59
70
  /**
60
- * @description метод для инвалидации по списку ключей,
71
+ * метод для инвалидации по списку ключей,
61
72
  * предполагается использование из домена
62
73
  */
63
74
  invalidate: (keysParts: CacheKey[]) => void;
64
75
  /**
65
- * @description метод инвалидации всех query
76
+ * метод инвалидации всех query
66
77
  */
67
78
  invalidateQueries: () => void;
68
79
  /**
69
- * @description метод, который занимается проверкой наличия стора по ключу,
80
+ * метод, который занимается проверкой наличия стора по ключу,
70
81
  * и если нет, создает новый, добавляет его к себе в память, и возвращает его пользователю
71
82
  */
72
83
  private getCachedQuery;
84
+ private getBackgroundStatusStorage;
73
85
  /**
74
- * @description метод создания стора, кешируется
86
+ * метод создания стора, кешируется
75
87
  */
76
- 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>;
77
89
  /**
78
- * @description метод создания инфинит стора, кешируется
90
+ * метод создания инфинит стора, кешируется
79
91
  */
80
- 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>;
81
93
  /**
82
- * @description метод создания мутации, не кешируется
94
+ * метод создания мутации, не кешируется
83
95
  */
84
96
  createMutation: <TResult, TError = TDefaultError, TExecutorParams = void>(executor: MutationExecutor<TResult, TExecutorParams>, params?: MutationParams<TResult, TError> | undefined) => Mutation<TResult, TError, TExecutorParams>;
85
97
  }
@@ -1,35 +1,40 @@
1
1
  import { Query } from '../Query';
2
- import { InfiniteQuery } from '../InfiniteQuery';
3
- import { Mutation } from '../Mutation';
2
+ import { InfiniteQuery, } from '../InfiniteQuery';
3
+ import { Mutation, } from '../Mutation';
4
4
  import { DataStorageFactory } from '../DataStorage';
5
+ import { StatusStorageFactory } from '../StatusStorage';
5
6
  /**
6
- * @description время, спустя которое, запись о query c network-only будет удалена
7
+ * время, спустя которое, запись о query c network-only будет удалена
7
8
  */
8
9
  const DEFAULT_TIME_TO_CLEAN = 100;
9
10
  /**
10
- * @description Сервис, позволяющий кэшировать данные.
11
+ * Сервис, позволяющий кэшировать данные.
11
12
  */
12
13
  export class MobxQuery {
13
14
  constructor({ onError, fetchPolicy = 'cache-first', enabledAutoFetch = false, } = {}) {
14
15
  /**
15
- * @description объект соответствия хешей ключей и их значений
16
+ * объект соответствия хешей ключей и их значений
16
17
  */
17
18
  this.keys = {};
18
19
  /**
19
- * @description Map соответствия хешей ключей к запомненным сторам
20
+ * Map соответствия хешей ключей к запомненным сторам
20
21
  */
21
22
  this.cacheableStores = new Map();
22
23
  /**
23
- * @description фабрика создания хранилищ данных для обычного Query
24
+ * фабрика создания хранилищ данных для обычного Query
24
25
  */
25
26
  this.queryDataStorageFactory = new DataStorageFactory();
26
27
  /**
27
- * @description фабрика создания хранилищ данных для Infinite Query
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
- * @description метод для инвалидации по списку ключей,
37
+ * метод для инвалидации по списку ключей,
33
38
  * предполагается использование из домена
34
39
  */
35
40
  this.invalidate = (keysParts) => {
@@ -46,7 +51,7 @@ export class MobxQuery {
46
51
  });
47
52
  };
48
53
  /**
49
- * @description метод инвалидации всех query
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
- * @description метод, который занимается проверкой наличия стора по ключу,
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
- * @description метод создания стора, кешируется
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
- * @description метод создания инфинит стора, кешируется
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
- * @description метод создания мутации, не кешируется
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;
@@ -1,56 +1,34 @@
1
+ import { AuxiliaryQuery } from '../AuxiliaryQuery';
1
2
  import type { QueryBaseActions, Sync, SyncParams } from '../types';
3
+ import { QueryContainer } from '../QueryContainer';
2
4
  /**
3
- * @description исполнитель запроса
5
+ * исполнитель запроса
4
6
  */
5
7
  export type MutationExecutor<TResult, TParams> = (params: TParams) => Promise<TResult>;
6
8
  export type MutationParams<TResult, TError> = {
7
9
  /**
8
- * @description обработчик ошибки, вызываемый по умолчанию
10
+ * обработчик ошибки, вызываемый по умолчанию
9
11
  */
10
12
  onError?: SyncParams<TResult, TError>['onError'];
11
13
  };
12
14
  /**
13
- * @description простой стор для запросов, которые не требуют кэширования,
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
- * @description инстанс вспомогательного стора
21
+ * обработчик ошибки, вызываемый по умолчанию
19
22
  */
20
- private auxiliary;
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
- * @description синхронный метод получения/отправки данных
26
+ * синхронный метод получения/отправки данных
33
27
  */
34
28
  sync: Sync<TResult, TError, TExecutorParams>;
35
29
  /**
36
- * @description асинхронный метод получения/отправки данных,
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
34
  }
@@ -1,17 +1,18 @@
1
- import { makeAutoObservable } from 'mobx';
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
- * @description простой стор для запросов, которые не требуют кэширования,
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
- * @description инстанс вспомогательного стора
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,38 +32,13 @@ export class Mutation {
31
32
  });
32
33
  };
33
34
  /**
34
- * @description асинхронный метод получения/отправки данных,
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
- makeAutoObservable(this);
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;
42
+ makeObservable(this, { async: action, sync: action });
67
43
  }
68
44
  }