aboutsummaryrefslogtreecommitdiffstats
path: root/src/stores/RequestStore.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/stores/RequestStore.js')
-rw-r--r--src/stores/RequestStore.js59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/stores/RequestStore.js b/src/stores/RequestStore.js
new file mode 100644
index 000000000..4140ca362
--- /dev/null
+++ b/src/stores/RequestStore.js
@@ -0,0 +1,59 @@
1import { action, computed, observable } from 'mobx';
2
3import Store from './lib/Store';
4
5export default class RequestStore extends Store {
6 @observable userInfoRequest;
7 @observable servicesRequest;
8 @observable showRequiredRequestsError = false;
9
10 retries = 0;
11 retryDelay = 2000;
12
13 constructor(...args) {
14 super(...args);
15
16 this.actions.requests.retryRequiredRequests.listen(this._retryRequiredRequests.bind(this));
17
18 this.registerReactions([
19 this._autoRetry.bind(this),
20 ]);
21 }
22
23 setup() {
24 this.userInfoRequest = this.stores.user.getUserInfoRequest;
25 this.servicesRequest = this.stores.services.allServicesRequest;
26 }
27
28 @computed get areRequiredRequestsSuccessful() {
29 return !this.userInfoRequest.isError
30 && !this.servicesRequest.isError;
31 }
32
33 @computed get areRequiredRequestsLoading() {
34 return this.userInfoRequest.isExecuting
35 || this.servicesRequest.isExecuting;
36 }
37
38 @action _retryRequiredRequests() {
39 this.userInfoRequest.reload();
40 this.servicesRequest.reload();
41 }
42
43 // Reactions
44 _autoRetry() {
45 const delay = (this.retries <= 10 ? this.retries : 10) * this.retryDelay;
46 if (!this.areRequiredRequestsSuccessful && this.stores.user.isLoggedIn) {
47 setTimeout(() => {
48 this.retries += 1;
49 this._retryRequiredRequests();
50 if (this.retries === 4) {
51 this.showRequiredRequestsError = true;
52 }
53
54 this._autoRetry();
55 console.debug(`Retry required requests delayed in ${(delay) / 1000}s`);
56 }, delay);
57 }
58 }
59}