configureStore.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import { createStore, applyMiddleware, compose, combineReducers } from 'redux';
  2. import thunk from 'redux-thunk';
  3. import { combineEpics, createEpicMiddleware } from 'redux-observable';
  4. import { createLogger } from 'redux-logger';
  5. import sharedReducers from 'app/core/reducers';
  6. import alertingReducers from 'app/features/alerting/state/reducers';
  7. import teamsReducers from 'app/features/teams/state/reducers';
  8. import apiKeysReducers from 'app/features/api-keys/state/reducers';
  9. import foldersReducers from 'app/features/folders/state/reducers';
  10. import dashboardReducers from 'app/features/dashboard/state/reducers';
  11. import exploreReducers from 'app/features/explore/state/reducers';
  12. import pluginReducers from 'app/features/plugins/state/reducers';
  13. import dataSourcesReducers from 'app/features/datasources/state/reducers';
  14. import usersReducers from 'app/features/users/state/reducers';
  15. import userReducers from 'app/features/profile/state/reducers';
  16. import organizationReducers from 'app/features/org/state/reducers';
  17. import { setStore } from './store';
  18. import { limitMessageRateEpic } from 'app/features/explore/state/epics/limitMessageRateEpic';
  19. import { stateSaveEpic } from 'app/features/explore/state/epics/stateSaveEpic';
  20. import { processQueryResultsEpic } from 'app/features/explore/state/epics/processQueryResultsEpic';
  21. import { processQueryErrorsEpic } from 'app/features/explore/state/epics/processQueryErrorsEpic';
  22. import { runQueriesEpic } from 'app/features/explore/state/epics/runQueriesEpic';
  23. import { runQueriesBatchEpic } from 'app/features/explore/state/epics/runQueriesBatchEpic';
  24. import {
  25. DataSourceApi,
  26. DataQueryResponse,
  27. DataQuery,
  28. DataSourceJsonData,
  29. DataQueryRequest,
  30. DataStreamObserver,
  31. } from '@grafana/ui';
  32. import { Observable } from 'rxjs';
  33. import { getQueryResponse } from 'app/core/utils/explore';
  34. import { StoreState } from 'app/types/store';
  35. import { toggleLogActionsMiddleware } from 'app/core/middlewares/application';
  36. const rootReducers = {
  37. ...sharedReducers,
  38. ...alertingReducers,
  39. ...teamsReducers,
  40. ...apiKeysReducers,
  41. ...foldersReducers,
  42. ...dashboardReducers,
  43. ...exploreReducers,
  44. ...pluginReducers,
  45. ...dataSourcesReducers,
  46. ...usersReducers,
  47. ...userReducers,
  48. ...organizationReducers,
  49. };
  50. export function addRootReducer(reducers) {
  51. Object.assign(rootReducers, ...reducers);
  52. }
  53. export const rootEpic: any = combineEpics(
  54. limitMessageRateEpic,
  55. stateSaveEpic,
  56. runQueriesEpic,
  57. runQueriesBatchEpic,
  58. processQueryResultsEpic,
  59. processQueryErrorsEpic
  60. );
  61. export interface EpicDependencies {
  62. getQueryResponse: (
  63. datasourceInstance: DataSourceApi<DataQuery, DataSourceJsonData>,
  64. options: DataQueryRequest<DataQuery>,
  65. observer?: DataStreamObserver
  66. ) => Observable<DataQueryResponse>;
  67. }
  68. const dependencies: EpicDependencies = {
  69. getQueryResponse,
  70. };
  71. const epicMiddleware = createEpicMiddleware({ dependencies });
  72. export function configureStore() {
  73. const composeEnhancers = (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
  74. const rootReducer = combineReducers(rootReducers);
  75. const logger = createLogger({
  76. predicate: (getState: () => StoreState) => {
  77. return getState().application.logActions;
  78. },
  79. });
  80. const storeEnhancers =
  81. process.env.NODE_ENV !== 'production'
  82. ? applyMiddleware(toggleLogActionsMiddleware, thunk, epicMiddleware, logger)
  83. : applyMiddleware(thunk, epicMiddleware);
  84. const store = createStore(rootReducer, {}, composeEnhancers(storeEnhancers));
  85. setStore(store);
  86. epicMiddleware.run(rootEpic);
  87. return store;
  88. }