From 10f9592ad6cb2da8d1e66e379bbda3591a7c5976 Mon Sep 17 00:00:00 2001 From: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> Date: Tue, 16 Jan 2024 14:10:19 +0800 Subject: [PATCH 1/8] Add `enableStories` field to course config * Update persistence, types * Create toggle switches --- .../application/actions/__tests__/SessionActions.ts | 2 ++ .../reducers/__tests__/SessionReducer.ts | 1 + src/commons/application/types/SessionTypes.ts | 2 ++ src/commons/dropdown/DropdownCreateCourse.tsx | 13 +++++++++++++ src/commons/mocks/UserMocks.ts | 2 ++ src/commons/sagas/__tests__/BackendSaga.ts | 4 ++++ src/features/academy/__tests__/AcademyActions.ts | 1 + src/pages/__tests__/localStorage.test.ts | 1 + src/pages/academy/adminPanel/AdminPanel.tsx | 2 ++ .../adminPanel/subcomponents/CourseConfigPanel.tsx | 11 +++++++++++ src/pages/localStorage.ts | 1 + 11 files changed, 40 insertions(+) diff --git a/src/commons/application/actions/__tests__/SessionActions.ts b/src/commons/application/actions/__tests__/SessionActions.ts index 4b336e82fc..9e3773434a 100644 --- a/src/commons/application/actions/__tests__/SessionActions.ts +++ b/src/commons/application/actions/__tests__/SessionActions.ts @@ -228,6 +228,7 @@ test('setCourseConfiguration generates correct action object', () => { enableGame: true, enableAchievements: true, enableSourcecast: true, + enableStories: false, sourceChapter: Chapter.SOURCE_1, sourceVariant: Variant.DEFAULT, moduleHelpText: 'Help text', @@ -612,6 +613,7 @@ test('updateCourseConfig generates correct action object', () => { enableGame: true, enableAchievements: true, enableSourcecast: true, + enableStories: false, sourceChapter: Chapter.SOURCE_1, sourceVariant: Variant.DEFAULT, moduleHelpText: 'Help text', diff --git a/src/commons/application/reducers/__tests__/SessionReducer.ts b/src/commons/application/reducers/__tests__/SessionReducer.ts index cbfd2c0e52..8d622a5a15 100644 --- a/src/commons/application/reducers/__tests__/SessionReducer.ts +++ b/src/commons/application/reducers/__tests__/SessionReducer.ts @@ -96,6 +96,7 @@ test('SET_COURSE_CONFIGURATION works correctly', () => { enableGame: true, enableAchievements: true, enableSourcecast: true, + enableStories: false, sourceChapter: Chapter.SOURCE_1, sourceVariant: Variant.DEFAULT, moduleHelpText: 'Help text', diff --git a/src/commons/application/types/SessionTypes.ts b/src/commons/application/types/SessionTypes.ts index f1b5d12681..fbf069b11f 100644 --- a/src/commons/application/types/SessionTypes.ts +++ b/src/commons/application/types/SessionTypes.ts @@ -103,6 +103,7 @@ export type SessionState = { readonly enableGame?: boolean; readonly enableAchievements?: boolean; readonly enableSourcecast?: boolean; + readonly enableStories?: boolean; readonly sourceChapter?: number; readonly sourceVariant?: Variant; readonly moduleHelpText?: string; @@ -168,6 +169,7 @@ export type CourseConfiguration = { enableGame: boolean; enableAchievements: boolean; enableSourcecast: boolean; + enableStories: boolean; sourceChapter: Chapter; sourceVariant: Variant; moduleHelpText: string; diff --git a/src/commons/dropdown/DropdownCreateCourse.tsx b/src/commons/dropdown/DropdownCreateCourse.tsx index 7c5b7f70e1..f69c7b8da5 100644 --- a/src/commons/dropdown/DropdownCreateCourse.tsx +++ b/src/commons/dropdown/DropdownCreateCourse.tsx @@ -38,6 +38,7 @@ const DropdownCreateCourse: React.FC = props => { enableGame: true, enableAchievements: true, enableSourcecast: true, + enableStories: false, sourceChapter: Chapter.SOURCE_1, sourceVariant: Variant.DEFAULT, moduleHelpText: '' @@ -222,6 +223,18 @@ const DropdownCreateCourse: React.FC = props => { }) } /> + + + setCourseConfig({ + ...courseConfig, + enableStories: (e.target as HTMLInputElement).checked + }) + } + />
diff --git a/src/commons/mocks/UserMocks.ts b/src/commons/mocks/UserMocks.ts index 35b1737da0..0517e6a96e 100644 --- a/src/commons/mocks/UserMocks.ts +++ b/src/commons/mocks/UserMocks.ts @@ -130,6 +130,7 @@ export const mockCourseConfigurations: CourseConfiguration[] = [ enableGame: false, enableAchievements: true, enableSourcecast: true, + enableStories: false, sourceChapter: Chapter.SOURCE_1, sourceVariant: Variant.DEFAULT, moduleHelpText: '', @@ -142,6 +143,7 @@ export const mockCourseConfigurations: CourseConfiguration[] = [ enableGame: false, enableAchievements: false, enableSourcecast: false, + enableStories: false, sourceChapter: Chapter.SOURCE_2, sourceVariant: Variant.DEFAULT, moduleHelpText: 'Help Text!', diff --git a/src/commons/sagas/__tests__/BackendSaga.ts b/src/commons/sagas/__tests__/BackendSaga.ts index 164d0d57ff..5525f1b47c 100644 --- a/src/commons/sagas/__tests__/BackendSaga.ts +++ b/src/commons/sagas/__tests__/BackendSaga.ts @@ -173,6 +173,7 @@ const mockCourseConfiguration1: CourseConfiguration = { enableGame: true, enableAchievements: true, enableSourcecast: true, + enableStories: false, sourceChapter: Chapter.SOURCE_1, sourceVariant: Variant.DEFAULT, moduleHelpText: 'Help text', @@ -203,6 +204,7 @@ const mockCourseConfiguration2: CourseConfiguration = { enableGame: true, enableAchievements: true, enableSourcecast: true, + enableStories: false, sourceChapter: Chapter.SOURCE_4, sourceVariant: Variant.DEFAULT, moduleHelpText: 'Help text', @@ -887,6 +889,7 @@ describe('Test UPDATE_COURSE_CONFIG action', () => { enableGame: false, enableAchievements: false, enableSourcecast: false, + enableStories: false, sourceChapter: Chapter.SOURCE_4, sourceVariant: Variant.DEFAULT, moduleHelpText: 'Help', @@ -984,6 +987,7 @@ describe('Test CREATE_COURSE action', () => { enableGame: true, enableAchievements: true, enableSourcecast: true, + enableStories: false, sourceChapter: Chapter.SOURCE_1, sourceVariant: Variant.DEFAULT, moduleHelpText: 'Help Text' diff --git a/src/features/academy/__tests__/AcademyActions.ts b/src/features/academy/__tests__/AcademyActions.ts index 6e0b1f059e..fa02cadf36 100644 --- a/src/features/academy/__tests__/AcademyActions.ts +++ b/src/features/academy/__tests__/AcademyActions.ts @@ -31,6 +31,7 @@ test('createCourse generates correct action object', () => { enableGame: true, enableAchievements: true, enableSourcecast: true, + enableStories: false, sourceChapter: Chapter.SOURCE_1, sourceVariant: Variant.DEFAULT, moduleHelpText: 'Help Text' diff --git a/src/pages/__tests__/localStorage.test.ts b/src/pages/__tests__/localStorage.test.ts index 00123fac05..d26314adba 100644 --- a/src/pages/__tests__/localStorage.test.ts +++ b/src/pages/__tests__/localStorage.test.ts @@ -20,6 +20,7 @@ const mockShortDefaultState: SavedState = { enableGame: defaultState.session.enableGame, enableAchievements: defaultState.session.enableAchievements, enableSourcecast: defaultState.session.enableSourcecast, + enableStories: defaultState.session.enableStories, moduleHelpText: defaultState.session.moduleHelpText, assetsPrefix: defaultState.session.assetsPrefix, assessmentConfigurations: defaultState.session.assessmentConfigurations diff --git a/src/pages/academy/adminPanel/AdminPanel.tsx b/src/pages/academy/adminPanel/AdminPanel.tsx index 470e07c9be..bb73daf7a6 100644 --- a/src/pages/academy/adminPanel/AdminPanel.tsx +++ b/src/pages/academy/adminPanel/AdminPanel.tsx @@ -45,6 +45,7 @@ const AdminPanel: React.FC = () => { enableGame: true, enableAchievements: true, enableSourcecast: true, + enableStories: false, moduleHelpText: '' }); @@ -84,6 +85,7 @@ const AdminPanel: React.FC = () => { enableGame: session.enableGame, enableAchievements: session.enableAchievements, enableSourcecast: session.enableSourcecast, + enableStories: session.enableStories, moduleHelpText: session.moduleHelpText }); diff --git a/src/pages/academy/adminPanel/subcomponents/CourseConfigPanel.tsx b/src/pages/academy/adminPanel/subcomponents/CourseConfigPanel.tsx index 621c5ebe83..cb66bf41d1 100644 --- a/src/pages/academy/adminPanel/subcomponents/CourseConfigPanel.tsx +++ b/src/pages/academy/adminPanel/subcomponents/CourseConfigPanel.tsx @@ -39,6 +39,7 @@ const CourseConfigPanel: React.FC = props => { enableGame, enableAchievements, enableSourcecast, + enableStories, moduleHelpText } = props.courseConfiguration; @@ -177,6 +178,16 @@ const CourseConfigPanel: React.FC = props => { }) } /> + + props.setCourseConfiguration({ + ...props.courseConfiguration, + enableStories: (e.target as HTMLInputElement).checked + }) + } + />
diff --git a/src/pages/localStorage.ts b/src/pages/localStorage.ts index 83fef9cebc..261f8b8c1d 100644 --- a/src/pages/localStorage.ts +++ b/src/pages/localStorage.ts @@ -68,6 +68,7 @@ export const saveState = (state: OverallState) => { enableGame: state.session.enableGame, enableAchievements: state.session.enableAchievements, enableSourcecast: state.session.enableSourcecast, + enableStories: state.session.enableStories, moduleHelpText: state.session.moduleHelpText, assetsPrefix: state.session.assetsPrefix, assessmentConfigurations: state.session.assessmentConfigurations, From 02874943b1f9ab10ccdef94d3f6e73867a8ab7c0 Mon Sep 17 00:00:00 2001 From: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> Date: Tue, 16 Jan 2024 14:46:45 +0800 Subject: [PATCH 2/8] Use relative route paths for stories components --- src/pages/stories/Stories.tsx | 2 +- src/pages/stories/StoryActions.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pages/stories/Stories.tsx b/src/pages/stories/Stories.tsx index b877ab1020..85357d9501 100644 --- a/src/pages/stories/Stories.tsx +++ b/src/pages/stories/Stories.tsx @@ -32,7 +32,7 @@ const Stories: React.FC = () => { const isStoriesDisabled = useTypedSelector(state => !state.stories.groupId); const isLoggedIn = !!storiesUserId; - const handleNewStory = useCallback(() => navigate('/stories/new'), [navigate]); + const handleNewStory = useCallback(() => navigate('./new'), [navigate]); const handleDeleteStory = useCallback( async (id: number) => { const confirm = await showSimpleConfirmDialog({ diff --git a/src/pages/stories/StoryActions.tsx b/src/pages/stories/StoryActions.tsx index 2b32c50c26..db5f1e020c 100644 --- a/src/pages/stories/StoryActions.tsx +++ b/src/pages/stories/StoryActions.tsx @@ -32,7 +32,7 @@ const StoryActions: React.FC = ({ return ( {canView && ( - + } @@ -42,7 +42,7 @@ const StoryActions: React.FC = ({ )} {canEdit && ( - + } From c9cdf0e5e9f7b04a3cdcc16a9e4cc75de85933cb Mon Sep 17 00:00:00 2001 From: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> Date: Tue, 16 Jan 2024 14:48:32 +0800 Subject: [PATCH 3/8] Only render Stories button when enabled for course * Update navigation bar for selective rendering * Update stories routes to be under "/courses/:courseId" * Add loader to stories routes --- src/commons/navigationBar/NavigationBar.tsx | 30 +++++++++++++-------- src/routes/routerConfig.tsx | 20 ++++++++------ 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/src/commons/navigationBar/NavigationBar.tsx b/src/commons/navigationBar/NavigationBar.tsx index 1ad361a2b7..662c54ec6e 100644 --- a/src/commons/navigationBar/NavigationBar.tsx +++ b/src/commons/navigationBar/NavigationBar.tsx @@ -54,6 +54,7 @@ const NavigationBar: React.FC = () => { courseShortName, enableAchievements, enableSourcecast, + enableStories, assessmentConfigurations } = useSession(); const assessmentTypes = useMemo( @@ -179,14 +180,21 @@ const NavigationBar: React.FC = () => { disabled: !(isEnrolledInACourse && enableAchievements) }, { - to: '/stories', + to: `/courses/${courseId}/stories`, icon: IconNames.GIT_REPO, text: 'Stories', - // TODO: Enable when stories are implemented - disabled: true && !isLoggedIn + // TODO: Enable for public deployment + disabled: !(isEnrolledInACourse && enableStories) } ]; - }, [isLoggedIn, isEnrolledInACourse, courseId, enableSourcecast, enableAchievements]); + }, [ + courseId, + isEnrolledInACourse, + enableSourcecast, + enableStories, + isLoggedIn, + enableAchievements + ]); const fullAcademyMobileNavbarLeftAdditionalInfo = useMemo( () => getAcademyNavbarRightInfo({ isEnrolledInACourse, courseId, role }), @@ -351,14 +359,14 @@ const playgroundOnlyNavbarLeftInfo: NavbarEntryInfo[] = [ to: '/sicpjs', icon: IconNames.BOOK, text: 'SICP JS' - }, - { - to: '/stories', - icon: IconNames.GIT_REPO, - text: 'Stories', - // TODO: Enable when stories are implemented - disabled: true } + // { + // to: '/stories', + // icon: IconNames.GIT_REPO, + // text: 'Stories', + // // TODO: Enable for public deployment + // disabled: true + // } ]; export const renderNavlinksFromInfo = ( diff --git a/src/routes/routerConfig.tsx b/src/routes/routerConfig.tsx index b916aa374d..0975b7d4b2 100644 --- a/src/routes/routerConfig.tsx +++ b/src/routes/routerConfig.tsx @@ -157,20 +157,24 @@ export const getFullAcademyRouterConfig = ({ lazy: MissionControl }, { - path: 'stories/new', - lazy: EditStory + path: 'courses/:courseId/stories/new', + lazy: EditStory, + loader: ensureUserAndRole }, { - path: 'stories/view/:id', - lazy: ViewStory + path: 'courses/:courseId/stories/view/:id', + lazy: ViewStory, + loader: ensureUserAndRole }, { - path: 'stories/edit/:id', - lazy: EditStory + path: 'courses/:courseId/stories/edit/:id', + lazy: EditStory, + loader: ensureUserAndRole }, { - path: 'stories', - lazy: Stories + path: 'courses/:courseId/stories', + lazy: Stories, + loader: ensureUserAndRole }, ...commonChildrenRoutes, { From b73a8b3fc66ee43cdc08d8b16871466b505b904f Mon Sep 17 00:00:00 2001 From: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> Date: Tue, 16 Jan 2024 14:58:03 +0800 Subject: [PATCH 4/8] Fix spurious 404 errors Only contact the stories backend when stories are enabled in the current course configuration. --- src/commons/sagas/BackendSaga.ts | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/commons/sagas/BackendSaga.ts b/src/commons/sagas/BackendSaga.ts index afaf380889..4fd756b874 100644 --- a/src/commons/sagas/BackendSaga.ts +++ b/src/commons/sagas/BackendSaga.ts @@ -199,8 +199,10 @@ function* BackendSaga(): SagaIterator { yield put(actions.setCourseConfiguration(courseConfiguration)); yield put(actions.setAssessmentConfigurations(assessmentConfigurations)); - yield put(actions.getStoriesUser()); - // TODO: Fetch associated stories group ID + if (courseConfiguration.enableStories) { + yield put(actions.getStoriesUser()); + // TODO: Fetch associated stories group ID + } } /** * NOTE: Navigation logic is now handled in component. @@ -245,8 +247,10 @@ function* BackendSaga(): SagaIterator { yield put(actions.setCourseConfiguration(courseConfiguration)); yield put(actions.setAssessmentConfigurations(assessmentConfigurations)); - yield put(actions.getStoriesUser()); - // TODO: Fetch associated stories group ID + if (courseConfiguration.enableStories) { + yield put(actions.getStoriesUser()); + // TODO: Fetch associated stories group ID + } } } ); @@ -257,8 +261,10 @@ function* BackendSaga(): SagaIterator { if (config) { yield put(actions.setCourseConfiguration(config)); - yield put(actions.getStoriesUser()); - // TODO: Fetch associated stories group ID + if (config.enableStories) { + yield put(actions.getStoriesUser()); + // TODO: Fetch associated stories group ID + } } }); @@ -724,8 +730,10 @@ function* BackendSaga(): SagaIterator { yield put(actions.setAssessmentConfigurations(assessmentConfigurations)); yield put(actions.setCourseRegistration(courseRegistration)); - yield put(actions.getStoriesUser()); - // TODO: Fetch associated stories group ID + if (courseConfiguration.enableStories) { + yield put(actions.getStoriesUser()); + // TODO: Fetch associated stories group ID + } yield call(showSuccessMessage, `Switched to ${courseConfiguration.courseName}!`, 5000); } From 97bd630078d5e82fc8e615adc3885033f17a511d Mon Sep 17 00:00:00 2001 From: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> Date: Tue, 16 Jan 2024 15:05:32 +0800 Subject: [PATCH 5/8] Create wrapper action to clear stories state --- src/features/stories/StoriesActions.ts | 3 +++ src/features/stories/StoriesReducer.ts | 10 ++++++++++ src/features/stories/StoriesTypes.ts | 1 + 3 files changed, 14 insertions(+) diff --git a/src/features/stories/StoriesActions.ts b/src/features/stories/StoriesActions.ts index f48dcc67d7..d27b7df4e9 100644 --- a/src/features/stories/StoriesActions.ts +++ b/src/features/stories/StoriesActions.ts @@ -4,6 +4,7 @@ import { action } from 'typesafe-actions'; import { ADD_STORY_ENV, + CLEAR_STORIES_USER_AND_GROUP, CLEAR_STORY_ENV, CREATE_STORY, DELETE_STORY, @@ -78,3 +79,5 @@ export const setCurrentStoriesGroup = ( name: string | undefined, role: StoriesRole | undefined ) => action(SET_CURRENT_STORIES_GROUP, { id, name, role }); +// Helper/wrapper actions +export const clearStoriesUserAndGroup = () => action(CLEAR_STORIES_USER_AND_GROUP); diff --git a/src/features/stories/StoriesReducer.ts b/src/features/stories/StoriesReducer.ts index 5213fce320..52308b5e44 100644 --- a/src/features/stories/StoriesReducer.ts +++ b/src/features/stories/StoriesReducer.ts @@ -13,6 +13,7 @@ import { SourceActionType } from '../../commons/utils/ActionsHelper'; import { DEFAULT_ENV } from './storiesComponents/UserBlogContent'; import { ADD_STORY_ENV, + CLEAR_STORIES_USER_AND_GROUP, CLEAR_STORY_ENV, EVAL_STORY, EVAL_STORY_ERROR, @@ -212,6 +213,15 @@ export const StoriesReducer: Reducer = ( ...state, currentStory: action.payload }; + case CLEAR_STORIES_USER_AND_GROUP: + return { + ...state, + userId: undefined, + userName: undefined, + groupId: undefined, + groupName: undefined, + role: undefined + }; case SET_CURRENT_STORIES_USER: return { ...state, diff --git a/src/features/stories/StoriesTypes.ts b/src/features/stories/StoriesTypes.ts index ee184e33f7..524210e5b2 100644 --- a/src/features/stories/StoriesTypes.ts +++ b/src/features/stories/StoriesTypes.ts @@ -21,6 +21,7 @@ export const SAVE_STORY = 'SAVE_STORY'; export const DELETE_STORY = 'DELETE_STORY'; // Auth-related actions export const GET_STORIES_USER = 'GET_STORIES_USER'; +export const CLEAR_STORIES_USER_AND_GROUP = 'CLEAR_STORIES_USER_AND_GROUP'; // TODO: Investigate possibility of combining the two actions export const SET_CURRENT_STORIES_USER = 'SET_CURRENT_STORIES_USER'; export const SET_CURRENT_STORIES_GROUP = 'SET_CURRENT_STORIES_GROUP'; From 1b795e7a15d70a951d95d023f877598d4989169f Mon Sep 17 00:00:00 2001 From: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> Date: Tue, 16 Jan 2024 15:06:23 +0800 Subject: [PATCH 6/8] Handle stories state change on course config change --- src/pages/academy/adminPanel/AdminPanel.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/pages/academy/adminPanel/AdminPanel.tsx b/src/pages/academy/adminPanel/AdminPanel.tsx index bb73daf7a6..1e864a26f5 100644 --- a/src/pages/academy/adminPanel/AdminPanel.tsx +++ b/src/pages/academy/adminPanel/AdminPanel.tsx @@ -11,6 +11,7 @@ import { addNewStoriesUsersToCourse, addNewUsersToCourse } from 'src/features/academy/AcademyActions'; +import { clearStoriesUserAndGroup, getStoriesUser } from 'src/features/stories/StoriesActions'; import { deleteAssessmentConfig, @@ -145,6 +146,11 @@ const AdminPanel: React.FC = () => { const submitHandler = () => { if (hasChangesCourseConfig) { dispatch(updateCourseConfig(courseConfiguration)); + if (courseConfiguration.enableStories) { + dispatch(getStoriesUser()); + } else { + dispatch(clearStoriesUserAndGroup()); + } setHasChangesCourseConfig(false); } if (assessmentConfigsToDelete.length > 0) { From 7f1fe3c29a6c7a597b12deffd94a005b64576940 Mon Sep 17 00:00:00 2001 From: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> Date: Tue, 16 Jan 2024 15:40:27 +0800 Subject: [PATCH 7/8] Update failing snapshots --- .../__snapshots__/NavigationBar.tsx.snap | 28 ------------------- 1 file changed, 28 deletions(-) diff --git a/src/commons/navigationBar/__tests__/__snapshots__/NavigationBar.tsx.snap b/src/commons/navigationBar/__tests__/__snapshots__/NavigationBar.tsx.snap index bd1b775d42..d2a1290326 100644 --- a/src/commons/navigationBar/__tests__/__snapshots__/NavigationBar.tsx.snap +++ b/src/commons/navigationBar/__tests__/__snapshots__/NavigationBar.tsx.snap @@ -347,20 +347,6 @@ exports[`NavigationBar Renders correctly for student with course 1`] = ` Achievements - - -
- Stories -
-
- - -
- Stories -
-
Date: Wed, 17 Jan 2024 18:12:56 +0800 Subject: [PATCH 8/8] Move clearing logic to BackendSaga Also adds the dispatch logic to previously missed action handlers. --- src/commons/sagas/BackendSaga.ts | 22 +++++++++++++++++++++ src/pages/academy/adminPanel/AdminPanel.tsx | 6 ------ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/commons/sagas/BackendSaga.ts b/src/commons/sagas/BackendSaga.ts index 4fd756b874..580e155c0e 100644 --- a/src/commons/sagas/BackendSaga.ts +++ b/src/commons/sagas/BackendSaga.ts @@ -202,6 +202,8 @@ function* BackendSaga(): SagaIterator { if (courseConfiguration.enableStories) { yield put(actions.getStoriesUser()); // TODO: Fetch associated stories group ID + } else { + yield put(actions.clearStoriesUserAndGroup()); } } /** @@ -250,6 +252,8 @@ function* BackendSaga(): SagaIterator { if (courseConfiguration.enableStories) { yield put(actions.getStoriesUser()); // TODO: Fetch associated stories group ID + } else { + yield put(actions.clearStoriesUserAndGroup()); } } } @@ -264,6 +268,8 @@ function* BackendSaga(): SagaIterator { if (config.enableStories) { yield put(actions.getStoriesUser()); // TODO: Fetch associated stories group ID + } else { + yield put(actions.clearStoriesUserAndGroup()); } } }); @@ -733,6 +739,8 @@ function* BackendSaga(): SagaIterator { if (courseConfiguration.enableStories) { yield put(actions.getStoriesUser()); // TODO: Fetch associated stories group ID + } else { + yield put(actions.clearStoriesUserAndGroup()); } yield call(showSuccessMessage, `Switched to ${courseConfiguration.courseName}!`, 5000); @@ -750,6 +758,13 @@ function* BackendSaga(): SagaIterator { return yield handleResponseError(resp); } + if (courseConfig.enableStories) { + yield put(actions.getStoriesUser()); + // TODO: Fetch associated stories group ID + } else { + yield put(actions.clearStoriesUserAndGroup()); + } + yield put(actions.setCourseConfiguration(courseConfig)); yield call(showSuccessMessage, 'Updated successfully!', 1000); } @@ -953,6 +968,13 @@ function* BackendSaga(): SagaIterator { yield put(actions.setUser(user)); yield put(actions.setCourseRegistration({ role: Role.Student })); + if (courseConfiguration.enableStories) { + yield put(actions.getStoriesUser()); + // TODO: Fetch associated stories group ID + } else { + yield put(actions.clearStoriesUserAndGroup()); + } + const placeholderAssessmentConfig = [ { type: 'Missions', diff --git a/src/pages/academy/adminPanel/AdminPanel.tsx b/src/pages/academy/adminPanel/AdminPanel.tsx index 1e864a26f5..bb73daf7a6 100644 --- a/src/pages/academy/adminPanel/AdminPanel.tsx +++ b/src/pages/academy/adminPanel/AdminPanel.tsx @@ -11,7 +11,6 @@ import { addNewStoriesUsersToCourse, addNewUsersToCourse } from 'src/features/academy/AcademyActions'; -import { clearStoriesUserAndGroup, getStoriesUser } from 'src/features/stories/StoriesActions'; import { deleteAssessmentConfig, @@ -146,11 +145,6 @@ const AdminPanel: React.FC = () => { const submitHandler = () => { if (hasChangesCourseConfig) { dispatch(updateCourseConfig(courseConfiguration)); - if (courseConfiguration.enableStories) { - dispatch(getStoriesUser()); - } else { - dispatch(clearStoriesUserAndGroup()); - } setHasChangesCourseConfig(false); } if (assessmentConfigsToDelete.length > 0) {