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

FirstPartCreateOffer.js 3.0KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import React, { useState } from "react";
  2. import PropTypes from "prop-types";
  3. import { useFormik } from "formik";
  4. import { CreateOfferFormContainer } from "./FirstPartCreateOffer.styled";
  5. import { useSelector } from "react-redux";
  6. import { useMemo } from "react";
  7. import OfferTitleField from "./OfferTitleField/OfferTitleField";
  8. import OfferDescriptionField from "./OfferDescriptionField/OfferDescriptionField";
  9. import OfferLocationField from "./OfferLocationField/OfferLocationField";
  10. import OfferCategoryField from "./OfferCategoryField/OfferCategoryField";
  11. import OfferSubcategoryField from "./OfferSubcategoryField/OfferSubcategoryField";
  12. import NextButton from "./NextButton/NextButton";
  13. import firstPartCreateOfferInitialValues from "../../../../initialValues/createOfferInitialValues/firstPartCreateOfferInitialValues";
  14. import firstPartCreateOfferValidation from "../../../../validations/createOfferValidation/firstPartCreateOfferValidation";
  15. import ErrorMessage from "./ErrorMessage/ErrorMessage";
  16. const FirstPartCreateOffer = (props) => {
  17. const [subcategories, setSubcategories] = useState([]);
  18. const locations = useSelector((state) => state.locations.locations);
  19. const categories = useSelector((state) => state.categories.categories);
  20. // Change subcategory select options on category change
  21. const handleSubcategories = (category) => {
  22. setSubcategories(
  23. categories
  24. .find((cat) => cat.name === category)
  25. ?.subcategories?.map((subcategory) => subcategory.name)
  26. );
  27. };
  28. // Get initial values
  29. const initialValues = useMemo(() => {
  30. const newInitialValues = firstPartCreateOfferInitialValues(
  31. props.offer,
  32. props.informations
  33. );
  34. if (categories) {
  35. handleSubcategories(newInitialValues.category);
  36. }
  37. return newInitialValues;
  38. }, [props.offer, props.informations, categories]);
  39. // Get validation schema
  40. const validationSchema = useMemo(() => {
  41. return firstPartCreateOfferValidation(locations, categories, subcategories);
  42. }, [subcategories]);
  43. const handleSubmit = (values) => {
  44. props.handleNext(values);
  45. };
  46. const formik = useFormik({
  47. initialValues,
  48. validationSchema,
  49. onSubmit: handleSubmit,
  50. // validateOnBlur: true,
  51. enableReinitialize: true,
  52. });
  53. return (
  54. <CreateOfferFormContainer component="form" onSubmit={formik.handleSubmit}>
  55. <OfferTitleField formik={formik} />
  56. <OfferDescriptionField formik={formik} />
  57. <OfferLocationField formik={formik} locations={locations} />
  58. <OfferCategoryField
  59. formik={formik}
  60. categories={categories}
  61. handleSubcategories={handleSubcategories}
  62. />
  63. <OfferSubcategoryField formik={formik} subcategories={subcategories} />
  64. <ErrorMessage formik={formik} />
  65. <NextButton formik={formik} />
  66. </CreateOfferFormContainer>
  67. );
  68. };
  69. FirstPartCreateOffer.propTypes = {
  70. children: PropTypes.any,
  71. handleNext: PropTypes.func,
  72. offer: PropTypes.node,
  73. editOffer: PropTypes.bool,
  74. informations: PropTypes.any,
  75. };
  76. export default FirstPartCreateOffer;