WikiEducationFoundation/WikiEduDashboard

View on GitHub
app/assets/javascripts/reducers/assignments.js

Summary

Maintainability
A
1 hr
Test Coverage
B
87%
import { reject } from 'lodash-es';
import { sortByKey } from '../utils/model_utils';
import { RECEIVE_ASSIGNMENTS, ADD_ASSIGNMENT, DELETE_ASSIGNMENT, UPDATE_ASSIGNMENT, LOADING_ASSIGNMENTS } from '../constants';

const initialState = {
  assignments: [],
  sortKey: null,
  loading: true,
  lastRequestTimestamp: 0 // UNIX timestamp of last request - in milliseconds
};

const SORT_DESCENDING = {};

export default function assignments(state = initialState, action) {
  switch (action.type) {
    case RECEIVE_ASSIGNMENTS: {
      const dataAssignments = action.data.course.assignments;
      // Initial sorting by article title
      const sortedModel = sortByKey(dataAssignments, 'article_title', state.sortKey, SORT_DESCENDING.article_title);
      return {
        assignments: sortedModel.newModels,
        sortKey: sortedModel.newKey,
        loading: false,
        lastRequestTimestamp: Date.now()
      };
    }
    case ADD_ASSIGNMENT: {
      const newAssignment = action.data;
      const updatedAssignments = [...state.assignments, newAssignment];
      return { ...state, assignments: updatedAssignments };
    }
    case DELETE_ASSIGNMENT: {
      const updatedAssignments = reject(state.assignments, { id: action.data.assignmentId });
      return { ...state, assignments: updatedAssignments };
    }
    case UPDATE_ASSIGNMENT: {
      const updatedAssignment = action.data.assignment;
      const nonupdatedAssignments = reject(state.assignments, { id: updatedAssignment.id });
      return { ...state, assignments: [...nonupdatedAssignments, updatedAssignment] };
    }
    case LOADING_ASSIGNMENTS: {
      return { ...state, loading: true };
    }
    default:
      return state;
  }
}