EditAd.js 3.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import React ,{useState,useEffect,useRef} from "react";
  2. import { connect } from "react-redux";
  3. import { actionPostAd, actionTypeAdOne } from "../actions";
  4. import { Container } from "react-bootstrap";
  5. import CPromiseComponent from "../Components/PromiseComponent";
  6. import { Redirect , useHistory} from "react-router";
  7. import {useDropzone} from 'react-dropzone'
  8. import { Carousel } from 'react-responsive-carousel';
  9. import nofoto from '../images/placeholder.png'
  10. import "react-responsive-carousel/lib/styles/carousel.min.css";
  11. const Post = ({data,onChange,match:{params:{id}},getData}) => {
  12. let history = useHistory()
  13. let [title,setTitle] = useState('')
  14. let [description,setDescription] = useState('')
  15. let [price,setPrice] = useState(0)
  16. let [images,setImages] = useState()
  17. const loading = useRef()
  18. const {acceptedFiles, getRootProps, getInputProps} = useDropzone();
  19. // const files = acceptedFiles.map(file => <li key={file.path}>{file.path}</li>);
  20. if(acceptedFiles.length > 0 && !loading.current) {
  21. loading.current = true
  22. }
  23. const files = acceptedFiles.map(file => (
  24. <li key={file.name}>
  25. {file.name}
  26. </li>
  27. ));
  28. useEffect(()=>{
  29. setTitle(data?.title)
  30. setDescription(data?.description)
  31. setPrice(data?.price)
  32. setImages(data?.images)
  33. },[data])
  34. useEffect(() =>
  35. getData(id),[id]
  36. )
  37. return (
  38. <>
  39. <CPromiseComponent promiseName='AdFindOne'>
  40. <Container >
  41. <div className='d-flex flex-column align-items-start post'>
  42. <label>Введите название</label>
  43. <input value={title} onChange={e => setTitle(e.target.value)} ></input>
  44. </div>
  45. <div className='post'>
  46. <Carousel className='carousel' infiniteLoop useKeyboardArrows showStatus={false} showThumbs={false} >
  47. {images ? images.map(image =>
  48. <img src = {`http://marketplace.asmer.fs.a-level.com.ua/${image.url}`} />
  49. ): <img src={nofoto} />}
  50. </Carousel>
  51. </div>
  52. <div className='post'>
  53. <div {...getRootProps({className: 'dropzone'})}>
  54. <input onChange={e => setImages(e.target.value)} {...getInputProps() }/>
  55. <p>Фото, нажмите для обновления. Первое фото будет на обложке объявления</p>
  56. </div>
  57. <aside>
  58. <h5>Фото: </h5>
  59. <ul>{files}</ul>
  60. </aside>
  61. </div>
  62. <div className='d-flex flex-column align-items-start post'>
  63. <label>Описание</label>
  64. <textarea rows="5" cols="75" value={description} onChange={e => setDescription(e.target.value)} ></textarea>
  65. </div>
  66. <div className='d-flex flex-column align-items-start post'>
  67. <label>Введите цену</label>
  68. <input type={"number"} value={price} onChange={e => e.target.value>=0 ? setPrice(+e.target.value) : ""} ></input>
  69. </div>
  70. <div className="d-flex flex-column align-items-end post">
  71. <button onClick={()=> onChange(title,description,price,data.images && acceptedFiles,data._id) && history.push('/profile')}>Изменить объявление</button>
  72. </div>
  73. </Container>
  74. </CPromiseComponent>
  75. </>
  76. )
  77. }
  78. const CChange = connect(state => ({data: state.promiseReducer.AdFindOne?.payload?.data?.AdFindOne}),{onChange: actionPostAd, getData: actionTypeAdOne})(Post)
  79. export default CChange