configureStore.ts 4.5 KB

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