Passed
Push — task/application-touch-step-st... ( c95732...291e16 )
by Tristan
04:39
created

resources/assets/js/components/ApplicationReview/ApplicationTimelineReviewRoot.tsx   A

Complexity

Total Complexity 3
Complexity/F 0

Size

Lines of Code 165
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 3
eloc 135
c 0
b 0
f 0
dl 0
loc 165
rs 10
mnd 3
bc 3
fnc 0
bpm 0
cpm 0
noi 0
1
/* eslint-disable camelcase */
2
import * as React from "react";
3
import ReactDOM from "react-dom";
4
import { useIntl } from "react-intl";
5
import { useDispatch } from "react-redux";
6
import { DispatchType } from "../../configureStore";
7
import { getLocale } from "../../helpers/localize";
8
import {
9
  useApplicationUser,
10
  useCriteria,
11
  useExperiences,
12
  useExperienceSkills,
13
  useFetchReviewApplicationData,
14
  useJob,
15
  useJobApplicationAnswers,
16
  useJobPosterQuestions,
17
  useReviewedApplication,
18
  useSkills,
19
} from "../../hooks/applicationHooks";
20
import { Portal } from "../../models/app";
21
import { ReviewStatus } from "../../models/types";
22
import { loadingMessages } from "../Application/applicationMessages";
23
import ApplicationPreview from "../Application/Review/ApplicationPreview";
24
import RootContainer from "../RootContainer";
25
import ApplicationReviewNav from "./ApplicationReviewRoot";
26
27
interface ApplicationTimelineReviewRootProps {
28
  applicationId: number;
29
  applicantUserId: number;
30
  jobId: number;
31
  reviewStatuses: ReviewStatus[];
32
  portal: Portal;
33
}
34
35
const ApplicationTimelineReviewRoot: React.FunctionComponent<ApplicationTimelineReviewRootProps> = ({
36
  applicationId,
37
  applicantUserId,
38
  jobId,
39
  portal,
40
  reviewStatuses,
41
}) => {
42
  const intl = useIntl();
43
  const locale = getLocale(intl.locale);
44
  const dispatch = useDispatch<DispatchType>();
45
46
  const {
47
    experiencesLoaded,
48
    experienceConstantsLoaded,
49
    skillsLoaded,
50
  } = useFetchReviewApplicationData(
51
    applicantUserId,
52
    applicationId,
53
    jobId,
54
    dispatch,
55
  );
56
57
  const application = useReviewedApplication(applicationId);
58
  const applicantUser = useApplicationUser(applicationId);
59
  const job = useJob(jobId);
60
  const criteria = useCriteria(jobId);
61
  const experiences = useExperiences(applicationId, application);
62
  const experienceSkills = useExperienceSkills(applicationId, application);
63
  const skills = useSkills();
64
  const jobQuestions = useJobPosterQuestions(jobId);
65
  const jobApplicationAnswers = useJobApplicationAnswers(applicationId);
66
  const managerView = portal === "manager" || portal === "hr";
67
  const showLoadingState =
68
    application === null ||
69
    job === null ||
70
    !experiencesLoaded ||
71
    !experienceConstantsLoaded ||
72
    !skillsLoaded;
73
74
  return (
75
    <div data-clone>
76
      {showLoadingState && (
77
        <h2
78
          data-c-heading="h2"
79
          data-c-align="center"
80
          data-c-padding="top(2) bottom(2)"
81
        >
82
          {intl.formatMessage(loadingMessages.loading)}
83
        </h2>
84
      )}
85
      {!showLoadingState &&
86
        application !== null &&
87
        job !== null &&
88
        applicantUser !== null && (
89
          <>
90
            <ApplicationReviewNav
91
              initApplication={application}
92
              portal={portal}
93
              reviewStatuses={reviewStatuses}
94
            />
95
            <ApplicationPreview
96
              application={application}
97
              criteria={criteria}
98
              experiences={experiences}
99
              experienceSkills={experienceSkills}
100
              experienceViewState="education"
101
              experienceViewButtonOrder={["education", "skills", "experience"]}
102
              job={job}
103
              jobApplicationAnswers={jobApplicationAnswers}
104
              jobQuestions={jobQuestions}
105
              skills={skills}
106
              user={applicantUser}
107
              managerView={managerView}
108
            />
109
          </>
110
        )}
111
    </div>
112
  );
113
};
114
115
const renderApplicationReviewRoot = (
116
  container: HTMLElement,
117
  portal: Portal,
118
): void => {
119
  if (
120
    container.hasAttribute("data-applicant-user-id") &&
121
    container.hasAttribute("data-application-id") &&
122
    container.hasAttribute("data-job-id") &&
123
    container.hasAttribute("data-review-statuses")
124
  ) {
125
    const applicantUserId = JSON.parse(
126
      container.getAttribute("data-applicant-user-id") as string,
127
    );
128
    const applicationId = JSON.parse(
129
      container.getAttribute("data-application-id") as string,
130
    );
131
    const jobId = JSON.parse(container.getAttribute("data-job-id") as string);
132
    const reviewStatuses = JSON.parse(
133
      container.getAttribute("data-review-statuses") as string,
134
    );
135
    ReactDOM.render(
136
      <RootContainer>
137
        <ApplicationTimelineReviewRoot
138
          applicationId={applicationId}
139
          applicantUserId={applicantUserId}
140
          jobId={jobId}
141
          portal={portal}
142
          reviewStatuses={reviewStatuses}
143
        />
144
      </RootContainer>,
145
      container,
146
    );
147
  }
148
};
149
150
const managerContainer = document.getElementById(
151
  "application-timeline-review-container",
152
);
153
if (managerContainer !== null) {
154
  renderApplicationReviewRoot(managerContainer, "manager");
155
}
156
157
const hrContainer = document.getElementById(
158
  "application-timeline-review-container-hr",
159
);
160
if (hrContainer !== null) {
161
  renderApplicationReviewRoot(hrContainer, "hr");
162
}
163
164
export default ApplicationTimelineReviewRoot;
165