export function epicTimelineReducer()

in src/PortfolioPlanning/Redux/Reducers/EpicTimelineReducer.ts [13:131]


export function epicTimelineReducer(state: IEpicTimelineState, action: EpicTimelineActions): IEpicTimelineState {
    return produce(state || getDefaultState(), (draft: IEpicTimelineState) => {
        switch (action.type) {
            case EpicTimelineActionTypes.UpdateDates: {
                const { epicId, startDate, endDate } = action.payload;
                const epicToUpdate = draft.epics.find(epic => epic.id === epicId);
                epicToUpdate.startDate = startDate.toDate();
                epicToUpdate.startDate.setHours(0, 0, 0, 0);
                epicToUpdate.endDate = endDate.toDate();
                epicToUpdate.endDate.setHours(0, 0, 0, 0);
                epicToUpdate.itemUpdating = true;
                break;
            }
            case EpicTimelineActionTypes.ShiftItem: {
                const { itemId, startDate } = action.payload;

                const epicToUpdate = draft.epics.find(epic => epic.id === itemId);

                const epicDuration = epicToUpdate.endDate.getTime() - epicToUpdate.startDate.getTime();

                epicToUpdate.startDate = startDate.toDate();
                epicToUpdate.startDate.setHours(0, 0, 0, 0);
                epicToUpdate.endDate = startDate.add(epicDuration, "milliseconds").toDate();
                epicToUpdate.endDate.setHours(0, 0, 0, 0);
                epicToUpdate.itemUpdating = true;
                break;
            }
            case EpicTimelineActionTypes.UpdateItemFinished: {
                const { itemId } = action.payload;
                const epicToUpdate = draft.epics.find(epic => epic.id === itemId);
                epicToUpdate.itemUpdating = false;
                break;
            }
            case EpicTimelineActionTypes.ToggleItemDetailsDialogHidden: {
                const { hidden } = action.payload;

                draft.setDatesDialogHidden = hidden;

                break;
            }
            case EpicTimelineActionTypes.SetSelectedItemId: {
                const { id } = action.payload;

                draft.selectedItemId = id;

                break;
            }
            case EpicTimelineActionTypes.PortfolioItemsReceived:
                const { result } = action.payload;
                const { items, projects } = result;

                draft.planLoadingStatus = LoadingStatus.Loaded;
                draft.exceptionMessage = items.exceptionMessage || projects.exceptionMessage;

                return handlePortfolioItemsReceived(draft, action as PortfolioItemsReceivedAction);

            case EpicTimelineActionTypes.OpenAddItemPanel: {
                draft.addItemsPanelOpen = true;
                break;
            }
            case EpicTimelineActionTypes.CloseAddItemPanel: {
                draft.addItemsPanelOpen = false;
                draft.isNewPlanExperience = false;
                break;
            }
            case EpicTimelineActionTypes.PortfolioItemDeleted: {
                return handlePortfolioItemDeleted(state, action as PortfolioItemDeletedAction);
            }
            case EpicTimelineActionTypes.ToggleProgressTrackingCriteria: {
                draft.progressTrackingCriteria = action.payload.criteria;
                break;
            }
            case EpicTimelineActionTypes.ToggleLoadingStatus: {
                const { status } = action.payload;

                draft.planLoadingStatus = status;

                break;
            }
            case EpicTimelineActionTypes.ResetPlanState: {
                draft.planLoadingStatus = LoadingStatus.NotLoaded;
                draft.selectedItemId = undefined;
                draft.setDatesDialogHidden = true;
                draft.addItemsPanelOpen = false;
                draft.planSettingsPanelOpen = false;
                draft.epics = [];
                draft.projects = [];
                draft.teams = {};
                draft.isNewPlanExperience = false;
                draft.deletePlanDialogHidden = true;

                break;
            }
            case EpicTimelineActionTypes.TogglePlanSettingsPanelOpen: {
                const { isOpen } = action.payload;

                draft.planSettingsPanelOpen = isOpen;

                break;
            }
            case EpicTimelineActionTypes.ToggleIsNewPlanExperience: {
                draft.isNewPlanExperience = action.payload.isNewPlanExperience;
                break;
            }
            case EpicTimelineActionTypes.ToggleDeletePlanDialogHidden: {
                draft.deletePlanDialogHidden = action.payload.hidden;
                break;
            }
            case EpicTimelineActionTypes.HandleGeneralException: {
                draft.exceptionMessage = action.payload.message || action.payload.exceptionMessage;
                break;
            }
            case EpicTimelineActionTypes.DismissErrorMessageCard: {
                draft.exceptionMessage = "";
                break;
            }
        }
    });
}