@astral/mobx-query 1.4.0 → 1.6.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/AdaptableMap/AdaptableMap.d.ts +29 -0
- package/AdaptableMap/AdaptableMap.js +77 -0
- package/AdaptableMap/index.d.ts +1 -0
- package/AdaptableMap/index.js +1 -0
- package/AuxiliaryQuery/AuxiliaryQuery.d.ts +25 -26
- package/AuxiliaryQuery/AuxiliaryQuery.js +59 -34
- package/DataStorage/DataStorage.d.ts +11 -14
- package/DataStorage/DataStorage.js +12 -18
- package/InfiniteQuery/InfiniteQuery.d.ts +50 -55
- package/InfiniteQuery/InfiniteQuery.js +34 -57
- package/MobxQuery/MobxQuery.d.ts +48 -22
- package/MobxQuery/MobxQuery.js +88 -51
- package/Mutation/Mutation.d.ts +11 -34
- package/Mutation/Mutation.js +11 -38
- package/Query/Query.d.ts +45 -50
- package/Query/Query.js +28 -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 +24 -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 +9 -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
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type SimplifiedMap<TData> = Pick<Map<string, TData>, 'get' | 'delete' | 'has'> & {
|
|
2
|
+
set: (key: string, value: TData) => void;
|
|
3
|
+
};
|
|
4
|
+
/**
|
|
5
|
+
* Фасад для работы с Map, умеющий в конвертацию хранимого значения в "слабое" состояние и в "сильное"
|
|
6
|
+
* По умолчанию все значения хранятся как "слабые".
|
|
7
|
+
* @enum "Слабое" состояние подразумевает то, что хранимое значение сохранено через WeakRef, следовательно, если в системе не останется ссылок на хранимое значение, сборщик мусора сможет удалить это значение из памяти.
|
|
8
|
+
* @enum "Сильное" состояние подразумевает то, что значение хранится как есть, т.е. даже если в системе не останется других ссылок на хранимое значение, сборщик мусора не сможет удалить его из памяти.
|
|
9
|
+
*/
|
|
10
|
+
export declare class AdaptableMap<TData extends {}> implements SimplifiedMap<TData> {
|
|
11
|
+
private strong;
|
|
12
|
+
private weak;
|
|
13
|
+
get: (key: string) => TData | undefined;
|
|
14
|
+
set: (key: string, data: TData) => void;
|
|
15
|
+
delete: (key: string) => boolean;
|
|
16
|
+
has: (key: string) => boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Метод перемещающий значение из одного Map в другой
|
|
19
|
+
*/
|
|
20
|
+
private change;
|
|
21
|
+
/**
|
|
22
|
+
* Метод для конвертации значения из "сильного" в "слабое" состояние
|
|
23
|
+
*/
|
|
24
|
+
convertToWeak: (key: string) => void;
|
|
25
|
+
/**
|
|
26
|
+
* Метод для конвертации значения из "слабого" в "сильное" состояние
|
|
27
|
+
*/
|
|
28
|
+
convertToStrong: (key: string) => void;
|
|
29
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Фасад для работы с Map, хранящим значения как WeakRef
|
|
3
|
+
*/
|
|
4
|
+
class WeakRefMap {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.map = new Map();
|
|
7
|
+
this.get = (key) => {
|
|
8
|
+
var _a, _b;
|
|
9
|
+
// Проверка на старые браузеры, не умеющие в WeakRef
|
|
10
|
+
if (!globalThis.WeakRef) {
|
|
11
|
+
return this.map.get(key);
|
|
12
|
+
}
|
|
13
|
+
return (_b = (_a = this.map.get(key)) === null || _a === void 0 ? void 0 : _a.deref) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
14
|
+
};
|
|
15
|
+
this.set = (key, value) => {
|
|
16
|
+
// Проверка на старые браузеры, не умеющие в WeakRef
|
|
17
|
+
if (!globalThis.WeakRef) {
|
|
18
|
+
this.map.set(key, value);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
this.map.set(key, new globalThis.WeakRef(value));
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
this.delete = (key) => this.map.delete(key);
|
|
25
|
+
this.has = (key) => this.map.has(key);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Фасад для работы с Map, умеющий в конвертацию хранимого значения в "слабое" состояние и в "сильное"
|
|
30
|
+
* По умолчанию все значения хранятся как "слабые".
|
|
31
|
+
* @enum "Слабое" состояние подразумевает то, что хранимое значение сохранено через WeakRef, следовательно, если в системе не останется ссылок на хранимое значение, сборщик мусора сможет удалить это значение из памяти.
|
|
32
|
+
* @enum "Сильное" состояние подразумевает то, что значение хранится как есть, т.е. даже если в системе не останется других ссылок на хранимое значение, сборщик мусора не сможет удалить его из памяти.
|
|
33
|
+
*/
|
|
34
|
+
export class AdaptableMap {
|
|
35
|
+
constructor() {
|
|
36
|
+
this.strong = new Map();
|
|
37
|
+
this.weak = new WeakRefMap();
|
|
38
|
+
this.get = (key) => {
|
|
39
|
+
if (this.strong.has(key)) {
|
|
40
|
+
return this.strong.get(key);
|
|
41
|
+
}
|
|
42
|
+
return this.weak.get(key);
|
|
43
|
+
};
|
|
44
|
+
this.set = (key, data) => {
|
|
45
|
+
this.weak.set(key, data);
|
|
46
|
+
};
|
|
47
|
+
this.delete = (key) => {
|
|
48
|
+
// если успешно удалилось в "слабом" хранилище, тогда в "сильном" уже не имеет смысла удалять.
|
|
49
|
+
return this.weak.delete(key) || this.strong.delete(key);
|
|
50
|
+
};
|
|
51
|
+
this.has = (key) => {
|
|
52
|
+
return Boolean(this.weak.get(key)) || this.strong.has(key);
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Метод перемещающий значение из одного Map в другой
|
|
56
|
+
*/
|
|
57
|
+
this.change = (key, from, to) => {
|
|
58
|
+
const query = this.get(key);
|
|
59
|
+
if (query) {
|
|
60
|
+
from.delete(key);
|
|
61
|
+
to.set(key, query);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Метод для конвертации значения из "сильного" в "слабое" состояние
|
|
66
|
+
*/
|
|
67
|
+
this.convertToWeak = (key) => {
|
|
68
|
+
this.change(key, this.strong, this.weak);
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Метод для конвертации значения из "слабого" в "сильное" состояние
|
|
72
|
+
*/
|
|
73
|
+
this.convertToStrong = (key) => {
|
|
74
|
+
this.change(key, this.weak, this.strong);
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './AdaptableMap';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './AdaptableMap';
|
|
@@ -1,56 +1,55 @@
|
|
|
1
|
+
import { type StatusStorage } from '../StatusStorage';
|
|
1
2
|
/**
|
|
2
|
-
*
|
|
3
|
+
* Испольнитель запроса
|
|
3
4
|
*/
|
|
4
5
|
type Executor<TResult> = () => Promise<TResult>;
|
|
5
6
|
/**
|
|
6
|
-
*
|
|
7
|
+
* Вспомогательное хранилище данных, для композиции в Query сторах,
|
|
7
8
|
* содержащее флаги загрузки и ошибки,
|
|
8
9
|
* колбэки на успешный запрос и на ошибку,
|
|
9
10
|
* данные последней ошибки,
|
|
10
11
|
* а так же, управляющее синглтон промисом.
|
|
11
12
|
*/
|
|
12
13
|
export declare class AuxiliaryQuery<TResult, TError = void> {
|
|
14
|
+
private readonly statusStorage;
|
|
15
|
+
private readonly backgroundStatusStorage;
|
|
13
16
|
/**
|
|
14
|
-
*
|
|
17
|
+
* Флаг, обозначающий простаивание, т.е. запроса еще не было
|
|
15
18
|
*/
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* @description флаг обозначающий, что последний запрос был зафейлен
|
|
19
|
-
*/
|
|
20
|
-
isError: boolean;
|
|
21
|
-
/**
|
|
22
|
-
* @description данные о последней ошибке
|
|
23
|
-
*/
|
|
24
|
-
error?: TError;
|
|
25
|
-
/**
|
|
26
|
-
* @description флаг, обозначающий успешность завершения последнего запроса
|
|
27
|
-
*/
|
|
28
|
-
isSuccess: boolean;
|
|
19
|
+
isIdle: boolean;
|
|
29
20
|
/**
|
|
30
|
-
*
|
|
21
|
+
* Единый промис, для устранения гонки запросов
|
|
31
22
|
*/
|
|
32
|
-
|
|
23
|
+
private unifiedPromise?;
|
|
33
24
|
/**
|
|
34
|
-
*
|
|
25
|
+
* Флаг, по которому реактивно определяется необходимость запуска инвалидации
|
|
35
26
|
*/
|
|
36
|
-
|
|
37
|
-
constructor();
|
|
27
|
+
isInvalid: boolean;
|
|
28
|
+
constructor(statusStorage: StatusStorage<TError>, backgroundStatusStorage: StatusStorage<TError> | null);
|
|
38
29
|
/**
|
|
39
|
-
*
|
|
30
|
+
* Метод ответственный за создание единого промиса,
|
|
40
31
|
* для устранения гонки запросов
|
|
41
32
|
*/
|
|
42
33
|
getUnifiedPromise: (executor: Executor<TResult>) => Promise<TResult>;
|
|
34
|
+
private setSuccess;
|
|
35
|
+
private checkBackgroundAndSet;
|
|
43
36
|
/**
|
|
44
|
-
*
|
|
37
|
+
* Обработчик успешного ответа
|
|
45
38
|
*/
|
|
46
39
|
submitSuccess: () => void;
|
|
40
|
+
private setError;
|
|
47
41
|
/**
|
|
48
|
-
*
|
|
42
|
+
* Обработчик ошибки
|
|
49
43
|
*/
|
|
50
|
-
submitError: (
|
|
44
|
+
submitError: (error: TError) => void;
|
|
45
|
+
private setLoading;
|
|
51
46
|
/**
|
|
52
|
-
*
|
|
47
|
+
* Метод, вызываемый в самом начале запроса, чтобы сбросить флаги в соответствующее значение
|
|
53
48
|
*/
|
|
54
49
|
startLoading: () => void;
|
|
50
|
+
/**
|
|
51
|
+
* Метод для инвалидации данных
|
|
52
|
+
*/
|
|
53
|
+
invalidate: () => void;
|
|
55
54
|
}
|
|
56
55
|
export {};
|
|
@@ -1,35 +1,25 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { action, makeObservable, observable, runInAction } from 'mobx';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Вспомогательное хранилище данных, для композиции в Query сторах,
|
|
4
4
|
* содержащее флаги загрузки и ошибки,
|
|
5
5
|
* колбэки на успешный запрос и на ошибку,
|
|
6
6
|
* данные последней ошибки,
|
|
7
7
|
* а так же, управляющее синглтон промисом.
|
|
8
8
|
*/
|
|
9
9
|
export class AuxiliaryQuery {
|
|
10
|
-
constructor() {
|
|
10
|
+
constructor(statusStorage, backgroundStatusStorage) {
|
|
11
|
+
this.statusStorage = statusStorage;
|
|
12
|
+
this.backgroundStatusStorage = backgroundStatusStorage;
|
|
11
13
|
/**
|
|
12
|
-
*
|
|
14
|
+
* Флаг, обозначающий простаивание, т.е. запроса еще не было
|
|
13
15
|
*/
|
|
14
|
-
this.
|
|
15
|
-
/**
|
|
16
|
-
* @description флаг обозначающий, что последний запрос был зафейлен
|
|
17
|
-
*/
|
|
18
|
-
this.isError = false;
|
|
19
|
-
/**
|
|
20
|
-
* @description данные о последней ошибке
|
|
21
|
-
*/
|
|
22
|
-
this.error = undefined;
|
|
23
|
-
/**
|
|
24
|
-
* @description флаг, обозначающий успешность завершения последнего запроса
|
|
25
|
-
*/
|
|
26
|
-
this.isSuccess = false;
|
|
16
|
+
this.isIdle = true;
|
|
27
17
|
/**
|
|
28
|
-
*
|
|
18
|
+
* Флаг, по которому реактивно определяется необходимость запуска инвалидации
|
|
29
19
|
*/
|
|
30
|
-
this.
|
|
20
|
+
this.isInvalid = false;
|
|
31
21
|
/**
|
|
32
|
-
*
|
|
22
|
+
* Метод ответственный за создание единого промиса,
|
|
33
23
|
* для устранения гонки запросов
|
|
34
24
|
*/
|
|
35
25
|
this.getUnifiedPromise = (executor) => {
|
|
@@ -50,36 +40,71 @@ export class AuxiliaryQuery {
|
|
|
50
40
|
.finally(() => {
|
|
51
41
|
this.unifiedPromise = undefined;
|
|
52
42
|
runInAction(() => {
|
|
53
|
-
this.isLoading = false;
|
|
43
|
+
this.statusStorage.isLoading = false;
|
|
54
44
|
});
|
|
55
45
|
});
|
|
56
46
|
}
|
|
57
47
|
return this.unifiedPromise;
|
|
58
48
|
};
|
|
49
|
+
this.setSuccess = (storage) => {
|
|
50
|
+
storage.isError = false;
|
|
51
|
+
storage.isSuccess = true;
|
|
52
|
+
};
|
|
53
|
+
this.checkBackgroundAndSet = (setStorage) => {
|
|
54
|
+
if (this.backgroundStatusStorage && this.statusStorage.isSuccess) {
|
|
55
|
+
setStorage(this.backgroundStatusStorage);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
setStorage(this.statusStorage);
|
|
59
|
+
}
|
|
60
|
+
};
|
|
59
61
|
/**
|
|
60
|
-
*
|
|
62
|
+
* Обработчик успешного ответа
|
|
61
63
|
*/
|
|
62
64
|
this.submitSuccess = () => {
|
|
63
|
-
this.
|
|
64
|
-
this.
|
|
65
|
+
this.checkBackgroundAndSet(this.setSuccess);
|
|
66
|
+
this.isInvalid = false;
|
|
67
|
+
};
|
|
68
|
+
this.setError = (storage, error) => {
|
|
69
|
+
storage.isSuccess = false;
|
|
70
|
+
storage.isError = true;
|
|
71
|
+
storage.error = error;
|
|
65
72
|
};
|
|
66
73
|
/**
|
|
67
|
-
*
|
|
74
|
+
* Обработчик ошибки
|
|
68
75
|
*/
|
|
69
|
-
this.submitError = (
|
|
70
|
-
this.
|
|
71
|
-
|
|
72
|
-
|
|
76
|
+
this.submitError = (error) => {
|
|
77
|
+
this.checkBackgroundAndSet((storage) => this.setError(storage, error));
|
|
78
|
+
};
|
|
79
|
+
this.setLoading = (storage) => {
|
|
80
|
+
storage.isLoading = true;
|
|
81
|
+
storage.isError = false;
|
|
82
|
+
storage.isSuccess = false;
|
|
73
83
|
};
|
|
74
84
|
/**
|
|
75
|
-
*
|
|
85
|
+
* Метод, вызываемый в самом начале запроса, чтобы сбросить флаги в соответствующее значение
|
|
76
86
|
*/
|
|
77
87
|
this.startLoading = () => {
|
|
78
88
|
this.isIdle = false;
|
|
79
|
-
this.
|
|
80
|
-
|
|
81
|
-
|
|
89
|
+
this.checkBackgroundAndSet(this.setLoading);
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Метод для инвалидации данных
|
|
93
|
+
*/
|
|
94
|
+
this.invalidate = () => {
|
|
95
|
+
this.isInvalid = true;
|
|
82
96
|
};
|
|
83
|
-
|
|
97
|
+
makeObservable(this, {
|
|
98
|
+
getUnifiedPromise: action,
|
|
99
|
+
isIdle: observable,
|
|
100
|
+
isInvalid: observable,
|
|
101
|
+
submitSuccess: action,
|
|
102
|
+
setSuccess: action,
|
|
103
|
+
setError: action,
|
|
104
|
+
setLoading: action,
|
|
105
|
+
submitError: action,
|
|
106
|
+
startLoading: action,
|
|
107
|
+
invalidate: action,
|
|
108
|
+
});
|
|
84
109
|
}
|
|
85
110
|
}
|
|
@@ -1,36 +1,33 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { StorageFactory } from '../StorageFactory';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Хранилище данных, предназначено для обеспечения единого интерфейса при работе с данными
|
|
4
4
|
*/
|
|
5
5
|
export declare class DataStorage<TData> {
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
7
|
+
* Поле, отвечающее за непосредственное хранение данных
|
|
8
8
|
*/
|
|
9
9
|
private internalData?;
|
|
10
10
|
constructor();
|
|
11
11
|
/**
|
|
12
|
-
*
|
|
12
|
+
* Флаг, отображающий наличие данных
|
|
13
13
|
*/
|
|
14
14
|
get hasData(): boolean;
|
|
15
15
|
/**
|
|
16
|
-
*
|
|
16
|
+
* Метод для установки данных
|
|
17
17
|
*/
|
|
18
18
|
setData: (value: TData) => void;
|
|
19
19
|
/**
|
|
20
|
-
*
|
|
20
|
+
* Геттер данных
|
|
21
21
|
*/
|
|
22
22
|
get data(): TData | undefined;
|
|
23
23
|
}
|
|
24
24
|
/**
|
|
25
|
-
*
|
|
25
|
+
* Фабрика ответственная за создание и хранение экземляров хранилищ
|
|
26
26
|
*/
|
|
27
|
-
export declare class DataStorageFactory {
|
|
28
|
-
|
|
29
|
-
* @description Map хранящий инстансы хранилищ по хэшу ключа
|
|
30
|
-
*/
|
|
31
|
-
private storageMap;
|
|
27
|
+
export declare class DataStorageFactory extends StorageFactory<DataStorage<unknown>> {
|
|
28
|
+
constructor();
|
|
32
29
|
/**
|
|
33
|
-
*
|
|
30
|
+
* Фабричный метод получения/создания инстанса хранилища по ключу
|
|
34
31
|
*/
|
|
35
|
-
getStorage: <TData>(
|
|
32
|
+
getStorage: <TData>(keyHash: string) => DataStorage<TData>;
|
|
36
33
|
}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { makeAutoObservable } from 'mobx';
|
|
2
|
+
import { StorageFactory } from '../StorageFactory';
|
|
2
3
|
/**
|
|
3
|
-
*
|
|
4
|
+
* Хранилище данных, предназначено для обеспечения единого интерфейса при работе с данными
|
|
4
5
|
*/
|
|
5
6
|
export class DataStorage {
|
|
6
7
|
constructor() {
|
|
7
8
|
/**
|
|
8
|
-
*
|
|
9
|
+
* Поле, отвечающее за непосредственное хранение данных
|
|
9
10
|
*/
|
|
10
11
|
this.internalData = undefined;
|
|
11
12
|
/**
|
|
12
|
-
*
|
|
13
|
+
* Метод для установки данных
|
|
13
14
|
*/
|
|
14
15
|
this.setData = (value) => {
|
|
15
16
|
this.internalData = value;
|
|
@@ -17,36 +18,29 @@ export class DataStorage {
|
|
|
17
18
|
makeAutoObservable(this);
|
|
18
19
|
}
|
|
19
20
|
/**
|
|
20
|
-
*
|
|
21
|
+
* Флаг, отображающий наличие данных
|
|
21
22
|
*/
|
|
22
23
|
get hasData() {
|
|
23
24
|
return Boolean(this.internalData);
|
|
24
25
|
}
|
|
25
26
|
/**
|
|
26
|
-
*
|
|
27
|
+
* Геттер данных
|
|
27
28
|
*/
|
|
28
29
|
get data() {
|
|
29
30
|
return this.internalData;
|
|
30
31
|
}
|
|
31
32
|
}
|
|
32
33
|
/**
|
|
33
|
-
*
|
|
34
|
+
* Фабрика ответственная за создание и хранение экземляров хранилищ
|
|
34
35
|
*/
|
|
35
|
-
export class DataStorageFactory {
|
|
36
|
+
export class DataStorageFactory extends StorageFactory {
|
|
36
37
|
constructor() {
|
|
38
|
+
super(() => new DataStorage());
|
|
37
39
|
/**
|
|
38
|
-
*
|
|
40
|
+
* Фабричный метод получения/создания инстанса хранилища по ключу
|
|
39
41
|
*/
|
|
40
|
-
this.
|
|
41
|
-
|
|
42
|
-
* @description фабричный метод получения/создания инстанса хранилища по ключу
|
|
43
|
-
*/
|
|
44
|
-
this.getStorage = (key) => {
|
|
45
|
-
const keyHash = JSON.stringify(key);
|
|
46
|
-
if (!this.storageMap.has(keyHash)) {
|
|
47
|
-
this.storageMap.set(keyHash, new DataStorage());
|
|
48
|
-
}
|
|
49
|
-
return this.storageMap.get(keyHash);
|
|
42
|
+
this.getStorage = (keyHash) => {
|
|
43
|
+
return this.getInternalStorage(keyHash);
|
|
50
44
|
};
|
|
51
45
|
}
|
|
52
46
|
}
|
|
@@ -1,140 +1,135 @@
|
|
|
1
1
|
import type { FetchPolicy, QueryBaseActions, Sync, SyncParams } from '../types';
|
|
2
|
+
import { AuxiliaryQuery } from '../AuxiliaryQuery';
|
|
2
3
|
import type { DataStorage } from '../DataStorage';
|
|
4
|
+
import { QueryContainer } from '../QueryContainer';
|
|
5
|
+
import { type StatusStorage } from '../StatusStorage';
|
|
3
6
|
export declare const DEFAULT_INFINITE_ITEMS_COUNT = 30;
|
|
4
7
|
export type InfiniteParams = {
|
|
5
8
|
offset: number;
|
|
6
9
|
count: number;
|
|
7
10
|
};
|
|
8
11
|
/**
|
|
9
|
-
*
|
|
12
|
+
* Исполнитель запроса, ожидается,
|
|
10
13
|
* что будет использоваться что-то возвращающее массив данных
|
|
11
14
|
*/
|
|
12
15
|
export type InfiniteExecutor<TResult> = (params: InfiniteParams) => Promise<Array<TResult>>;
|
|
13
|
-
export type InfiniteQueryParams<TResult, TError> = {
|
|
16
|
+
export type InfiniteQueryParams<TResult, TError, TIsBackground extends boolean = false> = {
|
|
14
17
|
/**
|
|
15
|
-
*
|
|
18
|
+
* Количество запрашиваемых элементов
|
|
16
19
|
* @default 30
|
|
17
20
|
*/
|
|
18
21
|
incrementCount?: number;
|
|
19
22
|
/**
|
|
20
|
-
*
|
|
23
|
+
* Обработчик ошибки, вызываемый по умолчанию
|
|
21
24
|
*/
|
|
22
25
|
onError?: SyncParams<TResult, TError>['onError'];
|
|
23
26
|
/**
|
|
24
|
-
*
|
|
27
|
+
* Флаг, отвечающий за автоматический запрос данных при обращении к полю data
|
|
25
28
|
*/
|
|
26
29
|
enabledAutoFetch?: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Инстанс хранилища основных статусов
|
|
32
|
+
*/
|
|
33
|
+
statusStorage: StatusStorage<TError>;
|
|
34
|
+
/**
|
|
35
|
+
* Политика получения данных.
|
|
36
|
+
* @enum cache-first - данные сначала берутся из кеша, если их нет, тогда идет обращение к сети, ответ записывается в кэш
|
|
37
|
+
* @enum network-only - данные всегда берутся из сети, при этом ответ записывается в кэш
|
|
38
|
+
*/
|
|
27
39
|
fetchPolicy?: FetchPolicy;
|
|
28
40
|
/**
|
|
29
|
-
*
|
|
41
|
+
* Инстанс хранилища данных
|
|
30
42
|
*/
|
|
31
43
|
dataStorage: DataStorage<TResult[]>;
|
|
44
|
+
/**
|
|
45
|
+
* Инстанс хранилища фоновых статусов
|
|
46
|
+
*/
|
|
47
|
+
backgroundStatusStorage?: TIsBackground extends true ? StatusStorage<TError> : null | undefined;
|
|
48
|
+
/**
|
|
49
|
+
* Колбэк, вызываемый при успешном завершении запроса, подразумевается использование, для подтверждения валидности данных, чтобы квери не был удален из памяти
|
|
50
|
+
*/
|
|
51
|
+
submitValidity?: () => void;
|
|
32
52
|
};
|
|
33
53
|
/**
|
|
34
|
-
*
|
|
54
|
+
* Квери для работы с инфинити запросами,
|
|
35
55
|
* которые должны быть закешированы,
|
|
36
56
|
*/
|
|
37
|
-
export declare class InfiniteQuery<TResult, TError = void> implements QueryBaseActions<Array<TResult>, TError> {
|
|
38
|
-
|
|
39
|
-
* @description инстанс вспомогательного стора
|
|
40
|
-
*/
|
|
41
|
-
private auxiliary;
|
|
57
|
+
export declare class InfiniteQuery<TResult, TError = void, TIsBackground extends boolean = false> extends QueryContainer<TError, AuxiliaryQuery<Array<TResult>, TError>, TIsBackground> implements QueryBaseActions<Array<TResult>, TError> {
|
|
58
|
+
private readonly executor;
|
|
42
59
|
/**
|
|
43
|
-
*
|
|
60
|
+
* Счетчик отступа для инфинити запроса
|
|
44
61
|
*/
|
|
45
62
|
private offset;
|
|
46
63
|
/**
|
|
47
|
-
*
|
|
64
|
+
* Количество запрашиваемых элементов
|
|
48
65
|
*/
|
|
49
66
|
private readonly incrementCount;
|
|
50
67
|
/**
|
|
51
|
-
*
|
|
52
|
-
* что будет использоваться что-то из слоя sources, возвращающее массив данных
|
|
53
|
-
*/
|
|
54
|
-
private executor;
|
|
55
|
-
/**
|
|
56
|
-
* @description хранилище данных, для обеспечения возможности синхронизации данных между разными инстансами
|
|
68
|
+
* Хранилище данных, для обеспечения возможности синхронизации данных между разными инстансами
|
|
57
69
|
*/
|
|
58
70
|
private storage;
|
|
59
71
|
/**
|
|
60
|
-
*
|
|
72
|
+
* Флаг того, что мы достигли предела запрашиваемых элементов
|
|
61
73
|
*/
|
|
62
74
|
isEndReached: boolean;
|
|
63
75
|
/**
|
|
64
|
-
*
|
|
65
|
-
*/
|
|
66
|
-
private isInvalid;
|
|
67
|
-
/**
|
|
68
|
-
* @description обработчик ошибки, вызываемый по умолчанию
|
|
76
|
+
* Обработчик ошибки, вызываемый по умолчанию
|
|
69
77
|
*/
|
|
70
78
|
private defaultOnError?;
|
|
71
79
|
/**
|
|
72
|
-
*
|
|
80
|
+
* Флаг, отвечающий за автоматический запрос данных при обращении к полю data
|
|
73
81
|
*/
|
|
74
82
|
private enabledAutoFetch?;
|
|
75
83
|
/**
|
|
76
|
-
*
|
|
84
|
+
* Стандартное поведение политики кеширования
|
|
77
85
|
*/
|
|
78
86
|
private readonly defaultFetchPolicy?;
|
|
79
|
-
|
|
87
|
+
/**
|
|
88
|
+
* Колбэк, вызываемый при успешном завершении запроса, подразумевается использование, для подтверждения валидности данных, чтобы квери не был удален из памяти
|
|
89
|
+
*/
|
|
90
|
+
private readonly submitValidity?;
|
|
91
|
+
constructor(executor: InfiniteExecutor<TResult>, { incrementCount, onError, enabledAutoFetch, fetchPolicy, dataStorage, statusStorage, backgroundStatusStorage, submitValidity, }: InfiniteQueryParams<TResult, TError, TIsBackground>);
|
|
80
92
|
private get isNetworkOnly();
|
|
81
93
|
/**
|
|
82
|
-
*
|
|
94
|
+
* Обработчик успешного запроса, проверяет что мы достигли предела
|
|
83
95
|
*/
|
|
84
96
|
private submitSuccess;
|
|
85
97
|
/**
|
|
86
|
-
*
|
|
98
|
+
* Форс метод для установки данных
|
|
87
99
|
*/
|
|
88
100
|
forceUpdate: (data: TResult[]) => void;
|
|
89
101
|
/**
|
|
90
|
-
*
|
|
102
|
+
* Метод для обогащения параметров текущими значениями для инфинити
|
|
91
103
|
*/
|
|
92
104
|
private get infiniteExecutor();
|
|
93
105
|
/**
|
|
94
|
-
*
|
|
106
|
+
* Метод для инвалидации данных
|
|
95
107
|
*/
|
|
96
108
|
invalidate: () => void;
|
|
97
109
|
/**
|
|
98
|
-
*
|
|
110
|
+
* Метод для запроса следующего набора данных
|
|
99
111
|
*/
|
|
100
112
|
fetchMore: () => void;
|
|
101
113
|
/**
|
|
102
|
-
*
|
|
114
|
+
* Синхронный метод получения данных
|
|
103
115
|
*/
|
|
104
116
|
sync: Sync<Array<TResult>, TError>;
|
|
105
117
|
/**
|
|
106
|
-
*
|
|
118
|
+
* Метод для переиспользования синхронной логики запроса
|
|
107
119
|
*/
|
|
108
120
|
private proceedSync;
|
|
109
121
|
/**
|
|
110
|
-
*
|
|
122
|
+
* Асинхронный метод получения данных,
|
|
111
123
|
* подходит для изменения параметров запроса(фильтров),
|
|
112
124
|
* при котором будет сброшен offset,
|
|
113
125
|
* предполагается, что нужно будет самостоятельно обрабатывать ошибку
|
|
114
126
|
*/
|
|
115
127
|
async: () => Promise<TResult[]>;
|
|
116
128
|
/**
|
|
117
|
-
*
|
|
129
|
+
* Вычисляемое свойство, содержащее реактивные данные,
|
|
118
130
|
* благодаря mobx, при изменении isInvalid, свойство будет вычисляться заново,
|
|
119
131
|
* следовательно, стриггерится условие невалидности,
|
|
120
132
|
* и начнется запрос, в результате которого, данные обновятся
|
|
121
133
|
*/
|
|
122
134
|
get data(): TResult[] | undefined;
|
|
123
|
-
/**
|
|
124
|
-
* @description флаг загрузки данных
|
|
125
|
-
*/
|
|
126
|
-
get isLoading(): boolean;
|
|
127
|
-
/**
|
|
128
|
-
* @description флаг обозначающий, что последний запрос был зафейлен
|
|
129
|
-
*/
|
|
130
|
-
get isError(): boolean;
|
|
131
|
-
/**
|
|
132
|
-
* @description данные о последней ошибке
|
|
133
|
-
*/
|
|
134
|
-
get error(): TError | undefined;
|
|
135
|
-
/**
|
|
136
|
-
* @description флаг обозначающий, что последний запрос был успешно завершен
|
|
137
|
-
*/
|
|
138
|
-
get isSuccess(): boolean;
|
|
139
|
-
get isIdle(): boolean;
|
|
140
135
|
}
|