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 114 | 33x 32x 32x 32x 32x 4x 3x 3x 3x 1x 32x 1x 1x 32x 5x 5x 32x 4x 4x 32x 1x 1x 32x 12x 20x 20x | import BasicLayout from "main/layouts/BasicLayout/BasicLayout";
import { useBackend, useBackendMutation } from "main/utils/useBackend";
import ReviewTable from "main/components/Reviews/ReviewTable";
import { useNavigate } from "react-router";
import { useState } from "react";
import { Modal, Button } from "react-bootstrap";
import { toast } from "react-toastify";
 
export default function MyReviewsIndexPage() {
  const navigate = useNavigate();
  const { data, isLoading, error } = useBackend(
    // Stryker disable next-line all: don't test internal caching of React Query
    ["/api/reviews/userReviews"],
    // Stryker disable next-line all: default method is get, so replacing with an empty string will do nothing
    { method: "GET", url: `/api/reviews/userReviews` },
  );
 
  const [showDeleteModal, setShowDeleteModal] = useState(false);
  const [pendingDelete, setPendingDelete] = useState(null);
 
  const deleteMutation = useBackendMutation(
    (review) => ({
      url: "/api/reviews/reviewer",
      method: "DELETE",
      params: { id: review.id },
    }),
    {
      onSuccess: () => {
        toast.success("Review deleted");
        setShowDeleteModal(false);
        setPendingDelete(null);
      },
      onError: () => {
        toast.error("Error deleting review");
      },
    },
    // Stryker disable next-line all : don't test internal caching of React Query
    ["/api/reviews/userReviews"],
  );
 
  const onEdit = (cell) => {
    const id = cell.row.original.id;
    navigate(`/myreviews/edit/${id}`);
  };
 
  const onDelete = (cell) => {
    setPendingDelete(cell.row.original);
    setShowDeleteModal(true);
  };
 
  const handleDeleteConfirm = () => {
    // Stryker disable next-line all : don't test guard clause of pendingDelete
    Iif (!pendingDelete) return;
    deleteMutation.mutate(pendingDelete);
  };
 
  const handleDeleteCancel = () => {
    setShowDeleteModal(false);
    setPendingDelete(null);
  };
 
  if (isLoading) {
    return (
      <BasicLayout>
        <p>Loading...</p>
      </BasicLayout>
    );
  }
 
  // Stryker disable next-line all : Don't mutate error block
  Iif (error) {
    return (
      <BasicLayout>
        <p>Error loading reviews.</p>
      </BasicLayout>
    );
  }
 
  return (
    <BasicLayout>
      <h1>My Reviews</h1>
      <ReviewTable
        data={data}
        userOptions={true}
        moderatorOptions={false}
        onEdit={onEdit}
        onDelete={onDelete}
      />
      <Modal
        show={showDeleteModal}
        onHide={handleDeleteCancel}
        data-testid="delete-modal"
      >
        <Modal.Header closeButton>
          <Modal.Title>Confirm Delete</Modal.Title>
        </Modal.Header>
        <Modal.Body>Are you sure you want to delete this review?</Modal.Body>
        <Modal.Footer>
          <Button variant="secondary" onClick={handleDeleteCancel}>
            Cancel
          </Button>
          <Button
            variant="danger"
            onClick={handleDeleteConfirm}
            disabled={deleteMutation.isLoading}
          >
            {deleteMutation.isLoading ? "Deleting..." : "Delete"}
          </Button>
        </Modal.Footer>
      </Modal>
    </BasicLayout>
  );
}
  |