aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--modern/src/store/index.js6
-rw-r--r--modern/src/store/throttleMiddleware.js39
2 files changed, 44 insertions, 1 deletions
diff --git a/modern/src/store/index.js b/modern/src/store/index.js
index 72867b76..2ab0c982 100644
--- a/modern/src/store/index.js
+++ b/modern/src/store/index.js
@@ -8,6 +8,7 @@ import { geofencesReducer as geofences } from './geofences';
import { groupsReducer as groups } from './groups';
import { driversReducer as drivers } from './drivers';
import { maintenancesReducer as maintenances } from './maintenances';
+import throttleMiddleware from './throttleMiddleware';
const reducer = combineReducers({
errors,
@@ -29,4 +30,7 @@ export { groupsActions } from './groups';
export { driversActions } from './drivers';
export { maintenancesActions } from './maintenances';
-export default configureStore({ reducer });
+export default configureStore({
+ reducer,
+ middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(throttleMiddleware),
+});
diff --git a/modern/src/store/throttleMiddleware.js b/modern/src/store/throttleMiddleware.js
new file mode 100644
index 00000000..9954b139
--- /dev/null
+++ b/modern/src/store/throttleMiddleware.js
@@ -0,0 +1,39 @@
+import { batch } from "react-redux";
+
+const threshold = 3;
+const interval = 1500;
+
+export default () => (next) => {
+ const buffer = [];
+ let throttle = false;
+ let counter = 0;
+
+ setInterval(() => {
+ console.log('batch');
+ if (throttle) {
+ if (buffer.length < threshold) {
+ throttle = false;
+ }
+ batch(() => buffer.splice(0, buffer.length).forEach((action) => next(action)));
+ } else {
+ if (counter > threshold) {
+ throttle = true;
+ }
+ counter = 0;
+ }
+ }, interval);
+
+ return (action) => {
+ console.log(action);
+ if (action.type === 'devices/update' || action.type === 'positions/update') {
+ if (throttle) {
+ buffer.push(action);
+ } else {
+ counter += 1;
+ return next(action);
+ }
+ } else {
+ return next(action);
+ }
+ };
+};