138 lines
4.5 KiB
JavaScript
138 lines
4.5 KiB
JavaScript
/* eslint-disable no-param-reassign */
|
|
import { createSlice } from '@reduxjs/toolkit';
|
|
|
|
import { RequestStatus } from '../../data/constants';
|
|
|
|
const slice = createSlice({
|
|
name: 'courseUnit',
|
|
initialState: {
|
|
savingStatus: '',
|
|
isQueryPending: false,
|
|
isTitleEditFormOpen: false,
|
|
canEdit: true,
|
|
loadingStatus: {
|
|
fetchUnitLoadingStatus: RequestStatus.IN_PROGRESS,
|
|
courseSectionVerticalLoadingStatus: RequestStatus.IN_PROGRESS,
|
|
courseVerticalChildrenLoadingStatus: RequestStatus.IN_PROGRESS,
|
|
},
|
|
unit: {},
|
|
courseSectionVertical: {},
|
|
courseVerticalChildren: { children: [], isPublished: true },
|
|
staticFileNotices: {},
|
|
},
|
|
reducers: {
|
|
fetchCourseItemSuccess: (state, { payload }) => {
|
|
state.unit = payload;
|
|
},
|
|
updateLoadingCourseUnitStatus: (state, { payload }) => {
|
|
state.loadingStatus = {
|
|
...state.loadingStatus,
|
|
fetchUnitLoadingStatus: payload.status,
|
|
};
|
|
},
|
|
updateQueryPendingStatus: (state, { payload }) => {
|
|
state.isQueryPending = payload;
|
|
},
|
|
changeEditTitleFormOpen: (state, { payload }) => {
|
|
state.isTitleEditFormOpen = payload;
|
|
},
|
|
updateSavingStatus: (state, { payload }) => {
|
|
state.savingStatus = payload.status;
|
|
},
|
|
fetchSequenceRequest: (state, { payload }) => {
|
|
state.sequenceId = payload.sequenceId;
|
|
state.sequenceStatus = RequestStatus.IN_PROGRESS;
|
|
state.sequenceMightBeUnit = false;
|
|
},
|
|
fetchSequenceSuccess: (state, { payload }) => {
|
|
state.sequenceId = payload.sequenceId;
|
|
state.sequenceStatus = RequestStatus.SUCCESSFUL;
|
|
state.sequenceMightBeUnit = false;
|
|
},
|
|
fetchSequenceFailure: (state, { payload }) => {
|
|
state.sequenceId = payload.sequenceId;
|
|
state.sequenceStatus = RequestStatus.FAILED;
|
|
state.sequenceMightBeUnit = payload.sequenceMightBeUnit || false;
|
|
},
|
|
fetchCourseSectionVerticalDataSuccess: (state, { payload }) => {
|
|
state.courseSectionVertical = payload;
|
|
},
|
|
updateLoadingCourseSectionVerticalDataStatus: (state, { payload }) => {
|
|
state.loadingStatus = {
|
|
...state.loadingStatus,
|
|
courseSectionVerticalLoadingStatus: payload.status,
|
|
};
|
|
},
|
|
updateLoadingCourseXblockStatus: (state, { payload }) => {
|
|
state.loadingStatus = {
|
|
...state.loadingStatus,
|
|
createUnitXblockLoadingStatus: payload.status,
|
|
};
|
|
},
|
|
addNewUnitStatus: (state, { payload }) => {
|
|
state.loadingStatus = {
|
|
...state.loadingStatus,
|
|
fetchUnitLoadingStatus: payload.status,
|
|
};
|
|
},
|
|
updateCourseVerticalChildren: (state, { payload }) => {
|
|
state.courseVerticalChildren = payload;
|
|
},
|
|
updateCourseVerticalChildrenLoadingStatus: (state, { payload }) => {
|
|
state.loadingStatus.courseVerticalChildrenLoadingStatus = payload.status;
|
|
},
|
|
deleteXBlock: (state, { payload }) => {
|
|
state.courseVerticalChildren.children = state.courseVerticalChildren.children.filter(
|
|
(component) => component.id !== payload,
|
|
);
|
|
},
|
|
duplicateXBlock: (state, { payload }) => {
|
|
state.courseVerticalChildren = {
|
|
...payload.newCourseVerticalChildren,
|
|
children: payload.newCourseVerticalChildren.children.map((component) => {
|
|
if (component.blockId === payload.newId) {
|
|
component.shouldScroll = true;
|
|
}
|
|
return component;
|
|
}),
|
|
};
|
|
},
|
|
fetchStaticFileNoticesSuccess: (state, { payload }) => {
|
|
state.staticFileNotices = payload;
|
|
},
|
|
reorderXBlockList: (state, { payload }) => {
|
|
// Create a map for payload IDs to their index for O(1) lookups
|
|
const indexMap = new Map(payload.map((id, index) => [id, index]));
|
|
|
|
// Directly sort the children based on the order defined in payload
|
|
// This avoids the need to copy the array beforehand
|
|
state.courseVerticalChildren.children.sort((a, b) => (indexMap.get(a.id) || 0) - (indexMap.get(b.id) || 0));
|
|
},
|
|
},
|
|
});
|
|
|
|
export const {
|
|
fetchCourseItemSuccess,
|
|
updateLoadingCourseUnitStatus,
|
|
updateSavingStatus,
|
|
updateModel,
|
|
fetchSequenceRequest,
|
|
fetchSequenceSuccess,
|
|
fetchSequenceFailure,
|
|
fetchCourseSectionVerticalDataSuccess,
|
|
updateLoadingCourseSectionVerticalDataStatus,
|
|
changeEditTitleFormOpen,
|
|
updateQueryPendingStatus,
|
|
updateLoadingCourseXblockStatus,
|
|
updateCourseVerticalChildren,
|
|
updateCourseVerticalChildrenLoadingStatus,
|
|
deleteXBlock,
|
|
duplicateXBlock,
|
|
fetchStaticFileNoticesSuccess,
|
|
reorderXBlockList,
|
|
} = slice.actions;
|
|
|
|
export const {
|
|
reducer,
|
|
} = slice;
|