Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

EditProfile.js 6.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. import React, { useState, useEffect } from "react";
  2. import PropTypes from "prop-types";
  3. import BackdropComponent from "../../../MUI/BackdropComponent";
  4. import {
  5. EditProfileContainer,
  6. ProfileImageContainer,
  7. BackButton,
  8. CloseButton,
  9. SaveButton,
  10. ProfileHeader,
  11. BasicInfo,
  12. DetailsInfo,
  13. ButtonsContainer,
  14. ProfileImagePicker,
  15. } from "./EditProfile.styled";
  16. import selectedTheme from "../../../../themes";
  17. import { useFormik } from "formik";
  18. import { ReactComponent as ArrowBack } from "../../../../assets/images/svg/arrow-back.svg";
  19. import { ReactComponent as CloseIcon } from "../../../../assets/images/svg/close-modal.svg";
  20. import { useTranslation } from "react-i18next";
  21. import {
  22. editProfile,
  23. editProfileAsAdmin,
  24. fetchAllProfilesAsAdmin,
  25. fetchMineProfile,
  26. } from "../../../../store/actions/profile/profileActions";
  27. import { useDispatch, useSelector } from "react-redux";
  28. import { selectUserId } from "../../../../store/selectors/loginSelectors";
  29. import editProfileValidation from "../../../../validations/editProfileValidation";
  30. import useIsMobile from "../../../../hooks/useIsMobile";
  31. import { useMemo } from "react";
  32. import editProfileInitialValues from "../../../../initialValues/editProfileInitialValues";
  33. import FirmNameField from "./FirmNameField/FirmNameField";
  34. import PIBField from "./PIBField/PIBField";
  35. import LocationField from "./LocationField/LocationField";
  36. import WebsiteField from "./WebsiteField/WebsiteField";
  37. import AppLinkField from "./AppLinkField/AppLinkField";
  38. import PhoneField from "./PhoneField/PhoneField";
  39. import FormikErrorMessage from "./FormikErrorMessage/FormikErrorMessage";
  40. import {
  41. dynamicRouteMatches,
  42. routeMatches,
  43. } from "../../../../util/helpers/routeHelpers";
  44. import {
  45. ADMIN_HOME_PAGE,
  46. ADMIN_USERS_PAGE,
  47. PROFILE_PAGE,
  48. } from "../../../../constants/pages";
  49. const EditProfile = (props) => {
  50. const [profileImage, setProfileImage] = useState(props.profile.image);
  51. const [showBasic, setShowBasic] = useState(true);
  52. const [showDetails, setShowDetails] = useState(true);
  53. const { t } = useTranslation();
  54. const dispatch = useDispatch();
  55. const { isMobile } = useIsMobile();
  56. const userId = useSelector(selectUserId);
  57. const locations = useSelector((state) => state.locations.locations);
  58. useEffect(() => {
  59. setShowDetails(!isMobile);
  60. }, [isMobile]);
  61. const handleApiResponseSuccess = () => {
  62. if (dynamicRouteMatches(PROFILE_PAGE)) dispatch(fetchMineProfile(userId));
  63. if (routeMatches(ADMIN_USERS_PAGE) || routeMatches(ADMIN_HOME_PAGE))
  64. dispatch(fetchAllProfilesAsAdmin());
  65. props.reFetchProfile();
  66. };
  67. const handleSubmit = (values) => {
  68. if (props.isAdmin) {
  69. dispatch(
  70. editProfileAsAdmin({
  71. userId: props.userId,
  72. ...values,
  73. firmLogo: profileImage === props.profile.image ? null : profileImage,
  74. handleApiResponseSuccess,
  75. })
  76. );
  77. } else {
  78. dispatch(
  79. editProfile({
  80. ...values,
  81. firmLogo: profileImage === props.profile.image ? null : profileImage,
  82. handleApiResponseSuccess,
  83. })
  84. );
  85. }
  86. props.closeModalHandler();
  87. };
  88. const initialValues = useMemo(
  89. () => editProfileInitialValues(props?.profile),
  90. [props?.profile]
  91. );
  92. const validationSchema = useMemo(() => {
  93. return editProfileValidation(locations);
  94. }, []);
  95. const formik = useFormik({
  96. initialValues,
  97. validationSchema: validationSchema,
  98. onSubmit: handleSubmit,
  99. validateOnBlur: true,
  100. enableReinitialize: true,
  101. });
  102. const closeEditModalHandler = () => {
  103. props.closeModalHandler();
  104. };
  105. const showDetailsHandler = () => {
  106. setShowDetails(!showDetails);
  107. setShowBasic(!showBasic);
  108. };
  109. const setImage = (image) => {
  110. setProfileImage(image);
  111. };
  112. return (
  113. <>
  114. <BackdropComponent
  115. handleClose={closeEditModalHandler}
  116. isLoading
  117. position="fixed"
  118. />
  119. <EditProfileContainer component="form" onSubmit={formik.handleSubmit}>
  120. {!showBasic && (
  121. <BackButton onClick={showDetailsHandler}>
  122. <ArrowBack />
  123. </BackButton>
  124. )}
  125. <ProfileImageContainer>
  126. <ProfileImagePicker
  127. image={profileImage}
  128. setImage={setImage}
  129. ></ProfileImagePicker>
  130. <ProfileHeader>{props.profile.company.name}</ProfileHeader>
  131. </ProfileImageContainer>
  132. <CloseButton onClick={closeEditModalHandler}>
  133. <CloseIcon />
  134. </CloseButton>
  135. {showBasic && (
  136. <BasicInfo>
  137. <FirmNameField formik={formik} />
  138. <PIBField formik={formik} />
  139. <LocationField formik={formik} />
  140. </BasicInfo>
  141. )}
  142. {showDetails && (
  143. <DetailsInfo>
  144. <WebsiteField formik={formik} />
  145. <AppLinkField formik={formik} />
  146. <PhoneField formik={formik} />
  147. </DetailsInfo>
  148. )}
  149. <FormikErrorMessage formik={formik} />
  150. <ButtonsContainer>
  151. {isMobile && (
  152. <>
  153. <SaveButton
  154. height="44px"
  155. width="155px"
  156. buttoncolor={selectedTheme.colors.primaryPurple}
  157. textcolor={selectedTheme.colors.primaryPurple}
  158. onClick={showDetailsHandler}
  159. >
  160. {showDetails
  161. ? t("editProfile.showBasic")
  162. : t("editProfile.showDetails")}
  163. </SaveButton>
  164. </>
  165. )}
  166. <SaveButton
  167. type="submit"
  168. variant="contained"
  169. height={isMobile ? "44px" : "48px"}
  170. width={isMobile ? "155px" : "335px"}
  171. buttoncolor={selectedTheme.colors.primaryPurple}
  172. textcolor="white"
  173. >
  174. {t("common.save")}
  175. </SaveButton>
  176. </ButtonsContainer>
  177. </EditProfileContainer>
  178. </>
  179. );
  180. };
  181. EditProfile.propTypes = {
  182. children: PropTypes.node,
  183. profile: PropTypes.any,
  184. closeModalHandler: PropTypes.func,
  185. setImage: PropTypes.func,
  186. reFetchProfile: PropTypes.func,
  187. isAdmin: PropTypes.bool,
  188. userId: PropTypes.string,
  189. };
  190. export default EditProfile;