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

FirstPartCreateOffer.js 8.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. import React, { useEffect, useState } from "react";
  2. import PropTypes from "prop-types";
  3. import { useFormik } from "formik";
  4. import {
  5. CreateOfferFormContainer,
  6. DescriptionField,
  7. FieldLabel,
  8. NextButton,
  9. SelectOption,
  10. TitleField,
  11. } from "./FirstPartCreateOffer.styled";
  12. import * as Yup from "yup";
  13. import selectedTheme from "../../../../themes";
  14. import { useTranslation } from "react-i18next";
  15. import { SelectField } from "../CreateOffer.styled";
  16. import { useSelector } from "react-redux";
  17. import useIsMobile from "../../../../hooks/useIsMobile";
  18. import { useRive } from "rive-react";
  19. import AnimationRiv from "../../../../assets/animations/register.riv";
  20. const FirstPartCreateOffer = (props) => {
  21. const [subcat, setSubcat] = useState([]);
  22. const locations = useSelector((state) => state.locations.locations);
  23. const categories = useSelector((state) => state.categories.categories);
  24. const [isPlayed, setIsPlayed] = useState(false);
  25. const { isMobile } = useIsMobile();
  26. const {RiveComponent, rive} = useRive({
  27. src:AnimationRiv,
  28. autoplay: false,
  29. animations: "Successful Registration"
  30. })
  31. useEffect(() => {
  32. if (rive && !isPlayed) {
  33. rive.play();
  34. setIsPlayed(true);
  35. console.log(rive);
  36. }
  37. }, [rive])
  38. const { t } = useTranslation();
  39. useEffect(() => {
  40. if (!props.offer) {
  41. if (Object.keys(props.informations).length !== 0) {
  42. formik.setFieldValue("nameOfProduct", props.informations.nameOfProduct);
  43. formik.setFieldValue("description", props.informations.description);
  44. formik.setFieldValue("location", props.informations.location);
  45. formik.setFieldValue("category", props.informations.category);
  46. formik.setFieldValue("subcategory", props.informations.subcategory);
  47. let scat = categories.filter(
  48. (cat) => cat.name === props.informations.category
  49. );
  50. setSubcat(scat[0].subcategories.map((x) => x.name));
  51. }
  52. } else {
  53. formik.setFieldValue("location", props.offer.location.city);
  54. formik.setFieldValue("category", props.offer.category.name);
  55. formik.setFieldValue("subcategory", props.offer.subcategory);
  56. }
  57. }, [props.offer, props.informations]);
  58. useEffect(() => {
  59. if (props.offer !== undefined) {
  60. let scat = categories.filter(
  61. (cat) => cat.name === props.offer.category.name
  62. );
  63. setSubcat(scat[0].subcategories.map((x) => x.name));
  64. }
  65. }, [props.offer]);
  66. const handleSubmit = (values) => {
  67. props.handleNext(values);
  68. };
  69. const formik = useFormik({
  70. initialValues: {
  71. nameOfProduct: `${!props.offer ? "" : props.offer.name}`,
  72. description: `${!props.offer ? "" : props.offer.description}`,
  73. location: "default",
  74. category: "default",
  75. subcategory: "default",
  76. },
  77. validationSchema: Yup.object().shape({
  78. nameOfProduct: Yup.string().required(t("login.nameOfProductRequired")),
  79. description: Yup.string().required(t("login.descriptionRequired")).min(8),
  80. location: Yup.string().oneOf(locations.map((l) => l.city)),
  81. category: Yup.string().oneOf(categories.map((c) => c.name)),
  82. // subcategory: Yup.string().oneOf(
  83. // subcat[0]?.subcategories ? subcat[0].subcategories : []
  84. // ),
  85. }),
  86. onSubmit: handleSubmit,
  87. validateOnBlur: true,
  88. enableReinitialize: true,
  89. });
  90. const handleSubcategories = (category) => {
  91. const filtered = categories.filter((cat) => cat.name === category);
  92. setSubcat(filtered[0].subcategories.map((c) => c.name));
  93. };
  94. return (
  95. <>
  96. <CreateOfferFormContainer component="form" onSubmit={formik.handleSubmit}>
  97. <RiveComponent />
  98. <FieldLabel leftText={t("offer.title")} />
  99. <TitleField
  100. name="nameOfProduct"
  101. placeholder={t("offer.productName")}
  102. italicPlaceholder
  103. margin="normal"
  104. value={formik.values.nameOfProduct}
  105. onChange={formik.handleChange}
  106. error={formik.touched.nameOfProduct && formik.errors.nameOfProduct}
  107. helperText={
  108. formik.touched.nameOfProduct && formik.errors.nameOfProduct
  109. }
  110. autoFocus
  111. fullWidth
  112. />
  113. <FieldLabel leftText={t("offer.productDescription")} />
  114. {!isMobile ? (
  115. <DescriptionField
  116. name="description"
  117. placeholder={t("offer.description")}
  118. margin="normal"
  119. italicPlaceholder
  120. value={formik.values.description}
  121. onChange={formik.handleChange}
  122. error={formik.touched.description && formik.errors.description}
  123. helperText={formik.touched.description && formik.errors.description}
  124. fullWidth
  125. multiline
  126. minRows={4}
  127. height={"100px"}
  128. />
  129. ) : (
  130. <DescriptionField
  131. name="description"
  132. placeholder={t("offer.description")}
  133. margin="normal"
  134. italicPlaceholder
  135. value={formik.values.description}
  136. onChange={formik.handleChange}
  137. error={formik.touched.description && formik.errors.description}
  138. helperText={formik.touched.description && formik.errors.description}
  139. fullWidth
  140. />
  141. )}
  142. <FieldLabel leftText={t("offer.location")} />
  143. <SelectField
  144. defaultValue={formik.values.location}
  145. onChange={(value) => {
  146. formik.setFieldValue("location", value.target.value);
  147. }}
  148. value={formik.values.location}
  149. >
  150. <SelectOption style={{ display: "none" }} value="default">
  151. {t("offer.choseLocation")}
  152. </SelectOption>
  153. {locations.map((loc) => {
  154. return (
  155. <SelectOption key={loc._id} value={loc.city}>
  156. {loc.city}
  157. </SelectOption>
  158. );
  159. })}
  160. </SelectField>
  161. <FieldLabel leftText={t("offer.category")} />
  162. <SelectField
  163. defaultValue={formik.values.category}
  164. onChange={(value) => {
  165. formik.setFieldValue("category", value.target.value);
  166. }}
  167. value={formik.values.category}
  168. >
  169. <SelectOption style={{ display: "none" }} value="default">
  170. {t("offer.choseCategory")}
  171. </SelectOption>
  172. {categories.map((cat, i) => {
  173. return (
  174. <SelectOption
  175. key={i}
  176. value={cat.name}
  177. onClick={() => handleSubcategories(cat.name)}
  178. >
  179. {cat.name}
  180. </SelectOption>
  181. );
  182. })}
  183. </SelectField>
  184. <FieldLabel leftText={t("offer.subcategory")} />
  185. <SelectField
  186. defaultValue={formik.values.subcategory}
  187. onChange={(value) => {
  188. formik.setFieldValue("subcategory", value.target.value);
  189. }}
  190. value={formik.values.subcategory}
  191. >
  192. <SelectOption style={{ display: "none" }} value="default">
  193. {t("offer.choseSubcategory")}
  194. </SelectOption>
  195. {subcat &&
  196. subcat.map((sub, i) => {
  197. return (
  198. <SelectOption key={i} value={sub}>
  199. {sub}
  200. </SelectOption>
  201. );
  202. })}
  203. </SelectField>
  204. </CreateOfferFormContainer>
  205. <NextButton
  206. type="submit"
  207. variant="contained"
  208. height="48px"
  209. fullWidth
  210. buttoncolor={selectedTheme.primaryPurple}
  211. textcolor="white"
  212. onClick={formik.handleSubmit}
  213. disabled={
  214. formik.values?.nameOfProduct?.length === 0 ||
  215. !formik.values?.nameOfProduct ||
  216. formik.values?.description?.length === 0 ||
  217. !formik.values?.description ||
  218. formik.values?.category?.length === 0 ||
  219. !formik.values?.category ||
  220. formik.values?.category === "default" ||
  221. formik.values?.subcategory?.length === 0 ||
  222. !formik.values?.subcategory ||
  223. formik.values?.subcategory === "default" ||
  224. formik.values?.location?.length === 0 ||
  225. !formik.values?.location ||
  226. formik.values?.location === "default"
  227. }
  228. >
  229. {t("offer.continue")}
  230. </NextButton>
  231. </>
  232. );
  233. };
  234. FirstPartCreateOffer.propTypes = {
  235. children: PropTypes.any,
  236. handleNext: PropTypes.func,
  237. offer: PropTypes.node,
  238. informations: PropTypes.any,
  239. };
  240. export default FirstPartCreateOffer;