Passed
Push — task/update-profile-experience ( 9cba2e...f7db59 )
by Tristan
07:12
created

resources/assets/js/components/ApplicantProfile/Experience/CommunityExperienceProfileModal.tsx   A

Complexity

Total Complexity 5
Complexity/F 0

Size

Lines of Code 140
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 5
eloc 112
mnd 5
bc 5
fnc 0
dl 0
loc 140
rs 10
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
1
import React, { FunctionComponent } from "react";
2
import { Formik, Form } from "formik";
3
import { useIntl } from "react-intl";
4
import * as Yup from "yup";
5
import {
6
  ProfileSkillSubform,
7
  SkillFormValues,
8
  submitDataToFormSkills,
9
  validationShape as skillValidationShape,
10
} from "./ProfileSkillSubform";
11
import {
12
  Skill,
13
  ExperienceCommunity,
14
  ExperienceSkill,
15
} from "../../../models/types";
16
import { ExperienceSubmitData } from "./ExperienceModalCommon";
17
import {
18
  ExperienceModalHeader,
19
  ExperienceDetailsIntro,
20
  ExperienceModalFooter,
21
} from "../../Application/ExperienceModals/ExperienceModalCommon";
22
import Modal from "../../Modal";
23
import {
24
  newCommunityExperience,
25
  CommunityDetailsFormValues,
26
  messages,
27
  communityValidationShape,
28
  CommunityDetailsSubform,
29
  detailsToExperience,
30
  experienceToDetails,
31
} from "../../Application/ExperienceModals/CommunityExperienceModal";
32
33
type CommunityExperienceFormValues = SkillFormValues &
34
  CommunityDetailsFormValues;
35
36
const dataToFormValues = (
37
  data: ExperienceSubmitData<ExperienceCommunity>,
38
  allSkills: Skill[],
39
): CommunityExperienceFormValues => {
40
  return {
41
    ...experienceToDetails(data.experience),
42
    ...submitDataToFormSkills(data, allSkills),
43
  };
44
};
45
46
interface ProfileCommunityModalProps {
47
  modalId: string;
48
  experienceCommunity: ExperienceCommunity | null;
49
  experienceableId: number;
50
  experienceableType: ExperienceCommunity["experienceable_type"];
51
  userSkills: Skill[];
52
  experienceSkills: ExperienceSkill[];
53
  parentElement: Element | null;
54
  visible: boolean;
55
  onModalCancel: () => void;
56
  onModalConfirm: (data: ExperienceCommunity) => Promise<void>;
57
}
58
59
export const ProfileCommunityModal: FunctionComponent<ProfileCommunityModalProps> = ({
60
  modalId,
61
  experienceCommunity,
62
  experienceableId,
63
  experienceableType,
64
  userSkills,
65
  experienceSkills,
66
  parentElement,
67
  visible,
68
  onModalCancel,
69
  onModalConfirm,
70
}) => {
71
  const intl = useIntl();
72
73
  const originalExperience =
74
    experienceCommunity ??
75
    newCommunityExperience(experienceableId, experienceableType);
76
77
  const relevantExperienceSkills = experienceSkills.filter(
78
    (expSkill) =>
79
      expSkill.experience_id === experienceCommunity?.id &&
80
      expSkill.experience_type === "experience_community",
81
  );
82
83
  const validationSchema = Yup.object().shape({
84
    ...communityValidationShape(intl),
85
    ...skillValidationShape(intl),
86
  });
87
88
  const initialFormValues = dataToFormValues(
89
    {
90
      experience: originalExperience,
91
      savedSkills: relevantExperienceSkills.map((expSkill) => ({
92
        skillId: expSkill.skill_id,
93
        justification: expSkill.justification ?? "",
94
      })),
95
    },
96
    userSkills,
97
  );
98
99
  return (
100
    <Modal
101
      id={modalId}
102
      parentElement={parentElement}
103
      visible={visible}
104
      onModalCancel={onModalCancel}
105
      onModalConfirm={onModalCancel}
106
      className="application-experience-dialog"
107
    >
108
      <ExperienceModalHeader
109
        title={intl.formatMessage(messages.modalTitle)}
110
        iconClass="fa-people-carry"
111
      />
112
      <Formik
113
        enableReinitialize
114
        initialValues={initialFormValues}
115
        onSubmit={async (values, actions): Promise<void> => {
116
          await onModalConfirm(detailsToExperience(values, originalExperience));
117
          actions.setSubmitting(false);
118
          actions.resetForm();
119
        }}
120
        validationSchema={validationSchema}
121
      >
122
        {(formikProps): React.ReactElement => (
123
          <Form>
124
            <Modal.Body>
125
              <ExperienceDetailsIntro
126
                description={intl.formatMessage(messages.modalDescription)}
127
              />
128
              <CommunityDetailsSubform />
129
              <ProfileSkillSubform keyPrefix="community" skills={userSkills} />
130
            </Modal.Body>
131
            <ExperienceModalFooter buttonsDisabled={formikProps.isSubmitting} />
132
          </Form>
133
        )}
134
      </Formik>
135
    </Modal>
136
  );
137
};
138
139
export default ProfileCommunityModal;
140