Skip to content
Snippets Groups Projects
Forked from an inaccessible project.
selectors.ts 3.01 KiB
// Libraries
import { createSelector } from '@ngrx/store';

// Models
import { GlobalState } from '@app/core/state';
import { Year } from '@app/core/models/year';
import { Note } from '@app/core/models/note';
import { Course } from '@app/core/models/course';
import { PlannedTerm } from '@app/core/models/planned-term';
import { DegreePlannerState } from './state';

export const getDegreePlannerState = ({ degreePlanner }: GlobalState) => {
  return degreePlanner;
};

export const getSavedForLaterCourses = createSelector(
  getDegreePlannerState,
  state => state.savedForLaterCourses,
);

export const firstActiveTermCode = createSelector(
  getDegreePlannerState,
  state => {
    if (state.activeTermCodes.length > 0) {
      return state.activeTermCodes[0];
    } else {
      return undefined;
    }
  },
);

export const getAllDegreePlans = createSelector(
  getDegreePlannerState,
  state => state.allDegreePlans,
);

export const getVisibleRoadmapId = createSelector(
  getDegreePlannerState,
  state => {
    return state.visibleDegreePlan
      ? state.visibleDegreePlan.roadmapId
      : undefined;
  },
);

export const getVisibleDegreePlan = createSelector(
  getDegreePlannerState,
  state => state.visibleDegreePlan,
);

export const getAllVisibleTerms = createSelector(
  getDegreePlannerState,
  state => state.visibleTerms,
);

export const getAllVisibleTermsByYear = createSelector(
  getDegreePlannerState,
  state => {
    const unqiueYears = state.visibleTerms
      .map(term => term.termCode.slice(0, 3))
      .filter(year => year.match(/^\d{3}/))
      .filter((year, index, self) => self.indexOf(year) === index)
      .sort();

    return unqiueYears.map<Year>(year => {
      const century = year[0] === '0' ? 0 : 1;
      const twoDigitYearCode = parseInt(year.substr(1, 2), 10);
      return {
        century,
        twoDigitYearCode,
        fall: getTermForCode(`${year}2`, state.visibleTerms),
        spring: getTermForCode(`${year}4`, state.visibleTerms),
        summer: getTermForCode(`${year}6`, state.visibleTerms),
      };
    });
  },
);

export const getDropZones = createSelector(
  getDegreePlannerState,
  (state: DegreePlannerState) => {
    // Get the most recent active term
    const currentTermCode = state.activeTermCodes[0];

    // Get only current / future terms
    const activeTerms = state.visibleTerms.filter(
      term => term.termCode >= currentTermCode,
    );

    // Return a list of current and future drop zone ID's
    return [
      'saved-courses',
      ...activeTerms.map(term => `term-${term.termCode}`),
    ];
  },
);

export const isPastTerm = (termCode: string) =>
  createSelector(
    getDegreePlannerState,
    (state: DegreePlannerState) => {
      const currentTermCode = state.activeTermCodes[0];

      return termCode < currentTermCode;
    },
  );

const getTermForCode = (termCode: string, terms: PlannedTerm[]) => {
  const foundTerm = terms.find(term => term.termCode === termCode);

  if (foundTerm !== undefined) {
    return foundTerm;
  }

  return { termCode, courses: [] };
};