Passed
Push — feature/timeline-myfit-step ( 24bc98...aa50b5 )
by Tristan
03:51
created

resources/assets/js/components/JobBuilder/JobBuilderProgressTracker.tsx   A

Complexity

Total Complexity 15
Complexity/F 0

Size

Lines of Code 179
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 15
eloc 146
mnd 15
bc 15
fnc 0
dl 0
loc 179
rs 10
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
1
import React from "react";
2
import { WrappedComponentProps, injectIntl } from "react-intl";
3
import { Job, JobPosterKeyTask, Criteria } from "../../models/types";
4
import {
5
  ProgressTrackerItem,
6
  ProgressTrackerState,
7
} from "../ProgressTracker/types";
8
import {
9
  progressTrackerLabels,
10
  progressTrackerTitles,
11
} from "./jobBuilderMessages";
12
import {
13
  criteriaProgressState,
14
  jobTasksProgressState,
15
  jobImpactProgressState,
16
  jobBuilderEnvProgressState,
17
  jobBuilderIntroProgressState,
18
  jobBuilderDetailsProgressState,
19
  JobBuilderPage,
20
} from "./jobBuilderHelpers";
21
import ProgressTracker from "../ProgressTracker/ProgressTracker";
22
import {
23
  jobBuilderIntro,
24
  jobBuilderDetails,
25
  jobBuilderEnv,
26
  jobBuilderImpact,
27
  jobBuilderTasks,
28
  jobBuilderSkills,
29
  jobBuilderReview,
30
} from "../../helpers/routes";
31
32
interface JobBuilderProgressTrackerProps {
33
  job: Job | null;
34
  jobId: number | null;
35
  tasks: JobPosterKeyTask[];
36
  criteria: Criteria[];
37
  dataIsLoading: boolean;
38
  currentPage: JobBuilderPage | null;
39
}
40
41
const pageOrder: { [page in JobBuilderPage]: number } = {
42
  intro: 0,
43
  details: 1,
44
  env: 2,
45
  impact: 3,
46
  tasks: 4,
47
  skills: 5,
48
  review: 6,
49
};
50
const stepComesBefore = (
51
  currentPage: JobBuilderPage | null,
52
  referencePage: JobBuilderPage,
53
): boolean => {
54
  if (currentPage === null) {
55
    return true;
56
  }
57
  const comesBefore = pageOrder[currentPage] < pageOrder[referencePage];
58
  return comesBefore;
59
};
60
61
export const JobBuilderProgressTracker: React.FunctionComponent<JobBuilderProgressTrackerProps &
62
  WrappedComponentProps> = ({
63
  job,
64
  jobId,
65
  tasks,
66
  dataIsLoading,
67
  criteria,
68
  currentPage,
69
  intl,
70
}): React.ReactElement => {
71
  const { locale } = intl;
72
  if (locale !== "en" && locale !== "fr") {
73
    throw new Error("Unexpected locale");
74
  }
75
  const pageStates: { [page in JobBuilderPage]: ProgressTrackerState } = {
76
    intro: dataIsLoading
77
      ? "null"
78
      : jobBuilderIntroProgressState(
79
          job,
80
          stepComesBefore(currentPage, "intro"),
81
        ),
82
    details: dataIsLoading
83
      ? "null"
84
      : jobBuilderDetailsProgressState(
85
          job,
86
          locale,
87
          stepComesBefore(currentPage, "details"),
88
        ),
89
    env: dataIsLoading
90
      ? "null"
91
      : jobBuilderEnvProgressState(
92
          job,
93
          locale,
94
          stepComesBefore(currentPage, "env"),
95
        ),
96
    impact: dataIsLoading
97
      ? "null"
98
      : jobImpactProgressState(
99
          job,
100
          locale,
101
          stepComesBefore(currentPage, "impact"),
102
        ),
103
    tasks: dataIsLoading
104
      ? "null"
105
      : jobTasksProgressState(
106
          tasks,
107
          locale,
108
          stepComesBefore(currentPage, "tasks"),
109
        ),
110
    skills: dataIsLoading
111
      ? "null"
112
      : criteriaProgressState(
113
          criteria,
114
          locale,
115
          stepComesBefore(currentPage, "skills"),
116
        ),
117
    review: "null",
118
  };
119
  if (currentPage) {
120
    pageStates[currentPage] = "active";
121
  }
122
  const progressTrackerItems: ProgressTrackerItem[] = [
123
    {
124
      link: jobBuilderIntro(locale, jobId || undefined),
125
      state: pageStates.intro,
126
      label: intl.formatMessage(progressTrackerLabels.start),
127
      title: intl.formatMessage(progressTrackerTitles.welcome),
128
    },
129
    {
130
      link: jobId ? jobBuilderDetails(locale, jobId) : "",
131
      state: pageStates.details,
132
      label: intl.formatMessage(progressTrackerLabels.step01),
133
      title: intl.formatMessage(progressTrackerTitles.jobInfo),
134
    },
135
    {
136
      link: jobId ? jobBuilderEnv(locale, jobId) : "",
137
      state: pageStates.env,
138
      label: intl.formatMessage(progressTrackerLabels.step02),
139
      title: intl.formatMessage(progressTrackerTitles.workEnv),
140
    },
141
    {
142
      link: jobId ? jobBuilderImpact(locale, jobId) : "",
143
      state: pageStates.impact,
144
      label: intl.formatMessage(progressTrackerLabels.step03),
145
      title: intl.formatMessage(progressTrackerTitles.impact),
146
    },
147
    {
148
      link: jobId ? jobBuilderTasks(locale, jobId) : "",
149
      state: pageStates.tasks,
150
      label: intl.formatMessage(progressTrackerLabels.step04),
151
      title: intl.formatMessage(progressTrackerTitles.tasks),
152
    },
153
    {
154
      link: jobId ? jobBuilderSkills(locale, jobId) : "",
155
      state: pageStates.skills,
156
      label: intl.formatMessage(progressTrackerLabels.step05),
157
      title: intl.formatMessage(progressTrackerTitles.skills),
158
    },
159
    {
160
      link: jobId ? jobBuilderReview(locale, jobId) : "",
161
      state: pageStates.review,
162
      label: intl.formatMessage(progressTrackerLabels.finish),
163
      title: intl.formatMessage(progressTrackerTitles.review),
164
    },
165
  ];
166
  return (
167
    <ProgressTracker
168
      items={progressTrackerItems}
169
      backgroundColor="black"
170
      fontColor="white"
171
      classNames="manager-jpb-tracker"
172
      itemsWrapperClassNames="tracker manager-jpb-tracker-wrapper"
173
      dataIsLoading={dataIsLoading}
174
    />
175
  );
176
};
177
178
export default injectIntl(JobBuilderProgressTracker);
179