configureStore.ts 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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. TimeZone,
  32. RawTimeRange,
  33. TimeRange,
  34. DateTimeInput,
  35. FormatInput,
  36. DateTime,
  37. toUtc,
  38. dateTime,
  39. } from '@grafana/ui';
  40. import { Observable } from 'rxjs';
  41. import { getQueryResponse } from 'app/core/utils/explore';
  42. import { StoreState } from 'app/types/store';
  43. import { toggleLogActionsMiddleware } from 'app/core/middlewares/application';
  44. import { timeEpic } from 'app/features/explore/state/epics/timeEpic';
  45. import { TimeSrv, getTimeSrv } from 'app/features/dashboard/services/TimeSrv';
  46. import { UserState } from 'app/types/user';
  47. import { getTimeRange } from 'app/core/utils/explore';
  48. import { getTimeZone } from 'app/features/profile/state/selectors';
  49. const rootReducers = {
  50. ...sharedReducers,
  51. ...alertingReducers,
  52. ...teamsReducers,
  53. ...apiKeysReducers,
  54. ...foldersReducers,
  55. ...dashboardReducers,
  56. ...exploreReducers,
  57. ...pluginReducers,
  58. ...dataSourcesReducers,
  59. ...usersReducers,
  60. ...userReducers,
  61. ...organizationReducers,
  62. };
  63. export function addRootReducer(reducers: any) {
  64. Object.assign(rootReducers, ...reducers);
  65. }
  66. export const rootEpic: any = combineEpics(
  67. limitMessageRateEpic,
  68. stateSaveEpic,
  69. runQueriesEpic,
  70. runQueriesBatchEpic,
  71. processQueryResultsEpic,
  72. processQueryErrorsEpic,
  73. timeEpic
  74. );
  75. export interface EpicDependencies {
  76. getQueryResponse: (
  77. datasourceInstance: DataSourceApi<DataQuery, DataSourceJsonData>,
  78. options: DataQueryRequest<DataQuery>,
  79. observer?: DataStreamObserver
  80. ) => Observable<DataQueryResponse>;
  81. getTimeSrv: () => TimeSrv;
  82. getTimeRange: (timeZone: TimeZone, rawRange: RawTimeRange) => TimeRange;
  83. getTimeZone: (state: UserState) => TimeZone;
  84. toUtc: (input?: DateTimeInput, formatInput?: FormatInput) => DateTime;
  85. dateTime: (input?: DateTimeInput, formatInput?: FormatInput) => DateTime;
  86. }
  87. const dependencies: EpicDependencies = {
  88. getQueryResponse,
  89. getTimeSrv,
  90. getTimeRange,
  91. getTimeZone,
  92. toUtc,
  93. dateTime,
  94. };
  95. const epicMiddleware = createEpicMiddleware({ dependencies });
  96. export function configureStore() {
  97. const composeEnhancers = (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
  98. const rootReducer = combineReducers(rootReducers);
  99. const logger = createLogger({
  100. predicate: (getState: () => StoreState) => {
  101. return getState().application.logActions;
  102. },
  103. });
  104. const storeEnhancers =
  105. process.env.NODE_ENV !== 'production'
  106. ? applyMiddleware(toggleLogActionsMiddleware, thunk, epicMiddleware, logger)
  107. : applyMiddleware(thunk, epicMiddleware);
  108. const store = createStore(rootReducer, {}, composeEnhancers(storeEnhancers));
  109. setStore(store);
  110. epicMiddleware.run(rootEpic);
  111. return store;
  112. }