configureStore.ts 4.5 KB

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