Passed
Push — feature/timeline-profile-page ( da9bea...2fc9bc )
by Tristan
04:53
created

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

Complexity

Total Complexity 6
Complexity/F 0

Size

Lines of Code 148
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 6
eloc 123
mnd 6
bc 6
fnc 0
dl 0
loc 148
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(applicationId, application);
57
  const skills = useSkills();
58
  const steps = useJobApplicationSteps();
59
60
  const stepsAreUpdating = useTouchApplicationStep(
61
    applicationId,
62
    "skills",
63
    dispatch,
64
  );
65
66
  const showLoadingState =
67
    application === null || job === null || !experiencesLoaded || !skillsLoaded;
68
69
  const handleUpdateExpSkill = async (
70
    expSkill: ExperienceSkill,
71
  ): Promise<ExperienceSkill> => {
72
    const result = await dispatch(updateExperienceSkill(expSkill));
73
    if (!result.error) {
74
      return result.payload;
75
    }
76
    return Promise.reject(result.error);
77
  };
78
  const handleDeleteExpSkill = async (
79
    expSkill: ExperienceSkill,
80
  ): Promise<void> => {
81
    const result = await dispatch(
82
      deleteExperienceSkill(
83
        expSkill.id,
84
        expSkill.experience_id,
85
        expSkill.experience_type,
86
      ),
87
    );
88
    if (!result.error) {
89
      return Promise.resolve();
90
    }
91
    return Promise.reject(result.error);
92
  };
93
  const closeDate = job?.close_date_time ?? null;
94
95
  const handleReturn = (): void => {
96
    navigate(applicationExperience(locale, applicationId));
97
  };
98
  const handleQuit = (): void => {
99
    // Because the Applications Index is outside of the Application SPA, we navigate to it differently.
100
    window.location.href = applicationIndex(locale);
101
  };
102
  const handleContinue = async (): Promise<void> => {
103
    navigate(applicationFit(locale, applicationId));
104
  };
105
106
  return (
107
    <>
108
      {application && (
109
        <ProgressBar
110
          closeDateTime={closeDate}
111
          currentTitle={intl.formatMessage(stepNames.step03)}
112
          steps={makeProgressBarSteps(
113
            applicationId,
114
            steps,
115
            intl,
116
            "skills",
117
            stepsAreUpdating,
118
          )}
119
        />
120
      )}
121
      {showLoadingState && (
122
        <h2
123
          data-c-heading="h2"
124
          data-c-align="center"
125
          data-c-padding="top(2) bottom(3)"
126
        >
127
          {intl.formatMessage(loadingMessages.loading)}
128
        </h2>
129
      )}
130
      {!showLoadingState && (
131
        <Skills
132
          criteria={criteria}
133
          experiences={experiences}
134
          experienceSkills={experienceSkills}
135
          skills={skills}
136
          handleUpdateExperienceJustification={handleUpdateExpSkill}
137
          handleRemoveExperienceJustification={handleDeleteExpSkill}
138
          handleContinue={handleContinue}
139
          handleReturn={handleReturn}
140
          handleQuit={handleQuit}
141
        />
142
      )}
143
    </>
144
  );
145
};
146
147
export default SkillsPage;
148