Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

FirstPartCreateOffer.js 7.9KB

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