Passed
Push — feature/response-screening ( dc9872...83ee0e )
by Tristan
04:25
created

resources/assets/js/store/Application/applicationSelector.ts   A

Complexity

Total Complexity 3
Complexity/F 0

Size

Lines of Code 65
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 3
eloc 56
mnd 3
bc 3
fnc 0
dl 0
loc 65
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
rs 10
1
import { RootState } from "../store";
2
import { EntityState, UiState } from "./applicationReducer";
3
import {
4
  Application,
5
} from "../../models/types";
6
import { PropType } from "../../models/app";
7
import createCachedSelector from "re-reselect";
8
import { find, hasKey, getId, notEmpty } from "../../helpers/queries";
9
10
const entities = (state: RootState): EntityState => state.applications.entities;
11
const ui = (state: RootState): UiState => state.applications.ui;
12
13
const getApplicationState = (state: RootState) => entities(state).applications;
14
15
const getApplicationReviewState = (state: RootState) =>
16
  entities(state).applicationReviews;
17
18
const constructNonNormalizedApplication = (
19
  applications: ReturnType<typeof getApplicationState>,
20
  applicationReviews: PropType<EntityState, "applicationReviews">,
21
  id: number,
22
): Application | null => {
23
  const applicationNormalized = hasKey(applications, id)
24
    ? applications[id]
25
    : null;
26
  if (applicationNormalized === null) {
27
    return null;
28
  }
29
  if (hasKey(applicationReviews.idByApplicationId, id)) {
30
    const reviewId = applicationReviews.idByApplicationId[id];
31
    return {
32
      ...applicationNormalized,
33
      application_review: applicationReviews.byId[reviewId],
34
    };
35
  } else {
36
    return {
37
      ...applicationNormalized,
38
      application_review: undefined,
39
    };
40
  }
41
};
42
43
export const getApplicationById = createCachedSelector(
44
  getApplicationState,
45
  getApplicationReviewState,
46
  (state: RootState, ownProps: { id: number }): number => ownProps.id,
47
  constructNonNormalizedApplication,
48
)((state, ownProps): number => ownProps.id);
49
50
export const getApplicationsByJob = createCachedSelector(
51
  getApplicationState,
52
  getApplicationReviewState,
53
  (state: RootState, ownProps: { jobId: number }): number => ownProps.jobId,
54
  (applications, applicationReviews, jobId): Application[] => {
55
    const applicationIds = Object.values(applications)
56
      .filter((application) => application.job_poster_id == jobId)
57
      .map(getId);
58
    return applicationIds
59
      .map((id) =>
60
        constructNonNormalizedApplication(applications, applicationReviews, id),
61
      )
62
      .filter(notEmpty);
63
  },
64
);
65