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
|
|
|
|