Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

EditProfile.js 6.5KB

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