aboutsummaryrefslogtreecommitdiff
path: root/src/services/http.service.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/services/http.service.js')
-rw-r--r--src/services/http.service.js90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/services/http.service.js b/src/services/http.service.js
index e69de29..c3914f6 100644
--- a/src/services/http.service.js
+++ b/src/services/http.service.js
@@ -0,0 +1,90 @@
+import axios from 'axios';
+import Storage from './storage.service';
+import { COMMON_REQUEST, COMMON_SUCCESS, COMMON_CANCEL } from '../utils/constants';
+
+class HttpServiceSingleton {
+ constructor() {
+ axios.defaults.headers.post["Content-Type"] = "application/json";
+ axios.defaults.headers.put["Accept"] = "application/json";
+ this.count = 0; // This will store API requests
+ this.complete = 0; // This will store API Success/errors
+ }
+
+ set reduxStore(store) {
+ this.store = store;
+ }
+
+ fetch(payload, noAuth) {
+ const cancelToken = axios.CancelToken;
+ this.cancelSource = cancelToken.source();
+ let config = {};
+ if (!noAuth) {
+ let token = Storage.get("token");
+ config.headers = {
+ 'Authirization': `Bearer ${token}`
+ };
+ }
+
+ config.method = payload.method ? payload.method : 'get';
+ config.url = payload.url ? payload.url : '';
+ config.cancelToken = this.cancelSource.token;
+ if (payload.data) config.data = JSON.stringify(payload.data);
+
+ return axios(config).catch((thrown) => {
+ if (axios.isCancel(thrown)) {
+ this.count = 0;
+ this.complete = 0;
+ this.store.dispatch({
+ type: COMMON_CANCEL
+ });
+ console.log('Request canceled', thrown.message);
+ } else {
+ // handle error
+ }
+ });
+ }
+
+ httpInterceptor() {
+ axios.interceptors.request.use((config) => {
+ this.count++;
+ this.checkApiComplete(this.store);
+ return config;
+ }, (error) => {
+ this.complete++;
+ this.checkApiComplete(this.store);
+ return Promise.reject(error);
+ });
+
+ axios.interceptors.response.use((response) => {
+ this.complete++;
+ this.checkApiComplete(this.store);
+ return response;
+ }, (error) => {
+ this.complete++;
+ this.checkApiComplete(this.store);
+ return Promise.reject(error);
+ });
+ }
+
+ cancelRequest() {
+ this.cancelSource.cancel();
+ }
+
+ //Fallback to cancel all API loaders in case of multiple API call occuts
+ checkApiComplete(store) {
+ if (this.count == this.complete) { // Cancel API loader when all requests are completed
+ store.dispatch({
+ type: COMMON_SUCCESS
+ });
+ } else {
+ store.dispatch({
+ type: COMMON_REQUEST
+ });
+ }
+ }
+}
+
+const HttpService = new HttpServiceSingleton();
+// Object.freeze(HttpService); // Singleton Http Service
+
+export default HttpService; \ No newline at end of file