All files / components/MyReviews ReviewForm.jsx

100% Statements 24/24
100% Branches 23/23
100% Functions 10/10
100% Lines 24/24

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113        24x 1x     23x 21x     2x                     59x 59x 59x 20x         59x 23x 13x       59x 23x 13x       59x 22x 13x       59x 12x 12x                                                   7x                 7x                                   7x                
import React from "react";
import { Form, Button } from "react-bootstrap";
 
function formatDateTimeLocal(value) {
  if (!value) {
    return "";
  }
 
  if (typeof value === "string") {
    return value.slice(0, 16);
  }
 
  return new Date(value).toISOString().slice(0, 16);
}
 
export default function ReviewForm({
  initialItemName,
  initialReviewerComments,
  initialItemsStars,
  initialDateItemServed,
  submitAction,
  submitButtonText = "Submit Review",
}) {
  const [comments, setComments] = React.useState(initialReviewerComments ?? "");
  const [stars, setStars] = React.useState(initialItemsStars ?? 5);
  const [dateServed, setDateServed] = React.useState(() => {
    return initialDateItemServed
      ? formatDateTimeLocal(initialDateItemServed)
      : new Date().toISOString().slice(0, 16);
  });
 
  React.useEffect(() => {
    if (initialReviewerComments !== undefined) {
      setComments(initialReviewerComments ?? "");
    }
  }, [initialReviewerComments]);
 
  React.useEffect(() => {
    if (initialItemsStars !== undefined) {
      setStars(initialItemsStars ?? 5);
    }
  }, [initialItemsStars]);
 
  React.useEffect(() => {
    if (initialDateItemServed !== undefined) {
      setDateServed(formatDateTimeLocal(initialDateItemServed));
    }
  }, [initialDateItemServed]);
 
  const handleSubmit = (e) => {
    e.preventDefault();
    submitAction({
      reviewerComments: comments,
      itemsStars: stars,
      dateItemServed: dateServed,
    });
  };
 
  return (
    <Form onSubmit={handleSubmit}>
      <Form.Group className="mb-3">
        <Form.Label htmlFor="review-item-name">Item Name</Form.Label>
        <Form.Control
          id="review-item-name"
          type="text"
          value={initialItemName ?? ""}
          disabled
        />
      </Form.Group>
 
      <Form.Group className="mb-3">
        <Form.Label htmlFor="review-comments">Comments</Form.Label>
        <Form.Control
          id="review-comments"
          as="textarea"
          rows={3}
          value={comments}
          onChange={(e) => setComments(e.target.value)}
        />
      </Form.Group>
 
      <Form.Group className="mb-3">
        <Form.Label htmlFor="review-stars">Stars (1 to 5)</Form.Label>
        <Form.Select
          id="review-stars"
          value={stars}
          onChange={(e) => setStars(Number(e.target.value))}
        >
          {[1, 2, 3, 4, 5].map((num) => (
            <option key={num} value={num}>
              {num}
            </option>
          ))}
        </Form.Select>
      </Form.Group>
 
      <Form.Group className="mb-3">
        <Form.Label htmlFor="review-date">
          Date and Time Item was Served
        </Form.Label>
        <Form.Control
          id="review-date"
          type="datetime-local"
          value={dateServed}
          onChange={(e) => setDateServed(e.target.value)}
        />
      </Form.Group>
 
      <Button type="submit">{submitButtonText}</Button>
    </Form>
  );
}