Viewing File: /home/ubuntu/walnutminds-ecom-frontend-base/src/components/Product/WriteReviewModal.jsx

import { Link } from "react-router-dom";
import React, { useState, useCallback } from 'react';
import { Form, Button, Image, Modal } from "react-bootstrap";
import ReactStars from "react-rating-stars-component";
import { withTranslation, useTranslation } from "react-multi-lang";
import { useDropzone } from "react-dropzone";
import { connect } from "react-redux";
import {
	saveReviewsFilesStart,
	deleteReviewsFilesStart,
	saveReviewsStart,
} from "../store/actions/ReviewsAction";
import { useEffect } from "react";

const WriteReviewModal = (props) => {

	const [skipRender, setSkipRender] = useState(true);
	const [requiredMsg, setRequiredMsg] = useState(false);
	const t = useTranslation();

	const [reviewData, setReviewData] = useState({
		image: "",
		star: 0,
		review: "",
		product_id: props.singleProduct.product_id,
		review_file_ids: [],
	});

	const [reviewFiles, setReviewFiles] = useState([]);

	const onDrop = useCallback(acceptedFiles => {
		// Do something with the files
		// setReviewData({
		// 	...reviewData,
		// 	image: acceptedFiles.map(file => Object.assign(file, {
		// 		preview: URL.createObjectURL(file)
		// 	}))
		// });
		props.dispatch(saveReviewsFilesStart({ file: acceptedFiles[0] }));
	}, []);

	const ratingChanged = (newRating) => {
		setReviewData({
			...reviewData,
			star: newRating
		});
		setRequiredMsg(false);
	};

	useEffect(() => {
		if (!skipRender && !props.reviewsSaveFiles.loading &&
			Object.keys(props.reviewsSaveFiles.data).length > 0) {
			let review_file_ids = [];
			review_file_ids.push(props.reviewsSaveFiles.data.review_file_id);
			setReviewFiles([
				...reviewFiles,
				props.reviewsSaveFiles.data
			])
			setReviewData({
				...reviewData,
				review_file_ids: JSON.stringify(review_file_ids),
			})
		}
		setSkipRender(false)
	}, [props.reviewsSaveFiles]);

	useEffect(() => {
		if (!skipRender && !props.reviewsDeleteFiles.loading &&
			Object.keys(props.reviewsDeleteFiles.data).length > 0) {
			setReviewFiles([])
			setReviewData({
				...reviewData,
				review_file_ids: [],
			})
		}
		setSkipRender(false)
	}, [props.reviewsDeleteFiles]);

	useEffect(() => {
		if (!skipRender && !props.reviewsSave.loading &&
			Object.keys(props.reviewsSave.data).length > 0) {
			props.closeWriteReviewModal()
			setReviewFiles([])
			setReviewData({
				image: "",
				star: 0,
				review: "",
				product_id: props.singleProduct.product_id,
				review_file_ids: [],
			})
		}
		setSkipRender(false)
	}, [props.reviewsSave]);
	const saveReview = e => {
		e.preventDefault();
		if (reviewData.star > 0) {
			props.dispatch(saveReviewsStart(reviewData));
		} else {
			setRequiredMsg(true);
		}
	}

	const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop })

	return (
		<>
			<Modal
				className="modal-dialog-center write-review-modal"
				size="md"
				centered
				show={props.writeReview}
				onHide={props.closeWriteReviewModal}
			>
				<Modal.Header closeButton>
					<Modal.Title>{t("write_review")}</Modal.Title>
				</Modal.Header>
				<Modal.Body>
					<Form onSubmit={saveReview} className="write-review-form">
						<ReactStars
							count={5}
							onChange={ratingChanged}
							size={24}
							isHalf={true}
							emptyIcon={<i class="far fa-star"></i>}
							halfIcon={<i class="fas fa-star-half-alt"></i>}
							fullIcon={<i class="fas fa-star"></i>}
							activeColor="#ffd700"
						/>
						{requiredMsg
							? <div className="text-danger">Required</div>
							: null}
						<Form.Group className="mb-3" controlId="exampleForm.ControlTextarea1">
							<Form.Label>Review</Form.Label>
							<div className="text-small">Optional</div>
							<Form.Control
								as="textarea"
								rows={3}
								name="review"
								onChange={(e) => setReviewData({
									...reviewData,
									review: e.target.value
								})}
							/>
						</Form.Group>
						<div className="write-review-dropzone">
							<div {...getRootProps()}>
								<input {...getInputProps()} />
								{
									isDragActive ?
										<p>{t("drop_files")}</p> :
										<p>{t("drag_drop_files")}</p>
								}
							</div>
						</div>
						{reviewFiles.length > 0 && (
							reviewFiles.map((preview) => (
								<div
									className="review-preview"
									onClick={() => props.dispatch(deleteReviewsFilesStart({
										review_file_id: preview.review_file_id
									}))}
								>
									<img
										src={preview.file}
										className="review-preview-img"
									// onLoad={() => { URL.revokeObjectURL(reviewData.image[0].preview) }}
									/>
									<div className="remove-review-image">
										<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm121.6 313.1c4.7 4.7 4.7 12.3 0 17L338 377.6c-4.7 4.7-12.3 4.7-17 0L256 312l-65.1 65.6c-4.7 4.7-12.3 4.7-17 0L134.4 338c-4.7-4.7-4.7-12.3 0-17l65.6-65-65.6-65.1c-4.7-4.7-4.7-12.3 0-17l39.6-39.6c4.7-4.7 12.3-4.7 17 0l65 65.7 65.1-65.6c4.7-4.7 12.3-4.7 17 0l39.6 39.6c4.7 4.7 4.7 12.3 0 17L312 256l65.6 65.1z" /></svg>
									</div>
								</div>
							))
						)}
						<div className="write-review-btn-sec">
							<Button
								className="wishlist-btn"
								type="submit"
								disabled={props.reviewsSave.buttonDisable}
							>
								{props.reviewsSave.loadingButtonContent ? props.reviewsSave.loadingButtonContent : t("submit")}
							</Button>
						</div>
					</Form>
				</Modal.Body>
			</Modal>
		</>
	);
};

const mapStateToPros = (state) => ({
	reviewsSaveFiles: state.reviews.reviewsSaveFiles,
	reviewsDeleteFiles: state.reviews.reviewsDeleteFiles,
	reviewsSave: state.reviews.reviewsSave,
});

function mapDispatchToProps(dispatch) {
	return { dispatch };
}

export default connect(mapStateToPros, mapDispatchToProps)(withTranslation(WriteReviewModal));
Back to Directory File Manager