Passed
Push — task/update-build-badge ( b9b78a )
by
unknown
06:16
created

resources/assets/js/components/Application/Skills/SkillsPage.tsx   A

Complexity

Total Complexity 6
Complexity/F 0

Size

Lines of Code 153
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 6
eloc 127
mnd 6
bc 6
fnc 0
dl 0
loc 153
rs 10
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
1
/* eslint-disable camelcase */
2
import React from "react";
3
import { useIntl } from "react-intl";
4
import { useDispatch } from "react-redux";
5
import makeProgressBarSteps from "../ProgressBar/progressHelpers";
6
import ProgressBar, { stepNames } from "../ProgressBar/ProgressBar";
7
import { ExperienceSkill } from "../../../models/types";
8
import { navigate } from "../../../helpers/router";
9
import {
10
  applicationFit,
11
  applicationIndex,
12
  applicationExperience,
13
} from "../../../helpers/routes";
14
import { getLocale } from "../../../helpers/localize";
15
import { DispatchType } from "../../../configureStore";
16
import {
17
  updateExperienceSkill,
18
  deleteExperienceSkill,
19
} from "../../../store/Experience/experienceActions";
20
import Skills from "./Skills";
21
import { loadingMessages } from "../applicationMessages";
22
import {
23
  useApplication,
24
  useCriteria,
25
  useExperiences,
26
  useExperienceSkills,
27
  useFetchAllApplicationData,
28
  useJob,
29
  useSkills,
30
  useJobApplicationSteps,
31
  useTouchApplicationStep,
32
} from "../../../hooks/applicationHooks";
33
34
interface SkillsPageProps {
35
  applicationId: number;
36
}
37
38
export const SkillsPage: React.FunctionComponent<SkillsPageProps> = ({
39
  applicationId,
40
}) => {
41
  const intl = useIntl();
42
  const locale = getLocale(intl.locale);
43
  const dispatch = useDispatch<DispatchType>();
44
45
  // Fetch all un-loaded data that may be required for the Application.
46
  const { experiencesLoaded, skillsLoaded } = useFetchAllApplicationData(
47
    applicationId,
48
    dispatch,
49
  );
50
51
  const application = useApplication(applicationId);
52
  const jobId = application?.job_poster_id;
53
  const job = useJob(jobId);
54
  const criteria = useCriteria(jobId);
55
  const experiences = useExperiences(applicationId, application);
56
  const experienceSkills = useExperienceSkills(
57
    applicationId,
58
    application,
59
  ).filter((expSkill) =>
60
    criteria.find((criterion) => criterion.skill_id === expSkill.skill_id),
61
  );
62
  const skills = useSkills();
63
  const steps = useJobApplicationSteps();
64
65
  const stepsAreUpdating = useTouchApplicationStep(
66
    applicationId,
67
    "skills",
68
    dispatch,
69
  );
70
71
  const showLoadingState =
72
    application === null || job === null || !experiencesLoaded || !skillsLoaded;
73
74
  const handleUpdateExpSkill = async (
75
    expSkill: ExperienceSkill,
76
  ): Promise<ExperienceSkill> => {
77
    const result = await dispatch(updateExperienceSkill(expSkill));
78
    if (!result.error) {
79
      return result.payload;
80
    }
81
    return Promise.reject(result.error);
82
  };
83
  const handleDeleteExpSkill = async (
84
    expSkill: ExperienceSkill,
85
  ): Promise<void> => {
86
    const result = await dispatch(
87
      deleteExperienceSkill(
88
        expSkill.id,
89
        expSkill.experience_id,
90
        expSkill.experience_type,
91
      ),
92
    );
93
    if (!result.error) {
94
      return Promise.resolve();
95
    }
96
    return Promise.reject(result.error);
97
  };
98
  const closeDate = job?.close_date_time ?? null;
99
100
  const handleReturn = (): void => {
101
    navigate(applicationExperience(locale, applicationId));
102
  };
103
  const handleQuit = (): void => {
104
    // Because the Applications Index is outside of the Application SPA, we navigate to it differently.
105
    window.location.href = applicationIndex(locale);
106
  };
107
  const handleContinue = async (): Promise<void> => {
108
    navigate(applicationFit(locale, applicationId));
109
  };
110
111
  return (
112
    <>
113
      {application && (
114
        <ProgressBar
115
          closeDateTime={closeDate}
116
          currentTitle={intl.formatMessage(stepNames.step03)}
117
          steps={makeProgressBarSteps(
118
            applicationId,
119
            steps,
120
            intl,
121
            "skills",
122
            stepsAreUpdating,
123
          )}
124
        />
125
      )}
126
      {showLoadingState && (
127
        <h2
128
          data-c-heading="h2"
129
          data-c-align="center"
130
          data-c-padding="top(2) bottom(3)"
131
        >
132
          {intl.formatMessage(loadingMessages.loading)}
133
        </h2>
134
      )}
135
      {!showLoadingState && (
136
        <Skills
137
          criteria={criteria}
138
          experiences={experiences}
139
          experienceSkills={experienceSkills}
140
          skills={skills}
141
          handleUpdateExperienceJustification={handleUpdateExpSkill}
142
          handleRemoveExperienceJustification={handleDeleteExpSkill}
143
          handleContinue={handleContinue}
144
          handleReturn={handleReturn}
145
          handleQuit={handleQuit}
146
        />
147
      )}
148
    </>
149
  );
150
};
151
152
export default SkillsPage;
153