Adds some TypeScript types to the global redux state that's in `src/store.ts`. I've only added types for a few parts of the state but already it's caught quite a few bugs in the code, which I've tried to fix in this PR.
101 lines
4.8 KiB
TypeScript
101 lines
4.8 KiB
TypeScript
import { configureStore, Reducer } from '@reduxjs/toolkit';
|
|
|
|
// FIXME: because the 'live' plugin is using Redux, we have to hard-code a reference to it here.
|
|
// If this app + the plugin were using React-query, there'd be no issues.
|
|
import { reducer as liveReducer } from '@openedx-plugins/course-app-live/data/slice';
|
|
|
|
import { reducer as modelsReducer } from './generic/model-store';
|
|
import { reducer as courseDetailReducer } from './data/slice';
|
|
import { reducer as discussionsReducer } from './pages-and-resources/discussions/data/slice';
|
|
import { reducer as pagesAndResourcesReducer } from './pages-and-resources/data/slice';
|
|
import { reducer as customPagesReducer } from './custom-pages/data/slice';
|
|
import { reducer as advancedSettingsReducer } from './advanced-settings/data/slice';
|
|
import { reducer as studioHomeReducer } from './studio-home/data/slice';
|
|
import { reducer as scheduleAndDetailsReducer } from './schedule-and-details/data/slice';
|
|
import { reducer as filesReducer } from './files-and-videos/files-page/data/slice';
|
|
import { reducer as courseTeamReducer } from './course-team/data/slice';
|
|
import { reducer as CourseUpdatesReducer } from './course-updates/data/slice';
|
|
import { reducer as processingNotificationReducer } from './generic/processing-notification/data/slice';
|
|
import { reducer as helpUrlsReducer } from './help-urls/data/slice';
|
|
import { reducer as courseExportReducer } from './export-page/data/slice';
|
|
import { reducer as courseOptimizerReducer } from './optimizer-page/data/slice';
|
|
import { reducer as genericReducer } from './generic/data/slice';
|
|
import { reducer as courseImportReducer } from './import-page/data/slice';
|
|
import { reducer as videosReducer } from './files-and-videos/videos-page/data/slice';
|
|
import { reducer as courseOutlineReducer } from './course-outline/data/slice';
|
|
import { reducer as courseUnitReducer } from './course-unit/data/slice';
|
|
import { reducer as courseChecklistReducer } from './course-checklist/data/slice';
|
|
import { reducer as accessibilityPageReducer } from './accessibility-page/data/slice';
|
|
import { reducer as textbooksReducer } from './textbooks/data/slice';
|
|
import { reducer as certificatesReducer } from './certificates/data/slice';
|
|
import { reducer as groupConfigurationsReducer } from './group-configurations/data/slice';
|
|
|
|
type InferState<ReducerType> = ReducerType extends Reducer<infer T> ? T : never;
|
|
|
|
/**
|
|
* @deprecated The global Redux state for Authoring MFE, excluding editors.
|
|
* TODO: refactor each part to use React Context and React Query instead.
|
|
*/
|
|
export interface DeprecatedReduxState {
|
|
courseDetail: InferState<typeof courseDetailReducer>;
|
|
customPages: Record<string, any>;
|
|
discussions: Record<string, any>;
|
|
assets: Record<string, any>;
|
|
pagesAndResources: Record<string, any>;
|
|
scheduleAndDetails: Record<string, any>;
|
|
advancedSettings: Record<string, any>;
|
|
studioHome: InferState<typeof studioHomeReducer>;
|
|
models: Record<string, any>;
|
|
live: Record<string, any>;
|
|
courseTeam: Record<string, any>;
|
|
courseUpdates: Record<string, any>;
|
|
processingNotification: Record<string, any>;
|
|
helpUrls: Record<string, any>;
|
|
courseExport: Record<string, any>;
|
|
courseOptimizer: Record<string, any>;
|
|
generic: Record<string, any>;
|
|
courseImport: Record<string, any>;
|
|
videos: Record<string, any>;
|
|
courseOutline: Record<string, any>;
|
|
courseUnit: Record<string, any>;
|
|
courseChecklist: Record<string, any>;
|
|
accessibilityPage: Record<string, any>;
|
|
certificates: Record<string, any>;
|
|
groupConfigurations: InferState<typeof groupConfigurationsReducer>;
|
|
textbooks: Record<string, any>;
|
|
}
|
|
|
|
export default function initializeStore(preloadedState: Partial<DeprecatedReduxState> | undefined = undefined) {
|
|
return configureStore<DeprecatedReduxState>({
|
|
reducer: {
|
|
courseDetail: courseDetailReducer,
|
|
customPages: customPagesReducer,
|
|
discussions: discussionsReducer,
|
|
assets: filesReducer,
|
|
pagesAndResources: pagesAndResourcesReducer,
|
|
scheduleAndDetails: scheduleAndDetailsReducer,
|
|
advancedSettings: advancedSettingsReducer,
|
|
studioHome: studioHomeReducer,
|
|
models: modelsReducer,
|
|
live: liveReducer,
|
|
courseTeam: courseTeamReducer,
|
|
courseUpdates: CourseUpdatesReducer,
|
|
processingNotification: processingNotificationReducer,
|
|
helpUrls: helpUrlsReducer,
|
|
courseExport: courseExportReducer,
|
|
courseOptimizer: courseOptimizerReducer,
|
|
generic: genericReducer,
|
|
courseImport: courseImportReducer,
|
|
videos: videosReducer,
|
|
courseOutline: courseOutlineReducer,
|
|
courseUnit: courseUnitReducer,
|
|
courseChecklist: courseChecklistReducer,
|
|
accessibilityPage: accessibilityPageReducer,
|
|
certificates: certificatesReducer,
|
|
groupConfigurations: groupConfigurationsReducer,
|
|
textbooks: textbooksReducer,
|
|
},
|
|
preloadedState,
|
|
});
|
|
}
|