@astral/mobx-query 0.1.2 → 0.1.4

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.
@@ -4,6 +4,10 @@ import { makeAutoObservable } from 'mobx';
4
4
  */
5
5
  export class DataStorage {
6
6
  constructor() {
7
+ /**
8
+ * @description поле, отвечающее за непосредственное хранение данных
9
+ */
10
+ this.internalData = undefined;
7
11
  /**
8
12
  * @description метод для установки данных
9
13
  */
@@ -1,4 +1,4 @@
1
- import { makeAutoObservable } from 'mobx';
1
+ import { makeAutoObservable, when } from 'mobx';
2
2
  import { AuxiliaryQuery } from '../AuxiliaryQuery';
3
3
  export const DEFAULT_INFINITE_ITEMS_COUNT = 30;
4
4
  /**
@@ -151,7 +151,9 @@ export class InfiniteQuery {
151
151
  get data() {
152
152
  const shouldSync = this.enabledAutoFetch && !this.isSuccess && !this.isLoading;
153
153
  if (this.isInvalid || shouldSync) {
154
- this.proceedSync();
154
+ // т.к. при вызове апдейта, изменяются флаги, на которые подписан data,
155
+ // нужно вызывать этот экшн асинхронно
156
+ when(() => true, this.proceedSync);
155
157
  }
156
158
  // возвращаем имеющиеся данные
157
159
  return this.storage.data;
@@ -2,6 +2,10 @@ import { Query } from '../Query';
2
2
  import { InfiniteQuery, } from '../InfiniteQuery';
3
3
  import { Mutation } from '../Mutation';
4
4
  import { DataStorageFactory } from '../DataStorage';
5
+ /**
6
+ * @description время, спустя которое, запись о query c network-only будет удалена
7
+ */
8
+ const DEFAULT_TIME_TO_CLEAN = 100;
5
9
  /**
6
10
  * @description Сервис, позволяющий кэшировать данные.
7
11
  */
@@ -46,16 +50,28 @@ export class MobxQuery {
46
50
  * и если нет, создает новый, добавляет его к себе в память, и возвращает его пользователю
47
51
  */
48
52
  this.getCachedQuery = (key, createStore, fetchPolicy) => {
49
- if (fetchPolicy === 'network-only') {
50
- return createStore();
51
- }
52
- const keyHash = this.serialize(key);
53
+ // создаем хэш ключа с добавляем к ключу значения fetchPolicy,
54
+ // чтобы query c одинаковым ключом, но разным fetchPolicy не пересекались бы
55
+ const keyHash = this.serialize([...key, fetchPolicy]);
53
56
  if (this.cacheableStores.has(keyHash)) {
54
57
  return this.cacheableStores.get(keyHash);
55
58
  }
56
59
  const store = createStore();
57
60
  this.cacheableStores.set(keyHash, store);
58
61
  this.keys[keyHash] = key;
62
+ // Ожидается, что network-only квери не должны кешироваться,
63
+ // но, с введением StrictMode в реакт 18, проявилась проблема,
64
+ // что network-only квери, созданные в одном реакт компоненте,
65
+ // создаются дважды (т.к. все хуки вызываются дважды)
66
+ // и т.к. мы не ограничиваем момент запроса,
67
+ // то можем получить эффект, что оба network-only квери
68
+ // делают по отдельному запросу к данным единомоментно,
69
+ if (fetchPolicy === 'network-only') {
70
+ setTimeout(() => {
71
+ this.cacheableStores.delete(keyHash);
72
+ delete this.keys[keyHash];
73
+ }, DEFAULT_TIME_TO_CLEAN);
74
+ }
59
75
  return store;
60
76
  };
61
77
  /**
package/Query/Query.js CHANGED
@@ -1,4 +1,4 @@
1
- import { makeAutoObservable } from 'mobx';
1
+ import { makeAutoObservable, when } from 'mobx';
2
2
  import { AuxiliaryQuery } from '../AuxiliaryQuery';
3
3
  /**
4
4
  * @description стор для работы с запросами,
@@ -90,7 +90,9 @@ export class Query {
90
90
  get data() {
91
91
  const shouldSync = this.enabledAutoFetch && !this.isSuccess && !this.isLoading;
92
92
  if (this.isInvalid || shouldSync) {
93
- this.proceedSync();
93
+ // т.к. при вызове апдейта, изменяются флаги, на которые подписан data,
94
+ // нужно вызывать этот экшн асинхронно
95
+ when(() => true, this.proceedSync);
94
96
  }
95
97
  // возвращаем имеющиеся данные
96
98
  return this.storage.data;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astral/mobx-query",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "browser": "./index.js",
5
5
  "main": "./index.js",
6
6
  "dependencies": {