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