From 58cda9cc7fb79ca9df6746de7f9662bc08dc156a Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Fri, 13 Oct 2017 12:29:40 +0200 Subject: initial commit --- src/stores/RequestStore.js | 59 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/stores/RequestStore.js (limited to 'src/stores/RequestStore.js') 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 @@ +import { action, computed, observable } from 'mobx'; + +import Store from './lib/Store'; + +export default class RequestStore extends Store { + @observable userInfoRequest; + @observable servicesRequest; + @observable showRequiredRequestsError = false; + + retries = 0; + retryDelay = 2000; + + constructor(...args) { + super(...args); + + this.actions.requests.retryRequiredRequests.listen(this._retryRequiredRequests.bind(this)); + + this.registerReactions([ + this._autoRetry.bind(this), + ]); + } + + setup() { + this.userInfoRequest = this.stores.user.getUserInfoRequest; + this.servicesRequest = this.stores.services.allServicesRequest; + } + + @computed get areRequiredRequestsSuccessful() { + return !this.userInfoRequest.isError + && !this.servicesRequest.isError; + } + + @computed get areRequiredRequestsLoading() { + return this.userInfoRequest.isExecuting + || this.servicesRequest.isExecuting; + } + + @action _retryRequiredRequests() { + this.userInfoRequest.reload(); + this.servicesRequest.reload(); + } + + // Reactions + _autoRetry() { + const delay = (this.retries <= 10 ? this.retries : 10) * this.retryDelay; + if (!this.areRequiredRequestsSuccessful && this.stores.user.isLoggedIn) { + setTimeout(() => { + this.retries += 1; + this._retryRequiredRequests(); + if (this.retries === 4) { + this.showRequiredRequestsError = true; + } + + this._autoRetry(); + console.debug(`Retry required requests delayed in ${(delay) / 1000}s`); + }, delay); + } + } +} -- cgit v1.2.3-70-g09d2